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
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
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
@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;
}
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
*/
@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 {
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;
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;
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;
}
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 {
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;
/**
}
@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);
}
*/
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;
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;
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);
}
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
//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);
}
}
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;
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();
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;
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
@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
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;
}
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
}
@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);
}
+
}
+++ /dev/null
-/*
- * 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();
- }
-}
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);