Make ReusableImmutableNormalizedNodeStreamWriter reuse leaf builders 22/82422/2
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 6 Jun 2019 13:42:50 +0000 (15:42 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 6 Jun 2019 15:19:36 +0000 (17:19 +0200)
LeafSetEntryNode and LeafNode cannot have children, hence we can
easily reuse their instances.

Change-Id: Ic347a3e89648d6a67ca81dc65c6c320647b078b5
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/ImmutableNormalizedNodeStreamWriter.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/InterningLeafNodeBuilder.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/ReusableImmutableNormalizedNodeStreamWriter.java

index 1132bc7733fdd5c2ca871dd8780055b793fe6698..c1f9dc0357aff195ae42cd43d875db03fe13534c 100644 (file)
@@ -36,6 +36,7 @@ import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableAn
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableAugmentationNodeBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableChoiceNodeBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafNodeBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafSetEntryNodeBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafSetNodeBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableMapEntryNodeBuilder;
@@ -145,7 +146,7 @@ public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStream
     @Override
     public void startLeafNode(final NodeIdentifier name) {
         checkDataNodeContainer();
-        enter(name, InterningLeafNodeBuilder.forSchema(nextSchema));
+        enter(name, leafNodeBuilder(nextSchema));
         nextSchema = null;
     }
 
@@ -162,7 +163,7 @@ public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStream
         checkArgument(current instanceof ImmutableLeafSetNodeBuilder
             || current instanceof ImmutableOrderedLeafSetNodeBuilder || current instanceof NormalizedNodeResultBuilder,
             "LeafSetEntryNode is not valid for parent %s", current);
-        enter(name, ImmutableLeafSetEntryNodeBuilder.create());
+        enter(name, leafsetEntryNodeBuilder());
         nextSchema = null;
     }
 
@@ -327,6 +328,19 @@ public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStream
         builders.push(builder);
     }
 
+    private <T> ImmutableLeafNodeBuilder<T> leafNodeBuilder(final DataSchemaNode schema) {
+        final InterningLeafNodeBuilder<T> interning = InterningLeafNodeBuilder.forSchema(schema);
+        return interning != null ? interning : leafNodeBuilder();
+    }
+
+    <T> ImmutableLeafNodeBuilder<T> leafNodeBuilder() {
+        return new ImmutableLeafNodeBuilder<>();
+    }
+
+    <T> ImmutableLeafSetEntryNodeBuilder<T> leafsetEntryNodeBuilder() {
+        return ImmutableLeafSetEntryNodeBuilder.create();
+    }
+
     private void checkDataNodeContainer() {
         @SuppressWarnings("rawtypes")
         final NormalizedNodeContainerBuilder current = currentContainer();
index c2cb30490f0deffe695e351dade40535b28305c2..f50ba27fa2cbe89827917026659e2e85cbbb76aa 100644 (file)
@@ -11,7 +11,6 @@ import static java.util.Objects.requireNonNull;
 
 import com.google.common.collect.Interner;
 import java.util.Optional;
-import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafNodeBuilder;
@@ -26,15 +25,14 @@ final class InterningLeafNodeBuilder<T> extends ImmutableLeafNodeBuilder<T> {
         this.interner = requireNonNull(interner);
     }
 
-    static <T> @NonNull ImmutableLeafNodeBuilder<T> forSchema(final @Nullable DataSchemaNode schema) {
+    static <T> @Nullable InterningLeafNodeBuilder<T> forSchema(final @Nullable DataSchemaNode schema) {
         if (schema instanceof LeafSchemaNode) {
             final Optional<Interner<LeafNode<T>>> interner = LeafInterner.forSchema((LeafSchemaNode)schema);
             if (interner.isPresent()) {
                 return new InterningLeafNodeBuilder<>(interner.get());
             }
         }
-
-        return new ImmutableLeafNodeBuilder<>();
+        return null;
     }
 
     @Override
index 25710269402e675d684353e0b6834b17ec273d8e..fc49467004ae78bd27de24576b5d76490309313c 100644 (file)
@@ -13,6 +13,8 @@ import com.google.common.annotations.Beta;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.api.schema.stream.ReusableStreamReceiver;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafSetEntryNodeBuilder;
 
 /**
  * A reusable variant of {@link ImmutableNormalizedNodeStreamWriter}. It can be reset into its base state and used for
@@ -23,6 +25,9 @@ public final class ReusableImmutableNormalizedNodeStreamWriter extends Immutable
         implements ReusableStreamReceiver {
     private final NormalizedNodeResultBuilder builder;
 
+    private final ImmutableLeafSetEntryNodeBuilder<?> leafsetEntryBuilder = ImmutableLeafSetEntryNodeBuilder.create();
+    private final ImmutableLeafNodeBuilder<?> leafNodeBuilder = new ImmutableLeafNodeBuilder<>();
+
     private ReusableImmutableNormalizedNodeStreamWriter(final NormalizedNodeResultBuilder builder) {
         super(builder);
         this.builder = requireNonNull(builder);
@@ -42,4 +47,16 @@ public final class ReusableImmutableNormalizedNodeStreamWriter extends Immutable
     public NormalizedNode<?, ?> getResult() {
         return builder.result().getResult();
     }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    <T> ImmutableLeafNodeBuilder<T> leafNodeBuilder() {
+        return (ImmutableLeafNodeBuilder<T>) leafNodeBuilder;
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    <T> ImmutableLeafSetEntryNodeBuilder<T> leafsetEntryNodeBuilder() {
+        return (ImmutableLeafSetEntryNodeBuilder<T>) leafsetEntryBuilder;
+    }
 }