Rather than using 5 strings next to each other, encapsulate the value into a struct union
authorJaroslav Tulach <jaroslav.tulach@netbeans.org>
Tue, 28 Jan 2014 14:36:47 +0100
branchunion
changeset 500643d88ddac2a
parent 499 07c20dc62794
child 501 688d1b6299d7
Rather than using 5 strings next to each other, encapsulate the value into a struct
json/src/main/java/org/netbeans/html/json/impl/ModelProcessor.java
     1.1 --- a/json/src/main/java/org/netbeans/html/json/impl/ModelProcessor.java	Tue Jan 28 09:03:10 2014 +0100
     1.2 +++ b/json/src/main/java/org/netbeans/html/json/impl/ModelProcessor.java	Tue Jan 28 14:36:47 2014 +0100
     1.3 @@ -205,7 +205,7 @@
     1.4          try {
     1.5              StringWriter body = new StringWriter();
     1.6              StringBuilder onReceiveType = new StringBuilder();
     1.7 -            List<String> propsGetSet = new ArrayList<String>();
     1.8 +            List<PropInfo> propsGetSet = new ArrayList<PropInfo>();
     1.9              List<String> functions = new ArrayList<String>();
    1.10              Map<String, Collection<String>> propsDeps = new HashMap<String, Collection<String>>();
    1.11              Map<String, Collection<String>> functionDeps = new HashMap<String, Collection<String>>();
    1.12 @@ -235,7 +235,10 @@
    1.13                  w.append("package " + pkg + ";\n");
    1.14                  w.append("import net.java.html.json.*;\n");
    1.15                  w.append("public final ");
    1.16 -                generateClassBody(w, className, body, e, props, functionDeps, propsDeps, propsGetSet, functions, onReceiveType);
    1.17 +                generateClassBody(w, className, body, e, props, 
    1.18 +                    functionDeps, propsDeps, propsGetSet, 
    1.19 +                    functions, onReceiveType
    1.20 +                );
    1.21              } finally {
    1.22                  w.close();
    1.23              }
    1.24 @@ -246,7 +249,15 @@
    1.25          return ok;
    1.26      }
    1.27  
    1.28 -    private void generateClassBody(Writer w, String className, StringWriter body, Element e, Prprt[] props, Map<String, Collection<String>> functionDeps, Map<String, Collection<String>> propsDeps, List<String> propsGetSet, List<String> functions, StringBuilder onReceiveType) throws IOException {
    1.29 +    private void generateClassBody(
    1.30 +        Writer w, String className, StringWriter body, 
    1.31 +        Element e, Prprt[] props, 
    1.32 +        Map<String, Collection<String>> functionDeps, 
    1.33 +        Map<String, Collection<String>> propsDeps, 
    1.34 +        List<PropInfo> propsGetSet, 
    1.35 +        List<String> functions, 
    1.36 +        StringBuilder onReceiveType
    1.37 +    ) throws IOException {
    1.38          w.append("class ").append(className).append(" implements Cloneable {\n");
    1.39          w.append("  private static final Html4JavaType TYPE = new Html4JavaType();\n");
    1.40          w.append("  private final org.apidesign.html.json.spi.Proto proto;\n");
    1.41 @@ -336,12 +347,12 @@
    1.42          }
    1.43          w.append("  private static class Html4JavaType extends org.apidesign.html.json.spi.Proto.Type<").append(className).append("> {\n");
    1.44          w.append("    private Html4JavaType() {\n      super(").append(className).append(".class, ").
    1.45 -            append(inPckName(e)).append(".class, " + (propsGetSet.size() / 5) + ", "
    1.46 +            append(inPckName(e)).append(".class, " + (propsGetSet.size()) + ", "
    1.47                  + (functions.size() / 2) + ");\n");
    1.48          {
    1.49 -            for (int i = 0; i < propsGetSet.size(); i += 5) {
    1.50 -                w.append("      registerProperty(\"").append(propsGetSet.get(i)).append("\", ");
    1.51 -                w.append((i / 5) + ", " + (propsGetSet.get(i + 2) == null) + ");\n");
    1.52 +            for (int i = 0; i < propsGetSet.size(); i++) {
    1.53 +                w.append("      registerProperty(\"").append(propsGetSet.get(i).p0).append("\", ");
    1.54 +                w.append(i + ", " + (propsGetSet.get(i).p2 == null) + ");\n");
    1.55              }
    1.56          }
    1.57          {
    1.58 @@ -353,25 +364,25 @@
    1.59          w.append("    }\n");
    1.60          w.append("    @Override public void setValue(" + className + " data, int type, Object value) {\n");
    1.61          w.append("      switch (type) {\n");
    1.62 -        for (int i = 0; i < propsGetSet.size(); i += 5) {
    1.63 -            final String set = propsGetSet.get(i + 2);
    1.64 -            String tn = propsGetSet.get(i + 4);
    1.65 +        for (int i = 0; i < propsGetSet.size(); i++) {
    1.66 +            final String set = propsGetSet.get(i).p2;
    1.67 +            String tn = propsGetSet.get(i).p4;
    1.68              String btn = findBoxedType(tn);
    1.69              if (btn != null) {
    1.70                  tn = btn;
    1.71              }
    1.72              if (set != null) {
    1.73 -                w.append("        case " + (i / 5) + ": data." + strip(set) + "(TYPE.extractValue(" + tn + ".class, value)); return;\n");
    1.74 +                w.append("        case " + i + ": data." + strip(set) + "(TYPE.extractValue(" + tn + ".class, value)); return;\n");
    1.75              }
    1.76          }
    1.77          w.append("      }\n");
    1.78          w.append("    }\n");
    1.79          w.append("    @Override public Object getValue(" + className + " data, int type) {\n");
    1.80          w.append("      switch (type) {\n");
    1.81 -        for (int i = 0; i < propsGetSet.size(); i += 5) {
    1.82 -            final String get = propsGetSet.get(i + 1);
    1.83 +        for (int i = 0; i < propsGetSet.size(); i++) {
    1.84 +            final String get = propsGetSet.get(i).p1;
    1.85              if (get != null) {
    1.86 -                w.append("        case " + (i / 5) + ": return data." + strip(get) + "();\n");
    1.87 +                w.append("        case " + i + ": return data." + strip(get) + "();\n");
    1.88              }
    1.89          }
    1.90          w.append("      }\n");
    1.91 @@ -414,8 +425,8 @@
    1.92          w.append("  private ").append(className).append("(net.java.html.BrwsrCtx c, Object json) {\n");
    1.93          w.append("    this(c);\n");
    1.94          int values = 0;
    1.95 -        for (int i = 0; i < propsGetSet.size(); i += 5) {
    1.96 -            Prprt p = findPrprt(props, propsGetSet.get(i));
    1.97 +        for (int i = 0; i < propsGetSet.size(); i++) {
    1.98 +            Prprt p = findPrprt(props, propsGetSet.get(i).p0);
    1.99              if (p == null) {
   1.100                  continue;
   1.101              }
   1.102 @@ -423,16 +434,16 @@
   1.103          }
   1.104          w.append("    Object[] ret = new Object[" + values + "];\n");
   1.105          w.append("    proto.extract(json, new String[] {\n");
   1.106 -        for (int i = 0; i < propsGetSet.size(); i += 5) {
   1.107 -            Prprt p = findPrprt(props, propsGetSet.get(i));
   1.108 +        for (int i = 0; i < propsGetSet.size(); i++) {
   1.109 +            Prprt p = findPrprt(props, propsGetSet.get(i).p0);
   1.110              if (p == null) {
   1.111                  continue;
   1.112              }
   1.113 -            w.append("      \"").append(propsGetSet.get(i)).append("\",\n");
   1.114 +            w.append("      \"").append(propsGetSet.get(i).p0).append("\",\n");
   1.115          }
   1.116          w.append("    }, ret);\n");
   1.117 -        for (int i = 0, cnt = 0, prop = 0; i < propsGetSet.size(); i += 5) {
   1.118 -            final String pn = propsGetSet.get(i);
   1.119 +        for (int i = 0, cnt = 0, prop = 0; i < propsGetSet.size(); i++) {
   1.120 +            final String pn = propsGetSet.get(i).p0;
   1.121              Prprt p = findPrprt(props, pn);
   1.122              if (p == null) {
   1.123                  continue;
   1.124 @@ -541,7 +552,7 @@
   1.125          try {
   1.126              StringWriter body = new StringWriter();
   1.127              StringBuilder onReceiveType = new StringBuilder();
   1.128 -            List<String> propsGetSet = new ArrayList<String>();
   1.129 +            List<PropInfo> propsGetSet = new ArrayList<PropInfo>();
   1.130              List<String> functions = new ArrayList<String>();
   1.131              Map<String, Collection<String>> propsDeps = new HashMap<String, Collection<String>>();
   1.132              Map<String, Collection<String>> functionDeps = new HashMap<String, Collection<String>>();
   1.133 @@ -687,12 +698,12 @@
   1.134                  }
   1.135                  w.append("  private static class Html4JavaType extends org.apidesign.html.json.spi.Proto.Type<").append(className).append("> {\n");
   1.136                  w.append("    private Html4JavaType() {\n      super(").append(className).append(".class, ").
   1.137 -                    append(inPckName(e)).append(".class, " + (propsGetSet.size() / 5) + ", "
   1.138 +                    append(inPckName(e)).append(".class, " + (propsGetSet.size()) + ", "
   1.139                      + (functions.size() / 2) + ");\n");
   1.140                  {
   1.141 -                    for (int i = 0; i < propsGetSet.size(); i += 5) {
   1.142 -                        w.append("      registerProperty(\"").append(propsGetSet.get(i)).append("\", ");
   1.143 -                        w.append((i / 5) + ", " + (propsGetSet.get(i + 2) == null) + ");\n");
   1.144 +                    for (int i = 0; i < propsGetSet.size(); i++) {
   1.145 +                        w.append("      registerProperty(\"").append(propsGetSet.get(i).p0).append("\", ");
   1.146 +                        w.append(i + ", " + (propsGetSet.get(i).p2 == null) + ");\n");
   1.147                      }
   1.148                  }
   1.149                  {
   1.150 @@ -704,25 +715,25 @@
   1.151                  w.append("    }\n");
   1.152                  w.append("    @Override public void setValue(" + className + " data, int type, Object value) {\n");
   1.153                  w.append("      switch (type) {\n");
   1.154 -                for (int i = 0; i < propsGetSet.size(); i += 5) {
   1.155 -                    final String set = propsGetSet.get(i + 2);
   1.156 -                    String tn = propsGetSet.get(i + 4);
   1.157 +                for (int i = 0; i < propsGetSet.size(); i++) {
   1.158 +                    final String set = propsGetSet.get(i).p2;
   1.159 +                    String tn = propsGetSet.get(i).p4;
   1.160                      String btn = findBoxedType(tn);
   1.161                      if (btn != null) {
   1.162                          tn = btn;
   1.163                      }
   1.164                      if (set != null) {
   1.165 -                        w.append("        case " + (i / 5) + ": data." + strip(set) + "(TYPE.extractValue(" + tn + ".class, value)); return;\n");
   1.166 +                        w.append("        case " + i + ": data." + strip(set) + "(TYPE.extractValue(" + tn + ".class, value)); return;\n");
   1.167                      }
   1.168                  }
   1.169                  w.append("      }\n");
   1.170                  w.append("    }\n");
   1.171                  w.append("    @Override public Object getValue(" + className + " data, int type) {\n");
   1.172                  w.append("      switch (type) {\n");
   1.173 -                for (int i = 0; i < propsGetSet.size(); i += 5) {
   1.174 -                    final String get = propsGetSet.get(i + 1);
   1.175 +                for (int i = 0; i < propsGetSet.size(); i++) {
   1.176 +                    final String get = propsGetSet.get(i).p1;
   1.177                      if (get != null) {
   1.178 -                        w.append("        case " + (i / 5) + ": return data." + strip(get) + "();\n");
   1.179 +                        w.append("        case " + i + ": return data." + strip(get) + "();\n");
   1.180                      }
   1.181                  }
   1.182                  w.append("      }\n");
   1.183 @@ -766,8 +777,8 @@
   1.184                  w.append("  }\n");
   1.185                  w.append("  private final Object readUnion(Object json) {\n");
   1.186                  int values = 1;
   1.187 -                for (int i = 0; i < propsGetSet.size(); i += 5) {
   1.188 -                    Prprt p = findPrprt(props, propsGetSet.get(i));
   1.189 +                for (int i = 0; i < propsGetSet.size(); i++) {
   1.190 +                    Prprt p = findPrprt(props, propsGetSet.get(i).p0);
   1.191                      if (p == null) {
   1.192                          continue;
   1.193                      }
   1.194 @@ -776,12 +787,12 @@
   1.195                  w.append("    Object[] ret = new Object[" + values + "];\n");
   1.196                  w.append("    proto.extract(json, new String[] {\n");
   1.197                  w.append("      \"").append(e.getSimpleName()).append("\",\n");
   1.198 -                for (int i = 0; i < propsGetSet.size(); i += 5) {
   1.199 -                    Prprt p = findPrprt(props, propsGetSet.get(i));
   1.200 +                for (int i = 0; i < propsGetSet.size(); i++) {
   1.201 +                    Prprt p = findPrprt(props, propsGetSet.get(i).p0);
   1.202                      if (p == null) {
   1.203                          continue;
   1.204                      }
   1.205 -                    w.append("      \"").append(propsGetSet.get(i)).append("\",\n");
   1.206 +                    w.append("      \"").append(propsGetSet.get(i).p0).append("\",\n");
   1.207                  }
   1.208                  w.append("    }, ret);\n");
   1.209                  w.append("    Object union;\n");
   1.210 @@ -796,8 +807,8 @@
   1.211                  }
   1.212                  w.append("      default: throw new IllegalStateException(ret[0].toString());\n");
   1.213                  w.append("    }\n" );
   1.214 -                for (int i = 0, cnt = 1, prop = 0; i < propsGetSet.size(); i += 5) {
   1.215 -                    final String pn = propsGetSet.get(i);
   1.216 +                for (int i = 0, cnt = 1, prop = 0; i < propsGetSet.size(); i++) {
   1.217 +                    final String pn = propsGetSet.get(i).p0;
   1.218                      Prprt p = findPrprt(props, pn);
   1.219                      if (p == null) {
   1.220                          continue;
   1.221 @@ -947,7 +958,7 @@
   1.222          
   1.223          StringWriter body = new StringWriter();
   1.224          StringBuilder onReceiveType = new StringBuilder();
   1.225 -        List<String> propsGetSet = new ArrayList<String>();
   1.226 +        List<PropInfo> propsGetSet = new ArrayList<PropInfo>();
   1.227          List<String> functions = new ArrayList<String>();
   1.228          Map<String, Collection<String>> propsDeps = new HashMap<String, Collection<String>>();
   1.229          Map<String, Collection<String>> functionDeps = new HashMap<String, Collection<String>>();
   1.230 @@ -982,7 +993,7 @@
   1.231      private boolean generateProperties(
   1.232          Element where,
   1.233          Writer w, String className, Prprt[] properties,
   1.234 -        Collection<String> props, 
   1.235 +        Collection<PropInfo> props, 
   1.236          Map<String,Collection<String>> deps,
   1.237          Map<String,Collection<String>> functionDeps
   1.238      ) throws IOException {
   1.239 @@ -1028,19 +1039,21 @@
   1.240                  }
   1.241                  w.write("  }\n");
   1.242              }
   1.243 -            
   1.244 -            props.add(p.name());
   1.245 -            props.add(gs[2]);
   1.246 -            props.add(gs[3]);
   1.247 -            props.add(gs[0]);
   1.248 -            props.add(castTo);
   1.249 +
   1.250 +            props.add(new PropInfo(
   1.251 +                p.name(),
   1.252 +                gs[2],
   1.253 +                gs[3],
   1.254 +                gs[0],
   1.255 +                castTo
   1.256 +            ));
   1.257          }
   1.258          return ok;
   1.259      }
   1.260  
   1.261      private boolean generateComputedProperties(
   1.262          Writer w, Prprt[] fixedProps,
   1.263 -        Collection<? extends Element> arr, Collection<String> props,
   1.264 +        Collection<? extends Element> arr, Collection<PropInfo> props,
   1.265          Map<String,Collection<String>> deps
   1.266      ) throws IOException {
   1.267          boolean ok = true;
   1.268 @@ -1128,11 +1141,13 @@
   1.269              w.write("    }\n");
   1.270              w.write("  }\n");
   1.271  
   1.272 -            props.add(e.getSimpleName().toString());
   1.273 -            props.add(gs[2]);
   1.274 -            props.add(null);
   1.275 -            props.add(gs[0]);
   1.276 -            props.add(tn);
   1.277 +            props.add(new PropInfo(
   1.278 +                e.getSimpleName().toString(),
   1.279 +                gs[2],
   1.280 +                null,
   1.281 +                gs[0],
   1.282 +                tn
   1.283 +            ));
   1.284          }
   1.285          
   1.286          return ok;
   1.287 @@ -2309,5 +2324,22 @@
   1.288          error(err, errElem);
   1.289          return false;
   1.290      }
   1.291 -    
   1.292 +
   1.293 +    private static final class PropInfo {
   1.294 +        final String p0;
   1.295 +        final String p1;
   1.296 +        final String p2;
   1.297 +        final String p3;
   1.298 +        final String p4;
   1.299 +
   1.300 +        PropInfo(
   1.301 +            String p1, String p2, Object p3, String p4, String p5
   1.302 +        ) {
   1.303 +            this.p0 = p1;
   1.304 +            this.p1 = p2;
   1.305 +            this.p2 = p3 == null ? null : p3.toString();
   1.306 +            this.p3 = p4;
   1.307 +            this.p4 = p5;
   1.308 +        }
   1.309 +    }
   1.310  }