Cleanup JsonParserStream 95/57595/2
authorRobert Varga <robert.varga@pantheon.tech>
Sun, 21 May 2017 22:25:07 +0000 (00:25 +0200)
committerRobert Varga <nite@hq.sk>
Tue, 23 May 2017 13:22:39 +0000 (13:22 +0000)
We can speed up namesakes manipulation by checking the return value
of Set.add(). Also use Preconditions.checkState().

Change-Id: I5759c426654914616925ed9144cbd909ec52245f
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JsonParserStream.java

index a05fb34c1961904dc1019eedf7b47d86e81ef4db..bc29d28a65bc94a9ded963e72d1590a77ab23c0e 100644 (file)
@@ -67,15 +67,20 @@ public final class JsonParserStream implements Closeable, Flushable {
     private final DataSchemaNode parentNode;
 
     private JsonParserStream(final NormalizedNodeStreamWriter writer, final SchemaContext schemaContext,
-            final DataSchemaNode parentNode) {
+            final JSONCodecFactory codecs, final DataSchemaNode parentNode) {
         this.schema = Preconditions.checkNotNull(schemaContext);
         this.writer = Preconditions.checkNotNull(writer);
-        this.codecs = JSONCodecFactory.create(schemaContext);
+        this.codecs = Preconditions.checkNotNull(codecs);
         this.parentNode = parentNode;
     }
 
+    private JsonParserStream(final NormalizedNodeStreamWriter writer, final SchemaContext schemaContext,
+            final DataSchemaNode parentNode) {
+        this(writer, schemaContext, JSONCodecFactory.getShared(schemaContext), parentNode);
+    }
+
     public static JsonParserStream create(final NormalizedNodeStreamWriter writer, final SchemaContext schemaContext,
-            final SchemaNode parentNode ) {
+            final SchemaNode parentNode) {
         if (parentNode instanceof RpcDefinition) {
             return new JsonParserStream(writer, schemaContext, new RpcAsContainer((RpcDefinition) parentNode));
         }
@@ -219,19 +224,17 @@ public final class JsonParserStream implements Closeable, Flushable {
                 final NamespaceAndName namespaceAndName = resolveNamespace(jsonElementName, parentSchema);
                 final String localName = namespaceAndName.getName();
                 addNamespace(namespaceAndName.getUri());
-                if (namesakes.contains(jsonElementName)) {
+                if (!namesakes.add(jsonElementName)) {
                     throw new JsonSyntaxException("Duplicate name " + jsonElementName + " in JSON input.");
                 }
-                namesakes.add(jsonElementName);
 
-                final Deque<DataSchemaNode> childDataSchemaNodes =
-                        ParserStreamUtils.findSchemaNodeByNameAndNamespace(parentSchema, localName, getCurrentNamespace());
-                if (childDataSchemaNodes.isEmpty()) {
-                    throw new IllegalStateException("Schema for node with name " + localName + " and namespace "
-                            + getCurrentNamespace() + " doesn't exist.");
-                }
+                final Deque<DataSchemaNode> childDataSchemaNodes = ParserStreamUtils.findSchemaNodeByNameAndNamespace(
+                    parentSchema, localName, getCurrentNamespace());
+                Preconditions.checkState(!childDataSchemaNodes.isEmpty(),
+                    "Schema for node with name %s and namespace %s does not exist.", localName, getCurrentNamespace());
 
-                final AbstractNodeDataWithSchema newChild = ((CompositeNodeDataWithSchema) parent).addChild(childDataSchemaNodes);
+                final AbstractNodeDataWithSchema newChild = ((CompositeNodeDataWithSchema) parent)
+                        .addChild(childDataSchemaNodes);
                 if (newChild instanceof AnyXmlNodeDataWithSchema) {
                     readAnyXmlValue(in, (AnyXmlNodeDataWithSchema) newChild, jsonElementName);
                 } else {
@@ -357,8 +360,6 @@ public final class JsonParserStream implements Closeable, Flushable {
         return namespaces.peek();
     }
 
-
-
     private static class NamespaceAndName {
         private final URI uri;
         private final String name;