From 4cd2b06b8c376671c3ce7a0de43442843ac09f39 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 24 Mar 2022 01:07:31 +0100 Subject: [PATCH] Add convenience methods for XML codec 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 --- .../XMLStreamNormalizedNodeStreamWriter.java | 15 +++++++ .../yang/data/codec/xml/XmlParserStream.java | 43 +++++++++++++++++++ .../util/NormalizedNodeStreamWriterStack.java | 18 ++++++++ 3 files changed, 76 insertions(+) diff --git a/codec/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XMLStreamNormalizedNodeStreamWriter.java b/codec/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XMLStreamNormalizedNodeStreamWriter.java index 3cb9b3865c..6593134784 100644 --- a/codec/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XMLStreamNormalizedNodeStreamWriter.java +++ b/codec/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XMLStreamNormalizedNodeStreamWriter.java @@ -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 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. * diff --git a/codec/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlParserStream.java b/codec/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlParserStream.java index 02943098f3..e4f54e4124 100644 --- a/codec/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlParserStream.java +++ b/codec/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlParserStream.java @@ -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)} diff --git a/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/NormalizedNodeStreamWriterStack.java b/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/NormalizedNodeStreamWriterStack.java index 686e0d8739..35b16a9e42 100644 --- a/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/NormalizedNodeStreamWriterStack.java +++ b/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/NormalizedNodeStreamWriterStack.java @@ -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. * -- 2.36.6