javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java
branchmodel
changeset 498 607f062485cc
parent 496 a06c98795b01
child 500 f9e80d48e9b4
     1.1 --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java	Sun Jan 20 21:01:46 2013 +0100
     1.2 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java	Mon Jan 21 07:00:56 2013 +0100
     1.3 @@ -24,8 +24,11 @@
     1.4  import java.util.ArrayList;
     1.5  import java.util.Collection;
     1.6  import java.util.Collections;
     1.7 +import java.util.HashMap;
     1.8 +import java.util.LinkedHashSet;
     1.9  import java.util.List;
    1.10  import java.util.Locale;
    1.11 +import java.util.Map;
    1.12  import java.util.Set;
    1.13  import javax.annotation.processing.AbstractProcessor;
    1.14  import javax.annotation.processing.Completion;
    1.15 @@ -106,8 +109,9 @@
    1.16                      }
    1.17                      w.append("  }\n");
    1.18                      List<String> propsGetSet = new ArrayList<String>();
    1.19 -                    generateProperties(w, p.properties(), propsGetSet);
    1.20 -                    generateComputedProperties(w, e.getEnclosedElements(), propsGetSet);
    1.21 +                    Map<String,Collection<String>> propsDeps = new HashMap<String, Collection<String>>();
    1.22 +                    generateComputedProperties(w, e.getEnclosedElements(), propsGetSet, propsDeps);
    1.23 +                    generateProperties(w, p.properties(), propsGetSet, propsDeps);
    1.24                      w.append("  private static org.apidesign.bck2brwsr.htmlpage.Knockout ko;\n");
    1.25                      if (!propsGetSet.isEmpty()) {
    1.26                          w.write("public static void applyBindings() {\n");
    1.27 @@ -259,7 +263,8 @@
    1.28      }
    1.29  
    1.30      private static void generateProperties(
    1.31 -        Writer w, Property[] properties, Collection<String> props
    1.32 +        Writer w, Property[] properties, Collection<String> props,
    1.33 +        Map<String,Collection<String>> deps
    1.34      ) throws IOException {
    1.35          for (Property p : properties) {
    1.36              final String tn = typeName(p);
    1.37 @@ -271,7 +276,15 @@
    1.38              w.write("}\n");
    1.39              w.write("public static void " + gs[1] + "(" + tn + " v) {\n");
    1.40              w.write("  prop_" + p.name() + " = v;\n");
    1.41 -            w.write("  if (ko != null) ko.valueHasMutated(\"" + p.name() + "\");\n");
    1.42 +            w.write("  if (ko != null) {\n");
    1.43 +            w.write("    ko.valueHasMutated(\"" + p.name() + "\");\n");
    1.44 +            final Collection<String> dependants = deps.get(p.name());
    1.45 +            if (dependants != null) {
    1.46 +                for (String depProp : dependants) {
    1.47 +                    w.write("    ko.valueHasMutated(\"" + depProp + "\");\n");
    1.48 +                }
    1.49 +            }
    1.50 +            w.write("  }\n");
    1.51              w.write("}\n");
    1.52              
    1.53              props.add(p.name());
    1.54 @@ -280,8 +293,9 @@
    1.55          }
    1.56      }
    1.57  
    1.58 -    private void generateComputedProperties(
    1.59 -        Writer w, Collection<? extends Element> arr, Collection<String> props
    1.60 +    private boolean generateComputedProperties(
    1.61 +        Writer w, Collection<? extends Element> arr, Collection<String> props,
    1.62 +        Map<String,Collection<String>> deps
    1.63      ) throws IOException {
    1.64          for (Element e : arr) {
    1.65              if (e.getKind() != ElementKind.METHOD) {
    1.66 @@ -292,16 +306,25 @@
    1.67              }
    1.68              ExecutableElement ee = (ExecutableElement)e;
    1.69              final String tn = ee.getReturnType().toString();
    1.70 -            String[] gs = toGetSet(ee.getSimpleName().toString(), tn);
    1.71 -
    1.72 +            final String sn = ee.getSimpleName().toString();
    1.73 +            String[] gs = toGetSet(sn, tn);
    1.74 +            
    1.75              w.write("public static " + tn + " " + gs[0] + "() {\n");
    1.76              w.write("  return " + e.getEnclosingElement().getSimpleName() + '.' + e.getSimpleName() + "(");
    1.77              String sep = "";
    1.78              for (VariableElement pe : ee.getParameters()) {
    1.79 -                String[] call = toGetSet(pe.getSimpleName().toString(), pe.asType().toString());
    1.80 +                final String dn = pe.getSimpleName().toString();
    1.81 +                String[] call = toGetSet(dn, pe.asType().toString());
    1.82                  w.write(sep);
    1.83                  w.write(call[0] + "()");
    1.84                  sep = ", ";
    1.85 +                
    1.86 +                Collection<String> depends = deps.get(dn);
    1.87 +                if (depends == null) {
    1.88 +                    depends = new LinkedHashSet<String>();
    1.89 +                    deps.put(dn, depends);
    1.90 +                }
    1.91 +                depends.add(sn);
    1.92              }
    1.93              w.write(");\n");
    1.94              w.write("}\n");
    1.95 @@ -310,6 +333,8 @@
    1.96              props.add(gs[2]);
    1.97              props.add(null);
    1.98          }
    1.99 +        
   1.100 +        return true;
   1.101      }
   1.102  
   1.103      private static String[] toGetSet(String name, String type) {
   1.104 @@ -326,11 +351,12 @@
   1.105              pref = "is";
   1.106              bck2brwsrType = "Z";
   1.107          }
   1.108 +        final String nu = n.replace('.', '_');
   1.109          return new String[]{
   1.110              pref + n, 
   1.111              "set" + n, 
   1.112 -            pref + n + "__" + bck2brwsrType,
   1.113 -            "set" + n + "__V" + bck2brwsrType
   1.114 +            pref + nu + "__" + bck2brwsrType,
   1.115 +            "set" + nu + "__V" + bck2brwsrType
   1.116          };
   1.117      }
   1.118  
   1.119 @@ -338,10 +364,7 @@
   1.120          try {
   1.121              return p.type().getName();
   1.122          } catch (MirroredTypeException ex) {
   1.123 -            if (ex.getTypeMirror().getKind().isPrimitive()) {
   1.124 -                return ex.getTypeMirror().toString();
   1.125 -            }
   1.126 -            throw ex;
   1.127 +            return ex.getTypeMirror().toString();
   1.128          }
   1.129      }
   1.130  }