Expose EffectiveStatementInference from NormalizedAnyData 50/95150/5
authorRobert Varga <robert.varga@pantheon.tech>
Fri, 12 Feb 2021 21:53:58 +0000 (22:53 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Sun, 14 Feb 2021 10:14:19 +0000 (11:14 +0100)
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 <robert.varga@pantheon.tech>
13 files changed:
yang/rfc7952-data-util/src/main/java/org/opendaylight/yangtools/rfc7952/data/util/ImmutableMetadataNormalizedAnydata.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/NormalizableAnydata.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/NormalizedAnydata.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/DOMSourceAnydata.java
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/StreamWriterFacade.java
yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/AnydataNormalizeToContainerTest.java
yang/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/AnydataSerializeTest.java
yang/yang-data-impl/src/main/java/module-info.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/AbstractNormalizableAnydata.java
yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ImmutableNormalizedAnydata.java
yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/SingleChildDataNodeContainer.java [deleted file]
yang/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/DefaultSchemaTreeInference.java

index ae3208f46c0b35725c7b5ab756b4361adf6059b4..6d6e41e0658d42a471543d305c8ae88bbfc251e6 100644 (file)
@@ -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<NormalizedMetadata> metadata) {
+    public static ImmutableNormalizedAnydata ofOptional(final EffectiveStatementInference inference,
+            final NormalizedNode data, final Optional<NormalizedMetadata> 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
index 34002f9150c6aa156457abb90d1c6a81d813c89f..34e173b91177e41c81309667401767f053e04427 100644 (file)
@@ -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;
 }
index f1fdcf42f3845235de9e9e647b0bc53e92310fa8..d915984cf8c06b22304363baa75aef38e3af161a 100644 (file)
@@ -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 {
index dcbb94b3660a70cb291b871a2b2b53cfc72d9689..4a2206d7f9d32ea851630acef702eb2f08599e7a 100644 (file)
@@ -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<? extends EffectiveStatement<?, ?>> 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 {
index 2f01f4f587d0b22f303a7c07c4d3b59050b64c4e..3df399b80f2057be389be76e959e0232374635d7 100644 (file)
@@ -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<? extends EffectiveStatement<?, ?>> 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);
         }
index 28b18398b5bcce974aa4de642c64ad41c7f00c23..798057c359858f71fee28adf45909a8c5bbe1542 100644 (file)
@@ -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<? extends EffectiveStatement<?, ?>> 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);
         }
index 50a6cfd785054d138d657476032b45f85b808c40..726e7abb0ec772d0872753aeeaea4f2f08656e40 100644 (file)
@@ -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);
     }
 }
index 49adb55a0ae733500abd7d4b3d7a9df65b4b4c00..2d375a4cc1a7c31137d16233ff31d036d34079f0 100644 (file)
@@ -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();
 
index 22b06786fd31d0032aa3710ad86ff8eac9e55655..c36c2df55f99cf9b69e71c6e90e7ddebaf826ec5 100644 (file)
@@ -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;
index 12fe44ec1cfda6aef07738975ef387d7f5a05331..8bcd593cd019ec69b65ecc16de72fed69462f5ec 100644 (file)
@@ -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;
 }
index 1fd441262538ba2c3e4d30098cf3d8cbbe82c714..1c23a0108c95930d142c3c1d441079008251af1f 100644 (file)
@@ -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 (file)
index 302193e..0000000
+++ /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<DataSchemaNode> getChildNodes() {
-        return ImmutableSet.of(child);
-    }
-
-    @Override
-    public Set<TypeDefinition<?>> getTypeDefinitions() {
-        return ImmutableSet.of();
-    }
-
-    @Override
-    public Set<GroupingDefinition> getGroupings() {
-        return ImmutableSet.of();
-    }
-
-    @Override
-    public Set<UsesNode> getUses() {
-        return ImmutableSet.of();
-    }
-}
index 84c3f5f508e107c8bd8cc7773e0c8ee63f18e979..9917c3f0d19fbea26725efce4b94d7f99b8c19de 100644 (file)
@@ -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);