json/src/main/java/org/netbeans/html/json/impl/ModelProcessor.java
branchComponent257162
changeset 1035 3534e15dc446
parent 1030 02568f34628a
     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  }