emul/src/main/java/org/apidesign/bck2brwsr/emul/AnnotationImpl.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Wed, 05 Dec 2012 10:03:58 +0100
branchreflection
changeset 266 2e2e6f946208
parent 254 emul/src/main/java/java/lang/AnnotationImpl.java@d0013f44e9b1
child 378 ccb1544a88bc
permissions -rw-r--r--
Can obtain annotation from a method
jaroslav@235
     1
/*
jaroslav@235
     2
 * To change this template, choose Tools | Templates
jaroslav@235
     3
 * and open the template in the editor.
jaroslav@235
     4
 */
jaroslav@266
     5
package org.apidesign.bck2brwsr.emul;
jaroslav@235
     6
jaroslav@235
     7
import java.lang.annotation.Annotation;
jaroslav@235
     8
import org.apidesign.bck2brwsr.core.JavaScriptBody;
jaroslav@235
     9
jaroslav@235
    10
/**
jaroslav@235
    11
 *
jaroslav@235
    12
 * @author Jaroslav Tulach <jtulach@netbeans.org>
jaroslav@235
    13
 */
jaroslav@266
    14
public final class AnnotationImpl implements Annotation {
jaroslav@235
    15
    public Class<? extends Annotation> annotationType() {
jaroslav@235
    16
        return getClass();
jaroslav@235
    17
    }
jaroslav@235
    18
jaroslav@253
    19
    @JavaScriptBody(args = { "a", "n", "values" }, body = ""
jaroslav@253
    20
        + "function f(v, p) {\n"
jaroslav@253
    21
        + "  var val = v;\n"
jaroslav@253
    22
        + "  var prop = p;\n"
jaroslav@253
    23
        + "  return function() {\n"
jaroslav@253
    24
        + "    return val[prop];\n"
jaroslav@253
    25
        + "  };\n"
jaroslav@253
    26
        + "}\n"
jaroslav@253
    27
        + "var props = Object.getOwnPropertyNames(values);\n"
jaroslav@253
    28
        + "for (var i = 0; i < props.length; i++) {\n"
jaroslav@253
    29
        + "  var p = props[i];\n"
jaroslav@253
    30
        + "  a[p] = new f(values, p);\n"
jaroslav@253
    31
        + "}\n"
jaroslav@253
    32
        + "a['$instOf_' + n] = true;\n"
jaroslav@235
    33
        + "return a;"
jaroslav@235
    34
    )
jaroslav@235
    35
    private static <T extends Annotation> T create(AnnotationImpl a, String n, Object values) {
jaroslav@235
    36
        return null;
jaroslav@235
    37
    }
jaroslav@266
    38
    public static <T extends Annotation> T create(Class<T> annoClass, Object values) {
jaroslav@235
    39
        return create(new AnnotationImpl(), annoClass.getName().replace('.', '_'), values);
jaroslav@235
    40
    }
jaroslav@238
    41
jaroslav@266
    42
    public static Annotation[] create(Object anno) {
jaroslav@238
    43
        String[] names = findNames(anno);
jaroslav@238
    44
        Annotation[] ret = new Annotation[names.length];
jaroslav@238
    45
        for (int i = 0; i < names.length; i++) {
jaroslav@238
    46
            String n = names[i].substring(1, names[i].length() - 1).replace('/', '_');
jaroslav@238
    47
            ret[i] = create(new AnnotationImpl(), n, findData(anno, names[i]));
jaroslav@238
    48
        }
jaroslav@238
    49
        return ret;
jaroslav@238
    50
    }
jaroslav@238
    51
    @JavaScriptBody(args = "anno", body =
jaroslav@238
    52
          "var arr = new Array();"
jaroslav@254
    53
        + "var props = Object.getOwnPropertyNames(anno);\n"
jaroslav@254
    54
        + "for (var i = 0; i < props.length; i++) {\n"
jaroslav@254
    55
        + "  var p = props[i];\n"
jaroslav@238
    56
        + "  arr.push(p);"
jaroslav@238
    57
        + "}"
jaroslav@238
    58
        + "return arr;"
jaroslav@238
    59
    )
jaroslav@238
    60
    private static String[] findNames(Object anno) {
jaroslav@238
    61
        throw new UnsupportedOperationException();
jaroslav@238
    62
    }
jaroslav@238
    63
jaroslav@238
    64
    @JavaScriptBody(args={ "anno", "p"}, body="return anno[p];")
jaroslav@238
    65
    private static Object findData(Object anno, String p) {
jaroslav@238
    66
        throw new UnsupportedOperationException();
jaroslav@238
    67
    }
jaroslav@235
    68
}