Generate List<type> for arrays model
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Mon, 18 Feb 2013 12:26:16 +0100
branchmodel
changeset 7604bd6f3bc6c64
parent 759 41e1dc88a399
child 761 ade90921ede5
Generate List<type> for arrays
javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java
javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/api/Property.java
javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/ModelTest.java
     1.1 --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java	Sun Feb 17 17:58:34 2013 +0100
     1.2 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java	Mon Feb 18 12:26:16 2013 +0100
     1.3 @@ -317,26 +317,34 @@
     1.4      ) throws IOException {
     1.5          for (Property p : properties) {
     1.6              final String tn = typeName(p);
     1.7 -            String[] gs = toGetSet(p.name(), tn);
     1.8 +            String[] gs = toGetSet(p.name(), tn, p.array());
     1.9  
    1.10 -            w.write("private " + tn + " prop_" + p.name() + ";\n");
    1.11 -            w.write("public " + tn + " " + gs[0] + "() {\n");
    1.12 -            w.write("  if (locked) throw new IllegalStateException();\n");
    1.13 -            w.write("  return prop_" + p.name() + ";\n");
    1.14 -            w.write("}\n");
    1.15 -            w.write("public void " + gs[1] + "(" + tn + " v) {\n");
    1.16 -            w.write("  if (locked) throw new IllegalStateException();\n");
    1.17 -            w.write("  prop_" + p.name() + " = v;\n");
    1.18 -            w.write("  if (ko != null) {\n");
    1.19 -            w.write("    ko.valueHasMutated(\"" + p.name() + "\");\n");
    1.20 -            final Collection<String> dependants = deps.get(p.name());
    1.21 -            if (dependants != null) {
    1.22 -                for (String depProp : dependants) {
    1.23 -                    w.write("    ko.valueHasMutated(\"" + depProp + "\");\n");
    1.24 +            if (p.array()) {
    1.25 +                w.write("private java.util.List<" + tn + "> prop_" + p.name() + " = new java.util.ArrayList<" + tn + ">();\n");
    1.26 +                w.write("public java.util.List<" + tn + "> " + gs[0] + "() {\n");
    1.27 +                w.write("  if (locked) throw new IllegalStateException();\n");
    1.28 +                w.write("  return prop_" + p.name() + ";\n");
    1.29 +                w.write("}\n");
    1.30 +            } else {
    1.31 +                w.write("private " + tn + " prop_" + p.name() + ";\n");
    1.32 +                w.write("public " + tn + " " + gs[0] + "() {\n");
    1.33 +                w.write("  if (locked) throw new IllegalStateException();\n");
    1.34 +                w.write("  return prop_" + p.name() + ";\n");
    1.35 +                w.write("}\n");
    1.36 +                w.write("public void " + gs[1] + "(" + tn + " v) {\n");
    1.37 +                w.write("  if (locked) throw new IllegalStateException();\n");
    1.38 +                w.write("  prop_" + p.name() + " = v;\n");
    1.39 +                w.write("  if (ko != null) {\n");
    1.40 +                w.write("    ko.valueHasMutated(\"" + p.name() + "\");\n");
    1.41 +                final Collection<String> dependants = deps.get(p.name());
    1.42 +                if (dependants != null) {
    1.43 +                    for (String depProp : dependants) {
    1.44 +                        w.write("    ko.valueHasMutated(\"" + depProp + "\");\n");
    1.45 +                    }
    1.46                  }
    1.47 +                w.write("  }\n");
    1.48 +                w.write("}\n");
    1.49              }
    1.50 -            w.write("  }\n");
    1.51 -            w.write("}\n");
    1.52              
    1.53              props.add(p.name());
    1.54              props.add(gs[2]);
    1.55 @@ -359,7 +367,7 @@
    1.56              ExecutableElement ee = (ExecutableElement)e;
    1.57              final String tn = ee.getReturnType().toString();
    1.58              final String sn = ee.getSimpleName().toString();
    1.59 -            String[] gs = toGetSet(sn, tn);
    1.60 +            String[] gs = toGetSet(sn, tn, false);
    1.61              
    1.62              w.write("public " + tn + " " + gs[0] + "() {\n");
    1.63              w.write("  if (locked) throw new IllegalStateException();\n");
    1.64 @@ -367,7 +375,7 @@
    1.65              for (VariableElement pe : ee.getParameters()) {
    1.66                  final String dn = pe.getSimpleName().toString();
    1.67                  final String dt = pe.asType().toString();
    1.68 -                String[] call = toGetSet(dn, dt);
    1.69 +                String[] call = toGetSet(dn, dt, false);
    1.70                  w.write("  " + dt + " arg" + (++arg) + " = ");
    1.71                  w.write(call[0] + "();\n");
    1.72                  
    1.73 @@ -402,7 +410,7 @@
    1.74          return true;
    1.75      }
    1.76  
    1.77 -    private static String[] toGetSet(String name, String type) {
    1.78 +    private static String[] toGetSet(String name, String type, boolean array) {
    1.79          String n = Character.toUpperCase(name.charAt(0)) + name.substring(1);
    1.80          String bck2brwsrType = "L" + type.replace('.', '_') + "_2";
    1.81          if ("int".equals(type)) {
    1.82 @@ -417,6 +425,14 @@
    1.83              bck2brwsrType = "Z";
    1.84          }
    1.85          final String nu = n.replace('.', '_');
    1.86 +        if (array) {
    1.87 +            return new String[] { 
    1.88 +                "get" + n,
    1.89 +                null,
    1.90 +                "get" + nu + "___3" + bck2brwsrType,
    1.91 +                null
    1.92 +            };
    1.93 +        }
    1.94          return new String[]{
    1.95              pref + n, 
    1.96              "set" + n, 
     2.1 --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/api/Property.java	Sun Feb 17 17:58:34 2013 +0100
     2.2 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/api/Property.java	Mon Feb 18 12:26:16 2013 +0100
     2.3 @@ -31,4 +31,5 @@
     2.4  public @interface Property {
     2.5      String name();
     2.6      Class<?> type();
     2.7 +    boolean array() default false;
     2.8  }
     3.1 --- a/javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/ModelTest.java	Sun Feb 17 17:58:34 2013 +0100
     3.2 +++ b/javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/ModelTest.java	Mon Feb 18 12:26:16 2013 +0100
     3.3 @@ -32,7 +32,8 @@
     3.4   */
     3.5  @Page(xhtml = "Empty.html", className = "Model", properties = {
     3.6      @Property(name = "value", type = int.class),
     3.7 -    @Property(name = "unrelated", type = long.class)
     3.8 +    @Property(name = "unrelated", type = long.class),
     3.9 +    @Property(name = "names", type = String.class, array = true)
    3.10  })
    3.11  public class ModelTest {
    3.12      private Model model;
    3.13 @@ -53,6 +54,12 @@
    3.14          assertEquals(16, model.getPowerValue());
    3.15      }
    3.16      
    3.17 +    @Test public void arrayIsMutable() {
    3.18 +        assertEquals(model.getNames().size(), 0, "Is empty");
    3.19 +        model.getNames().add("Jarda");
    3.20 +        assertEquals(model.getNames().size(), 1, "One element");
    3.21 +    }
    3.22 +    
    3.23      @Test public void derivedPropertiesAreNotified() {
    3.24          MockKnockout my = new MockKnockout();
    3.25          MockKnockout.next = my;