X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-data-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fdata%2Fimpl%2Fschema%2FImmutableNormalizedNodeStreamWriter.java;h=73202be3eea184bbe59fbbca57dd7f229f390a02;hb=f7fe89b85f540dbe7d1fc051f2082f2ce571321a;hp=c0f800f07f2031b1116d36e9d149d5bc8fcaa632;hpb=f1c55073f8d7631007c01a401346cc83383e5745;p=yangtools.git 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 c0f800f07f..73202be3ee 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 @@ -11,12 +11,14 @@ import com.google.common.base.Preconditions; import java.util.ArrayDeque; import java.util.Collection; import java.util.Deque; +import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; +import org.opendaylight.yangtools.yang.data.api.schema.LeafNode; import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode; import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; import org.opendaylight.yangtools.yang.data.api.schema.MapNode; @@ -24,7 +26,9 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.data.api.schema.OrderedMapNode; import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode; import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode; +import org.opendaylight.yangtools.yang.data.api.schema.YangModeledAnyXmlNode; import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter; +import org.opendaylight.yangtools.yang.data.api.schema.stream.SchemaAwareNormalizedNodeStreamWriter; import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.CollectionNodeBuilder; import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeAttrBuilder; import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder; @@ -37,9 +41,15 @@ import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableCo import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafSetNodeBuilder; import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableMapEntryNodeBuilder; import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableMapNodeBuilder; +import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableOrderedLeafSetNodeBuilder; import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableOrderedMapNodeBuilder; import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableUnkeyedListEntryNodeBuilder; import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableUnkeyedListNodeBuilder; +import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableYangModeledAnyXmlNodeBuilder; +import org.opendaylight.yangtools.yang.data.util.LeafInterner; +import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; +import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; +import org.opendaylight.yangtools.yang.model.api.YangModeledAnyXmlSchemaNode; /** * @@ -54,10 +64,11 @@ import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableUn * * */ -public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStreamWriter { +public class ImmutableNormalizedNodeStreamWriter implements SchemaAwareNormalizedNodeStreamWriter { @SuppressWarnings("rawtypes") private final Deque builders = new ArrayDeque<>(); + private DataSchemaNode nextSchema; @SuppressWarnings("rawtypes") protected ImmutableNormalizedNodeStreamWriter(final NormalizedNodeContainerBuilder topLevelBuilder) { @@ -84,7 +95,6 @@ public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStream } /** - * * Creates a {@link NormalizedNodeStreamWriter} which creates one instance of top * level {@link NormalizedNode} (type of NormalizedNode) is determined by first * start event. @@ -106,7 +116,6 @@ public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStream return new ImmutableNormalizedNodeStreamWriter(result); } - @SuppressWarnings("rawtypes") private NormalizedNodeContainerBuilder getCurrent() { return builders.peek(); @@ -115,6 +124,7 @@ public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStream @SuppressWarnings("rawtypes") private void enter(final NormalizedNodeContainerBuilder next) { builders.push(next); + nextSchema = null; } @SuppressWarnings("unchecked") @@ -131,34 +141,64 @@ public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStream Preconditions.checkState(current != null, "Reached top level node, which could not be closed in this writer."); final NormalizedNode product = finishedBuilder.build(); current.addChild(product); + nextSchema = null; } @Override public void leafNode(final NodeIdentifier name, final Object value) { checkDataNodeContainer(); - writeChild(ImmutableNodes.leafNode(name, value)); + + final LeafNode sample = ImmutableNodes.leafNode(name, value); + final LeafNode node; + if (nextSchema instanceof LeafSchemaNode) { + node = LeafInterner.forSchema((LeafSchemaNode)nextSchema).intern(sample); + } else { + node = sample; + } + + writeChild(node); + nextSchema = null; } @Override public void startLeafSet(final NodeIdentifier name, final int childSizeHint) { checkDataNodeContainer(); final ListNodeBuilder> builder = UNKNOWN_SIZE == childSizeHint ? - ImmutableLeafSetNodeBuilder.create() : ImmutableLeafSetNodeBuilder.create(childSizeHint); + InterningLeafSetNodeBuilder.create(nextSchema) : + InterningLeafSetNodeBuilder.create(nextSchema, childSizeHint); builder.withNodeIdentifier(name); enter(builder); } @Override - public void leafSetEntryNode(final Object value) { - Preconditions.checkArgument(getCurrent() instanceof ImmutableLeafSetNodeBuilder); - @SuppressWarnings("unchecked") - final ListNodeBuilder> builder = ((ImmutableLeafSetNodeBuilder) getCurrent()); - builder.withChildValue(value); + public void leafSetEntryNode(final QName name, final Object value) { + if (getCurrent() instanceof ImmutableOrderedLeafSetNodeBuilder) { + @SuppressWarnings("unchecked") + ListNodeBuilder> builder = ((ImmutableOrderedLeafSetNodeBuilder) getCurrent()); + builder.withChildValue(value); + } else if (getCurrent() instanceof ImmutableLeafSetNodeBuilder) { + @SuppressWarnings("unchecked") + ListNodeBuilder> builder = ((ImmutableLeafSetNodeBuilder) getCurrent()); + builder.withChildValue(value); + } else { + throw new IllegalArgumentException("LeafSetEntryNode is not valid for parent " + getCurrent()); + } + + nextSchema = null; + } + + @Override + public void startOrderedLeafSet(final NodeIdentifier name, final int childSizeHint) { + checkDataNodeContainer(); + final ListNodeBuilder> builder = Builders.orderedLeafSetBuilder(); + builder.withNodeIdentifier(name); + enter(builder); } @Override public void anyxmlNode(final NodeIdentifier name, final Object value) { checkDataNodeContainer(); + nextSchema = null; } @Override @@ -170,6 +210,18 @@ public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStream enter(builder.withNodeIdentifier(name)); } + @Override + public void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint) { + checkDataNodeContainer(); + + Preconditions.checkArgument(nextSchema instanceof YangModeledAnyXmlSchemaNode, + "Schema of this node should be instance of YangModeledAnyXmlSchemaNode"); + final DataContainerNodeAttrBuilder builder = UNKNOWN_SIZE == childSizeHint ? ImmutableYangModeledAnyXmlNodeBuilder + .create((YangModeledAnyXmlSchemaNode) nextSchema) : ImmutableYangModeledAnyXmlNodeBuilder.create( + (YangModeledAnyXmlSchemaNode) nextSchema, childSizeHint); + enter(builder.withNodeIdentifier(name)); + } + @Override public void startUnkeyedList(final NodeIdentifier name, final int childSizeHint) { checkDataNodeContainer(); @@ -181,8 +233,8 @@ public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStream @Override public void startUnkeyedListItem(final NodeIdentifier name, final int childSizeHint) { - Preconditions.checkArgument(getCurrent() instanceof ImmutableUnkeyedListNodeBuilder); - + Preconditions.checkArgument((getCurrent() instanceof NormalizedNodeResultBuilder) + || getCurrent() instanceof ImmutableUnkeyedListNodeBuilder); final DataContainerNodeAttrBuilder builder = UNKNOWN_SIZE == childSizeHint ? ImmutableUnkeyedListEntryNodeBuilder.create() : ImmutableUnkeyedListEntryNodeBuilder.create(childSizeHint); enter(builder.withNodeIdentifier(name)); @@ -293,4 +345,9 @@ public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStream public void close() { // no-op } + + @Override + public void nextDataSchemaNode(final DataSchemaNode schema) { + nextSchema = Preconditions.checkNotNull(schema); + } }