emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/reflect/AnnotationImpl.java
branchreflection
changeset 652 f095ea52f417
parent 555 cde0c2d7794e
child 654 26a86cc00224
     1.1 --- a/emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/reflect/AnnotationImpl.java	Wed Jan 23 20:52:11 2013 +0100
     1.2 +++ b/emul/mini/src/main/java/org/apidesign/bck2brwsr/emul/reflect/AnnotationImpl.java	Sun Feb 03 18:58:09 2013 +0100
     1.3 @@ -18,6 +18,8 @@
     1.4  package org.apidesign.bck2brwsr.emul.reflect;
     1.5  
     1.6  import java.lang.annotation.Annotation;
     1.7 +import java.lang.reflect.Method;
     1.8 +import java.lang.reflect.Modifier;
     1.9  import org.apidesign.bck2brwsr.core.JavaScriptBody;
    1.10  
    1.11  /**
    1.12 @@ -29,7 +31,7 @@
    1.13          return getClass();
    1.14      }
    1.15  
    1.16 -    @JavaScriptBody(args = { "a", "n", "values" }, body = ""
    1.17 +    @JavaScriptBody(args = { "a", "n", "arr", "values" }, body = ""
    1.18          + "function f(v, p) {\n"
    1.19          + "  var val = v;\n"
    1.20          + "  var prop = p;\n"
    1.21 @@ -37,27 +39,42 @@
    1.22          + "    return val[prop];\n"
    1.23          + "  };\n"
    1.24          + "}\n"
    1.25 -        + "var props = Object.getOwnPropertyNames(values);\n"
    1.26 -        + "for (var i = 0; i < props.length; i++) {\n"
    1.27 -        + "  var p = props[i];\n"
    1.28 -        + "  a[p] = new f(values, p);\n"
    1.29 +        + "for (var i = 0; i < arr.length; i += 2) {\n"
    1.30 +        + "  var m = arr[i];\n"
    1.31 +        + "  var p = arr[i + 1];\n"
    1.32 +        + "  a[m] = new f(values, p);\n"
    1.33          + "}\n"
    1.34          + "a['$instOf_' + n] = true;\n"
    1.35          + "return a;"
    1.36      )
    1.37 -    private static <T extends Annotation> T create(AnnotationImpl a, String n, Object values) {
    1.38 -        return null;
    1.39 -    }
    1.40 +    private static native <T extends Annotation> T create(
    1.41 +        AnnotationImpl a, String n, String[] methodsAndProps, Object values
    1.42 +    );
    1.43 +    
    1.44      public static <T extends Annotation> T create(Class<T> annoClass, Object values) {
    1.45 -        return create(new AnnotationImpl(), annoClass.getName().replace('.', '_'), values);
    1.46 +        return create(new AnnotationImpl(), 
    1.47 +            annoClass.getName().replace('.', '_'), 
    1.48 +            findProps(annoClass), values
    1.49 +        );
    1.50      }
    1.51  
    1.52      public static Annotation[] create(Object anno) {
    1.53          String[] names = findNames(anno);
    1.54          Annotation[] ret = new Annotation[names.length];
    1.55          for (int i = 0; i < names.length; i++) {
    1.56 -            String n = names[i].substring(1, names[i].length() - 1).replace('/', '_');
    1.57 -            ret[i] = create(new AnnotationImpl(), n, findData(anno, names[i]));
    1.58 +            String annoNameSlash = names[i].substring(1, names[i].length() - 1);
    1.59 +            Class<?> annoClass;
    1.60 +            try {
    1.61 +                annoClass = Class.forName(annoNameSlash.replace('/', '.'));
    1.62 +            } catch (ClassNotFoundException ex) {
    1.63 +                throw new IllegalStateException("Can't find annotation class " + annoNameSlash);
    1.64 +            }
    1.65 +            ret[i] = create(
    1.66 +                new AnnotationImpl(), 
    1.67 +                annoNameSlash.replace('/', '_'),
    1.68 +                findProps(annoClass),
    1.69 +                findData(anno, names[i])
    1.70 +            );
    1.71          }
    1.72          return ret;
    1.73      }
    1.74 @@ -70,12 +87,19 @@
    1.75          + "}"
    1.76          + "return arr;"
    1.77      )
    1.78 -    private static String[] findNames(Object anno) {
    1.79 -        throw new UnsupportedOperationException();
    1.80 -    }
    1.81 +    private static native String[] findNames(Object anno);
    1.82  
    1.83      @JavaScriptBody(args={ "anno", "p"}, body="return anno[p];")
    1.84 -    private static Object findData(Object anno, String p) {
    1.85 -        throw new UnsupportedOperationException();
    1.86 +    private static native Object findData(Object anno, String p);
    1.87 +
    1.88 +    private static String[] findProps(Class<?> annoClass) {
    1.89 +        final Method[] marr = MethodImpl.findMethods(annoClass, Modifier.PUBLIC);
    1.90 +        String[] arr = new String[marr.length * 2];
    1.91 +        int pos = 0;
    1.92 +        for (Method m : marr) {
    1.93 +            arr[pos++] = MethodImpl.toSignature(m);
    1.94 +            arr[pos++] = m.getName();
    1.95 +        }
    1.96 +        return arr;
    1.97      }
    1.98  }