Revert "Revert "Bug 3874: Support of yang modeled AnyXML - API"" 89/30889/1
authorRobert Varga <rovarga@cisco.com>
Mon, 7 Dec 2015 08:46:42 +0000 (09:46 +0100)
committerRobert Varga <rovarga@cisco.com>
Mon, 7 Dec 2015 08:46:49 +0000 (09:46 +0100)
This reverts commit 73d49d0ace358adba79a2567acea14e4bb076003.

Change-Id: I53a6d6721dc3b1dcb873191c21834baa1dc64f05
Signed-off-by: Robert Varga <rovarga@cisco.com>
14 files changed:
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/YangModeledAnyXmlNode.java [new file with mode: 0644]
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/ForwardingNormalizedNodeStreamAttributeWriter.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/ForwardingNormalizedNodeStreamWriter.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/LoggingNormalizedNodeStreamWriter.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/NormalizedNodeStreamAttributeWriter.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/NormalizedNodeStreamWriter.java
yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONNormalizedNodeStreamWriter.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/SchemaTracker.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/xml/XMLStreamNormalizedNodeStreamWriter.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/Builders.java
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/builder/impl/ImmutableYangModeledAnyXmlNodeBuilder.java [new file with mode: 0644]
yang/yang-data-transform/src/main/java/org/opendaylight/yangtools/transform/QNameTransformingStreamWriter.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/YangModeledAnyXmlSchemaNode.java [new file with mode: 0644]

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 (file)
index 0000000..4bb7f04
--- /dev/null
@@ -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<NodeIdentifier>,
+        DataContainerChild<NodeIdentifier, Collection<DataContainerChild<? extends PathArgument, ?>>> {
+
+    /**
+     * @return DataSchemaNode - schema of contained XML data
+     */
+    @Nonnull
+    ContainerSchemaNode getSchemaOfAnyXmlData();
+}
index 0c7ed69fb9ebf3530f64c99fb91658187ee771b9..3598630dd9898bb43988d338e163171c5fb2bcf7 100644 (file)
@@ -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<QName, String> attributes) throws IOException {
+        delegate().startYangModeledAnyXmlNode(name, childSizeHint, attributes);
+    }
+
     @Override
     public void startUnkeyedListItem(final NodeIdentifier name, final int childSizeHint,
             final Map<QName, String> attributes) throws IOException {
index 28ccf74f543ea20c867235323b182633dddfd17b..95796c53a8c38e51783df19dcd99eba2bda9c8ef 100644 (file)
@@ -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();
index 7d7a4eeb7d7b73db5cc21fe5892f1e5a29b16c9c..19536df9c20213ba84d29c6f9b29bd293a7968a7 100644 (file)
@@ -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("<<FLUSH>>");
index ae4f37d51e6f0d3ac7720fc4f3719165a66acf7c..5074acaa176c0a8fd0be7bcbcb13020b8d8f05b9 100644 (file)
@@ -23,6 +23,8 @@ public interface NormalizedNodeStreamAttributeWriter extends NormalizedNodeStrea
 
     void startContainerNode(YangInstanceIdentifier.NodeIdentifier name, int childSizeHint, Map<QName, String> attributes) throws IOException;
 
+    void startYangModeledAnyXmlNode(YangInstanceIdentifier.NodeIdentifier name, int childSizeHint, Map<QName, String> attributes) throws IOException;
+
     void startUnkeyedListItem(YangInstanceIdentifier.NodeIdentifier name, int childSizeHint, Map<QName, String> attributes) throws IOException;
 
     void startMapEntryNode(YangInstanceIdentifier.NodeIdentifierWithPredicates identifier, int childSizeHint, Map<QName, String> attributes) throws IOException;
index 5f4e66c5c6a8dd23f8ae9e579b4fcf6722a97479..983378703e57f72694db34748f7011b008484fd6 100644 (file)
@@ -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 <code>map</code>,
      *             <code>choice</code> <code>unkeyed list</code> 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 <code>map</code>,
      *             <code>choice</code> <code>unkeyed list</code> 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 <code>map</code>,
      *             <code>choice</code> <code>unkeyed list</code> 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 <code>map</code>,
      *             <code>choice</code> <code>unkeyed list</code> 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.
+    *
+    * <p>
+    * End of yang modeled anyXml node event is emitted by invoking {@link #endNode()}.
+    *
+    * <p>
+    * Valid sub-events are:
+    * <ul>
+    * <li>{@link #leafNode}</li>
+    * <li>{@link #startContainerNode}</li>
+    * <li>{@link #startLeafSet}</li>
+    * <li>{@link #startMapNode}</li>
+    * <li>{@link #startUnkeyedList}</li>
+    * </ul>
+    *
+    * @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 <code>map</code>,
+    *             <code>choice</code> <code>unkeyed list</code> node.
+    * @throws IOException if an underlying IO error occurs
+    */
+    void startYangModeledAnyXmlNode(NodeIdentifier name, int childSizeHint) throws IOException;
+
     /**
      * Emits end event for node.
      *
index e3913c81659e29ab2edebf8f128758cd9286532c..0a8f9877e992d0f700cd62c68bd102a063595a94 100644 (file)
@@ -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();
index 5c02d7eb396352a079c4dfd2416674530aec9d4b..472be45cbafb0a62845cc58147121a757eb0e15d 100644 (file)
@@ -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;
     }
 
index ee464ce6fc9beaefa7af3e730d6f9053a7c413ca..17343e7f30fbef489dfca0106574ccce9d766fee 100644 (file)
@@ -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<QName, String> attributes) throws IOException {
+        startYangModeledAnyXmlNode(name, childSizeHint);
+        writeAttributes(attributes);
+    }
+
     @Override
     public void startUnkeyedListItem(final NodeIdentifier name, final int childSizeHint, final Map<QName, String> 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();
index da82eaac9c65034f15b7f7121da361c382d88abc..b732ace51d6544d57f6b051894ba2cc05af3a5c1 100644 (file)
@@ -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 <T> DataContainerNodeAttrBuilder<NodeIdentifier, YangModeledAnyXmlNode> yangModeledAnyXmlBuilder(
+            final YangModeledAnyXmlSchemaNode schema) {
+        return ImmutableYangModeledAnyXmlNodeBuilder.create(schema);
+    }
+
     public static <T> ListNodeBuilder<T,LeafSetEntryNode<T>> leafSetBuilder() {
         return ImmutableLeafSetNodeBuilder.create();
     }
index 13327f54aa0144745bc4798a237f6210311aabe5..3fd8e6d9daa4375eab006ad65a039e7d15cdb43c 100644 (file)
@@ -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<NodeIdentifier, YangModeledAnyXmlNode> 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 (file)
index 0000000..65a730f
--- /dev/null
@@ -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<NodeIdentifier, YangModeledAnyXmlNode> {
+
+    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<NodeIdentifier, YangModeledAnyXmlNode> create(
+            final YangModeledAnyXmlSchemaNode yangModeledAnyXMLSchemaNode) {
+        return new ImmutableYangModeledAnyXmlNodeBuilder(yangModeledAnyXMLSchemaNode);
+    }
+
+    public static DataContainerNodeAttrBuilder<NodeIdentifier, YangModeledAnyXmlNode> 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<NodeIdentifier> implements YangModeledAnyXmlNode {
+
+        private final ContainerSchemaNode contentSchema;
+
+        ImmutableYangModeledAnyXmlNode(final NodeIdentifier nodeIdentifier,
+                final Map<PathArgument, DataContainerChild<? extends PathArgument, ?>> value,
+                final Map<QName, String> 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;
+        }
+    }
+}
index 0085ae061b15b78f830ce310b13a714d29a19efc..acd448ef1f14b1971297459f62a90b5d03a71e80 100644 (file)
@@ -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 (file)
index 0000000..e1119de
--- /dev/null
@@ -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. <br>
+ * <br>
+ * This interface was modeled according to definition in <a
+ * href="https://tools.ietf.org/html/rfc6020#section-7.10">[RFC-6020] The anyxml
+ * Statement</a>
+ *
+ *
+ */
+@Beta
+public interface YangModeledAnyXmlSchemaNode extends AnyXmlSchemaNode {
+
+    /**
+     * @return DataSchemaNode - schema of contained XML data
+     */
+    @Nonnull
+    ContainerSchemaNode getSchemaOfAnyXmlData();
+}