private boolean generateProperties()

in json/src/main/java/org/netbeans/html/json/impl/ModelProcessor.java [643:757]


    private boolean generateProperties(
        Element where, String builderPrefix,
        Writer w, String className, Prprt[] properties,
        List<GetSet> props,
        Map<String,Collection<String[]>> deps,
        Map<String,Collection<String>> functionDeps,
        Set<String> propertyFqns
    ) throws IOException {
        boolean ok = true;
        for (Prprt p : properties) {
            final String tn;
            tn = typeName(p);
            if (tn.contains(".")){
                propertyFqns.add(tn);
            }
            String[] gs = toGetSet(p.name(), tn, p.array());
            String castTo;

            if (p.array()) {
                w.write("  private final java.util.List<" + tn + "> prop_" + p.name() + ";\n");

                castTo = "java.util.List";
                w.write("  public java.util.List<" + tn + "> " + gs[0] + "() {\n");
                w.write("    proto.accessProperty(\"" + p.name() + "\");\n");
                w.write("    return prop_" + p.name() + ";\n");
                w.write("  }\n");
                if (builderPrefix != null) {
                    boolean[] isModel = {false};
                    boolean[] isEnum = {false};
                    boolean isPrimitive[] = {false};
                    String ret = checkType(p, isModel, isEnum, isPrimitive);
                    w.write("  public " + className + " " + builderMethod(builderPrefix, p) + "(" + ret + "... v) {\n");
                    w.write("    proto.accessProperty(\"" + p.name() + "\");\n");
                    w.append("   TYPE.replaceValue(prop_").append(p.name()).append(", " + tn + ".class, v);\n");
                    w.write("    return this;\n");
                    w.write("  }\n");
                }
            } else {
                castTo = tn;
                boolean isModel[] = { false };
                boolean isEnum[] = { false };
                boolean isPrimitive[] = { false };
                checkType(p, isModel, isEnum, isPrimitive);
                if (isModel[0]) {
                    w.write("  private /*" + tn + "*/Object prop_" + p.name() + ";\n");

                } else {
                    w.write("  private " + tn + " prop_" + p.name() + ";\n");
                }
                w.write("  public " + tn + " " + gs[0] + "() {\n");
                w.write("    proto.accessProperty(\"" + p.name() + "\");\n");
                if (isModel[0]) {
                    w.write("    if (prop_" + p.name() + " == TYPE) prop_" + p.name() + " = net.java.html.json.Models.bind(new " + tn +"(), proto.getContext());\n");
                }
                w.write("    return (" + tn + ")prop_" + p.name() + ";\n");
                w.write("  }\n");
                w.write("  public void " + gs[1] + "(" + tn + " v) {\n");
                if (!p.mutable()) {
                    w.write("    proto.initTo(null, null);\n");
                }
                w.write("    proto.verifyUnlocked();\n");
                w.write("    Object o = prop_" + p.name() + ";\n");
                if (isModel[0]) {
                    w.write("    if (o == v) return;\n");
                    w.write("    prop_" + p.name() + " = v;\n");
                } else {
                    w.write("    if (TYPE.isSame(o , v)) return;\n");
                    w.write("    prop_" + p.name() + " = v;\n");
                }
                w.write("    proto.valueHasMutated(\"" + p.name() + "\", o, v);\n");
                {
                    Collection<String[]> dependants = deps.get(p.name());
                    if (dependants != null) {
                        for (String[] pair : dependants) {
                            w.write("    proto.valueHasMutated(\"" + pair[0] + "\", null, " + pair[1] + "());\n");
                        }
                    }
                }
                {
                    Collection<String> dependants = functionDeps.get(p.name());
                    if (dependants != null) {
                        w.append("    ");
                        w.append(className).append(" model = ").append(className).append(".this;\n");
                        for (String call : dependants) {
                            w.append("  ").append(call);
                        }
                    }
                }
                w.write("  }\n");
                if (builderPrefix != null) {
                    w.write("  public " + className + " " + builderMethod(builderPrefix, p) + "(" + tn + " v) {\n");
                    w.write("    " + gs[1] + "(v);\n");
                    w.write("    return this;\n");
                    w.write("  }\n");
                }
            }

            for (int i = 0; i < props.size(); i++) {
                if (props.get(i).name.equals(p.name())) {
                    error("Cannot have the property " + p.name() + " defined twice", where);
                    ok = false;
                }
            }

            props.add(new GetSet(
                p.name(),
                gs[0],
                gs[1],
                tn,
                gs[3] == null && !p.array(),
                !p.mutable()
            ));
        }
        return ok;
    }