Optimize JsonToPatchBodyReader 83/57583/2
authorRobert Varga <robert.varga@pantheon.tech>
Sat, 20 May 2017 11:46:12 +0000 (13:46 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Sat, 20 May 2017 11:53:10 +0000 (13:53 +0200)
Use a StringBuilder instead of a StringBuffer, use switch statements
and du not use string concat when using StringBuilder.append().

Change-Id: Icaf68a7a92dae6aece4e9382ba4a03bac429d4ec
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
restconf/sal-rest-connector/src/main/java/org/opendaylight/restconf/jersey/providers/JsonToPatchBodyReader.java

index 2665e58e2a98febf7584cd07e78800bd8a965102..33265ff8c4f43197253f695086328cf73448d4d1 100644 (file)
@@ -213,7 +213,7 @@ public class JsonToPatchBodyReader extends AbstractIdentifierAwareJaxRsProvider
     private void readEditDefinition(@Nonnull final PatchEdit edit, @Nonnull final JsonReader in,
                                     @Nonnull final InstanceIdentifierContext<?> path,
                                     @Nonnull final StringModuleInstanceIdentifierCodec codec) throws IOException {
-        final StringBuffer value = new StringBuffer();
+        final StringBuilder sb = new StringBuilder();
         in.beginObject();
 
         while (in.hasNext()) {
@@ -242,7 +242,7 @@ public class JsonToPatchBodyReader extends AbstractIdentifierAwareJaxRsProvider
                 case "value" :
                     // save data defined in value node for next (later) processing, because target needs to be read
                     // always first and there is no ordering in Json input
-                    readValueNode(value, in);
+                    readValueNode(sb, in);
                     break;
                 default:
                     break;
@@ -253,98 +253,101 @@ public class JsonToPatchBodyReader extends AbstractIdentifierAwareJaxRsProvider
 
         // read saved data to normalized node when target schema is already known
         edit.setData(
-                readEditData(new JsonReader(new StringReader(value.toString())), edit.getTargetSchemaNode(), path));
+                readEditData(new JsonReader(new StringReader(sb.toString())), edit.getTargetSchemaNode(), path));
     }
 
     /**
      * Parse data defined in value node and saves it to buffer.
-     * @param value Buffer to read value node
+     * @param sb Buffer to read value node
      * @param in JsonReader reader
      * @throws IOException if operation fails
      */
-    private void readValueNode(@Nonnull final StringBuffer value, @Nonnull final JsonReader in) throws IOException {
+    private void readValueNode(@Nonnull final StringBuilder sb, @Nonnull final JsonReader in) throws IOException {
         in.beginObject();
-        value.append("{");
 
-        value.append("\"" + in.nextName() + "\"" + ":");
+        sb.append("{\"").append(in.nextName()).append("\":");
 
-        if (in.peek() == JsonToken.BEGIN_ARRAY) {
-            in.beginArray();
-            value.append("[");
+        switch (in.peek()) {
+            case BEGIN_ARRAY:
+                in.beginArray();
+                sb.append('[');
 
-            while (in.hasNext()) {
-                if (in.peek() == JsonToken.STRING) {
-                    value.append("\"" + in.nextString() + "\"");
-                } else {
-                    readValueObject(value, in);
-                }
-                if (in.peek() != JsonToken.END_ARRAY) {
-                    value.append(",");
+                while (in.hasNext()) {
+                    if (in.peek() == JsonToken.STRING) {
+                        sb.append('"').append(in.nextString()).append('"');
+                    } else {
+                        readValueObject(sb, in);
+                    }
+                    if (in.peek() != JsonToken.END_ARRAY) {
+                        sb.append(',');
+                    }
                 }
-            }
 
-            in.endArray();
-            value.append("]");
-        } else {
-            readValueObject(value, in);
+                in.endArray();
+                sb.append(']');
+                break;
+            default:
+                readValueObject(sb, in);
+                break;
         }
 
         in.endObject();
-        value.append("}");
+        sb.append('}');
     }
 
     /**
      * Parse one value object of data and saves it to buffer.
-     * @param value Buffer to read value object
+     * @param sb Buffer to read value object
      * @param in JsonReader reader
      * @throws IOException if operation fails
      */
-    private void readValueObject(@Nonnull final StringBuffer value, @Nonnull final JsonReader in) throws IOException {
+    private void readValueObject(@Nonnull final StringBuilder sb, @Nonnull final JsonReader in) throws IOException {
         // read simple leaf value
         if (in.peek() == JsonToken.STRING) {
-            value.append("\"" + in.nextString() + "\"");
+            sb.append('"').append(in.nextString()).append('"');
             return;
         }
 
         in.beginObject();
-        value.append("{");
+        sb.append('{');
 
         while (in.hasNext()) {
-            value.append("\"" + in.nextName() + "\"");
-            value.append(":");
+            sb.append('"').append(in.nextName()).append("\":");
 
-            if (in.peek() == JsonToken.STRING) {
-                value.append("\"" + in.nextString() + "\"");
-            } else {
-                if (in.peek() == JsonToken.BEGIN_ARRAY) {
+            switch (in.peek()) {
+                case STRING:
+                    sb.append('"').append(in.nextString()).append('"');
+                    break;
+                case BEGIN_ARRAY:
                     in.beginArray();
-                    value.append("[");
+                    sb.append('[');
 
                     while (in.hasNext()) {
                         if (in.peek() == JsonToken.STRING) {
-                            value.append("\"" + in.nextString() + "\"");
+                            sb.append('"').append(in.nextString()).append('"');
                         } else {
-                            readValueObject(value, in);
+                            readValueObject(sb, in);
                         }
+
                         if (in.peek() != JsonToken.END_ARRAY) {
-                            value.append(",");
+                            sb.append(',');
                         }
                     }
 
                     in.endArray();
-                    value.append("]");
-                } else {
-                    readValueObject(value, in);
-                }
+                    sb.append(']');
+                    break;
+                default:
+                    readValueObject(sb, in);
             }
 
             if (in.peek() != JsonToken.END_OBJECT) {
-                value.append(",");
+                sb.append(',');
             }
         }
 
         in.endObject();
-        value.append("}");
+        sb.append('}');
     }
 
     /**