json/src/main/java/org/netbeans/html/json/impl/ModelProcessor.java
changeset 1017 10427ce1c0ee
parent 1014 c89b9f91ed18
child 1023 4f906bde3a2e
child 1026 cda94194f901
     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++) {