javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java
branchmodel
changeset 930 e8916518b38d
parent 929 b43aaf398748
child 934 19b4ddc302a6
     1.1 --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java	Thu Apr 04 11:45:54 2013 +0200
     1.2 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java	Thu Apr 04 13:08:26 2013 +0200
     1.3 @@ -134,7 +134,7 @@
     1.4                  w.append("import org.apidesign.bck2brwsr.htmlpage.api.*;\n");
     1.5                  w.append("import org.apidesign.bck2brwsr.htmlpage.KOList;\n");
     1.6                  w.append("import org.apidesign.bck2brwsr.core.JavaScriptOnly;\n");
     1.7 -                w.append("final class ").append(className).append(" {\n");
     1.8 +                w.append("final class ").append(className).append(" implements Cloneable {\n");
     1.9                  w.append("  private Object json;\n");
    1.10                  w.append("  private boolean locked;\n");
    1.11                  w.append("  private org.apidesign.bck2brwsr.htmlpage.Knockout ko;\n");
    1.12 @@ -148,6 +148,7 @@
    1.13                  w.append("    );\n");
    1.14                  w.append("  };\n");
    1.15                  writeToString(m.properties(), w);
    1.16 +                writeClone(className, m.properties(), w);
    1.17                  w.append("}\n");
    1.18              } finally {
    1.19                  w.close();
    1.20 @@ -540,32 +541,16 @@
    1.21  
    1.22      private String typeName(Element where, Property p) {
    1.23          String ret;
    1.24 -        boolean isModel = false;
    1.25 -        boolean isEnum = false;
    1.26 -        try {
    1.27 -            ret = p.type().getName();
    1.28 -        } catch (MirroredTypeException ex) {
    1.29 -            TypeMirror tm = processingEnv.getTypeUtils().erasure(ex.getTypeMirror());
    1.30 -            final Element e = processingEnv.getTypeUtils().asElement(tm);
    1.31 -            final Model m = e == null ? null : e.getAnnotation(Model.class);
    1.32 -            if (m != null) {
    1.33 -                ret = findPkgName(e) + '.' + m.className();
    1.34 -                isModel = true;
    1.35 -                models.put(e, m.className());
    1.36 -            } else {
    1.37 -                ret = tm.toString();
    1.38 -            }
    1.39 -            TypeMirror enm = processingEnv.getElementUtils().getTypeElement("java.lang.Enum").asType();
    1.40 -            enm = processingEnv.getTypeUtils().erasure(enm);
    1.41 -            isEnum = processingEnv.getTypeUtils().isSubtype(tm, enm);
    1.42 -        }
    1.43 +        boolean[] isModel = { false };
    1.44 +        boolean[] isEnum = { false };
    1.45 +        ret = checkType(p, isModel, isEnum);
    1.46          if (p.array()) {
    1.47              String bt = findBoxedType(ret);
    1.48              if (bt != null) {
    1.49                  return bt;
    1.50              }
    1.51          }
    1.52 -        if (!isModel && !"java.lang.String".equals(ret) && !isEnum) {
    1.53 +        if (!isModel[0] && !"java.lang.String".equals(ret) && !isEnum[0]) {
    1.54              String bt = findBoxedType(ret);
    1.55              if (bt == null) {
    1.56                  processingEnv.getMessager().printMessage(
    1.57 @@ -786,6 +771,25 @@
    1.58          w.write("    return sb.toString();\n");
    1.59          w.write("  }\n");
    1.60      }
    1.61 +    private void writeClone(String className, Property[] props, Writer w) throws IOException {
    1.62 +        w.write("  public " + className + " clone() {\n");
    1.63 +        w.write("    " + className + " ret = new " + className + "();\n");
    1.64 +        for (Property p : props) {
    1.65 +            if (!p.array()) {
    1.66 +                boolean isModel[] = { false };
    1.67 +                boolean isEnum[] = { false };
    1.68 +                checkType(p, isModel, isEnum);
    1.69 +                if (!isModel[0]) {
    1.70 +                    w.write("    ret.prop_" + p.name() + " = prop_" + p.name() + ";\n");
    1.71 +                    continue;
    1.72 +                }
    1.73 +            }
    1.74 +            w.write("    ret.prop_" + p.name() + " = prop_" + p.name() + ".clone();\n");
    1.75 +        }
    1.76 +        
    1.77 +        w.write("    return ret;\n");
    1.78 +        w.write("  }\n");
    1.79 +    }
    1.80  
    1.81      private String inPckName(Element e) {
    1.82          StringBuilder sb = new StringBuilder();
    1.83 @@ -809,4 +813,26 @@
    1.84          }
    1.85          return pt.toString();
    1.86      }
    1.87 +
    1.88 +    private String checkType(Property p, boolean[] isModel, boolean[] isEnum) {
    1.89 +        String ret;
    1.90 +        try {
    1.91 +            ret = p.type().getName();
    1.92 +        } catch (MirroredTypeException ex) {
    1.93 +            TypeMirror tm = processingEnv.getTypeUtils().erasure(ex.getTypeMirror());
    1.94 +            final Element e = processingEnv.getTypeUtils().asElement(tm);
    1.95 +            final Model m = e == null ? null : e.getAnnotation(Model.class);
    1.96 +            if (m != null) {
    1.97 +                ret = findPkgName(e) + '.' + m.className();
    1.98 +                isModel[0] = true;
    1.99 +                models.put(e, m.className());
   1.100 +            } else {
   1.101 +                ret = tm.toString();
   1.102 +            }
   1.103 +            TypeMirror enm = processingEnv.getElementUtils().getTypeElement("java.lang.Enum").asType();
   1.104 +            enm = processingEnv.getTypeUtils().erasure(enm);
   1.105 +            isEnum[0] = processingEnv.getTypeUtils().isSubtype(tm, enm);
   1.106 +        }
   1.107 +        return ret;
   1.108 +    }
   1.109  }