1.1 --- a/json/src/main/java/org/netbeans/html/json/impl/ModelProcessor.java Thu Oct 29 20:10:06 2015 +0100
1.2 +++ b/json/src/main/java/org/netbeans/html/json/impl/ModelProcessor.java Thu Nov 05 23:38:18 2015 +0100
1.3 @@ -189,6 +189,7 @@
1.4 Map<String, Collection<String[]>> propsDeps = new HashMap<String, Collection<String[]>>();
1.5 Map<String, Collection<String>> functionDeps = new HashMap<String, Collection<String>>();
1.6 Prprt[] props = createProps(e, m.properties());
1.7 + final String builderPrefix = findBuilderPrefix(e, m);
1.8
1.9 if (!generateComputedProperties(className, body, props, e.getEnclosedElements(), propsGetSet, propsDeps)) {
1.10 ok = false;
1.11 @@ -196,7 +197,7 @@
1.12 if (!generateOnChange(e, propsDeps, props, className, functionDeps)) {
1.13 ok = false;
1.14 }
1.15 - if (!generateProperties(e, body, className, props, propsGetSet, propsDeps, functionDeps)) {
1.16 + if (!generateProperties(e, builderPrefix, body, className, props, propsGetSet, propsDeps, functionDeps)) {
1.17 ok = false;
1.18 }
1.19 if (!generateFunctions(e, body, className, e.getEnclosedElements(), functions)) {
1.20 @@ -271,7 +272,7 @@
1.21 }
1.22 }
1.23 w.append(" };\n");
1.24 - if (props.length > 0) {
1.25 + if (props.length > 0 && builderPrefix == null) {
1.26 StringBuilder constructorWithArguments = new StringBuilder();
1.27 constructorWithArguments.append(" public ").append(className).append("(");
1.28 Prprt firstArray = null;
1.29 @@ -462,8 +463,13 @@
1.30 w.append(type).append(".valueOf(TYPE.stringValue(e)));\n");
1.31 } else {
1.32 if (isPrimitive(type)) {
1.33 - w.append(" this.prop_").append(pn).append(".add(TYPE.numberValue(e).");
1.34 - w.append(type).append("Value());\n");
1.35 + if (type.equals("char")) {
1.36 + w.append(" this.prop_").append(pn).append(".add((char)TYPE.numberValue(e).");
1.37 + w.append("intValue());\n");
1.38 + } else {
1.39 + w.append(" this.prop_").append(pn).append(".add(TYPE.numberValue(e).");
1.40 + w.append(type).append("Value());\n");
1.41 + }
1.42 } else {
1.43 w.append(" this.prop_").append(pn).append(".add((");
1.44 w.append(type).append(")e);\n");
1.45 @@ -561,8 +567,29 @@
1.46 return ok;
1.47 }
1.48
1.49 + private static String findBuilderPrefix(Element e, Model m) {
1.50 + if (!m.builder().isEmpty()) {
1.51 + return m.builder();
1.52 + }
1.53 + for (AnnotationMirror am : e.getAnnotationMirrors()) {
1.54 + for (Map.Entry<? extends Object, ? extends Object> entry : am.getElementValues().entrySet()) {
1.55 + if ("builder()".equals(entry.getKey().toString())) {
1.56 + return "";
1.57 + }
1.58 + }
1.59 + }
1.60 + return null;
1.61 + }
1.62 +
1.63 + private static String builderMethod(String builderPrefix, Prprt p) {
1.64 + if (builderPrefix.isEmpty()) {
1.65 + return p.name();
1.66 + }
1.67 + return builderPrefix + Character.toUpperCase(p.name().charAt(0)) + p.name().substring(1);
1.68 + }
1.69 +
1.70 private boolean generateProperties(
1.71 - Element where,
1.72 + Element where, String builderPrefix,
1.73 Writer w, String className, Prprt[] properties,
1.74 List<GetSet> props,
1.75 Map<String,Collection<String[]>> deps,
1.76 @@ -583,6 +610,17 @@
1.77 w.write(" proto.accessProperty(\"" + p.name() + "\");\n");
1.78 w.write(" return prop_" + p.name() + ";\n");
1.79 w.write(" }\n");
1.80 + if (builderPrefix != null) {
1.81 + boolean[] isModel = {false};
1.82 + boolean[] isEnum = {false};
1.83 + boolean isPrimitive[] = {false};
1.84 + String ret = checkType(p, isModel, isEnum, isPrimitive);
1.85 + w.write(" public " + className + " " + builderMethod(builderPrefix, p) + "(" + ret + "... v) {\n");
1.86 + w.write(" proto.accessProperty(\"" + p.name() + "\");\n");
1.87 + w.append(" TYPE.replaceValue(prop_").append(p.name()).append(", " + tn + ".class, v);\n");
1.88 + w.write(" return this;\n");
1.89 + w.write(" }\n");
1.90 + }
1.91 } else {
1.92 castTo = tn;
1.93 boolean isModel[] = { false };
1.94 @@ -623,6 +661,12 @@
1.95 }
1.96 }
1.97 w.write(" }\n");
1.98 + if (builderPrefix != null) {
1.99 + w.write(" public " + className + " " + builderMethod(builderPrefix, p) + "(" + tn + " v) {\n");
1.100 + w.write(" " + gs[1] + "(v);\n");
1.101 + w.write(" return this;\n");
1.102 + w.write(" }\n");
1.103 + }
1.104 }
1.105
1.106 for (int i = 0; i < props.size(); i++) {