1.1 --- a/json/src/main/java/org/netbeans/html/json/impl/ModelProcessor.java Sun Dec 13 21:33:32 2015 +0100
1.2 +++ b/json/src/main/java/org/netbeans/html/json/impl/ModelProcessor.java Tue Dec 15 23:19:35 2015 +0100
1.3 @@ -58,6 +58,7 @@
1.4 import java.util.LinkedHashSet;
1.5 import java.util.List;
1.6 import java.util.Map;
1.7 +import java.util.Properties;
1.8 import java.util.ResourceBundle;
1.9 import java.util.Set;
1.10 import java.util.WeakHashMap;
1.11 @@ -78,6 +79,7 @@
1.12 import javax.lang.model.element.ElementKind;
1.13 import javax.lang.model.element.ExecutableElement;
1.14 import javax.lang.model.element.Modifier;
1.15 +import javax.lang.model.element.Name;
1.16 import javax.lang.model.element.PackageElement;
1.17 import javax.lang.model.element.TypeElement;
1.18 import javax.lang.model.element.VariableElement;
1.19 @@ -90,6 +92,8 @@
1.20 import javax.lang.model.util.Types;
1.21 import javax.tools.Diagnostic;
1.22 import javax.tools.FileObject;
1.23 +import javax.tools.StandardLocation;
1.24 +import net.java.html.json.Component;
1.25 import net.java.html.json.ComputedProperty;
1.26 import net.java.html.json.Function;
1.27 import net.java.html.json.Model;
1.28 @@ -113,7 +117,8 @@
1.29 "net.java.html.json.OnReceive",
1.30 "net.java.html.json.OnPropertyChange",
1.31 "net.java.html.json.ComputedProperty",
1.32 - "net.java.html.json.Property"
1.33 + "net.java.html.json.Property",
1.34 + "net.java.html.json.Component"
1.35 })
1.36 public final class ModelProcessor extends AbstractProcessor {
1.37 private static final Logger LOG = Logger.getLogger(ModelProcessor.class.getName());
1.38 @@ -127,6 +132,11 @@
1.39 ok = false;
1.40 }
1.41 }
1.42 + for (Element e : roundEnv.getElementsAnnotatedWith(Component.class)) {
1.43 + if (!processComponent(e)) {
1.44 + ok = false;
1.45 + }
1.46 + }
1.47 if (roundEnv.processingOver()) {
1.48 models.clear();
1.49 for (Map.Entry<Element, Prprt[]> entry : verify.entrySet()) {
1.50 @@ -2191,4 +2201,44 @@
1.51 return null;
1.52 }
1.53
1.54 + private boolean processComponent(Element e) {
1.55 + try {
1.56 + Component c = e.getAnnotation(Component.class);
1.57 + if (c == null) {
1.58 + return false;
1.59 + }
1.60 + if (e.getKind() != ElementKind.METHOD) {
1.61 + error("@Component can only annotate a method", e);
1.62 + return false;
1.63 + }
1.64 + ExecutableElement ee = (ExecutableElement) e;
1.65 + if (ee.getParameters().size() != 1) {
1.66 + error("Method annotated by @Component needs to take one @Model generated parameter", e);
1.67 + return false;
1.68 + }
1.69 + FileObject def = processingEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, "", "META-INF/html+java/components/" + c.name(), e);
1.70 + OutputStreamWriter w = new OutputStreamWriter(def.openOutputStream());
1.71 + Properties p = new Properties();
1.72 + final TypeMirror typeParam = ee.getParameters().get(0).asType();
1.73 + String fqnParam;
1.74 + if (typeParam.getKind() == TypeKind.ERROR) {
1.75 + fqnParam = findPkgName(ee) + "." + typeParam;
1.76 + } else {
1.77 + final TypeElement elem = (TypeElement) processingEnv.getTypeUtils().asElement(typeParam);
1.78 + fqnParam = processingEnv.getElementUtils().getBinaryName(elem).toString();
1.79 + }
1.80 + p.setProperty("paramName", fqnParam);
1.81 + p.setProperty("methodName", e.getSimpleName().toString());
1.82 + TypeElement clazz = (TypeElement)e.getEnclosingElement();
1.83 + final String fqn = clazz.getQualifiedName().toString();
1.84 + p.setProperty("className", fqn);
1.85 + p.setProperty("template", findPkgName(e).replace('.', '/') + '/' + c.template());
1.86 + p.store(w, "Generated by " + e);
1.87 + w.close();
1.88 + return true;
1.89 + } catch (IOException ex) {
1.90 + error(ex.getMessage(), e);
1.91 + return false;
1.92 + }
1.93 + }
1.94 }