Allow startAnyxmlNode() to handle differing object models 07/84807/6
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 30 Sep 2019 09:40:29 +0000 (11:40 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 30 Sep 2019 15:55:01 +0000 (17:55 +0200)
Anyxml can have a number of underlying object models, with the most
common being DOMSource. This changes the entrypoint to work the same
as anydata, allowing implementations to support different models.

Change-Id: I06ec1e5d46e7bc2287b239ea97811d58544c8c2b
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/rfc7952-data-util/src/main/java/org/opendaylight/yangtools/rfc7952/data/util/NormalizedNodeStreamWriterMetadataDecorator.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/NormalizedNodeStreamWriter.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/stream/NormalizedNodeWriter.java
yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONNormalizedNodeStreamWriter.java
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/SchemaAwareXMLStreamNormalizedNodeStreamWriter.java
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/SchemalessXMLStreamNormalizedNodeStreamWriter.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/ImmutableNormalizedNodeStreamWriter.java
yang/yang-data-transform/src/main/java/org/opendaylight/yangtools/transform/QNameTransformingStreamWriter.java
yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/AnyXmlNodeDataWithSchema.java

index 0e705af7cf83f3fd433e1f4f49a19e9602fcbbdc..cbcd22b34829b79e72fcd268d9788ffa493d8c85 100644 (file)
@@ -123,9 +123,12 @@ final class NormalizedNodeStreamWriterMetadataDecorator extends ForwardingNormal
     }
 
     @Override
-    public void startAnyxmlNode(final NodeIdentifier name) throws IOException {
-        super.startAnyxmlNode(name);
-        enterMetadataNode(name);
+    public boolean startAnyxmlNode(final NodeIdentifier name, final Class<?> objectModel) throws IOException {
+        final boolean ret = super.startAnyxmlNode(name, objectModel);
+        if (ret) {
+            enterMetadataNode(name);
+        }
+        return ret;
     }
 
     @Override
index aa7663442aa3aa057f2bbc51d0fb2ea1dca48651..e5f5ca308eed42ea4044baccfad170ae14db5169 100644 (file)
@@ -88,8 +88,8 @@ public abstract class ForwardingNormalizedNodeStreamWriter extends ForwardingObj
     }
 
     @Override
-    public void startAnyxmlNode(final NodeIdentifier name) throws IOException {
-        delegate().startAnyxmlNode(name);
+    public boolean startAnyxmlNode(final NodeIdentifier name, final Class<?> objectModel) throws IOException {
+        return delegate().startAnyxmlNode(name, objectModel);
     }
 
     @Override
index db4952b1dc2acfb0c3d4123d8a857801bef7d0c9..c5100112e61a7f2ffe9b2428d6fe2477303f76e7 100644 (file)
@@ -130,9 +130,10 @@ public final class LoggingNormalizedNodeStreamWriter implements NormalizedNodeSt
     }
 
     @Override
-    public void startAnyxmlNode(final NodeIdentifier name) {
+    public boolean startAnyxmlNode(final NodeIdentifier name, final Class<?> objectModel) {
         LOG.debug("{}{}(anyxml)", ind(), name);
         incIndent();
+        return true;
     }
 
     @Override
index 5f06ab7adb3b66ba1d5620a274c0e1ad4b89e9e3..a9d2451d9ce78876a8684b3f692b7463ef661bd6 100644 (file)
@@ -59,7 +59,7 @@ import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
  * <li>{@code leaf-list} - Leaf list start is emitted using {@link #startLeafSet(NodeIdentifier, int)}. Individual
  * leaf-list entries are emitted using {@link #startLeafSetEntryNode(NodeWithValue)}.
  *
- * <li>{@code anyxml} - An anyxml node event is emitted using {@link #startAnyxmlNode(NodeIdentifier)}.</li>
+ * <li>{@code anyxml} - An anyxml node event is emitted using {@link #startAnyxmlNode(NodeIdentifier, Class)}.</li>
  *
  * <li>{@code choice} - Choice node event is emitted by {@link #startChoiceNode(NodeIdentifier, int)} event.</li>
  *
@@ -154,7 +154,7 @@ public interface NormalizedNodeStreamWriter extends Closeable, Flushable,
      * Emits start of new container. Valid sub-events are:
      * <ul>
      * <li>{@link #startLeafNode}</li>
-     * <li>{@link #startAnyxmlNode(NodeIdentifier)}</li>
+     * <li>{@link #startAnyxmlNode(NodeIdentifier, Class)}</li>
      * <li>{@link #startContainerNode(NodeIdentifier, int)}</li>
      * <li>{@link #startChoiceNode(NodeIdentifier, int)}</li>
      * <li>{@link #startLeafSet(NodeIdentifier, int)}</li>
@@ -308,6 +308,7 @@ public interface NormalizedNodeStreamWriter extends Closeable, Flushable,
      * @param objectModel The object model of anydata content
      * @return True if the specified object model is supported by this extension and the process of emitting the node
      *         has started. False if the object model is not supported and the node has not started to be emitted.
+     * @throws NullPointerException if any argument is null
      * @throws IOException if an underlying IO error occurs
      */
     @Beta
@@ -317,14 +318,16 @@ public interface NormalizedNodeStreamWriter extends Closeable, Flushable,
      * Emits a start of anyxml node event.
      *
      * @param name name of node as defined in schema, namespace and revision are derived from parent node.
-     * @throws NullPointerException if {@code name} is null
+     * @param objectModel The object model of anyxml content
+     * @return True if the specified object model is supported by this extension and the process of emitting the node
+     *         has started. False if the object model is not supported and the node has not started to be emitted.
+     * @throws NullPointerException if any argument is null
      * @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 choice} or a {@code unkeyed list}
      *                               node.
      * @throws IOException if an underlying IO error occurs
      */
-    // FIXME: 4.0.0: this should follow the startAnydataNode template
-    void startAnyxmlNode(NodeIdentifier name) throws IOException;
+    boolean startAnyxmlNode(NodeIdentifier name, Class<?> objectModel) throws IOException;
 
     /**
      * Set the value of current anyxml node. This call is only valid within the context in which an anyxml node is open.
index 96500be75412f9574e282dd50cd2389b017654c7..87aa4d680bcbd0c01efce22bbb48589a5aaf2fa9 100644 (file)
@@ -150,11 +150,14 @@ public class NormalizedNodeWriter implements Closeable, Flushable {
         } else if (node instanceof AnyxmlNode) {
             final AnyxmlNode<?> anyxmlNode = (AnyxmlNode<?>)node;
             final Class<?> model = anyxmlNode.getValueObjectModel();
-            if (DOMSource.class.isAssignableFrom(model)) {
+            if (writer.startAnyxmlNode(anyxmlNode.getIdentifier(), model)) {
                 final Object value = node.getValue();
-                verify(value instanceof DOMSource, "Inconsistent anyxml node %s", anyxmlNode);
-                writer.startAnyxmlNode(anyxmlNode.getIdentifier());
-                writer.domSourceValue((DOMSource) value);
+                if (DOMSource.class.isAssignableFrom(model)) {
+                    verify(value instanceof DOMSource, "Inconsistent anyxml node %s", anyxmlNode);
+                    writer.domSourceValue((DOMSource) value);
+                } else {
+                    writer.scalarValue(value);
+                }
                 writer.endNode();
                 return true;
             }
index 6101d15bc8a3cb5d18e72424c6d64de849fcbef3..cb2ed769d3c8931547dc746146bdf57cc66d507b 100644 (file)
@@ -316,10 +316,14 @@ public abstract class JSONNormalizedNodeStreamWriter implements NormalizedNodeSt
     }
 
     @Override
-    public final void startAnyxmlNode(final NodeIdentifier name) throws IOException {
-        tracker.startAnyxmlNode(name);
-        context.emittingChild(codecs.getSchemaContext(), writer);
-        context.writeChildJsonIdentifier(codecs.getSchemaContext(), writer, name.getNodeType());
+    public final boolean startAnyxmlNode(final NodeIdentifier name, final Class<?> objectModel) throws IOException {
+        if (DOMSource.class.isAssignableFrom(objectModel)) {
+            tracker.startAnyxmlNode(name);
+            context.emittingChild(codecs.getSchemaContext(), writer);
+            context.writeChildJsonIdentifier(codecs.getSchemaContext(), writer, name.getNodeType());
+            return true;
+        }
+        return false;
     }
 
     @Override
index 86f4041bac2ab867a217f3d3521846d49bbc4aad..9c60bb759c2a039034a7923ae0f5f9ce6e33b443 100644 (file)
@@ -138,9 +138,13 @@ final class SchemaAwareXMLStreamNormalizedNodeStreamWriter extends XMLStreamNorm
     }
 
     @Override
-    public void startAnyxmlNode(final NodeIdentifier name) throws IOException {
-        tracker.startAnyxmlNode(name);
-        startElement(name.getNodeType());
+    public boolean startAnyxmlNode(final NodeIdentifier name, final Class<?> objectModel) throws IOException {
+        if (DOMSource.class.isAssignableFrom(objectModel)) {
+            tracker.startAnyxmlNode(name);
+            startElement(name.getNodeType());
+            return true;
+        }
+        return false;
     }
 
     @Override
index fee9596aae5f8bd63140e43513b49e9e57f131bc..8d1b68c492ddea31ea21b4f47b633d2660e60b56 100644 (file)
@@ -79,9 +79,13 @@ final class SchemalessXMLStreamNormalizedNodeStreamWriter extends XMLStreamNorma
     }
 
     @Override
-    public void startAnyxmlNode(final NodeIdentifier name) throws IOException {
-        nodeTypeStack.push(NodeType.ANY_XML);
-        startElement(name.getNodeType());
+    public boolean startAnyxmlNode(final NodeIdentifier name, final Class<?> objectModel) throws IOException {
+        if (DOMSource.class.isAssignableFrom(objectModel)) {
+            nodeTypeStack.push(NodeType.ANY_XML);
+            startElement(name.getNodeType());
+            return true;
+        }
+        return false;
     }
 
     @Override
index 9cce8db57b3975a883968c4d84cf2b111e7b7dfc..d8b9dc438e17282277b1941dff256d14ac82fb87 100644 (file)
@@ -165,10 +165,14 @@ public class ImmutableNormalizedNodeStreamWriter implements NormalizedNodeStream
     }
 
     @Override
-    public void startAnyxmlNode(final NodeIdentifier name) {
+    public boolean startAnyxmlNode(final NodeIdentifier name, final Class<?> objectModel) {
         checkDataNodeContainer();
-        enter(name, ImmutableAnyXmlNodeBuilder.create());
-        nextSchema = null;
+        if (DOMSource.class.isAssignableFrom(objectModel)) {
+            enter(name, ImmutableAnyXmlNodeBuilder.create());
+            nextSchema = null;
+            return true;
+        }
+        return false;
     }
 
     @Override
index 444464fd6a9016c5eb535c4e2042f028912a9b95..1ff8994794248707fbe3097b255b9f896e0b0501 100644 (file)
@@ -144,8 +144,8 @@ public abstract class QNameTransformingStreamWriter extends ForwardingNormalized
     }
 
     @Override
-    public void startAnyxmlNode(final NodeIdentifier name) throws IOException {
-        super.startAnyxmlNode(transform(name));
+    public boolean startAnyxmlNode(final NodeIdentifier name, final Class<?> objectModel) throws IOException {
+        return super.startAnyxmlNode(transform(name), objectModel);
     }
 
     @Override
index d0151f2a9a44b73fbd6ea6202bc9b5a48c0ed1b1..962076588dd77f421e597be00796ccd84478e558 100644 (file)
@@ -30,9 +30,10 @@ public class AnyXmlNodeDataWithSchema extends SimpleNodeDataWithSchema<AnyxmlSch
     public void write(final NormalizedNodeStreamWriter writer, final StreamWriterMetadataExtension metaWriter)
             throws IOException {
         writer.nextDataSchemaNode(getSchema());
-        writer.startAnyxmlNode(provideNodeIdentifier());
-        writeMetadata(metaWriter);
-        writer.domSourceValue((DOMSource) getValue());
-        writer.endNode();
+        if (writer.startAnyxmlNode(provideNodeIdentifier(), DOMSource.class)) {
+            writeMetadata(metaWriter);
+            writer.domSourceValue((DOMSource) getValue());
+            writer.endNode();
+        }
     }
 }