From: Peter Kajsa Date: Mon, 23 Nov 2015 11:36:35 +0000 (+0100) Subject: Bug 3874: Support of yang modeled AnyXML - API X-Git-Tag: release/beryllium~105 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=2c1d8cbaeacc2a688db2034329bd972a3ef69e48;hp=fbce68a099f5f0c5a9bc1d297d459bee0db8b02e;p=yangtools.git Bug 3874: Support of yang modeled AnyXML - API - created API and object structures for representation of yang modeled anyXml. Change-Id: I64e61cf058d052a72b75085d816ce33f9e5f72c0 Signed-off-by: Peter Kajsa Signed-off-by: Robert Varga --- diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/YangModeledAnyXmlNode.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/YangModeledAnyXmlNode.java new file mode 100644 index 0000000000..4bb7f049b0 --- /dev/null +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/YangModeledAnyXmlNode.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2015 Cisco Systems, Inc. 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.api.schema; + +import com.google.common.annotations.Beta; +import java.util.Collection; +import javax.annotation.Nonnull; +import org.opendaylight.yangtools.yang.data.api.AttributesContainer; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; +import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; + +/** + * AnyXML node with schema of contained XML data. + */ +@Beta +public interface YangModeledAnyXmlNode extends AttributesContainer, DataContainerNode, + DataContainerChild>> { + + /** + * @return DataSchemaNode - schema of contained XML data + */ + @Nonnull + ContainerSchemaNode getSchemaOfAnyXmlData(); +} diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/ForwardingNormalizedNodeStreamAttributeWriter.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/ForwardingNormalizedNodeStreamAttributeWriter.java index 0c7ed69fb9..3598630dd9 100644 --- a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/ForwardingNormalizedNodeStreamAttributeWriter.java +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/ForwardingNormalizedNodeStreamAttributeWriter.java @@ -34,6 +34,12 @@ abstract class ForwardingNormalizedNodeStreamAttributeWriter extends ForwardingN delegate().startContainerNode(name, childSizeHint, attributes); } + @Override + public void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint, + final Map attributes) throws IOException { + delegate().startYangModeledAnyXmlNode(name, childSizeHint, attributes); + } + @Override public void startUnkeyedListItem(final NodeIdentifier name, final int childSizeHint, final Map attributes) throws IOException { diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/ForwardingNormalizedNodeStreamWriter.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/ForwardingNormalizedNodeStreamWriter.java index 28ccf74f54..95796c53a8 100644 --- a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/ForwardingNormalizedNodeStreamWriter.java +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/ForwardingNormalizedNodeStreamWriter.java @@ -78,6 +78,11 @@ abstract class ForwardingNormalizedNodeStreamWriter extends ForwardingObject imp delegate().anyxmlNode(name, value); } + @Override + public void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint) throws IOException { + delegate().startYangModeledAnyXmlNode(name, childSizeHint); + } + @Override public void endNode() throws IOException { delegate().endNode(); diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/LoggingNormalizedNodeStreamWriter.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/LoggingNormalizedNodeStreamWriter.java index 7d7a4eeb7d..19536df9c2 100644 --- a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/LoggingNormalizedNodeStreamWriter.java +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/LoggingNormalizedNodeStreamWriter.java @@ -127,6 +127,12 @@ public final class LoggingNormalizedNodeStreamWriter implements NormalizedNodeSt LOG.debug("{}{}(anyxml)=", ind(), name, value); } + @Override + public void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint) { + LOG.debug("{}{}(yangModeledAnyXml)", ind(), name); + incIndent(); + } + @Override public void flush() { LOG.trace("<>"); diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/NormalizedNodeStreamAttributeWriter.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/NormalizedNodeStreamAttributeWriter.java index ae4f37d51e..5074acaa17 100644 --- a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/NormalizedNodeStreamAttributeWriter.java +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/NormalizedNodeStreamAttributeWriter.java @@ -23,6 +23,8 @@ public interface NormalizedNodeStreamAttributeWriter extends NormalizedNodeStrea void startContainerNode(YangInstanceIdentifier.NodeIdentifier name, int childSizeHint, Map attributes) throws IOException; + void startYangModeledAnyXmlNode(YangInstanceIdentifier.NodeIdentifier name, int childSizeHint, Map attributes) throws IOException; + void startUnkeyedListItem(YangInstanceIdentifier.NodeIdentifier name, int childSizeHint, Map attributes) throws IOException; void startMapEntryNode(YangInstanceIdentifier.NodeIdentifierWithPredicates identifier, int childSizeHint, Map attributes) throws IOException; diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/NormalizedNodeStreamWriter.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/NormalizedNodeStreamWriter.java index 5f4e66c5c6..983378703e 100644 --- a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/NormalizedNodeStreamWriter.java +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/NormalizedNodeStreamWriter.java @@ -257,7 +257,13 @@ public interface NormalizedNodeStreamWriter extends Closeable, Flushable { * name of node as defined in schema, namespace and revision are * derived from parent node. * @param childSizeHint + * Non-negative count of expected direct child nodes or + * {@link #UNKNOWN_SIZE} if count is unknown. This is only hint + * and should not fail writing of child events, if there are more + * events than count. * @throws IllegalArgumentException + * If emitted node is invalid in current context or was emitted + * multiple times. * @throws IllegalStateException * If node was emitted inside map, * choice unkeyed list node. @@ -287,6 +293,11 @@ public interface NormalizedNodeStreamWriter extends Closeable, Flushable { * * @param identifier * QName to value pairs of keys of map entry node. Values MUST BE constant over time. + * @param childSizeHint + * Non-negative count of expected direct child nodes or + * {@link #UNKNOWN_SIZE} if count is unknown. This is only hint + * and should not fail writing of child events, if there are more + * events than count. * @throws IllegalArgumentException * If key contains incorrect value. * @throws IllegalStateException @@ -308,7 +319,14 @@ public interface NormalizedNodeStreamWriter extends Closeable, Flushable { * @param name * name of node as defined in schema, namespace and revision are * derived from parent node. + * @param childSizeHint + * Non-negative count of expected direct child nodes or + * {@link #UNKNOWN_SIZE} if count is unknown. This is only hint + * and should not fail writing of child events, if there are more + * events than count. * @throws IllegalArgumentException + * If emitted node is invalid in current context or was emitted + * multiple times. * @throws IllegalStateException * If node was emitted inside map, * choice unkeyed list node. @@ -324,7 +342,13 @@ public interface NormalizedNodeStreamWriter extends Closeable, Flushable { * name of node as defined in schema, namespace and revision are * derived from parent node. * @param childSizeHint + * Non-negative count of expected direct child nodes or + * {@link #UNKNOWN_SIZE} if count is unknown. This is only hint + * and should not fail writing of child events, if there are more + * events than count. * @throws IllegalArgumentException + * If emitted node is invalid in current context or was emitted + * multiple times. * @throws IllegalStateException * If node was emitted inside map, * choice unkeyed list node. @@ -362,8 +386,13 @@ public interface NormalizedNodeStreamWriter extends Closeable, Flushable { * Emits anyxml node event. * * @param name + * name of node as defined in schema, namespace and revision are + * derived from parent node. * @param value + * Value of AnyXml node. * @throws IllegalArgumentException + * If emitted node is invalid in current context or was emitted + * multiple times. * @throws IllegalStateException * If node was emitted inside map, * choice unkeyed list node. @@ -371,6 +400,41 @@ public interface NormalizedNodeStreamWriter extends Closeable, Flushable { */ void anyxmlNode(NodeIdentifier name, Object value) throws IOException; + /** + * + * Emits start of new yang modeled anyXml node. + * + *

+ * End of yang modeled anyXml node event is emitted by invoking {@link #endNode()}. + * + *

+ * Valid sub-events are: + *

    + *
  • {@link #leafNode}
  • + *
  • {@link #startContainerNode}
  • + *
  • {@link #startLeafSet}
  • + *
  • {@link #startMapNode}
  • + *
  • {@link #startUnkeyedList}
  • + *
+ * + * @param name + * name of node as defined in schema, namespace and revision are + * derived from parent node. + * @param childSizeHint + * Non-negative count of expected direct child nodes or + * {@link #UNKNOWN_SIZE} if count is unknown. This is only hint + * and should not fail writing of child events, if there are more + * events than count. + * @throws IllegalArgumentException + * If emitted node is invalid in current context or was emitted + * multiple times. + * @throws IllegalStateException + * If node was emitted inside map, + * choice unkeyed list node. + * @throws IOException if an underlying IO error occurs + */ + void startYangModeledAnyXmlNode(NodeIdentifier name, int childSizeHint) throws IOException; + /** * Emits end event for node. * diff --git a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONNormalizedNodeStreamWriter.java b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONNormalizedNodeStreamWriter.java index e3913c8165..0a8f9877e9 100644 --- a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONNormalizedNodeStreamWriter.java +++ b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONNormalizedNodeStreamWriter.java @@ -180,6 +180,12 @@ public final class JSONNormalizedNodeStreamWriter implements NormalizedNodeStrea writer.value(String.valueOf(value)); } + @Override + public void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint) throws IOException { + tracker.startYangModeledAnyXmlNode(name); + context = new JSONStreamWriterNamedObjectContext(context, name, true); + } + @Override public void endNode() throws IOException { tracker.endNode(); diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/SchemaTracker.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/SchemaTracker.java index 5c02d7eb39..472be45cba 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/SchemaTracker.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/SchemaTracker.java @@ -39,6 +39,7 @@ import org.opendaylight.yangtools.yang.model.api.RpcDefinition; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.model.api.SchemaNode; import org.opendaylight.yangtools.yang.model.api.SchemaPath; +import org.opendaylight.yangtools.yang.model.api.YangModeledAnyXmlSchemaNode; import org.opendaylight.yangtools.yang.model.util.EffectiveAugmentationSchema; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -231,6 +232,19 @@ public final class SchemaTracker { Preconditions.checkArgument(isAllowed, "Node %s is not a container nor a notification", schema.getPath()); schemaStack.push(schema); + + return schema; + } + + public SchemaNode startYangModeledAnyXmlNode(final NodeIdentifier name) { + LOG.debug("Enter yang modeled anyXml {}", name); + final SchemaNode schema = getSchema(name); + + Preconditions.checkArgument(schema instanceof YangModeledAnyXmlSchemaNode, + "Node %s is not an yang modeled anyXml.", schema.getPath()); + + schemaStack.push(((YangModeledAnyXmlSchemaNode) schema).getSchemaOfAnyXmlData()); + return schema; } diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/xml/XMLStreamNormalizedNodeStreamWriter.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/xml/XMLStreamNormalizedNodeStreamWriter.java index ee464ce6fc..17343e7f30 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/xml/XMLStreamNormalizedNodeStreamWriter.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/xml/XMLStreamNormalizedNodeStreamWriter.java @@ -79,6 +79,7 @@ public final class XMLStreamNormalizedNodeStreamWriter implements NormalizedNode * * @param writer Output {@link XMLStreamWriter} * @param context Associated {@link SchemaContext}. + * @param path path * * @return A new {@link NormalizedNodeStreamWriter} */ @@ -176,6 +177,12 @@ public final class XMLStreamNormalizedNodeStreamWriter implements NormalizedNode writeAttributes(attributes); } + @Override + public void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint, final Map attributes) throws IOException { + startYangModeledAnyXmlNode(name, childSizeHint); + writeAttributes(attributes); + } + @Override public void startUnkeyedListItem(final NodeIdentifier name, final int childSizeHint, final Map attributes) throws IOException { startUnkeyedListItem(name, childSizeHint); @@ -279,6 +286,12 @@ public final class XMLStreamNormalizedNodeStreamWriter implements NormalizedNode } } + @Override + public void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint) throws IOException { + final SchemaNode schema = tracker.startYangModeledAnyXmlNode(name); + startElement(schema.getQName()); + } + public static String toString(final Element xml) { try { final Transformer transformer = TransformerFactory.newInstance().newTransformer(); diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/Builders.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/Builders.java index da82eaac9c..b732ace51d 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/Builders.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/Builders.java @@ -24,6 +24,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.MapNode; 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.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; @@ -53,6 +54,7 @@ import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableOr import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableOrderedMapNodeSchemaAwareBuilder; 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.model.api.AnyXmlSchemaNode; import org.opendaylight.yangtools.yang.model.api.AugmentationSchema; import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode; @@ -60,6 +62,7 @@ import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode; import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; +import org.opendaylight.yangtools.yang.model.api.YangModeledAnyXmlSchemaNode; public final class Builders { @@ -94,6 +97,11 @@ public final class Builders { return ImmutableAnyXmlNodeSchemaAwareBuilder.create(schema); } + public static DataContainerNodeAttrBuilder yangModeledAnyXmlBuilder( + final YangModeledAnyXmlSchemaNode schema) { + return ImmutableYangModeledAnyXmlNodeBuilder.create(schema); + } + public static ListNodeBuilder> leafSetBuilder() { return ImmutableLeafSetNodeBuilder.create(); } 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 13327f54aa..3fd8e6d9da 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 @@ -25,6 +25,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.api.schema.stream.SchemaAwareNormalizedNodeStreamWriter; import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.CollectionNodeBuilder; @@ -42,9 +43,11 @@ import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableMa 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; /** * @@ -189,6 +192,18 @@ public class ImmutableNormalizedNodeStreamWriter implements SchemaAwareNormalize 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(); diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableYangModeledAnyXmlNodeBuilder.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableYangModeledAnyXmlNodeBuilder.java new file mode 100644 index 0000000000..65a730fa12 --- /dev/null +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableYangModeledAnyXmlNodeBuilder.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2015 Cisco Systems, Inc. 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.builder.impl; + +import com.google.common.base.Preconditions; +import java.util.Map; +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; +import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild; +import org.opendaylight.yangtools.yang.data.api.schema.YangModeledAnyXmlNode; +import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeAttrBuilder; +import org.opendaylight.yangtools.yang.data.impl.schema.nodes.AbstractImmutableDataContainerAttrNode; +import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; +import org.opendaylight.yangtools.yang.model.api.YangModeledAnyXmlSchemaNode; + +public class ImmutableYangModeledAnyXmlNodeBuilder extends + AbstractImmutableDataContainerNodeAttrBuilder { + + private final ContainerSchemaNode contentSchema; + + private ImmutableYangModeledAnyXmlNodeBuilder(final YangModeledAnyXmlSchemaNode yangModeledAnyXMLSchemaNode) { + Preconditions.checkNotNull(yangModeledAnyXMLSchemaNode, "Yang modeled any xml node must not be null."); + super.withNodeIdentifier(NodeIdentifier.create(yangModeledAnyXMLSchemaNode.getQName())); + this.contentSchema = yangModeledAnyXMLSchemaNode.getSchemaOfAnyXmlData(); + } + + private ImmutableYangModeledAnyXmlNodeBuilder(final YangModeledAnyXmlSchemaNode yangModeledAnyXMLSchemaNode, final int sizeHint) { + super(sizeHint); + Preconditions.checkNotNull(yangModeledAnyXMLSchemaNode, "Yang modeled any xml node must not be null."); + super.withNodeIdentifier(NodeIdentifier.create(yangModeledAnyXMLSchemaNode.getQName())); + this.contentSchema = yangModeledAnyXMLSchemaNode.getSchemaOfAnyXmlData(); + } + + public static DataContainerNodeAttrBuilder create( + final YangModeledAnyXmlSchemaNode yangModeledAnyXMLSchemaNode) { + return new ImmutableYangModeledAnyXmlNodeBuilder(yangModeledAnyXMLSchemaNode); + } + + public static DataContainerNodeAttrBuilder create( + final YangModeledAnyXmlSchemaNode yangModeledAnyXMLSchemaNode, final int sizeHint) { + return new ImmutableYangModeledAnyXmlNodeBuilder(yangModeledAnyXMLSchemaNode, sizeHint); + } + + @Override + public YangModeledAnyXmlNode build() { + return new ImmutableYangModeledAnyXmlNode(getNodeIdentifier(), buildValue(), getAttributes(), contentSchema); + } + + private static final class ImmutableYangModeledAnyXmlNode extends + AbstractImmutableDataContainerAttrNode implements YangModeledAnyXmlNode { + + private final ContainerSchemaNode contentSchema; + + ImmutableYangModeledAnyXmlNode(final NodeIdentifier nodeIdentifier, + final Map> value, + final Map attributes, final ContainerSchemaNode contentSchema) { + super(value, nodeIdentifier, attributes); + this.contentSchema = Preconditions.checkNotNull(contentSchema, "Schema of yang modeled anyXml content cannot be null."); + } + + @Override + public ContainerSchemaNode getSchemaOfAnyXmlData() { + return contentSchema; + } + } +} diff --git a/yang/yang-data-transform/src/main/java/org/opendaylight/yangtools/transform/QNameTransformingStreamWriter.java b/yang/yang-data-transform/src/main/java/org/opendaylight/yangtools/transform/QNameTransformingStreamWriter.java index 0085ae061b..acd448ef1f 100644 --- a/yang/yang-data-transform/src/main/java/org/opendaylight/yangtools/transform/QNameTransformingStreamWriter.java +++ b/yang/yang-data-transform/src/main/java/org/opendaylight/yangtools/transform/QNameTransformingStreamWriter.java @@ -160,6 +160,11 @@ public abstract class QNameTransformingStreamWriter extends ForwardingObject imp delegate().anyxmlNode(transform(name), value); } + @Override + public void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint) throws IOException, IllegalArgumentException { + delegate().startYangModeledAnyXmlNode(transform(name), childSizeHint); + } + @Override public void endNode() throws IOException, IllegalStateException { delegate().endNode(); diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/YangModeledAnyXmlSchemaNode.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/YangModeledAnyXmlSchemaNode.java new file mode 100644 index 0000000000..e1119dee04 --- /dev/null +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/YangModeledAnyXmlSchemaNode.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2015 Cisco Systems, Inc. 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.model.api; + +import com.google.common.annotations.Beta; +import javax.annotation.Nonnull; + +/** + * The "YangModeledAnyXml" interface defines an interior node in the schema tree. It takes + * one argument, which is an identifier represented by QName inherited from + * {@link SchemaNode}, followed by a block of substatements that holds detailed + * anyxml information. The substatements are defined in {@link DataSchemaNode}. + * The "YangModeledAnyXml" in contrast to the "AnyXml" interface can also provide schema + * of contained XML information.
+ *
+ * This interface was modeled according to definition in [RFC-6020] The anyxml + * Statement + * + * + */ +@Beta +public interface YangModeledAnyXmlSchemaNode extends AnyXmlSchemaNode { + + /** + * @return DataSchemaNode - schema of contained XML data + */ + @Nonnull + ContainerSchemaNode getSchemaOfAnyXmlData(); +}