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=66412fa925b7dd05b3a5170bbb3f9c5329469d42;hb=5d39f3539947e4a8906d54a1fceb18ff0af88ba6;hp=c97819bb381c6b355b9ad8fd0662eedca27e1ca2;hpb=74eba094499aca8e24a4d8c5fb4acdfbf992d580;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 c97819bb38..66412fa925 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,16 @@ import com.google.common.base.Preconditions; import java.util.ArrayDeque; import java.util.Collection; import java.util.Deque; +import javax.xml.transform.dom.DOMSource; +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.AnyXmlNode; 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,6 +28,7 @@ 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.impl.schema.builder.api.CollectionNodeBuilder; import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeAttrBuilder; @@ -31,15 +36,22 @@ import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContaine 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; 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.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; /** * @@ -58,12 +70,17 @@ public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStream @SuppressWarnings("rawtypes") private final Deque builders = new ArrayDeque<>(); + private DataSchemaNode nextSchema; @SuppressWarnings("rawtypes") - private ImmutableNormalizedNodeStreamWriter( final NormalizedNodeContainerBuilder topLevelBuilder) { + protected ImmutableNormalizedNodeStreamWriter(final NormalizedNodeContainerBuilder topLevelBuilder) { builders.push(topLevelBuilder); } + protected ImmutableNormalizedNodeStreamWriter(final NormalizedNodeResult result) { + this(new NormalizedNodeResultBuilder(result)); + } + /** * Creates a {@link NormalizedNodeStreamWriter} which creates instances of supplied * {@link NormalizedNode}s and writes them to supplied builder as child nodes. @@ -75,12 +92,11 @@ public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStream * @param builder Builder to which data will be written. * @return {@link NormalizedNodeStreamWriter} which writes data */ - public static final NormalizedNodeStreamWriter from(final NormalizedNodeContainerBuilder builder) { + public static NormalizedNodeStreamWriter from(final NormalizedNodeContainerBuilder builder) { return new ImmutableNormalizedNodeStreamWriter(builder); } /** - * * Creates a {@link NormalizedNodeStreamWriter} which creates one instance of top * level {@link NormalizedNode} (type of NormalizedNode) is determined by first * start event. @@ -98,11 +114,10 @@ public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStream * @param result {@link NormalizedNodeResult} object which will hold result value. * @return {@link NormalizedNodeStreamWriter} which will write item to supplied result holder. */ - public static final NormalizedNodeStreamWriter from(final NormalizedNodeResult result) { - return new ImmutableNormalizedNodeStreamWriter(new NormalizedNodeResultBuilder(result)); + public static NormalizedNodeStreamWriter from(final NormalizedNodeResult result) { + return new ImmutableNormalizedNodeStreamWriter(result); } - @SuppressWarnings("rawtypes") private NormalizedNodeContainerBuilder getCurrent() { return builders.peek(); @@ -111,10 +126,11 @@ public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStream @SuppressWarnings("rawtypes") private void enter(final NormalizedNodeContainerBuilder next) { builders.push(next); + nextSchema = null; } @SuppressWarnings("unchecked") - private void writeChild(final NormalizedNode child) { + protected void writeChild(final NormalizedNode child) { getCurrent().addChild(child); } @@ -123,42 +139,77 @@ public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStream public void endNode() { final NormalizedNodeContainerBuilder finishedBuilder = builders.poll(); Preconditions.checkState(finishedBuilder != null, "Node which should be closed does not exists."); - NormalizedNodeContainerBuilder current = getCurrent(); + final NormalizedNodeContainerBuilder current = getCurrent(); Preconditions.checkState(current != null, "Reached top level node, which could not be closed in this writer."); - NormalizedNode product = finishedBuilder.build(); + final NormalizedNode product = finishedBuilder.build(); current.addChild(product); + nextSchema = null; } @Override - public void leafNode(final NodeIdentifier name, final Object value) throws IllegalArgumentException { + 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) throws IllegalArgumentException { + public void startLeafSet(final NodeIdentifier name, final int childSizeHint) { checkDataNodeContainer(); - ListNodeBuilder> builder = UNKNOWN_SIZE == childSizeHint ? - ImmutableLeafSetNodeBuilder.create() : ImmutableLeafSetNodeBuilder.create(childSizeHint); + final ListNodeBuilder> builder = UNKNOWN_SIZE == childSizeHint ? + InterningLeafSetNodeBuilder.create(nextSchema) : + InterningLeafSetNodeBuilder.create(nextSchema, childSizeHint); builder.withNodeIdentifier(name); enter(builder); } @Override - public void leafSetEntryNode(final Object value) throws IllegalArgumentException { - Preconditions.checkArgument(getCurrent() instanceof ImmutableLeafSetNodeBuilder); - @SuppressWarnings("unchecked") - 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) throws IllegalArgumentException { + public void anyxmlNode(final NodeIdentifier name, final Object value) { checkDataNodeContainer(); + + final AnyXmlNode node = ImmutableAnyXmlNodeBuilder.create().withNodeIdentifier(name) + .withValue((DOMSource) value).build(); + writeChild(node); + + nextSchema = null; } @Override - public void startContainerNode(final NodeIdentifier name, final int childSizeHint) throws IllegalArgumentException { + public void startContainerNode(final NodeIdentifier name, final int childSizeHint) { checkDataNodeContainer(); final DataContainerNodeAttrBuilder builder = UNKNOWN_SIZE == childSizeHint ? @@ -167,7 +218,19 @@ public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStream } @Override - public void startUnkeyedList(final NodeIdentifier name, final int childSizeHint) throws IllegalArgumentException { + 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(); final CollectionNodeBuilder builder = UNKNOWN_SIZE == childSizeHint ? @@ -176,16 +239,16 @@ public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStream } @Override - public void startUnkeyedListItem(final NodeIdentifier name, final int childSizeHint) throws IllegalStateException { - Preconditions.checkArgument(getCurrent() instanceof ImmutableUnkeyedListNodeBuilder); - + public void startUnkeyedListItem(final NodeIdentifier name, final int childSizeHint) { + Preconditions.checkArgument((getCurrent() instanceof NormalizedNodeResultBuilder) + || getCurrent() instanceof ImmutableUnkeyedListNodeBuilder); final DataContainerNodeAttrBuilder builder = UNKNOWN_SIZE == childSizeHint ? ImmutableUnkeyedListEntryNodeBuilder.create() : ImmutableUnkeyedListEntryNodeBuilder.create(childSizeHint); enter(builder.withNodeIdentifier(name)); } @Override - public void startMapNode(final NodeIdentifier name, final int childSizeHint) throws IllegalArgumentException { + public void startMapNode(final NodeIdentifier name, final int childSizeHint) { checkDataNodeContainer(); final CollectionNodeBuilder builder = UNKNOWN_SIZE == childSizeHint ? @@ -194,8 +257,8 @@ public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStream } @Override - public void startMapEntryNode(final NodeIdentifierWithPredicates identifier, final int childSizeHint) throws IllegalArgumentException { - if(!(getCurrent() instanceof NormalizedNodeResultBuilder)) { + public void startMapEntryNode(final NodeIdentifierWithPredicates identifier, final int childSizeHint) { + if (!(getCurrent() instanceof NormalizedNodeResultBuilder)) { Preconditions.checkArgument(getCurrent() instanceof ImmutableMapNodeBuilder || getCurrent() instanceof ImmutableOrderedMapNodeBuilder); } @@ -205,7 +268,7 @@ public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStream } @Override - public void startOrderedMapNode(final NodeIdentifier name, final int childSizeHint) throws IllegalArgumentException { + public void startOrderedMapNode(final NodeIdentifier name, final int childSizeHint) { checkDataNodeContainer(); final CollectionNodeBuilder builder = UNKNOWN_SIZE == childSizeHint ? @@ -214,7 +277,7 @@ public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStream } @Override - public void startChoiceNode(final NodeIdentifier name, final int childSizeHint) throws IllegalArgumentException { + public void startChoiceNode(final NodeIdentifier name, final int childSizeHint) { checkDataNodeContainer(); final DataContainerNodeBuilder builder = UNKNOWN_SIZE == childSizeHint ? @@ -223,7 +286,7 @@ public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStream } @Override - public void startAugmentationNode(final AugmentationIdentifier identifier) throws IllegalArgumentException { + public void startAugmentationNode(final AugmentationIdentifier identifier) { checkDataNodeContainer(); Preconditions.checkArgument(!(getCurrent() instanceof ImmutableAugmentationNodeBuilder)); enter(Builders.augmentationBuilder().withNodeIdentifier(identifier)); @@ -231,9 +294,10 @@ public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStream private void checkDataNodeContainer() { @SuppressWarnings("rawtypes") + final NormalizedNodeContainerBuilder current = getCurrent(); - if(!(current instanceof NormalizedNodeResultBuilder)) { - Preconditions.checkArgument(current instanceof DataContainerNodeBuilder, "Invalid nesting of data."); + if (!(current instanceof NormalizedNodeResultBuilder)) { + Preconditions.checkArgument(current instanceof DataContainerNodeBuilder, "Invalid nesting of data."); } } @@ -288,4 +352,9 @@ public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStream public void close() { // no-op } + + @Override + public void nextDataSchemaNode(final DataSchemaNode schema) { + nextSchema = Preconditions.checkNotNull(schema); + } }