1.1 --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java Tue Mar 26 09:24:26 2013 +0100
1.2 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java Sun Mar 31 05:34:15 2013 +0200
1.3 @@ -28,9 +28,9 @@
1.4 import java.util.HashMap;
1.5 import java.util.LinkedHashSet;
1.6 import java.util.List;
1.7 -import java.util.Locale;
1.8 import java.util.Map;
1.9 import java.util.Set;
1.10 +import java.util.WeakHashMap;
1.11 import javax.annotation.processing.AbstractProcessor;
1.12 import javax.annotation.processing.Completion;
1.13 import javax.annotation.processing.Completions;
1.14 @@ -73,6 +73,7 @@
1.15 "org.apidesign.bck2brwsr.htmlpage.api.On"
1.16 })
1.17 public final class PageProcessor extends AbstractProcessor {
1.18 + private final Map<Element,String> models = new WeakHashMap<>();
1.19 @Override
1.20 public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
1.21 boolean ok = true;
1.22 @@ -86,6 +87,9 @@
1.23 ok = false;
1.24 }
1.25 }
1.26 + if (roundEnv.processingOver()) {
1.27 + models.clear();
1.28 + }
1.29 return ok;
1.30 }
1.31
1.32 @@ -129,6 +133,7 @@
1.33 w.append(" private boolean locked;\n");
1.34 w.append(" private org.apidesign.bck2brwsr.htmlpage.Knockout ko;\n");
1.35 w.append(body.toString());
1.36 + w.append(" private static Class<" + e.getSimpleName() + "> modelFor() { return null; }\n");
1.37 w.append("}\n");
1.38 } finally {
1.39 w.close();
1.40 @@ -546,6 +551,7 @@
1.41 if (m != null) {
1.42 ret = findPkgName(e) + '.' + m.className();
1.43 isModel = true;
1.44 + models.put(e, m.className());
1.45 } else {
1.46 ret = tm.toString();
1.47 }
1.48 @@ -687,18 +693,21 @@
1.49 params.append('"').append(id).append('"');
1.50 continue;
1.51 }
1.52 - toCall = "org.apidesign.bck2brwsr.htmlpage.ConvertTypes.toString";
1.53 + toCall = "org.apidesign.bck2brwsr.htmlpage.ConvertTypes.toString(";
1.54 }
1.55 if (ve.asType().getKind() == TypeKind.DOUBLE) {
1.56 - toCall = "org.apidesign.bck2brwsr.htmlpage.ConvertTypes.toDouble";
1.57 + toCall = "org.apidesign.bck2brwsr.htmlpage.ConvertTypes.toDouble(";
1.58 }
1.59 if (ve.asType().getKind() == TypeKind.INT) {
1.60 - toCall = "org.apidesign.bck2brwsr.htmlpage.ConvertTypes.toInt";
1.61 + toCall = "org.apidesign.bck2brwsr.htmlpage.ConvertTypes.toInt(";
1.62 + }
1.63 + if (dataName != null && ve.getSimpleName().contentEquals(dataName) && isModel(ve.asType())) {
1.64 + toCall = "org.apidesign.bck2brwsr.htmlpage.ConvertTypes.toModel(" + ve.asType() + ".class, ";
1.65 }
1.66
1.67 if (toCall != null) {
1.68 - params.append(toCall).append('(');
1.69 - if (dataName != null && ve.getSimpleName().contentEquals("data")) {
1.70 + params.append(toCall);
1.71 + if (dataName != null && ve.getSimpleName().contentEquals(dataName)) {
1.72 params.append(dataName);
1.73 params.append(", null");
1.74 } else {
1.75 @@ -726,4 +735,17 @@
1.76 }
1.77 return params;
1.78 }
1.79 +
1.80 + private boolean isModel(TypeMirror tm) {
1.81 + final Element e = processingEnv.getTypeUtils().asElement(tm);
1.82 + for (Element ch : e.getEnclosedElements()) {
1.83 + if (ch.getKind() == ElementKind.METHOD) {
1.84 + ExecutableElement ee = (ExecutableElement)ch;
1.85 + if (ee.getParameters().isEmpty() && ee.getSimpleName().contentEquals("modelFor")) {
1.86 + return true;
1.87 + }
1.88 + }
1.89 + }
1.90 + return models.values().contains(e.getSimpleName().toString());
1.91 + }
1.92 }