emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/AnnotationImpl.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Wed, 23 Jan 2013 20:39:23 +0100
branchemul
changeset 554 05224402145d
parent 378 emul/src/main/java/org/apidesign/bck2brwsr/emul/AnnotationImpl.java@ccb1544a88bc
permissions -rw-r--r--
First attempt to separate 'mini' profile from the rest of JDK APIs
jaroslav@378
     1
/**
jaroslav@378
     2
 * Back 2 Browser Bytecode Translator
jaroslav@378
     3
 * Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
jaroslav@378
     4
 *
jaroslav@378
     5
 * This program is free software: you can redistribute it and/or modify
jaroslav@378
     6
 * it under the terms of the GNU General Public License as published by
jaroslav@378
     7
 * the Free Software Foundation, version 2 of the License.
jaroslav@378
     8
 *
jaroslav@378
     9
 * This program is distributed in the hope that it will be useful,
jaroslav@378
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
jaroslav@378
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
jaroslav@378
    12
 * GNU General Public License for more details.
jaroslav@378
    13
 *
jaroslav@378
    14
 * You should have received a copy of the GNU General Public License
jaroslav@378
    15
 * along with this program. Look for COPYING file in the top folder.
jaroslav@378
    16
 * If not, see http://opensource.org/licenses/GPL-2.0.
jaroslav@235
    17
 */
jaroslav@266
    18
package org.apidesign.bck2brwsr.emul;
jaroslav@235
    19
jaroslav@235
    20
import java.lang.annotation.Annotation;
jaroslav@235
    21
import org.apidesign.bck2brwsr.core.JavaScriptBody;
jaroslav@235
    22
jaroslav@235
    23
/**
jaroslav@235
    24
 *
jaroslav@235
    25
 * @author Jaroslav Tulach <jtulach@netbeans.org>
jaroslav@235
    26
 */
jaroslav@266
    27
public final class AnnotationImpl implements Annotation {
jaroslav@235
    28
    public Class<? extends Annotation> annotationType() {
jaroslav@235
    29
        return getClass();
jaroslav@235
    30
    }
jaroslav@235
    31
jaroslav@253
    32
    @JavaScriptBody(args = { "a", "n", "values" }, body = ""
jaroslav@253
    33
        + "function f(v, p) {\n"
jaroslav@253
    34
        + "  var val = v;\n"
jaroslav@253
    35
        + "  var prop = p;\n"
jaroslav@253
    36
        + "  return function() {\n"
jaroslav@253
    37
        + "    return val[prop];\n"
jaroslav@253
    38
        + "  };\n"
jaroslav@253
    39
        + "}\n"
jaroslav@253
    40
        + "var props = Object.getOwnPropertyNames(values);\n"
jaroslav@253
    41
        + "for (var i = 0; i < props.length; i++) {\n"
jaroslav@253
    42
        + "  var p = props[i];\n"
jaroslav@253
    43
        + "  a[p] = new f(values, p);\n"
jaroslav@253
    44
        + "}\n"
jaroslav@253
    45
        + "a['$instOf_' + n] = true;\n"
jaroslav@235
    46
        + "return a;"
jaroslav@235
    47
    )
jaroslav@235
    48
    private static <T extends Annotation> T create(AnnotationImpl a, String n, Object values) {
jaroslav@235
    49
        return null;
jaroslav@235
    50
    }
jaroslav@266
    51
    public static <T extends Annotation> T create(Class<T> annoClass, Object values) {
jaroslav@235
    52
        return create(new AnnotationImpl(), annoClass.getName().replace('.', '_'), values);
jaroslav@235
    53
    }
jaroslav@238
    54
jaroslav@266
    55
    public static Annotation[] create(Object anno) {
jaroslav@238
    56
        String[] names = findNames(anno);
jaroslav@238
    57
        Annotation[] ret = new Annotation[names.length];
jaroslav@238
    58
        for (int i = 0; i < names.length; i++) {
jaroslav@238
    59
            String n = names[i].substring(1, names[i].length() - 1).replace('/', '_');
jaroslav@238
    60
            ret[i] = create(new AnnotationImpl(), n, findData(anno, names[i]));
jaroslav@238
    61
        }
jaroslav@238
    62
        return ret;
jaroslav@238
    63
    }
jaroslav@238
    64
    @JavaScriptBody(args = "anno", body =
jaroslav@238
    65
          "var arr = new Array();"
jaroslav@254
    66
        + "var props = Object.getOwnPropertyNames(anno);\n"
jaroslav@254
    67
        + "for (var i = 0; i < props.length; i++) {\n"
jaroslav@254
    68
        + "  var p = props[i];\n"
jaroslav@238
    69
        + "  arr.push(p);"
jaroslav@238
    70
        + "}"
jaroslav@238
    71
        + "return arr;"
jaroslav@238
    72
    )
jaroslav@238
    73
    private static String[] findNames(Object anno) {
jaroslav@238
    74
        throw new UnsupportedOperationException();
jaroslav@238
    75
    }
jaroslav@238
    76
jaroslav@238
    77
    @JavaScriptBody(args={ "anno", "p"}, body="return anno[p];")
jaroslav@238
    78
    private static Object findData(Object anno, String p) {
jaroslav@238
    79
        throw new UnsupportedOperationException();
jaroslav@238
    80
    }
jaroslav@235
    81
}