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 }