+++ /dev/null
-/*
- * Copyright (c) 2015 Cisco Systems, Inc. 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.odlext.model.api;
-
-import com.google.common.annotations.Beta;
-import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.SchemaNode;
-
-/**
- * The "YangModeledAnyXml" interface defines an interior node in the schema tree. It takes
- * one argument, which is an identifier represented by QName inherited from
- * {@link SchemaNode}, followed by a block of substatements that holds detailed
- * anyxml information. The substatements are defined in {@link DataSchemaNode}.
- * The "YangModeledAnyXml" in contrast to the "AnyXml" interface can also provide schema
- * of contained XML information. <br>
- * <br>
- * This interface was modeled according to definition in <a
- * href="https://tools.ietf.org/html/rfc6020#section-7.10">[RFC-6020] The anyxml
- * Statement</a>
- */
-@Beta
-public interface YangModeledAnyxmlSchemaNode extends AnyxmlSchemaNode {
-
- /**
- * Returns the root schema node of the data in this anyxml node.
- *
- * @return DataSchemaNode - schema of contained XML data
- */
- @NonNull ContainerSchemaNode getSchemaOfAnyXmlData();
-}
+++ /dev/null
-/*
- * Copyright (c) 2017 Pantheon Technologies, 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.odlext.parser;
-
-import java.util.Map;
-import java.util.Optional;
-import java.util.stream.Stream;
-import org.opendaylight.yangtools.odlext.model.api.AnyxmlSchemaLocationEffectiveStatement;
-import org.opendaylight.yangtools.odlext.model.api.AnyxmlSchemaLocationStatement;
-import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
-import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlEffectiveStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
-import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.anyxml.AnyxmlStatementSupport;
-import org.opendaylight.yangtools.yang.parser.spi.SchemaTreeNamespace;
-import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx.Current;
-import org.opendaylight.yangtools.yang.parser.spi.meta.ForwardingStatementSupport;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable;
-
-public final class AnyxmlStatementSupportOverride
- extends ForwardingStatementSupport<QName, AnyxmlStatement, AnyxmlEffectiveStatement> {
- private static final AnyxmlStatementSupportOverride INSTANCE = new AnyxmlStatementSupportOverride();
-
- private AnyxmlStatementSupportOverride() {
- super(AnyxmlStatementSupport.getInstance());
- }
-
- public static AnyxmlStatementSupportOverride getInstance() {
- return INSTANCE;
- }
-
- @Override
- public AnyxmlEffectiveStatement createEffective(final Current<QName, AnyxmlStatement> stmt,
- final Stream<? extends StmtContext<?, ?, ?>> declaredSubstatements,
- final Stream<? extends StmtContext<?, ?, ?>> effectiveSubstatements) {
- final AnyxmlEffectiveStatement delegateStatement = super.createEffective(stmt, declaredSubstatements,
- effectiveSubstatements);
-
- final Map<StatementDefinition, Mutable<SchemaNodeIdentifier, AnyxmlSchemaLocationStatement,
- AnyxmlSchemaLocationEffectiveStatement>> schemaLocations =
- stmt.localNamespacePortion(AnyxmlSchemaLocationNamespace.class);
- if (schemaLocations != null && !schemaLocations.isEmpty()) {
- final SchemaNodeIdentifier anyXmlSchemaNodeIdentifier = schemaLocations.values().iterator().next()
- .argument();
- final Optional<ContainerSchemaNode> anyXmlSchema = getAnyXmlSchema(stmt, anyXmlSchemaNodeIdentifier);
- if (anyXmlSchema.isPresent()) {
- return new YangModeledAnyxmlEffectiveStatementImpl(delegateStatement, anyXmlSchema.get());
- }
- }
-
- return delegateStatement;
- }
-
- private static Optional<ContainerSchemaNode> getAnyXmlSchema(final Current<QName, AnyxmlStatement> stmt,
- final SchemaNodeIdentifier contentSchemaPath) {
- return SchemaTreeNamespace.findNode(stmt.caerbannog().getRoot(), contentSchemaPath)
- .map(StmtContext::buildEffective)
- .filter(ContainerSchemaNode.class::isInstance).map(ContainerSchemaNode.class::cast);
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2015 Cisco Systems, Inc. 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.odlext.parser;
-
-import static java.util.Objects.requireNonNull;
-
-import java.util.Collection;
-import java.util.Optional;
-import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.yangtools.odlext.model.api.YangModeledAnyxmlSchemaNode;
-import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.MustDefinition;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
-import org.opendaylight.yangtools.yang.model.api.Status;
-import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.meta.ForwardingEffectiveStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlEffectiveStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlStatement;
-import org.opendaylight.yangtools.yang.xpath.api.YangXPathExpression.QualifiedBound;
-
-final class YangModeledAnyxmlEffectiveStatementImpl
- extends ForwardingEffectiveStatement<QName, AnyxmlStatement, AnyxmlEffectiveStatement>
- implements YangModeledAnyxmlSchemaNode, AnyxmlEffectiveStatement {
- private final @NonNull AnyxmlEffectiveStatement delegate;
- private final @NonNull ContainerSchemaNode contentSchema;
-
- YangModeledAnyxmlEffectiveStatementImpl(final AnyxmlEffectiveStatement delegate,
- final ContainerSchemaNode contentSchema) {
- this.delegate = requireNonNull(delegate);
- this.contentSchema = requireNonNull(contentSchema);
- }
-
- @Override
- protected @NonNull AnyxmlEffectiveStatement delegate() {
- return delegate;
- }
-
- @Override
- public @NonNull ContainerSchemaNode getSchemaOfAnyXmlData() {
- return contentSchema;
- }
-
- private AnyxmlSchemaNode delegateSchemaNode() {
- return (AnyxmlSchemaNode) delegate;
- }
-
- @Override
- public Optional<Boolean> effectiveConfig() {
- return delegateSchemaNode().effectiveConfig();
- }
-
- @Override
- public QName getQName() {
- return delegateSchemaNode().getQName();
- }
-
- @Override
- @Deprecated
- public SchemaPath getPath() {
- return delegateSchemaNode().getPath();
- }
-
- @Override
- public Status getStatus() {
- return delegateSchemaNode().getStatus();
- }
-
- @Override
- public Optional<String> getDescription() {
- return delegateSchemaNode().getDescription();
- }
-
- @Override
- public Optional<String> getReference() {
- return delegateSchemaNode().getReference();
- }
-
- @Deprecated
- @Override
- public boolean isAugmenting() {
- return delegateSchemaNode().isAugmenting();
- }
-
- @Deprecated
- @Override
- public boolean isAddedByUses() {
- return delegateSchemaNode().isAddedByUses();
- }
-
- @Override
- public Optional<? extends QualifiedBound> getWhenCondition() {
- return delegateSchemaNode().getWhenCondition();
- }
-
- @Override
- public boolean isMandatory() {
- return delegateSchemaNode().isMandatory();
- }
-
- @Override
- public Collection<? extends @NonNull MustDefinition> getMustConstraints() {
- return delegateSchemaNode().getMustConstraints();
- }
-
- @Override
- public Collection<? extends UnknownSchemaNode> getUnknownSchemaNodes() {
- return delegateSchemaNode().getUnknownSchemaNodes();
- }
-
- @Override
- public AnyxmlEffectiveStatement asEffectiveStatement() {
- return delegateSchemaNode().asEffectiveStatement();
- }
-
- @Override
- public String toString() {
- return YangModeledAnyxmlEffectiveStatementImpl.class.getSimpleName() + "["
- + "qname=" + getQName()
- + ", path=" + getPath()
- + "]";
- }
-}
*
* <p>
* To access this extension, add {@link org.opendaylight.yangtools.odlext.parser.AnyxmlSchemaLocationStatementSupport},
- * {@link org.opendaylight.yangtools.odlext.parser.AnyxmlStatementSupportOverride} and
* {@link org.opendaylight.yangtools.odlext.parser.AnyxmlSchemaLocationNamespace#BEHAVIOUR} to the reactor.
*
* @author Robert Varga
import org.junit.BeforeClass;
import org.junit.Test;
import org.opendaylight.yangtools.odlext.model.api.OpenDaylightExtensionsStatements;
-import org.opendaylight.yangtools.odlext.model.api.YangModeledAnyxmlSchemaNode;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.common.QNameModule;
+import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode;
import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
import org.opendaylight.yangtools.yang.model.api.SchemaNode;
import org.opendaylight.yangtools.yang.model.api.SchemaPath;
import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil;
import org.opendaylight.yangtools.yang.parser.rfc7950.reactor.RFC7950Reactors;
.addStatementSupport(ModelProcessingPhase.FULL_DECLARATION,
AnyxmlSchemaLocationStatementSupport.getInstance())
.addNamespaceSupport(ModelProcessingPhase.FULL_DECLARATION, AnyxmlSchemaLocationNamespace.BEHAVIOUR)
- .overrideStatementSupport(ModelProcessingPhase.FULL_DECLARATION,
- AnyxmlStatementSupportOverride.getInstance())
.build();
}
QName myAnyXmlDataQName = QName.create(foo, "my-anyxml-data");
DataSchemaNode dataChildByName = context.findDataChildByName(myAnyXmlDataQName).get();
- assertTrue(dataChildByName instanceof YangModeledAnyxmlSchemaNode);
- YangModeledAnyxmlSchemaNode yangModeledAnyXml = (YangModeledAnyxmlSchemaNode) dataChildByName;
+ assertTrue(dataChildByName instanceof AnyxmlSchemaNode);
+ AnyxmlSchemaNode anyxml = (AnyxmlSchemaNode) dataChildByName;
SchemaNode myContainer2 = SchemaContextUtil.findDataSchemaNode(context,
SchemaPath.create(true, myContainer2QName));
assertTrue(myContainer2 instanceof ContainerSchemaNode);
- assertEquals(myContainer2, yangModeledAnyXml.getSchemaOfAnyXmlData());
- Collection<? extends UnknownSchemaNode> unknownSchemaNodes = yangModeledAnyXml.getUnknownSchemaNodes();
+ Collection<? extends UnknownSchemaNode> unknownSchemaNodes = anyxml.getUnknownSchemaNodes();
assertEquals(1, unknownSchemaNodes.size());
UnknownSchemaNode next = unknownSchemaNodes.iterator().next();
assertTrue(next instanceof AnyxmlSchemaLocationEffectiveStatementImpl);
AnyxmlSchemaLocationEffectiveStatementImpl anyxmlSchemaLocationUnknownNode =
(AnyxmlSchemaLocationEffectiveStatementImpl) next;
+ assertEquals(Absolute.of(myContainer2QName), anyxmlSchemaLocationUnknownNode.argument());
assertEquals(OpenDaylightExtensionsStatements.ANYXML_SCHEMA_LOCATION.getStatementName(),
anyxmlSchemaLocationUnknownNode.getNodeType());
assertEquals(OpenDaylightExtensionsStatements.ANYXML_SCHEMA_LOCATION.getStatementName(),
return ret;
}
- @Override
- public void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint) throws IOException {
- super.startYangModeledAnyXmlNode(name, childSizeHint);
- enterMetadataNode(name);
- }
-
@Override
public void endNode() throws IOException {
super.endNode();
+++ /dev/null
-/*
- * Copyright (c) 2015 Cisco Systems, Inc. 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.api.schema;
-
-import com.google.common.annotations.Beta;
-import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
-
-/**
- * AnyXML node with schema of contained XML data.
- *
- * @deprecated This interface is wrong abstraction. It should be expressed as {@link NormalizableAnydata} equivalent.
- */
-@Beta
-@Deprecated
-public interface YangModeledAnyXmlNode extends DataContainerNode<NodeIdentifier>, DataContainerChild {
- /**
- * Returns the schema corresponding to the node's datea.
- *
- * @return schema of contained XML data
- */
- @NonNull ContainerSchemaNode getSchemaOfAnyXmlData();
-}
return delegate().startAnyxmlNode(name, objectModel);
}
- @Override
- public void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint) throws IOException {
- delegate().startYangModeledAnyXmlNode(name, childSizeHint);
- }
-
@Override
public boolean startAnydataNode(final NodeIdentifier name, final Class<?> objectModel) throws IOException {
return delegate().startAnydataNode(name, objectModel);
return true;
}
- @Override
- public void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint) {
- LOG.debug("{}{}(yangModeledAnyXml)", ind(), name);
- incIndent();
- }
-
@Override
public void flush() {
LOG.trace("<<FLUSH>>");
// FIXME: 7.0.0: this probably should integrated with scalarValue()
void domSourceValue(DOMSource value) throws IOException;
- /**
- * Emits start of new YANG-modeled anyxml node. Valid sub-events are:
- * <ul>
- * <li>{@link #startLeafNode}</li>
- * <li>{@link #startContainerNode}</li>
- * <li>{@link #startLeafSet}</li>
- * <li>{@link #startMapNode}</li>
- * <li>{@link #startUnkeyedList}</li>
- * </ul>
- *
- * @param name name of node as defined in schema, namespace and revision are derived from parent node.
- * @param childSizeHint Non-negative count of expected direct child nodes or {@link #UNKNOWN_SIZE} if count is
- * unknown. This is only hint and should not fail writing of child events, if there are more
- * events than count.
- * @throws NullPointerException if {@code name} is null
- * @throws IllegalArgumentException If emitted node is invalid in current context or was emitted multiple times.
- * @throws IllegalStateException If node was emitted inside {@code map}, {@code choice} or a {@code unkeyed list}
- * node.
- * @throws IOException if an underlying IO error occurs
- */
- void startYangModeledAnyXmlNode(NodeIdentifier name, int childSizeHint) throws IOException;
-
/**
* Emits end event for node.
*
import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
import org.opendaylight.yangtools.yang.data.api.schema.UserLeafSetNode;
import org.opendaylight.yangtools.yang.data.api.schema.UserMapNode;
-import org.opendaylight.yangtools.yang.data.api.schema.YangModeledAnyXmlNode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
writer.startContainerNode(n.getIdentifier(), childSizeHint(n.body()));
return writeChildren(n.body());
}
- if (node instanceof YangModeledAnyXmlNode) {
- final YangModeledAnyXmlNode n = (YangModeledAnyXmlNode) node;
- writer.startYangModeledAnyXmlNode(n.getIdentifier(), childSizeHint(n.body()));
- return writeChildren(n.body());
- }
if (node instanceof MapEntryNode) {
return writeMapEntryNode((MapEntryNode) node);
}
import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
import org.opendaylight.yangtools.yang.data.api.schema.UserLeafSetNode;
import org.opendaylight.yangtools.yang.data.api.schema.UserMapNode;
-import org.opendaylight.yangtools.yang.data.api.schema.YangModeledAnyXmlNode;
public class NormalizedNodeWriterTest {
final NormalizedNode mockedContainerNode = mock(ContainerNode.class);
assertNotNull(orderedNormalizedNodeWriter.write(mockedContainerNode));
- final NormalizedNode mockedYangModeledAnyXmlNode = mock(YangModeledAnyXmlNode.class);
- assertNotNull(orderedNormalizedNodeWriter.write(mockedYangModeledAnyXmlNode));
-
final MapEntryNode mockedMapEntryNode = mock(MapEntryNode.class);
doReturn(NodeIdentifierWithPredicates.of(myKeyedList, myKeyLeaf, "list-key-value-1"))
.when(mockedMapEntryNode).getIdentifier();
startNode(name, LithiumNode.CONTAINER_NODE);
}
- @Override
- public final void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint)
- throws IOException {
- LOG.trace("Starting a new yang modeled anyXml node");
- startNode(name, LithiumNode.YANG_MODELED_ANY_XML_NODE);
- }
-
@Override
public final void startUnkeyedList(final NodeIdentifier name, final int childSizeHint) throws IOException {
LOG.trace("Starting a new unkeyed list");
case MagnesiumNode.NODE_ANYXML:
streamAnyxml(writer, nodeHeader);
break;
- case MagnesiumNode.NODE_ANYXML_MODELED:
- streamAnyxmlModeled(writer, nodeHeader);
- break;
case MagnesiumNode.NODE_LIST_ENTRY:
streamListEntry(writer, parent, nodeHeader);
break;
}
}
- private void streamAnyxmlModeled(final NormalizedNodeStreamWriter writer, final byte nodeHeader)
- throws IOException {
- // TODO: decide how to deal with these
- throw new UnsupportedOperationException("Reading YANG-modeled anyxml was never supported");
- }
-
private void streamAugmentation(final NormalizedNodeStreamWriter writer, final byte nodeHeader) throws IOException {
final AugmentationIdentifier augIdentifier = decodeAugmentationIdentifier(nodeHeader);
LOG.trace("Streaming augmentation node {}", augIdentifier);
writeValue(writer.toString());
}
- @Override
- public final void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint)
- throws IOException {
- // FIXME: implement this
- throw new UnsupportedOperationException();
- }
-
@Override
public final void endNode() throws IOException {
if (stack.pop() instanceof PathArgument) {
static final byte ANY_XML_NODE = 12;
static final byte END_NODE = 13;
static final byte ORDERED_LEAF_SET = 14;
+ // Note: never emitted as of yangtools-7.0.0
+ @Deprecated
static final byte YANG_MODELED_ANY_XML_NODE = 15;
private LithiumNode() {
static final byte NODE_LEAFSET_ENTRY = 0x0C;
static final byte NODE_MAP_ENTRY = 0x0D;
- // TODO: either implement or remove this coding. While Lithium has emit code, it lacks the code do read such nodes,
- // which most probably means we do not need to bother ...
+ // Note: unused as of yangtools-7.0.0
+ @Deprecated
static final byte NODE_ANYXML_MODELED = 0x0E;
// 0x0F reserved for anydata
static final byte TYPE_MASK = 0x0F;
return false;
}
- @Override
- public final void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint)
- throws IOException {
- tracker.startYangModeledAnyXmlNode(name);
- context = new JSONStreamWriterNamedObjectContext(context, name, true);
- }
-
@Override
public final void endNode() throws IOException {
tracker.endNode();
import java.util.Set;
import javax.xml.transform.dom.DOMSource;
import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.yangtools.odlext.model.api.YangModeledAnyxmlSchemaNode;
import org.opendaylight.yangtools.util.xml.UntrustedXML;
import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
import org.opendaylight.yangtools.yang.data.util.AbstractNodeDataWithSchema;
}
while (in.hasNext()) {
final String jsonElementName = in.nextName();
- DataSchemaNode parentSchema = parent.getSchema();
- if (parentSchema instanceof YangModeledAnyxmlSchemaNode) {
- parentSchema = ((YangModeledAnyxmlSchemaNode) parentSchema).getSchemaOfAnyXmlData();
- }
+ final DataSchemaNode parentSchema = parent.getSchema();
final Entry<String, URI> namespaceAndName = resolveNamespace(jsonElementName, parentSchema);
final String localName = namespaceAndName.getKey();
final URI namespace = namespaceAndName.getValue();
}
private void executebug8927Test(final String inputXmlFile, final String expectedJsonFile) throws Exception {
- final InputStream resourceAsStream = YangModeledAnyXmlSupportTest.class
- .getResourceAsStream(inputXmlFile);
+ final InputStream resourceAsStream = AnyXmlSupportTest.class.getResourceAsStream(inputXmlFile);
final NormalizedNodeResult result = new NormalizedNodeResult();
loadXmlToNormalizedNodes(resourceAsStream, result, schemaContext);
+++ /dev/null
-/*
- * Copyright (c) 2016 Cisco Systems, Inc. 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.codec.gson;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.opendaylight.yangtools.yang.data.codec.gson.TestUtils.loadTextFile;
-
-import com.google.gson.JsonElement;
-import com.google.gson.JsonParser;
-import com.google.gson.stream.JsonReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.io.Writer;
-import java.net.URISyntaxException;
-import java.nio.charset.StandardCharsets;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamReader;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.opendaylight.yangtools.util.xml.UntrustedXML;
-import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
-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.api.schema.stream.NormalizedNodeWriter;
-import org.opendaylight.yangtools.yang.data.codec.xml.XmlParserStream;
-import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter;
-import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
-import org.opendaylight.yangtools.yang.model.api.Module;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
-import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
-import org.xml.sax.SAXException;
-
-public class YangModeledAnyXmlSupportTest {
- private static EffectiveModelContext schemaContext;
- private static JSONCodecFactory lhotkaCodecFactory;
- private static ContainerNode data;
-
- @BeforeClass
- public static void init() throws XMLStreamException, URISyntaxException, IOException, ParserConfigurationException,
- SAXException {
- schemaContext = YangParserTestUtils.parseYangResourceDirectory("/yang-modeled-anyxml/yang");
- lhotkaCodecFactory = JSONCodecFactorySupplier.DRAFT_LHOTKA_NETMOD_YANG_JSON_02.getShared(schemaContext);
-
- final Module bazModule = schemaContext.findModules("baz").iterator().next();
- final ContainerSchemaNode bazCont = (ContainerSchemaNode) bazModule.findDataChildByName(
- QName.create(bazModule.getQNameModule(), "baz")).get();
-
- final InputStream resourceAsStream = YangModeledAnyXmlSupportTest.class.getResourceAsStream(
- "/yang-modeled-anyxml/xml/baz.xml");
-
- final XMLStreamReader reader = UntrustedXML.createXMLStreamReader(resourceAsStream);
-
- final NormalizedNodeResult result = new NormalizedNodeResult();
-
- final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
-
- final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, schemaContext, bazCont);
- xmlParser.parse(reader);
-
- assertNotNull(result.getResult());
- assertTrue(result.getResult() instanceof ContainerNode);
- data = (ContainerNode) result.getResult();
- }
-
- @AfterClass
- public static void cleanup() {
- lhotkaCodecFactory = null;
- schemaContext = null;
- data = null;
- }
-
- @Test
- public void jsonToNormalizedNodesTest() throws IOException, URISyntaxException, SAXException {
- final String inputJson = loadTextFile("/yang-modeled-anyxml/json/baz.json");
- final NormalizedNodeResult result = new NormalizedNodeResult();
- final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
- final JsonParserStream jsonParser = JsonParserStream.create(streamWriter, lhotkaCodecFactory);
- jsonParser.parse(new JsonReader(new StringReader(inputJson)));
- final NormalizedNode transformedInput = result.getResult();
-
- assertEquals(data, transformedInput);
- }
-
- @Test
- public void normalizedNodesToJsonTest() throws IOException, URISyntaxException, SAXException {
- final Writer writer = new StringWriter();
- final String jsonOutput = normalizedNodeToJsonStreamTransformation(writer, data);
-
- final JsonParser parser = new JsonParser();
- final JsonElement serializedJson = parser.parse(jsonOutput);
- final JsonElement expextedJson = parser.parse(new FileReader(new File(getClass().getResource(
- "/yang-modeled-anyxml/json/baz.json").toURI()), StandardCharsets.UTF_8));
-
- assertEquals(expextedJson, serializedJson);
- }
-
- private static String normalizedNodeToJsonStreamTransformation(final Writer writer,
- final NormalizedNode inputStructure) throws IOException {
-
- final NormalizedNodeStreamWriter jsonStream = JSONNormalizedNodeStreamWriter.createExclusiveWriter(
- lhotkaCodecFactory, SchemaPath.ROOT, null, JsonWriterFactory.createJsonWriter(writer, 2));
- final NormalizedNodeWriter nodeWriter = NormalizedNodeWriter.forStreamWriter(jsonStream);
- nodeWriter.write(inputStructure);
-
- nodeWriter.close();
- return writer.toString();
- }
-}
\ No newline at end of file
+++ /dev/null
-{
- "baz:baz":{
- "my-container-1":{
- "my-leaf-1":"value1"
- },
- "my-container-2":{
- "inner-container":{
- "my-leaf-2":"value2"
- },
- "my-leaf-3":"value3"
- },
- "my-anyxml-data":{
- "inner-container":{
- "my-leaf-2":"any-xml-leaf-2-value"
- },
- "my-leaf-3":"any-xml-leaf-3-value"
- }
- }
-}
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<baz xmlns="baz">
- <my-container-1>
- <my-leaf-1>value1</my-leaf-1>
- </my-container-1>
- <my-container-2>
- <inner-container>
- <my-leaf-2>value2</my-leaf-2>
- </inner-container>
- <my-leaf-3>value3</my-leaf-3>
- </my-container-2>
-
- <my-anyxml-data>
- <inner-container>
- <my-leaf-2>any-xml-leaf-2-value</my-leaf-2>
- </inner-container>
- <my-leaf-3>any-xml-leaf-3-value</my-leaf-3>
- </my-anyxml-data>
-</baz>
\ No newline at end of file
+++ /dev/null
-module baz {
- namespace "baz";
- prefix baz;
-
- import yang-ext { prefix ext; revision-date 2013-07-09; }
-
- container baz {
- container my-container-1 {
- leaf my-leaf-1 {
- type string;
- }
- }
-
- container my-container-2 {
- container inner-container {
- leaf my-leaf-2 {
- type string;
- }
- }
- leaf my-leaf-3 {
- type string;
- }
- }
-
- anyxml my-anyxml-data {
- ext:anyxml-schema-location "/baz/my-container-2";
- }
- }
-}
+++ /dev/null
-module yang-ext {
- yang-version 1;
- namespace "urn:opendaylight:yang:extension:yang-ext";
- prefix "ext";
-
- contact "Anton Tkacik <ttkacik@cisco.com>";
-
- description
- "Copyright (c) 2013 Cisco Systems, Inc. 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";
-
- revision "2013-07-09" {
- description "";
- }
-
- // Augmentation name
-
- extension "augment-identifier" {
- description
- "YANG language extension which assigns an identifier to augmentation.
- Augment identifier is used to identify specific augment statement
- by name. The identifier syntax is defined formally defined by
- the rule 'identifier' in Section 12 of RFC 6020. All augment identifiers
- defined in a namespace MUST be unique. The namespace of augment
- identifiers is shared by module and its submodules.";
-
- /*
- Discussion:
- This extension allows for ease of development / debug
- of YANG modules and it is suitable for code generation,
- where each augment statement is nicely identified by
- unique name instead of combination of augment target
- and when condition.
- */
- argument "identifier";
- }
-
- // Context-aware RPCs
-
- grouping rpc-context-ref {
- description
- "A reference to RPC context.";
- leaf context-instance {
- type instance-identifier;
- description "Pointer to the context. ";
- }
- }
-
- extension "rpc-context-instance" {
- description
- "YANG language extension which defines enclosing (parent) schema
- node as referencable context for RPCs. The argument is identity
- which is used to identify RPC context type.";
-
- argument "context-type";
- }
-
- extension "context-reference" {
- argument "context-type";
- }
-
- extension "context-instance" {
- argument "context-type";
- }
-
- extension "instance-target" {
- argument "path";
- }
-
- extension "anyxml-schema-location" {
- argument "target-node";
- }
-}
tracker.startAugmentationNode(identifier);
}
- @Override
- public void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint) throws IOException {
- final SchemaNode schema = tracker.startYangModeledAnyXmlNode(name);
- startElement(schema.getQName());
- }
-
@Override
public boolean startAnyxmlNode(final NodeIdentifier name, final Class<?> objectModel) throws IOException {
if (DOMSource.class.isAssignableFrom(objectModel)) {
return false;
}
- @Override
- public void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint) throws IOException {
- nodeTypeStack.push(NodeType.YANG_MODELED_ANY_XML);
- startElement(name.getNodeType());
- }
-
@Override
String encodeValue(final ValueWriter xmlWriter, final Object value, final Object context) {
return value.toString();
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stax.StAXSource;
-import org.opendaylight.yangtools.odlext.model.api.YangModeledAnyxmlSchemaNode;
import org.opendaylight.yangtools.rfc7952.model.api.AnnotationSchemaNode;
import org.opendaylight.yangtools.rfc8528.data.api.MountPointContext;
import org.opendaylight.yangtools.rfc8528.data.api.MountPointContextFactory;
import org.opendaylight.yangtools.yang.data.util.OperationAsContainer;
import org.opendaylight.yangtools.yang.data.util.ParserStreamUtils;
import org.opendaylight.yangtools.yang.data.util.SimpleNodeDataWithSchema;
-import org.opendaylight.yangtools.yang.data.util.YangModeledAnyXmlNodeDataWithSchema;
import org.opendaylight.yangtools.yang.model.api.AnydataSchemaNode;
import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode;
import org.opendaylight.yangtools.yang.model.api.ContainerLike;
nodeDataWithSchema = new ContainerNodeDataWithSchema((ContainerLike) parentNode);
} else if (parentNode instanceof ListSchemaNode) {
nodeDataWithSchema = new ListNodeDataWithSchema((ListSchemaNode) parentNode);
- } else if (parentNode instanceof YangModeledAnyxmlSchemaNode) {
- nodeDataWithSchema = new YangModeledAnyXmlNodeDataWithSchema((YangModeledAnyxmlSchemaNode) parentNode);
} else if (parentNode instanceof AnyxmlSchemaNode) {
nodeDataWithSchema = new AnyXmlNodeDataWithSchema((AnyxmlSchemaNode) parentNode);
} else if (parentNode instanceof LeafSchemaNode) {
return;
}
- if (parent instanceof YangModeledAnyxmlSchemaNode) {
- parent.setAttributes(getElementAttributes(in));
- }
-
switch (in.nextTag()) {
case XMLStreamConstants.START_ELEMENT:
// FIXME: 7.0.0: why do we even need this tracker? either document it or remove it.
final Set<Entry<String, String>> namesakes = new HashSet<>();
while (in.hasNext()) {
final String xmlElementName = in.getLocalName();
-
- DataSchemaNode parentSchema = parent.getSchema();
+ final DataSchemaNode parentSchema = parent.getSchema();
final String parentSchemaName = parentSchema.getQName().getLocalName();
if (parentSchemaName.equals(xmlElementName)
break;
}
- if (parentSchema instanceof YangModeledAnyxmlSchemaNode) {
- parentSchema = ((YangModeledAnyxmlSchemaNode) parentSchema).getSchemaOfAnyXmlData();
- }
-
final String elementNS = in.getNamespaceURI();
final boolean added = namesakes.add(new SimpleImmutableEntry<>(elementNS, xmlElementName));
+++ /dev/null
-/*
- * Copyright (c) 2016 Cisco Systems, Inc. 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.codec.xml;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import com.google.common.collect.ImmutableSet;
-import java.io.InputStream;
-import java.net.URI;
-import java.util.Collection;
-import java.util.Optional;
-import javax.xml.stream.XMLStreamReader;
-import org.junit.Before;
-import org.junit.Test;
-import org.opendaylight.yangtools.odlext.model.api.YangModeledAnyxmlSchemaNode;
-import org.opendaylight.yangtools.util.xml.UntrustedXML;
-import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.common.QNameModule;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
-import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
-import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
-import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
-import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.data.api.schema.YangModeledAnyXmlNode;
-import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
-import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter;
-import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
-import org.opendaylight.yangtools.yang.model.api.Module;
-import org.opendaylight.yangtools.yang.model.api.MustDefinition;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
-import org.opendaylight.yangtools.yang.model.api.Status;
-import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlEffectiveStatement;
-import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
-import org.opendaylight.yangtools.yang.xpath.api.YangXPathExpression.QualifiedBound;
-
-public class YangModeledAnyXMLDeserializationTest {
-
- private QNameModule fooModuleQName;
- private QNameModule barModuleQName;
- private QName myContainer1;
- private QName myContainer2;
- private QName innerContainer;
- private QName myLeaf3;
- private QName myLeaf2;
- private QName myLeaf1;
- private QName myAnyXMLDataBar;
- private QName myAnyXMLDataFoo;
- private EffectiveModelContext schemaContext;
-
- @Before
- public void setUp() {
- barModuleQName = QNameModule.create(URI.create("bar"));
- myContainer1 = QName.create(barModuleQName, "my-container-1");
- myLeaf1 = QName.create(barModuleQName, "my-leaf-1");
- myAnyXMLDataBar = QName.create(barModuleQName, "my-anyxml-data");
-
- fooModuleQName = QNameModule.create(URI.create("foo"));
- myContainer2 = QName.create(fooModuleQName, "my-container-2");
- innerContainer = QName.create(fooModuleQName, "inner-container");
- myLeaf3 = QName.create(fooModuleQName, "my-leaf-3");
- myLeaf2 = QName.create(fooModuleQName, "my-leaf-2");
- myAnyXMLDataFoo = QName.create(fooModuleQName, "my-anyxml-data");
-
- schemaContext = YangParserTestUtils.parseYangResourceDirectory("/anyxml-support/yang");
- }
-
- @Test
- public void testRawAnyXMLFromBar() throws Exception {
- DataSchemaNode barContainer = schemaContext.findDataChildByName(QName.create(barModuleQName, "bar")).get();
- assertTrue(barContainer instanceof ContainerSchemaNode);
- final YangModeledAnyxmlSchemaNode yangModeledAnyXML = new YangModeledAnyXMLSchemaNodeImplTest(myAnyXMLDataBar,
- (ContainerSchemaNode) barContainer);
-
- final InputStream resourceAsStream = YangModeledAnyXMLDeserializationTest.class.getResourceAsStream(
- "/anyxml-support/xml/bar.xml");
-
- final XMLStreamReader reader = UntrustedXML.createXMLStreamReader(resourceAsStream);
- final NormalizedNodeResult result = new NormalizedNodeResult();
-
- final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
-
- final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, schemaContext, yangModeledAnyXML);
- xmlParser.parse(reader);
-
- final NormalizedNode output = result.getResult();
- assertTrue(output instanceof YangModeledAnyXmlNode);
- final YangModeledAnyXmlNode yangModeledAnyXmlNode = (YangModeledAnyXmlNode) output;
-
- Collection<DataContainerChild> value = yangModeledAnyXmlNode.body();
- assertEquals(2, value.size());
-
- DataContainerChild child = yangModeledAnyXmlNode.childByArg(new NodeIdentifier(myContainer1));
- assertTrue(child instanceof ContainerNode);
- ContainerNode myContainerNode1 = (ContainerNode) child;
-
- DataContainerChild child2 = myContainerNode1.childByArg(new NodeIdentifier(myLeaf1));
- assertTrue(child2 instanceof LeafNode);
- LeafNode<?> leafNode1 = (LeafNode<?>) child2;
-
- Object leafNode1Value = leafNode1.body();
- assertEquals("value1", leafNode1Value);
- }
-
- @Test
- public void testRealSchemaContextFromFoo() throws Exception {
- final InputStream resourceAsStream = YangModeledAnyXMLDeserializationTest.class.getResourceAsStream(
- "/anyxml-support/xml/foo.xml");
- final Module foo = schemaContext.findModules("foo").iterator().next();
- final YangModeledAnyxmlSchemaNode myAnyXmlData = (YangModeledAnyxmlSchemaNode) foo.findDataChildByName(
- QName.create(foo.getQNameModule(), "my-anyxml-data")).get();
-
- final XMLStreamReader reader = UntrustedXML.createXMLStreamReader(resourceAsStream);
- final NormalizedNodeResult result = new NormalizedNodeResult();
-
- final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
-
- final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, schemaContext, myAnyXmlData);
- xmlParser.parse(reader);
-
- final NormalizedNode output = result.getResult();
- assertTrue(output instanceof YangModeledAnyXmlNode);
- final YangModeledAnyXmlNode yangModeledAnyXmlNode = (YangModeledAnyXmlNode) output;
-
- DataSchemaNode schemaOfAnyXmlData = yangModeledAnyXmlNode.getSchemaOfAnyXmlData();
- DataSchemaNode expectedSchemaOfAnyXmlData = schemaContext.findDataChildByName(myContainer2).get();
- assertEquals(expectedSchemaOfAnyXmlData, schemaOfAnyXmlData);
-
- Collection<DataContainerChild> value = yangModeledAnyXmlNode.body();
- assertEquals(2, value.size());
-
- DataContainerChild child2 = yangModeledAnyXmlNode.childByArg(new NodeIdentifier(innerContainer));
- assertTrue(child2 instanceof ContainerNode);
- ContainerNode innerContainerNode = (ContainerNode) child2;
-
- DataContainerChild child3 = innerContainerNode.childByArg(new NodeIdentifier(myLeaf2));
- assertTrue(child3 instanceof LeafNode);
- LeafNode<?> leafNode2 = (LeafNode<?>) child3;
-
- Object leafNode2Value = leafNode2.body();
- assertEquals("any-xml-leaf-2-value", leafNode2Value);
-
- DataContainerChild child4 = yangModeledAnyXmlNode.childByArg(new NodeIdentifier(myLeaf3));
- assertTrue(child4 instanceof LeafNode);
- LeafNode<?> leafNode3 = (LeafNode<?>) child4;
-
- Object leafNode3Value = leafNode3.body();
- assertEquals("any-xml-leaf-3-value", leafNode3Value);
- }
-
- private static final class YangModeledAnyXMLSchemaNodeImplTest implements YangModeledAnyxmlSchemaNode {
- private final QName qname;
- private final ContainerSchemaNode contentSchema;
-
- YangModeledAnyXMLSchemaNodeImplTest(final QName qname, final ContainerSchemaNode contentSchema) {
- this.qname = qname;
- this.contentSchema = contentSchema;
- }
-
- @Override
- public boolean isAugmenting() {
- return false;
- }
-
- @Override
- public boolean isAddedByUses() {
- return false;
- }
-
- @Override
- public Optional<Boolean> effectiveConfig() {
- return Optional.of(Boolean.FALSE);
- }
-
- @Override
- public boolean isMandatory() {
- return false;
- }
-
- @Override
- public QName getQName() {
- return qname;
- }
-
- @Override
- @Deprecated
- public SchemaPath getPath() {
- return null;
- }
-
- @Override
- public Optional<String> getDescription() {
- return Optional.empty();
- }
-
- @Override
- public Optional<String> getReference() {
- return Optional.empty();
- }
-
- @Override
- public Status getStatus() {
- return Status.CURRENT;
- }
-
- @Override
- public ContainerSchemaNode getSchemaOfAnyXmlData() {
- return contentSchema;
- }
-
- @Override
- public Collection<MustDefinition> getMustConstraints() {
- return ImmutableSet.of();
- }
-
- @Override
- public Optional<? extends QualifiedBound> getWhenCondition() {
- return Optional.empty();
- }
-
- @Override
- public AnyxmlEffectiveStatement asEffectiveStatement() {
- throw new UnsupportedOperationException();
- }
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2016 Cisco Systems, Inc. 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.codec.xml;
-
-import static java.util.Objects.requireNonNull;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.StringWriter;
-import java.net.URI;
-import java.util.Collection;
-import javax.xml.stream.XMLOutputFactory;
-import javax.xml.stream.XMLStreamReader;
-import javax.xml.stream.XMLStreamWriter;
-import javax.xml.transform.OutputKeys;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.TransformerFactoryConfigurationError;
-import javax.xml.transform.dom.DOMResult;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-import org.custommonkey.xmlunit.XMLTestCase;
-import org.custommonkey.xmlunit.XMLUnit;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.opendaylight.yangtools.util.xml.UntrustedXML;
-import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.common.QNameModule;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
-import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
-import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
-import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.data.api.schema.YangModeledAnyXmlNode;
-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.data.impl.schema.ImmutableNormalizedNodeStreamWriter;
-import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
-import org.opendaylight.yangtools.yang.model.api.Module;
-import org.opendaylight.yangtools.yang.model.api.SchemaNode;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
-import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil;
-import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.xml.sax.SAXException;
-
-@RunWith(Parameterized.class)
-public class YangModeledAnyXMLSerializationTest extends XMLTestCase {
- @Parameterized.Parameters(name = "{0}")
- public static Collection<Object[]> data() {
- return TestFactories.junitParameters();
- }
-
- private final QNameModule bazModuleQName = QNameModule.create(URI.create("baz"));
- private final QName myAnyXMLDataBaz = QName.create(bazModuleQName, "my-anyxml-data");
- private final QName bazQName = QName.create(bazModuleQName, "baz");
- private final QName myContainer2QName = QName.create(bazModuleQName, "my-container-2");
-
- private static EffectiveModelContext SCHEMA_CONTEXT;
-
- private final XMLOutputFactory factory;
-
- public YangModeledAnyXMLSerializationTest(final String factoryMode, final XMLOutputFactory factory) {
- this.factory = factory;
- }
-
- @BeforeClass
- public static void beforeClass() {
- SCHEMA_CONTEXT = YangParserTestUtils.parseYangResourceDirectory("/anyxml-support/serialization");
- }
-
- @AfterClass
- public static void afterClass() {
- SCHEMA_CONTEXT = null;
- }
-
- @Test
- public void testSerializationOfBaz() throws Exception {
- final InputStream resourceAsStream = XmlToNormalizedNodesTest.class.getResourceAsStream(
- "/anyxml-support/serialization/baz.xml");
- final Module bazModule = SCHEMA_CONTEXT.findModules("baz").iterator().next();
- final ContainerSchemaNode bazCont = (ContainerSchemaNode) bazModule.findDataChildByName(
- QName.create(bazModule.getQNameModule(), "baz")).get();
-
- final XMLStreamReader reader = UntrustedXML.createXMLStreamReader(resourceAsStream);
-
- final NormalizedNodeResult result = new NormalizedNodeResult();
-
- final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
-
- final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, SCHEMA_CONTEXT, bazCont);
- xmlParser.parse(reader);
-
- final NormalizedNode transformedInput = result.getResult();
- assertNotNull(transformedInput);
-
- assertTrue(transformedInput instanceof ContainerNode);
- ContainerNode bazContainer = (ContainerNode) transformedInput;
- assertEquals(bazContainer.getNodeType(), bazQName);
-
- DataContainerChild bazContainerChild = bazContainer.childByArg(new NodeIdentifier(myAnyXMLDataBaz));
- assertTrue(bazContainerChild instanceof YangModeledAnyXmlNode);
- YangModeledAnyXmlNode yangModeledAnyXmlNode = (YangModeledAnyXmlNode) bazContainerChild;
-
- DataSchemaNode schemaOfAnyXmlData = yangModeledAnyXmlNode.getSchemaOfAnyXmlData();
- SchemaNode myContainer2SchemaNode = SchemaContextUtil.findDataSchemaNode(SCHEMA_CONTEXT,
- SchemaPath.create(true, bazQName, myContainer2QName));
- assertTrue(myContainer2SchemaNode instanceof ContainerSchemaNode);
- assertEquals(myContainer2SchemaNode, schemaOfAnyXmlData);
-
- final Document document = UntrustedXML.newDocumentBuilder().newDocument();
- final DOMResult domResult = new DOMResult(document);
-
- final XMLStreamWriter xmlStreamWriter = factory.createXMLStreamWriter(domResult);
-
- final NormalizedNodeStreamWriter xmlNormalizedNodeStreamWriter = XMLStreamNormalizedNodeStreamWriter
- .create(xmlStreamWriter, SCHEMA_CONTEXT);
-
- final NormalizedNodeWriter normalizedNodeWriter = NormalizedNodeWriter.forStreamWriter(
- xmlNormalizedNodeStreamWriter);
-
- normalizedNodeWriter.write(transformedInput);
-
- final Document doc = loadDocument("/anyxml-support/serialization/baz.xml");
-
- XMLUnit.setIgnoreWhitespace(true);
- XMLUnit.setIgnoreComments(true);
- XMLUnit.setIgnoreAttributeOrder(true);
- XMLUnit.setNormalize(true);
-
- String expectedXml = toString(doc.getDocumentElement());
- String serializedXml = toString(domResult.getNode());
-
- assertXMLEqual(expectedXml, serializedXml);
- }
-
- private static Document loadDocument(final String xmlPath) throws IOException, SAXException {
- final InputStream resourceAsStream = YangModeledAnyXMLSerializationTest.class.getResourceAsStream(xmlPath);
- return requireNonNull(readXmlToDocument(resourceAsStream));
- }
-
- private static Document readXmlToDocument(final InputStream xmlContent) throws IOException, SAXException {
- final Document doc = UntrustedXML.newDocumentBuilder().parse(xmlContent);
- doc.getDocumentElement().normalize();
- return doc;
- }
-
- private static String toString(final Node xml) {
- try {
- final Transformer transformer = TransformerFactory.newInstance().newTransformer();
- transformer.setOutputProperty(OutputKeys.INDENT, "yes");
- transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
-
- final StreamResult result = new StreamResult(new StringWriter());
- final DOMSource source = new DOMSource(xml);
- transformer.transform(source, result);
-
- return result.getWriter().toString();
- } catch (IllegalArgumentException | TransformerFactoryConfigurationError | TransformerException e) {
- throw new RuntimeException("Unable to serialize xml element " + xml, e);
- }
- }
-}
import java.util.List;
import java.util.Optional;
import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.yangtools.odlext.model.api.YangModeledAnyxmlSchemaNode;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
return schema;
}
- public SchemaNode startYangModeledAnyXmlNode(final NodeIdentifier name) {
- LOG.debug("Enter yang modeled anyXml {}", name);
- final SchemaNode schema = getSchema(name);
-
- checkArgument(schema instanceof YangModeledAnyxmlSchemaNode, "Node %s is not an yang modeled anyXml.", schema);
- schemaStack.push(((YangModeledAnyxmlSchemaNode) schema).getSchemaOfAnyXmlData());
- return schema;
- }
-
public AugmentationSchemaNode startAugmentationNode(final AugmentationIdentifier identifier) {
LOG.debug("Enter augmentation {}", identifier);
Object parent = getParent();
package org.opendaylight.yangtools.yang.data.impl.schema;
import javax.xml.transform.dom.DOMSource;
-import org.opendaylight.yangtools.odlext.model.api.YangModeledAnyxmlSchemaNode;
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.NodeIdentifierWithPredicates;
import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
import org.opendaylight.yangtools.yang.data.api.schema.UserLeafSetNode;
import org.opendaylight.yangtools.yang.data.api.schema.UserMapNode;
-import org.opendaylight.yangtools.yang.data.api.schema.YangModeledAnyXmlNode;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.CollectionNodeBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.ListNodeBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableUserLeafSetNodeSchemaAwareBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableUserMapNodeBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableUserMapNodeSchemaAwareBuilder;
-import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableYangModeledAnyXmlNodeBuilder;
import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode;
import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
return ImmutableAnyXmlNodeSchemaAwareBuilder.create(schema);
}
- public static DataContainerNodeBuilder<NodeIdentifier, YangModeledAnyXmlNode> yangModeledAnyXmlBuilder(
- final YangModeledAnyxmlSchemaNode schema) {
- return ImmutableYangModeledAnyXmlNodeBuilder.create(schema);
- }
-
public static <T> NormalizedNodeBuilder<NodeIdentifier, T, AnydataNode<T>> anydataBuilder(
final Class<T> objectModel) {
return ImmutableAnydataNodeBuilder.create(objectModel);
import java.util.Deque;
import javax.xml.transform.dom.DOMSource;
import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.yangtools.odlext.model.api.YangModeledAnyxmlSchemaNode;
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.NodeIdentifierWithPredicates;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableUnkeyedListNodeBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableUserLeafSetNodeBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableUserMapNodeBuilder;
-import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableYangModeledAnyXmlNodeBuilder;
import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
/**
: ImmutableContainerNodeBuilder.create(childSizeHint));
}
- @Override
- public void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint) {
- checkDataNodeContainer();
-
- checkArgument(nextSchema instanceof YangModeledAnyxmlSchemaNode,
- "Schema of this node should be instance of YangModeledAnyxmlSchemaNode");
- final YangModeledAnyxmlSchemaNode anyxmlSchema = (YangModeledAnyxmlSchemaNode) nextSchema;
- enter(name, UNKNOWN_SIZE == childSizeHint ? ImmutableYangModeledAnyXmlNodeBuilder.create(anyxmlSchema)
- : ImmutableYangModeledAnyXmlNodeBuilder.create(anyxmlSchema, childSizeHint));
- }
-
@Override
public void startUnkeyedList(final NodeIdentifier name, final int childSizeHint) {
checkDataNodeContainer();
+++ /dev/null
-/*
- * Copyright (c) 2015 Cisco Systems, Inc. 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.impl.schema.builder.impl;
-
-import static java.util.Objects.requireNonNull;
-
-import java.util.Map;
-import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.yangtools.odlext.model.api.YangModeledAnyxmlSchemaNode;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
-import org.opendaylight.yangtools.yang.data.api.schema.YangModeledAnyXmlNode;
-import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
-import org.opendaylight.yangtools.yang.data.impl.schema.nodes.AbstractImmutableDataContainerNode;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
-
-public final class ImmutableYangModeledAnyXmlNodeBuilder extends
- AbstractImmutableDataContainerNodeBuilder<NodeIdentifier, YangModeledAnyXmlNode> {
-
- private final ContainerSchemaNode contentSchema;
-
- private ImmutableYangModeledAnyXmlNodeBuilder(final YangModeledAnyxmlSchemaNode yangModeledAnyXMLSchemaNode) {
- requireNonNull(yangModeledAnyXMLSchemaNode, "Yang modeled any xml node must not be null.");
- super.withNodeIdentifier(NodeIdentifier.create(yangModeledAnyXMLSchemaNode.getQName()));
- this.contentSchema = yangModeledAnyXMLSchemaNode.getSchemaOfAnyXmlData();
- }
-
- private ImmutableYangModeledAnyXmlNodeBuilder(final YangModeledAnyxmlSchemaNode yangModeledAnyXMLSchemaNode,
- final int sizeHint) {
- super(sizeHint);
- requireNonNull(yangModeledAnyXMLSchemaNode, "Yang modeled any xml node must not be null.");
- super.withNodeIdentifier(NodeIdentifier.create(yangModeledAnyXMLSchemaNode.getQName()));
- this.contentSchema = yangModeledAnyXMLSchemaNode.getSchemaOfAnyXmlData();
- }
-
- public static @NonNull DataContainerNodeBuilder<NodeIdentifier, YangModeledAnyXmlNode> create(
- final YangModeledAnyxmlSchemaNode yangModeledAnyXMLSchemaNode) {
- return new ImmutableYangModeledAnyXmlNodeBuilder(yangModeledAnyXMLSchemaNode);
- }
-
- public static @NonNull DataContainerNodeBuilder<NodeIdentifier, YangModeledAnyXmlNode> create(
- final YangModeledAnyxmlSchemaNode yangModeledAnyXMLSchemaNode, final int sizeHint) {
- return new ImmutableYangModeledAnyXmlNodeBuilder(yangModeledAnyXMLSchemaNode, sizeHint);
- }
-
- @Override
- public YangModeledAnyXmlNode build() {
- return new ImmutableYangModeledAnyXmlNode(getNodeIdentifier(), buildValue(), contentSchema);
- }
-
- private static final class ImmutableYangModeledAnyXmlNode extends
- AbstractImmutableDataContainerNode<NodeIdentifier, YangModeledAnyXmlNode> implements YangModeledAnyXmlNode {
- private final @NonNull ContainerSchemaNode contentSchema;
-
- ImmutableYangModeledAnyXmlNode(final NodeIdentifier nodeIdentifier, final Map<PathArgument, Object> value,
- final ContainerSchemaNode contentSchema) {
- super(value, nodeIdentifier);
- this.contentSchema = requireNonNull(contentSchema, "Schema of yang modeled anyXml content cannot be null.");
- }
-
- @Override
- @Deprecated
- public ContainerSchemaNode getSchemaOfAnyXmlData() {
- return contentSchema;
- }
-
- @Override
- protected Class<YangModeledAnyXmlNode> implementedType() {
- return YangModeledAnyXmlNode.class;
- }
- }
-}
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
-import org.opendaylight.yangtools.odlext.model.api.YangModeledAnyxmlSchemaNode;
import org.opendaylight.yangtools.util.UnmodifiableCollection;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableUserLeafSetNodeSchemaAwareBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableUserMapNodeBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableUserMapNodeSchemaAwareBuilder;
-import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableYangModeledAnyXmlNodeBuilder;
import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
ImmutableMapEntryNodeBuilder.create(1).build();
}
- @Test(expected = NullPointerException.class)
- public void immutableYangModeledAnyXmlNodeBuilderExceptionTest() {
- ImmutableYangModeledAnyXmlNodeBuilder.create(mock(YangModeledAnyxmlSchemaNode.class), 1);
- }
-
@Test(expected = UnsupportedOperationException.class)
public void immutableUnkeyedListNodeBuilderExceptionTest() {
ImmutableUnkeyedListNodeBuilder.create().withNodeIdentifier(NODE_IDENTIFIER_LEAF)
return super.startAnyxmlNode(transform(name), objectModel);
}
- @Override
- public void startYangModeledAnyXmlNode(final NodeIdentifier name, final int childSizeHint) throws IOException {
- super.startYangModeledAnyXmlNode(transform(name), childSizeHint);
- }
-
/**
* Transforms a QName to new mapping.
*
import java.util.List;
import java.util.Map.Entry;
import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.yangtools.odlext.model.api.YangModeledAnyxmlSchemaNode;
import org.opendaylight.yangtools.rfc7952.data.api.StreamWriterMetadataExtension;
import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
import org.opendaylight.yangtools.yang.model.api.AnydataSchemaNode;
if (schema instanceof LeafSchemaNode) {
newChild = new LeafNodeDataWithSchema((LeafSchemaNode) schema);
} else if (schema instanceof AnyxmlSchemaNode) {
- // YangModeledAnyxmlSchemaNode is handled by addCompositeChild method.
- if (schema instanceof YangModeledAnyxmlSchemaNode) {
- return null;
- }
newChild = new AnyXmlNodeDataWithSchema((AnyxmlSchemaNode) schema);
} else if (schema instanceof AnydataSchemaNode) {
newChild = new AnydataNodeDataWithSchema((AnydataSchemaNode) schema);
newChild = new LeafListNodeDataWithSchema((LeafListSchemaNode) schema);
} else if (schema instanceof ContainerLike) {
newChild = new ContainerNodeDataWithSchema((ContainerLike) schema);
- } else if (schema instanceof YangModeledAnyxmlSchemaNode) {
- newChild = new YangModeledAnyXmlNodeDataWithSchema((YangModeledAnyxmlSchemaNode)schema);
} else {
newChild = new CompositeNodeDataWithSchema<>(schema);
}
+++ /dev/null
-/*
- * Copyright (c) 2016 Cisco Systems, Inc. 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 java.io.IOException;
-import org.opendaylight.yangtools.odlext.model.api.YangModeledAnyxmlSchemaNode;
-import org.opendaylight.yangtools.rfc7952.data.api.StreamWriterMetadataExtension;
-import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
-
-/**
- * Utility class used for tracking parser state as needed by a StAX-like parser.
- * This class is to be used only by respective XML and JSON parsers in yang-data-codec-xml and yang-data-codec-gson.
- *
- * <p>
- * Represents a YANG-modeled-anyxml node.
- */
-public final class YangModeledAnyXmlNodeDataWithSchema
- extends CompositeNodeDataWithSchema<YangModeledAnyxmlSchemaNode> {
-
- public YangModeledAnyXmlNodeDataWithSchema(final YangModeledAnyxmlSchemaNode yangModeledAnyXml) {
- super(yangModeledAnyXml);
- }
-
- @Override
- public void write(final NormalizedNodeStreamWriter writer, final StreamWriterMetadataExtension metaWriter)
- throws IOException {
- writer.nextDataSchemaNode(getSchema());
-
- writer.startYangModeledAnyXmlNode(provideNodeIdentifier(), childSizeHint());
- writeMetadata(metaWriter);
- super.write(writer, metaWriter);
- writer.endNode();
- }
-}
import org.eclipse.jdt.annotation.NonNull;
import org.opendaylight.yangtools.odlext.parser.AnyxmlSchemaLocationNamespace;
import org.opendaylight.yangtools.odlext.parser.AnyxmlSchemaLocationStatementSupport;
-import org.opendaylight.yangtools.odlext.parser.AnyxmlStatementSupportOverride;
import org.opendaylight.yangtools.openconfig.parser.EncryptedValueStatementSupport;
import org.opendaylight.yangtools.openconfig.parser.HashedValueStatementSupport;
import org.opendaylight.yangtools.rfc6241.parser.GetFilterElementAttributesStatementSupport;
.addStatementSupport(ModelProcessingPhase.FULL_DECLARATION,
AnyxmlSchemaLocationStatementSupport.getInstance())
.addNamespaceSupport(ModelProcessingPhase.FULL_DECLARATION, AnyxmlSchemaLocationNamespace.BEHAVIOUR)
- .overrideStatementSupport(ModelProcessingPhase.FULL_DECLARATION,
- AnyxmlStatementSupportOverride.getInstance())
// RFC6241 get-filter-element-attributes support
.addStatementSupport(ModelProcessingPhase.FULL_DECLARATION,