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