From 5337e2540746f9d3f101f847a32781fa7a8241d3 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Fri, 12 Feb 2021 22:53:58 +0100 Subject: [PATCH] Expose EffectiveStatementInference from NormalizedAnyData Rather than exposing a simple DataSchemaNode, make sure we expose an inference, which allows context to be re-created without relying on SchemaNode.getPath(). JIRA: YANGTOOLS-1245 Change-Id: I471191e608c3a63ed88ea8c781859a90acbb2303 Signed-off-by: Robert Varga --- .../ImmutableMetadataNormalizedAnydata.java | 18 +++--- .../data/api/schema/NormalizableAnydata.java | 13 ++--- .../data/api/schema/NormalizedAnydata.java | 19 ++++-- .../gson/JSONNormalizedNodeStreamWriter.java | 19 +++++- .../yang/data/codec/xml/DOMSourceAnydata.java | 21 +++++-- .../data/codec/xml/StreamWriterFacade.java | 22 ++++++- .../xml/AnydataNormalizeToContainerTest.java | 5 +- .../data/codec/xml/AnydataSerializeTest.java | 15 +++-- .../src/main/java/module-info.java | 2 +- .../schema/AbstractNormalizableAnydata.java | 16 +++-- .../data/util/ImmutableNormalizedAnydata.java | 26 +++++---- .../util/SingleChildDataNodeContainer.java | 58 ------------------- .../model/spi/DefaultSchemaTreeInference.java | 2 + 13 files changed, 116 insertions(+), 120 deletions(-) delete mode 100644 yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/SingleChildDataNodeContainer.java diff --git a/yang/rfc7952-data-util/src/main/java/org/opendaylight/yangtools/rfc7952/data/util/ImmutableMetadataNormalizedAnydata.java b/yang/rfc7952-data-util/src/main/java/org/opendaylight/yangtools/rfc7952/data/util/ImmutableMetadataNormalizedAnydata.java index ae3208f46c..6d6e41e065 100644 --- a/yang/rfc7952-data-util/src/main/java/org/opendaylight/yangtools/rfc7952/data/util/ImmutableMetadataNormalizedAnydata.java +++ b/yang/rfc7952-data-util/src/main/java/org/opendaylight/yangtools/rfc7952/data/util/ImmutableMetadataNormalizedAnydata.java @@ -18,8 +18,7 @@ import org.opendaylight.yangtools.rfc7952.data.api.NormalizedMetadata; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter; import org.opendaylight.yangtools.yang.data.util.ImmutableNormalizedAnydata; -import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; -import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; +import org.opendaylight.yangtools.yang.model.api.EffectiveStatementInference; @Beta @NonNullByDefault @@ -27,18 +26,17 @@ public final class ImmutableMetadataNormalizedAnydata extends ImmutableNormalize implements MetadataNormalizedAnydata { private final NormalizedMetadata metadata; - public ImmutableMetadataNormalizedAnydata(final EffectiveModelContext schemaContext, - final DataSchemaNode contextNode, final NormalizedNode data, final NormalizedMetadata metadata) { - super(schemaContext, contextNode, data); + public ImmutableMetadataNormalizedAnydata(final EffectiveStatementInference inference, final NormalizedNode data, + final NormalizedMetadata metadata) { + super(inference, data); this.metadata = requireNonNull(metadata); } - public static ImmutableNormalizedAnydata ofOptional(final EffectiveModelContext schemaContext, - final DataSchemaNode contextNode, final NormalizedNode data, - final Optional metadata) { + public static ImmutableNormalizedAnydata ofOptional(final EffectiveStatementInference inference, + final NormalizedNode data, final Optional metadata) { return metadata.isPresent() - ? new ImmutableMetadataNormalizedAnydata(schemaContext, contextNode, data, metadata.get()) - : new ImmutableNormalizedAnydata(schemaContext, contextNode, data); + ? new ImmutableMetadataNormalizedAnydata(inference, data, metadata.get()) + : new ImmutableNormalizedAnydata(inference, data); } @Override diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/NormalizableAnydata.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/NormalizableAnydata.java index 34002f9150..34e173b911 100644 --- a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/NormalizableAnydata.java +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/NormalizableAnydata.java @@ -9,8 +9,7 @@ package org.opendaylight.yangtools.yang.data.api.schema; import com.google.common.annotations.Beta; import org.eclipse.jdt.annotation.NonNullByDefault; -import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; -import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; +import org.opendaylight.yangtools.yang.model.api.EffectiveStatementInference; /** * An {@link AnydataNode#bodyObjectModel() anydata value object model} which can be normalized to @@ -20,14 +19,12 @@ import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; @NonNullByDefault public interface NormalizableAnydata { /** - * Attempt to interpret this anydata content in the context of specified tree and node. + * Attempt to interpret this anydata content in the context of specified {@link EffectiveStatementInference}. * - * @param schemaContext Schema context - * @param contextNode Corresponding schema node + * @param inference effective statement inference * @return Normalized anydata instance - * @throws NullPointerException if any argument is null + * @throws NullPointerException if {@code inference} is null * @throws AnydataNormalizationException if this data cannot be interpreted in the requested context */ - NormalizedAnydata normalizeTo(EffectiveModelContext schemaContext, DataSchemaNode contextNode) - throws AnydataNormalizationException; + NormalizedAnydata normalizeTo(EffectiveStatementInference inference) throws AnydataNormalizationException; } diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/NormalizedAnydata.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/NormalizedAnydata.java index f1fdcf42f3..d915984cf8 100644 --- a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/NormalizedAnydata.java +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/NormalizedAnydata.java @@ -13,8 +13,7 @@ import org.eclipse.jdt.annotation.NonNullByDefault; import org.opendaylight.yangtools.concepts.Immutable; import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter; import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter; -import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; -import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextProvider; +import org.opendaylight.yangtools.yang.model.api.EffectiveStatementInference; /** * The contents of an {@code anydata} node in a normalized format. This representation acts as a schema-bound bridge @@ -27,10 +26,20 @@ import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextProvider; */ @Beta @NonNullByDefault -public interface NormalizedAnydata extends Immutable, EffectiveModelContextProvider { - - DataSchemaNode getContextNode(); +public interface NormalizedAnydata extends Immutable { + /** + * Return the {@link EffectiveStatementInference} which describes the structure returned by {@link #getData()}. + * + * @return An {@link EffectiveStatementInference} + */ + EffectiveStatementInference getInference(); + /** + * Return the {@link NormalizedNode} representation of this node's data. Information about the corresponding schema + * is available via {@link #getInference()}. + * + * @return A {@link NormalizedNode} + */ NormalizedNode getData(); default void writeTo(final NormalizedNodeStreamWriter writer) throws IOException { 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 dcbb94b366..4a2206d7f9 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 @@ -8,6 +8,7 @@ package org.opendaylight.yangtools.yang.data.codec.gson; import static com.google.common.base.Preconditions.checkState; +import static com.google.common.base.Verify.verify; import static java.util.Objects.requireNonNull; import static org.w3c.dom.Node.ELEMENT_NODE; import static org.w3c.dom.Node.TEXT_NODE; @@ -16,6 +17,7 @@ import com.google.common.collect.ClassToInstanceMap; import com.google.common.collect.ImmutableClassToInstanceMap; import com.google.gson.stream.JsonWriter; import java.io.IOException; +import java.util.List; import java.util.regex.Pattern; import javax.xml.transform.dom.DOMSource; import org.checkerframework.checker.regex.qual.Regex; @@ -31,15 +33,16 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedAnydata; import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter; import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriterExtension; import org.opendaylight.yangtools.yang.data.impl.codec.SchemaTracker; -import org.opendaylight.yangtools.yang.data.util.SingleChildDataNodeContainer; import org.opendaylight.yangtools.yang.model.api.AnydataSchemaNode; import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode; import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; import org.opendaylight.yangtools.yang.model.api.DataNodeContainer; import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; +import org.opendaylight.yangtools.yang.model.api.EffectiveStatementInference; import org.opendaylight.yangtools.yang.model.api.SchemaNode; import org.opendaylight.yangtools.yang.model.api.SchemaPath; 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.w3c.dom.Element; import org.w3c.dom.Node; @@ -433,9 +436,19 @@ public abstract class JSONNormalizedNodeStreamWriter implements NormalizedNodeSt } private void writeNormalizedAnydata(final NormalizedAnydata anydata) throws IOException { + final EffectiveStatementInference inference = anydata.getInference(); + final List> path = inference.statementPath(); + final DataNodeContainer parent; + if (path.size() > 1) { + final EffectiveStatement stmt = path.get(path.size() - 2); + verify(stmt instanceof DataNodeContainer, "Unexpected statement %s", stmt); + parent = (DataNodeContainer) stmt; + } else { + parent = inference.getEffectiveModelContext(); + } + anydata.writeTo(JSONNormalizedNodeStreamWriter.createNestedWriter( - codecs.rebaseTo(anydata.getEffectiveModelContext()), - new SingleChildDataNodeContainer(anydata.getContextNode()), context.getNamespace(), writer)); + codecs.rebaseTo(inference.getEffectiveModelContext()), parent, context.getNamespace(), writer)); } private void writeAnyXmlValue(final DOMSource anyXmlValue) throws IOException { diff --git a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/DOMSourceAnydata.java b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/DOMSourceAnydata.java index 2f01f4f587..3df399b80f 100644 --- a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/DOMSourceAnydata.java +++ b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/DOMSourceAnydata.java @@ -13,14 +13,16 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.base.MoreObjects.ToStringHelper; import java.io.IOException; import java.net.URISyntaxException; +import java.util.List; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import javax.xml.transform.dom.DOMSource; import org.eclipse.jdt.annotation.NonNullByDefault; import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter; import org.opendaylight.yangtools.yang.data.impl.schema.AbstractNormalizableAnydata; -import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; -import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; +import org.opendaylight.yangtools.yang.model.api.EffectiveStatementInference; +import org.opendaylight.yangtools.yang.model.api.SchemaNode; +import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.xml.sax.SAXException; /** @@ -49,11 +51,20 @@ final class DOMSourceAnydata extends AbstractNormalizableAnydata { } @Override - protected void writeTo(final NormalizedNodeStreamWriter streamWriter, final EffectiveModelContext schemaContext, - final DataSchemaNode contextNode) throws IOException { + protected void writeTo(final NormalizedNodeStreamWriter streamWriter, final EffectiveStatementInference inference) + throws IOException { + final List> path = inference.statementPath(); + if (path.isEmpty()) { + throw new IOException("Cannot handle empty inference " + inference); + } + final EffectiveStatement stmt = path.get(path.size() - 1); + if (!(stmt instanceof SchemaNode)) { + throw new IOException("Unhandled statement " + stmt); + } + final XmlParserStream xmlParser; try { - xmlParser = XmlParserStream.create(streamWriter, schemaContext, contextNode); + xmlParser = XmlParserStream.create(streamWriter, inference.getEffectiveModelContext(), (SchemaNode) stmt); } catch (IllegalArgumentException e) { throw new IOException("Failed to instantiate XML parser", e); } diff --git a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/StreamWriterFacade.java b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/StreamWriterFacade.java index 28b18398b5..798057c359 100644 --- a/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/StreamWriterFacade.java +++ b/yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/StreamWriterFacade.java @@ -7,10 +7,12 @@ */ package org.opendaylight.yangtools.yang.data.codec.xml; +import static com.google.common.base.Verify.verify; import static java.util.Objects.requireNonNull; import com.google.common.base.Strings; import java.io.IOException; +import java.util.List; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import javax.xml.XMLConstants; @@ -22,7 +24,9 @@ import javax.xml.stream.XMLStreamWriter; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.XMLNamespace; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedAnydata; -import org.opendaylight.yangtools.yang.data.util.SingleChildDataNodeContainer; +import org.opendaylight.yangtools.yang.model.api.DataNodeContainer; +import org.opendaylight.yangtools.yang.model.api.EffectiveStatementInference; +import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -283,9 +287,21 @@ final class StreamWriterFacade extends ValueWriter { void emitNormalizedAnydata(final NormalizedAnydata anydata) throws XMLStreamException { flushElement(); + + final EffectiveStatementInference inference = anydata.getInference(); + final List> path = inference.statementPath(); + final DataNodeContainer parent; + if (path.size() > 1) { + final EffectiveStatement stmt = path.get(path.size() - 2); + verify(stmt instanceof DataNodeContainer, "Unexpected statement %s", stmt); + parent = (DataNodeContainer) stmt; + } else { + parent = inference.getEffectiveModelContext(); + } + try { - anydata.writeTo(XMLStreamNormalizedNodeStreamWriter.create(writer, anydata.getEffectiveModelContext(), - new SingleChildDataNodeContainer(anydata.getContextNode()))); + anydata.writeTo(XMLStreamNormalizedNodeStreamWriter.create(writer, inference.getEffectiveModelContext(), + parent)); } catch (IOException e) { throw new XMLStreamException("Failed to emit anydata " + anydata, e); } diff --git a/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/AnydataNormalizeToContainerTest.java b/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/AnydataNormalizeToContainerTest.java index 50a6cfd785..726e7abb0e 100644 --- a/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/AnydataNormalizeToContainerTest.java +++ b/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/AnydataNormalizeToContainerTest.java @@ -23,6 +23,8 @@ import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult; import org.opendaylight.yangtools.yang.model.api.AnydataSchemaNode; import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; import org.opendaylight.yangtools.yang.model.api.SchemaNode; +import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute; +import org.opendaylight.yangtools.yang.model.spi.DefaultSchemaTreeInference; public class AnydataNormalizeToContainerTest extends AbstractAnydataTest { @Test @@ -55,7 +57,8 @@ public class AnydataNormalizeToContainerTest extends AbstractAnydataTest { //Normalize anydata content to specific container element DOMSourceAnydata domSourceAnydata = (DOMSourceAnydata) anydataNode.body(); - NormalizedAnydata normalizedAnydata = domSourceAnydata.normalizeTo(SCHEMA_CONTEXT, containerSchemaNode); + NormalizedAnydata normalizedAnydata = domSourceAnydata.normalizeTo( + DefaultSchemaTreeInference.of(SCHEMA_CONTEXT, Absolute.of(CONT_QNAME))); assertNotNull(normalizedAnydata); } } diff --git a/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/AnydataSerializeTest.java b/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/AnydataSerializeTest.java index 49adb55a0a..2d375a4cc1 100644 --- a/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/AnydataSerializeTest.java +++ b/yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/AnydataSerializeTest.java @@ -44,6 +44,8 @@ import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableCo import org.opendaylight.yangtools.yang.data.util.ImmutableNormalizedAnydata; import org.opendaylight.yangtools.yang.model.api.AnydataSchemaNode; import org.opendaylight.yangtools.yang.model.api.SchemaNode; +import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute; +import org.opendaylight.yangtools.yang.model.spi.DefaultSchemaTreeInference; import org.w3c.dom.Document; import org.xml.sax.SAXException; @@ -226,11 +228,14 @@ public class AnydataSerializeTest extends AbstractAnydataTest { xmlStreamWriter, SCHEMA_CONTEXT); final NormalizedNodeWriter normalizedNodeWriter = NormalizedNodeWriter.forStreamWriter( xmlNormalizedNodeStreamWriter); - normalizedNodeWriter.write(ImmutableContainerNodeBuilder.create().withNodeIdentifier(CONT_NODEID) - .withChild(ImmutableAnydataNodeBuilder.create(NormalizedAnydata.class).withNodeIdentifier(CONT_ANY_NODEID) - .withValue(new ImmutableNormalizedAnydata(SCHEMA_CONTEXT, - SCHEMA_CONTEXT.findDataChildByName(CONT_QNAME).get(), ImmutableContainerNodeBuilder.create() - .withNodeIdentifier(CONT_NODEID).build())).build()) + normalizedNodeWriter.write(ImmutableContainerNodeBuilder.create() + .withNodeIdentifier(CONT_NODEID) + .withChild(ImmutableAnydataNodeBuilder.create(NormalizedAnydata.class) + .withNodeIdentifier(CONT_ANY_NODEID) + .withValue(new ImmutableNormalizedAnydata( + DefaultSchemaTreeInference.of(SCHEMA_CONTEXT, Absolute.of(CONT_QNAME)), + ImmutableContainerNodeBuilder.create().withNodeIdentifier(CONT_NODEID).build())) + .build()) .build()); normalizedNodeWriter.flush(); diff --git a/yang/yang-data-impl/src/main/java/module-info.java b/yang/yang-data-impl/src/main/java/module-info.java index 22b06786fd..c36c2df55f 100644 --- a/yang/yang-data-impl/src/main/java/module-info.java +++ b/yang/yang-data-impl/src/main/java/module-info.java @@ -23,8 +23,8 @@ module org.opendaylight.yangtools.yang.data.impl { requires transitive org.opendaylight.yangtools.yang.data.api; requires transitive org.opendaylight.yangtools.rfc7952.data.api; + requires transitive org.opendaylight.yangtools.rfc7952.data.util; requires org.opendaylight.yangtools.util; - requires org.opendaylight.yangtools.rfc7952.data.util; requires org.opendaylight.yangtools.rfc8528.data.util; requires org.opendaylight.yangtools.yang.common; requires org.opendaylight.yangtools.yang.model.api; diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/AbstractNormalizableAnydata.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/AbstractNormalizableAnydata.java index 12fe44ec1c..8bcd593cd0 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/AbstractNormalizableAnydata.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/AbstractNormalizableAnydata.java @@ -17,8 +17,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.AnydataNormalizationExcep import org.opendaylight.yangtools.yang.data.api.schema.NormalizableAnydata; import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter; import org.opendaylight.yangtools.yang.data.util.ImmutableNormalizedAnydata; -import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; -import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; +import org.opendaylight.yangtools.yang.model.api.EffectiveStatementInference; /** * Abstract base class for implementing the NormalizableAnydata interface. This class provides the binding to @@ -28,18 +27,17 @@ import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; @NonNullByDefault public abstract class AbstractNormalizableAnydata implements NormalizableAnydata { @Override - public final ImmutableNormalizedAnydata normalizeTo(final EffectiveModelContext schemaContext, - final DataSchemaNode contextNode) throws AnydataNormalizationException { + public final ImmutableNormalizedAnydata normalizeTo(final EffectiveStatementInference inference) + throws AnydataNormalizationException { final NormalizedNodeMetadataResult result = new NormalizedNodeMetadataResult(); final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result); try { - writeTo(streamWriter, schemaContext, contextNode); + writeTo(streamWriter, inference); } catch (IOException e) { throw new AnydataNormalizationException("Failed to normalize anydata", e); } - return ImmutableMetadataNormalizedAnydata.ofOptional(schemaContext, contextNode, result.getResult(), - result.getMetadata()); + return ImmutableMetadataNormalizedAnydata.ofOptional(inference, result.getResult(), result.getMetadata()); } @Override @@ -49,6 +47,6 @@ public abstract class AbstractNormalizableAnydata implements NormalizableAnydata protected abstract ToStringHelper addToStringAttributes(ToStringHelper helper); - protected abstract void writeTo(NormalizedNodeStreamWriter streamWriter, EffectiveModelContext schemaContext, - DataSchemaNode contextNode) throws IOException; + protected abstract void writeTo(NormalizedNodeStreamWriter streamWriter, EffectiveStatementInference inference) + throws IOException; } diff --git a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ImmutableNormalizedAnydata.java b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ImmutableNormalizedAnydata.java index 1fd4412625..1c23a0108c 100644 --- a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ImmutableNormalizedAnydata.java +++ b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ImmutableNormalizedAnydata.java @@ -10,31 +10,28 @@ package org.opendaylight.yangtools.yang.data.util; import static java.util.Objects.requireNonNull; import com.google.common.annotations.Beta; +import com.google.common.base.MoreObjects; import com.google.common.base.MoreObjects.ToStringHelper; import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedAnydata; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; -import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; -import org.opendaylight.yangtools.yang.model.spi.AbstractEffectiveModelContextProvider; +import org.opendaylight.yangtools.yang.model.api.EffectiveStatementInference; @Beta @NonNullByDefault -public class ImmutableNormalizedAnydata extends AbstractEffectiveModelContextProvider implements NormalizedAnydata { - private final DataSchemaNode contextNode; +public class ImmutableNormalizedAnydata implements NormalizedAnydata { + private final EffectiveStatementInference inference; private final NormalizedNode data; - public ImmutableNormalizedAnydata(final EffectiveModelContext schemaContext, final DataSchemaNode contextNode, - final NormalizedNode data) { - super(schemaContext); - this.contextNode = requireNonNull(contextNode); + public ImmutableNormalizedAnydata(final EffectiveStatementInference inference, final NormalizedNode data) { + this.inference = requireNonNull(inference); this.data = requireNonNull(data); } @Override - public final DataSchemaNode getContextNode() { - return contextNode; + public final EffectiveStatementInference getInference() { + return inference; } @Override @@ -53,7 +50,12 @@ public class ImmutableNormalizedAnydata extends AbstractEffectiveModelContextPro } @Override + public final String toString() { + return addToStringAttributes(MoreObjects.toStringHelper(this)).toString(); + } + protected ToStringHelper addToStringAttributes(final ToStringHelper helper) { - return super.addToStringAttributes(helper).add("node", contextNode).add("data", data); + return helper.add("inference", inference).add("data", data); } + } diff --git a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/SingleChildDataNodeContainer.java b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/SingleChildDataNodeContainer.java deleted file mode 100644 index 302193e891..0000000000 --- a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/SingleChildDataNodeContainer.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (c) 2019 PANTHEON.tech, s.r.o. 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.util; - -import static java.util.Objects.requireNonNull; - -import com.google.common.annotations.Beta; -import com.google.common.collect.ImmutableSet; -import java.util.Collection; -import java.util.Set; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.model.api.DataNodeContainer; -import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; -import org.opendaylight.yangtools.yang.model.api.GroupingDefinition; -import org.opendaylight.yangtools.yang.model.api.TypeDefinition; -import org.opendaylight.yangtools.yang.model.api.UsesNode; - -/** - * Utility DataNodeContainer containing only the specified node. - */ -@Beta -public final class SingleChildDataNodeContainer implements DataNodeContainer { - private final DataSchemaNode child; - - public SingleChildDataNodeContainer(final DataSchemaNode child) { - this.child = requireNonNull(child); - } - - @Override - public DataSchemaNode dataChildByName(final QName name) { - return child.getQName().equals(name) ? child : null; - } - - @Override - public Collection getChildNodes() { - return ImmutableSet.of(child); - } - - @Override - public Set> getTypeDefinitions() { - return ImmutableSet.of(); - } - - @Override - public Set getGroupings() { - return ImmutableSet.of(); - } - - @Override - public Set getUses() { - return ImmutableSet.of(); - } -} diff --git a/yang/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/DefaultSchemaTreeInference.java b/yang/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/DefaultSchemaTreeInference.java index 84c3f5f508..9917c3f0d1 100644 --- a/yang/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/DefaultSchemaTreeInference.java +++ b/yang/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/DefaultSchemaTreeInference.java @@ -56,6 +56,8 @@ public final class DefaultSchemaTreeInference final QName qname = it.next(); final SchemaTreeEffectiveStatement found = parent.findSchemaTreeNode(qname).orElseThrow( () -> new IllegalArgumentException("Cannot resolve step " + qname + " in " + builder.build())); + builder.add(found); + if (it.hasNext()) { checkArgument(found instanceof SchemaTreeAwareEffectiveStatement, "Cannot resolve steps %s past %s", steps, found); -- 2.36.6