From 52cb7f67625f434751983a2dcbdd47f8868dc939 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Tue, 14 May 2019 16:43:30 +0200 Subject: [PATCH] Add ReusableImmutableNormalizedNodeStreamWriter 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 --- .../ImmutableNormalizedNodeStreamWriter.java | 6 +++ .../schema/NormalizedNodeMetadataResult.java | 6 +++ .../impl/schema/NormalizedNodeResult.java | 9 +++- .../schema/NormalizedNodeResultBuilder.java | 15 ++++++- ...leImmutableNormalizedNodeStreamWriter.java | 41 +++++++++++++++++++ 5 files changed, 73 insertions(+), 4 deletions(-) create mode 100644 yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/ReusableImmutableNormalizedNodeStreamWriter.java diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/ImmutableNormalizedNodeStreamWriter.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/ImmutableNormalizedNodeStreamWriter.java index 09a6840be2..2b2e5857fb 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/ImmutableNormalizedNodeStreamWriter.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/ImmutableNormalizedNodeStreamWriter.java @@ -302,6 +302,12 @@ public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStream return builders.pop(); } + final void reset(final NormalizedNodeResultBuilder builder) { + nextSchema = null; + builders.clear(); + builders.push(builder); + } + private void checkDataNodeContainer() { @SuppressWarnings("rawtypes") final NormalizedNodeContainerBuilder current = currentContainer(); diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/NormalizedNodeMetadataResult.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/NormalizedNodeMetadataResult.java index 160db0b4d0..84424ed54d 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/NormalizedNodeMetadataResult.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/NormalizedNodeMetadataResult.java @@ -28,4 +28,10 @@ public class NormalizedNodeMetadataResult extends NormalizedNodeResult { void setResult(final NormalizedMetadata metadata) { this.metadata = metadata; } + + @Override + void reset() { + metadata = null; + super.reset(); + } } diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/NormalizedNodeResult.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/NormalizedNodeResult.java index 85d41a78a1..6751515059 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/NormalizedNodeResult.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/NormalizedNodeResult.java @@ -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 index 13d45bbb2b..c4617db968 100644 --- 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 @@ -7,7 +7,10 @@ */ 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; @@ -15,10 +18,18 @@ import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNo @SuppressWarnings("rawtypes") final class NormalizedNodeResultBuilder implements NormalizedNodeContainerBuilder { - private final NormalizedNodeResult result; + private final @NonNull NormalizedNodeResult result; + + NormalizedNodeResultBuilder() { + this.result = new NormalizedNodeResult(); + } NormalizedNodeResultBuilder(final NormalizedNodeResult result) { - this.result = result; + this.result = requireNonNull(result); + } + + @NonNull NormalizedNodeResult result() { + return result; } @Override 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 index 0000000000..c9f7974eea --- /dev/null +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/ReusableImmutableNormalizedNodeStreamWriter.java @@ -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(); + } +} -- 2.36.6