Add ReusableImmutableNormalizedNodeStreamWriter 78/82078/1
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 15 May 2019 08:44:01 +0000 (10:44 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Wed, 15 May 2019 08:47:17 +0000 (10:47 +0200)
In certain situations it can be beneficial to reuse the same
writer multiple times, resetting it between uses.

This patch adds a reusable version of
ImmutableNormalizedNodeStreamWriter, which provides this service.

JIRA: YANGTOOLS-988
Change-Id: Id74e8ddcaec0e730e805cf300d455c6bf5357156
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
(cherry picked from commit 52cb7f67625f434751983a2dcbdd47f8868dc939)

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/NormalizedNodeResult.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/NormalizedNodeResultBuilder.java [new file with mode: 0644]
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/ReusableImmutableNormalizedNodeStreamWriter.java [new file with mode: 0644]

index 268c5bf650036f20eb289c948f23ff4fb23dfe61..e0a22c87e4962bf2eb5f8b403dcdd8b97c9608bf 100644 (file)
@@ -12,7 +12,6 @@ import static com.google.common.base.Preconditions.checkState;
 import static java.util.Objects.requireNonNull;
 
 import java.util.ArrayDeque;
-import java.util.Collection;
 import java.util.Deque;
 import javax.xml.transform.dom.DOMSource;
 import org.eclipse.jdt.annotation.NonNull;
@@ -40,7 +39,6 @@ import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.CollectionNo
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeAttrBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.ListNodeBuilder;
-import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNodeBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNodeContainerBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableAnyXmlNodeBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableAugmentationNodeBuilder;
@@ -321,47 +319,6 @@ public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStream
             "Invalid nesting of data.");
     }
 
-    @SuppressWarnings("rawtypes")
-    protected static final class NormalizedNodeResultBuilder implements NormalizedNodeContainerBuilder {
-
-        private final NormalizedNodeResult result;
-
-        public NormalizedNodeResultBuilder(final NormalizedNodeResult result) {
-            this.result = result;
-        }
-
-        @Override
-        public NormalizedNodeBuilder withValue(final Object value) {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public NormalizedNodeContainerBuilder withValue(final Collection value) {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public NormalizedNode build() {
-            throw new IllegalStateException("Can not close NormalizedNodeResult");
-        }
-
-        @Override
-        public NormalizedNodeContainerBuilder withNodeIdentifier(final PathArgument nodeIdentifier) {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public NormalizedNodeContainerBuilder addChild(final NormalizedNode child) {
-            result.setResult(child);
-            return this;
-        }
-
-        @Override
-        public NormalizedNodeContainerBuilder removeChild(final PathArgument key) {
-            throw new UnsupportedOperationException();
-        }
-    }
-
     @Override
     public void flush() {
         // no-op
@@ -376,4 +333,10 @@ public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStream
     public void nextDataSchemaNode(final DataSchemaNode schema) {
         nextSchema = requireNonNull(schema);
     }
+
+    final void reset(final NormalizedNodeResultBuilder builder) {
+        nextSchema = null;
+        builders.clear();
+        builders.push(builder);
+    }
 }
index 85d41a78a16c5cada404315015a36daba7ad1b0e..6751515059ed73da06f6acc78b7e61b941831ab5 100644 (file)
@@ -30,6 +30,10 @@ public class NormalizedNodeResult {
         return result;
     }
 
+    public boolean isFinished() {
+        return finished;
+    }
+
     void setResult(final NormalizedNode<?, ?> result) {
         if (finished) {
             throw new ResultAlreadySetException("Normalized Node result was already set.", this.result);
@@ -38,7 +42,8 @@ public class NormalizedNodeResult {
         this.result = result;
     }
 
-    public boolean isFinished() {
-        return finished;
+    void reset() {
+        result = null;
+        finished = false;
     }
 }
diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/NormalizedNodeResultBuilder.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/NormalizedNodeResultBuilder.java
new file mode 100644 (file)
index 0000000..c4617db
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2019 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.data.impl.schema;
+
+import static java.util.Objects.requireNonNull;
+
+import java.util.Collection;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNodeContainerBuilder;
+
+@SuppressWarnings("rawtypes")
+final class NormalizedNodeResultBuilder implements NormalizedNodeContainerBuilder {
+    private final @NonNull NormalizedNodeResult result;
+
+    NormalizedNodeResultBuilder() {
+        this.result = new NormalizedNodeResult();
+    }
+
+    NormalizedNodeResultBuilder(final NormalizedNodeResult result) {
+        this.result = requireNonNull(result);
+    }
+
+    @NonNull NormalizedNodeResult result() {
+        return result;
+    }
+
+    @Override
+    public NormalizedNodeBuilder withValue(final Object value) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public NormalizedNodeContainerBuilder withValue(final Collection value) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public NormalizedNode build() {
+        throw new IllegalStateException("Can not close NormalizedNodeResult");
+    }
+
+    @Override
+    public NormalizedNodeContainerBuilder withNodeIdentifier(final PathArgument nodeIdentifier) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public NormalizedNodeContainerBuilder addChild(final NormalizedNode child) {
+        result.setResult(child);
+        return this;
+    }
+
+    @Override
+    public NormalizedNodeContainerBuilder removeChild(final PathArgument key) {
+        throw new UnsupportedOperationException();
+    }
+}
\ No newline at end of file
diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/ReusableImmutableNormalizedNodeStreamWriter.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/ReusableImmutableNormalizedNodeStreamWriter.java
new file mode 100644 (file)
index 0000000..c9f7974
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2019 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.data.impl.schema;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.annotations.Beta;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+
+/**
+ * A reusable variant of {@link ImmutableNormalizedNodeStreamWriter}. It can be reset into its base state and used for
+ * multiple streaming sessions.
+ */
+@Beta
+public final class ReusableImmutableNormalizedNodeStreamWriter extends ImmutableNormalizedNodeStreamWriter {
+    private final NormalizedNodeResultBuilder builder;
+
+    private ReusableImmutableNormalizedNodeStreamWriter(final NormalizedNodeResultBuilder builder) {
+        super(builder);
+        this.builder = requireNonNull(builder);
+    }
+
+    public static @NonNull ReusableImmutableNormalizedNodeStreamWriter create() {
+        return new ReusableImmutableNormalizedNodeStreamWriter(new NormalizedNodeResultBuilder());
+    }
+
+    public void reset() {
+        builder.result().reset();
+        reset(builder);
+    }
+
+    public NormalizedNode<?, ?> getResult() {
+        return builder.result().getResult();
+    }
+}