javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java
branchmodel
changeset 906 22358b42ec2a
parent 892 16fd25f3a75d
child 907 5dc21ce7269d
     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  }