This bumps yangtools to 4.0.1 as part of Magnesium MRI.
Change-Id: I1ac7d3f856af310f4e8015875223d30eac3a8276
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
<dependency>
<groupId>org.opendaylight.yangtools</groupId>
<artifactId>yangtools-artifacts</artifactId>
- <version>3.0.5</version>
+ <version>4.0.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
-->
<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="odl-controller-blueprint-${project.version}">
<feature name="odl-controller-blueprint" version="${project.version}">
- <feature version="[3,4)">odl-yangtools-codec</feature>
+ <feature version="[4,5)">odl-yangtools-codec</feature>
<bundle start-level="40">mvn:org.opendaylight.controller/blueprint/${blueprint.version}</bundle>
</feature>
</features>
<dependency>
<groupId>org.opendaylight.yangtools</groupId>
<artifactId>yangtools-artifacts</artifactId>
- <version>3.0.5</version>
+ <version>4.0.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.opendaylight.yangtools</groupId>
<artifactId>yangtools-artifacts</artifactId>
- <version>3.0.5</version>
+ <version>4.0.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<feature version="[6,7)">odl-apache-commons-lang3</feature>
<feature version="[6,7)">odl-dropwizard-metrics</feature>
<feature version="[6,7)">odl-servlet-api</feature>
- <feature version="[3,4)">odl-yangtools-data</feature>
+ <feature version="[4,5)">odl-yangtools-data</feature>
</feature>
</features>
<dependency>
<groupId>org.opendaylight.yangtools</groupId>
<artifactId>yangtools-artifacts</artifactId>
- <version>3.0.5</version>
+ <version>4.0.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<features xmlns="http://karaf.apache.org/xmlns/features/v1.4.0" name="odl-controller-${project.version}">
<feature name="odl-mdsal-distributed-datastore" version="${project.version}">
<feature version="[6,7)">odl-apache-commons-text</feature>
- <feature version="[3,4)">odl-yangtools-codec</feature>
+ <feature version="[4,5)">odl-yangtools-codec</feature>
<feature version="[4,5)">odl-mdsal-eos-dom</feature>
<feature version="[4,5)">odl-mdsal-dom-broker</feature>
<feature version="[4.0.1,5)">odl-mdsal-binding-dom-adapter</feature>
<dependency>
<groupId>org.opendaylight.yangtools</groupId>
<artifactId>yangtools-artifacts</artifactId>
- <version>3.0.5</version>
+ <version>4.0.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.opendaylight.yangtools</groupId>
<artifactId>yangtools-artifacts</artifactId>
- <version>3.0.5</version>
+ <version>4.0.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
private void streamAnyxml(final NormalizedNodeStreamWriter writer) throws IOException {
final NodeIdentifier identifier = readNodeIdentifier();
LOG.trace("Streaming anyxml node {}", identifier);
- writer.startAnyxmlNode(identifier);
- writer.domSourceValue(readDOMSource());
- writer.endNode();
+
+ final DOMSource value = readDOMSource();
+ if (writer.startAnyxmlNode(identifier, DOMSource.class)) {
+ writer.domSourceValue(value);
+ writer.endNode();
+ }
}
private void streamAugmentation(final NormalizedNodeStreamWriter writer) throws IOException {
}
@Override
- public final void startAnyxmlNode(final NodeIdentifier name) throws IOException {
- LOG.trace("Starting any xml node");
- startNode(name, LithiumNode.ANY_XML_NODE);
- inSimple = true;
+ public final boolean startAnyxmlNode(final NodeIdentifier name, final Class<?> objectModel) throws IOException {
+ if (DOMSource.class.isAssignableFrom(objectModel)) {
+ LOG.trace("Starting anyxml node");
+ startNode(name, LithiumNode.ANY_XML_NODE);
+ inSimple = true;
+ return true;
+ }
+ return false;
}
@Override
private void streamAnyxml(final NormalizedNodeStreamWriter writer, final byte nodeHeader) throws IOException {
final NodeIdentifier identifier = decodeNodeIdentifier(nodeHeader);
LOG.trace("Streaming anyxml node {}", identifier);
- writer.startAnyxmlNode(identifier);
- writer.domSourceValue(readDOMSource());
- writer.endNode();
+
+ final DOMSource value = readDOMSource();
+ if (writer.startAnyxmlNode(identifier, DOMSource.class)) {
+ writer.domSourceValue(value);
+ writer.endNode();
+ }
}
private void streamAnyxmlModeled(final NormalizedNodeStreamWriter writer, final byte nodeHeader)
}
@Override
- public final void startAnyxmlNode(final NodeIdentifier name) throws IOException {
- startSimpleNode(MagnesiumNode.NODE_ANYXML, name);
+ public final boolean startAnyxmlNode(final NodeIdentifier name, final Class<?> objectModel) throws IOException {
+ if (DOMSource.class.isAssignableFrom(objectModel)) {
+ startSimpleNode(MagnesiumNode.NODE_ANYXML, name);
+ return true;
+ }
+ return false;
}
@Override
import org.eclipse.jdt.annotation.NonNull;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
}
}
+ @Override
+ public final boolean startAnydataNode(final NodeIdentifier name, final Class<?> objectModel) throws IOException {
+ // FIXME: We do not support anydata nodes of any kind, yet
+ return false;
+ }
+
abstract short streamVersion();
abstract void writeQNameInternal(@NonNull QName qname) throws IOException;
package org.opendaylight.controller.cluster.datastore.node.utils.transformer;
import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.base.Verify.verify;
import static java.util.Objects.requireNonNull;
import java.io.IOException;
}
@Override
- public void startAnyxmlNode(final NodeIdentifier name) throws IOException {
- enter(ReusableImmutableNormalizedNodeStreamWriter::startAnyxmlNode, name);
+ public boolean startAnyxmlNode(final NodeIdentifier name, final Class<?> objectModel) throws IOException {
+ if (enter(name)) {
+ verify(delegate.startAnyxmlNode(name, objectModel),
+ "Unexpected failure to stream DOMSource node %s model %s", name, objectModel);
+ }
+ return true;
+ }
+
+ @Override
+ public boolean startAnydataNode(final NodeIdentifier name, final Class<?> objectModel) throws IOException {
+ // FIXME: we do not support anydata nodes yet
+ return false;
}
@Override
* 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.controller.cluster.datastore.node.utils.stream;
import static org.junit.Assert.assertEquals;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
-import org.opendaylight.yangtools.yang.data.api.schema.AnyXmlNode;
import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
+import org.opendaylight.yangtools.yang.data.api.schema.DOMSourceAnyxmlNode;
import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
StreamResult xmlOutput = new StreamResult(new StringWriter());
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
- transformer.transform(((AnyXmlNode)child.get()).getValue(), xmlOutput);
+ transformer.transform(((DOMSourceAnyxmlNode)child.get()).getValue(), xmlOutput);
assertEquals("XML", xml, xmlOutput.getWriter().toString());
- assertEquals("http://www.w3.org/TR/html4/", ((AnyXmlNode)child.get()).getValue().getNode().getNamespaceURI());
+ assertEquals("http://www.w3.org/TR/html4/",
+ ((DOMSourceAnyxmlNode)child.get()).getValue().getNode().getNamespaceURI());
}
@Test
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
-import org.opendaylight.yangtools.yang.data.api.schema.AnyXmlNode;
import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode;
import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
+import org.opendaylight.yangtools.yang.data.api.schema.DOMSourceAnyxmlNode;
import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode;
final ByteArrayInputStream is =
new ByteArrayInputStream("<xml><data/></xml>".getBytes(Charset.defaultCharset()));
final Document parse = UntrustedXML.newDocumentBuilder().parse(is);
- final AnyXmlNode anyXmlNode = Builders.anyXmlBuilder()
+ final DOMSourceAnyxmlNode anyXmlNode = Builders.anyXmlBuilder()
.withNodeIdentifier(id("anyXmlNode"))
.withValue(new DOMSource(parse))
.build();
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
-import org.opendaylight.yangtools.yang.data.api.schema.AnyXmlNode;
+import org.opendaylight.yangtools.yang.data.api.schema.DOMSourceAnyxmlNode;
import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
@Test
public void testAnyXMLNodeNotPrunedWhenHasParent() throws IOException {
NormalizedNodePruner pruner = prunerFullSchema(TestModel.TEST_PATH);
- AnyXmlNode child = Builders.anyXmlBuilder().withNodeIdentifier(
+ DOMSourceAnyxmlNode child = Builders.anyXmlBuilder().withNodeIdentifier(
new NodeIdentifier(TestModel.ANY_XML_QNAME)).withValue(mock(DOMSource.class)).build();
NormalizedNode<?, ?> input = Builders.containerBuilder().withNodeIdentifier(
new NodeIdentifier(TestModel.TEST_QNAME)).withChild(child).build();
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
-import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode;
import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
import org.opendaylight.yangtools.yang.model.api.AugmentationTarget;
import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode;
}
}
- private static class AnyXmlNormalization extends DataNormalizationOperation<NodeIdentifier> {
- AnyXmlNormalization(final AnyXmlSchemaNode schema) {
+ private static class AnyxmlNormalization extends DataNormalizationOperation<NodeIdentifier> {
+ AnyxmlNormalization(final AnyxmlSchemaNode schema) {
super(new NodeIdentifier(schema.getQName()), schema);
}
return new ChoiceNodeNormalization((ChoiceSchemaNode) potential);
} else if (potential instanceof LeafListSchemaNode) {
return fromLeafListSchemaNode((LeafListSchemaNode) potential);
- } else if (potential instanceof AnyXmlSchemaNode) {
- return new AnyXmlNormalization((AnyXmlSchemaNode) potential);
+ } else if (potential instanceof AnyxmlSchemaNode) {
+ return new AnyxmlNormalization((AnyxmlSchemaNode) potential);
}
return null;
}
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
+import java.util.function.Function;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.text.WordUtils;
import org.checkerframework.checker.lock.qual.GuardedBy;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.distributed.datastore.provider.rev140612.DataStorePropertiesContainer;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.common.Uint16;
+import org.opendaylight.yangtools.yang.common.Uint32;
+import org.opendaylight.yangtools.yang.common.Uint64;
+import org.opendaylight.yangtools.yang.common.Uint8;
import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Map<String, Method> BUILDER_SETTERS = new HashMap<>();
+ private static final ImmutableMap<Class<?>, Function<String, Object>> UINT_FACTORIES =
+ ImmutableMap.<Class<?>, Function<String, Object>>builder()
+ .put(Uint8.class, Uint8::valueOf)
+ .put(Uint16.class, Uint16::valueOf)
+ .put(Uint32.class, Uint32::valueOf)
+ .put(Uint64.class, Uint64::valueOf)
+ .build();
+
static {
try {
introspectDatastoreContextBuilder();
}
final Constructor<?> ctor = CONSTRUCTORS.get(toType);
-
- LOG.trace("Found {}", ctor);
-
if (ctor == null) {
+ if (fromValue instanceof String) {
+ final Function<String, Object> factory = UINT_FACTORIES.get(toType);
+ if (factory != null) {
+ return factory.apply((String) fromValue);
+ }
+ }
+
throw new IllegalArgumentException(String.format("Constructor not found for type %s", toType));
}
+ LOG.trace("Found {}", ctor);
Object value = fromValue;
// Once we find a constructor that takes the original type as an argument, we're done recursing.
try {
candidate = tip.prepare(cohort.getDataTreeModification());
LOG.debug("{}: Transaction {} candidate ready", logContext, currentId);
- } catch (RuntimeException e) {
+ } catch (DataValidationFailedException | RuntimeException e) {
failPreCommit(e);
return;
}
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeConfiguration;
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification;
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeSnapshot;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataValidationFailedException;
import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
import org.opendaylight.yangtools.yang.data.impl.schema.tree.InMemoryDataTreeFactory;
import org.opendaylight.yangtools.yang.data.impl.schema.tree.SchemaValidationFailedException;
}
@Test
- public void testAppendRecoveredLogEntryCommitTransactionPayload() throws IOException {
+ public void testAppendRecoveredLogEntryCommitTransactionPayload() throws IOException,
+ DataValidationFailedException {
try {
coordinator.appendRecoveredLogEntry(CommitTransactionPayload.create(nextTransactionId(), createCar()));
} catch (final SchemaValidationFailedException e) {
}
@Test
- public void testApplyRecoverySnapshot() {
+ public void testApplyRecoverySnapshot() throws DataValidationFailedException {
coordinator.applyRecoverySnapshot(createSnapshot());
assertFalse(readCars(peopleDataTree).isPresent());
}
}
- private DataTreeCandidate createCar() {
+ private DataTreeCandidate createCar() throws DataValidationFailedException {
final DataTree dataTree = new InMemoryDataTreeFactory().create(
DataTreeConfiguration.DEFAULT_OPERATIONAL, carsSchemaContext);
return shardDataTree.readNode(PeopleModel.BASE_PATH);
}
- private static ShardSnapshotState createSnapshot() {
+ private static ShardSnapshotState createSnapshot() throws DataValidationFailedException {
final DataTree dataTree = new InMemoryDataTreeFactory().create(
DataTreeConfiguration.DEFAULT_OPERATIONAL, SchemaContextHelper.select(SchemaContextHelper.CARS_YANG,
SchemaContextHelper.PEOPLE_YANG));