Add convenience methods for XML codec 30/100230/5
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 24 Mar 2022 00:07:31 +0000 (01:07 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 24 Mar 2022 11:04:43 +0000 (12:04 +0100)
Codecs are at yang.data.api layer, add methods to initialize them with
YangInstanceIdentifier.

JIRA: YANGTOOLS-1412
Change-Id: Id9ce9af904fba55a0781a0c5e53ed253484664ac
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
codec/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XMLStreamNormalizedNodeStreamWriter.java
codec/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlParserStream.java
data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/NormalizedNodeStreamWriterStack.java

index 3cb9b3865c94053cee2ddf962cc48d75e640fe17..65931347847d40a7e65a6ddc7f7e0099ceeaa6fb 100644 (file)
@@ -23,6 +23,7 @@ import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.rfc7952.data.api.StreamWriterMetadataExtension;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.YangConstants;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 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;
@@ -116,6 +117,20 @@ public abstract class XMLStreamNormalizedNodeStreamWriter<T> implements Normaliz
             NormalizedNodeStreamWriterStack.of(context, path));
     }
 
+    /**
+     * Create a new writer with the specified context and rooted in the specified {@link YangInstanceIdentifier}.
+     *
+     * @param writer Output {@link XMLStreamWriter}
+     * @param context Associated {@link EffectiveModelContext}.
+     * @param path path
+     * @return A new {@link NormalizedNodeStreamWriter}
+     */
+    public static @NonNull NormalizedNodeStreamWriter create(final XMLStreamWriter writer,
+            final EffectiveModelContext context, final YangInstanceIdentifier path) {
+        return new SchemaAwareXMLStreamNormalizedNodeStreamWriter(writer, context,
+            NormalizedNodeStreamWriterStack.of(context, path));
+    }
+
     /**
      * Create a new writer with the specified context and rooted in the specified operation's input.
      *
index 02943098f311e592e2a47c912ac0dadcd4343f70..e4f54e4124742b789c4fe494584b093f905ae7e2 100644 (file)
@@ -52,6 +52,7 @@ import org.opendaylight.yangtools.rfc8528.model.api.SchemaMountConstants;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.QNameModule;
 import org.opendaylight.yangtools.yang.common.XMLNamespace;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
 import org.opendaylight.yangtools.yang.data.util.AbstractMountPointDataWithSchema;
 import org.opendaylight.yangtools.yang.data.util.AbstractNodeDataWithSchema;
@@ -60,6 +61,7 @@ import org.opendaylight.yangtools.yang.data.util.AnydataNodeDataWithSchema;
 import org.opendaylight.yangtools.yang.data.util.CompositeNodeDataWithSchema;
 import org.opendaylight.yangtools.yang.data.util.CompositeNodeDataWithSchema.ChildReusePolicy;
 import org.opendaylight.yangtools.yang.data.util.ContainerNodeDataWithSchema;
+import org.opendaylight.yangtools.yang.data.util.DataSchemaContextTree;
 import org.opendaylight.yangtools.yang.data.util.LeafListEntryNodeDataWithSchema;
 import org.opendaylight.yangtools.yang.data.util.LeafListNodeDataWithSchema;
 import org.opendaylight.yangtools.yang.data.util.LeafNodeDataWithSchema;
@@ -86,6 +88,7 @@ import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
 import org.opendaylight.yangtools.yang.model.api.OperationDefinition;
 import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -260,6 +263,46 @@ public final class XmlParserStream implements Closeable, Flushable {
         return create(writer, mountCtx, parentNode, true);
     }
 
+    @Beta
+    public static XmlParserStream create(final NormalizedNodeStreamWriter writer, final MountPointContext mountCtx,
+            final Absolute parentNode) {
+        return create(writer, mountCtx, parentNode, true);
+    }
+
+    @Beta
+    public static XmlParserStream create(final NormalizedNodeStreamWriter writer, final MountPointContext mountCtx,
+            final Absolute parentNode, final boolean strictParsing) {
+        return create(writer, XmlCodecFactory.create(mountCtx), parentNode, strictParsing);
+    }
+
+    @Beta
+    public static XmlParserStream create(final NormalizedNodeStreamWriter writer, final XmlCodecFactory codecs,
+            final Absolute parentNode) {
+        return create(writer, codecs, parentNode, true);
+    }
+
+    @Beta
+    public static XmlParserStream create(final NormalizedNodeStreamWriter writer, final XmlCodecFactory codecs,
+            final Absolute parentNode, final boolean strictParsing) {
+        return new XmlParserStream(writer, codecs,
+            SchemaInferenceStack.of(codecs.getEffectiveModelContext(), parentNode), strictParsing);
+    }
+
+    @Beta
+    public static XmlParserStream create(final NormalizedNodeStreamWriter writer, final MountPointContext mountCtx,
+            final YangInstanceIdentifier parentNode) {
+        return create(writer, mountCtx, parentNode, true);
+    }
+
+    @Beta
+    public static XmlParserStream create(final NormalizedNodeStreamWriter writer, final MountPointContext mountCtx,
+            final YangInstanceIdentifier parentNode, final boolean strictParsing) {
+        final var init = DataSchemaContextTree.from(mountCtx.getEffectiveModelContext())
+            .enterPath(parentNode)
+            .orElseThrow();
+        return new XmlParserStream(writer, XmlCodecFactory.create(mountCtx), init.stack(), strictParsing);
+    }
+
     /**
      * Utility method for use when caching {@link XmlCodecFactory} is not feasible. Users with high performance
      * requirements should use {@link #create(NormalizedNodeStreamWriter, XmlCodecFactory, EffectiveStatementInference)}
index 686e0d8739bdbdd8c5a769f13d9386d8e6c9fde7..35b16a9e422178e8e3842681c27b35cc6a5dd73b 100644 (file)
@@ -22,6 +22,7 @@ import java.util.Set;
 import java.util.stream.Collectors;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 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.NodeWithValue;
@@ -136,6 +137,23 @@ public final class NormalizedNodeStreamWriterStack implements LeafrefResolver {
         return new NormalizedNodeStreamWriterStack(SchemaInferenceStack.of(context, path));
     }
 
+    /**
+     * Create a new writer with the specified context and rooted in the specified {@link YangInstanceIdentifier}..
+     *
+     * @param context Associated {@link EffectiveModelContext}
+     * @param path Normalized path
+     * @return A new {@link NormalizedNodeStreamWriterStack}
+     * @throws NullPointerException if any argument is null
+     * @throws IllegalArgumentException if {@code path} does not point to a valid root
+     */
+    public static @NonNull NormalizedNodeStreamWriterStack of(final EffectiveModelContext context,
+            final YangInstanceIdentifier path) {
+        return new NormalizedNodeStreamWriterStack(DataSchemaContextTree.from(context)
+            .enterPath(path)
+            .orElseThrow()
+            .stack());
+    }
+
     /**
      * Create a new writer with the specified context and rooted in the specified schema path.
      *