From 01394e68302417fca3498151bc8e70a652e88d5d Mon Sep 17 00:00:00 2001 From: OleksandrZharov Date: Tue, 8 Mar 2022 19:30:50 +0100 Subject: [PATCH] Eliminate use of SchemaNode.getPath() in sal-netconf-connector Removed deprecated getPath method and replaced it with alternative ways using qnames and yang instance identifier. JIRA: NETCONF-817 Change-Id: Ia809e60f96f9a747d5d72e71f96cf421815ed751 Signed-off-by: OleksandrZharov Signed-off-by: Ivan Hrasko --- .../mapping/NetconfMessageTransformer.java | 73 +++++++++++++------ .../NetconfMessageTransformerTest.java | 7 +- 2 files changed, 54 insertions(+), 26 deletions(-) diff --git a/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/schema/mapping/NetconfMessageTransformer.java b/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/schema/mapping/NetconfMessageTransformer.java index 1d9ad98eff..db675ded0a 100644 --- a/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/schema/mapping/NetconfMessageTransformer.java +++ b/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/schema/mapping/NetconfMessageTransformer.java @@ -26,7 +26,6 @@ import java.io.IOException; import java.net.URISyntaxException; import java.time.Instant; import java.util.AbstractMap; -import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -60,6 +59,9 @@ import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.Revision; import org.opendaylight.yangtools.yang.common.XMLNamespace; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; 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; @@ -86,6 +88,7 @@ import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.model.api.SchemaNode; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute; import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack; +import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack.Inference; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; @@ -120,7 +123,7 @@ public class NetconfMessageTransformer implements MessageTransformer action.getPath().asAbsolute()); + this.actions = getActions(schemaContext); // RFC6020 normal notifications this.mappedNotifications = Multimaps.index(schemaContext.getNotifications(), @@ -130,26 +133,33 @@ public class NetconfMessageTransformer implements MessageTransformer by using only - static List getActions(final SchemaContext schemaContext) { - final List builder = new ArrayList<>(); - findAction(schemaContext, builder); - return builder; + static ImmutableMap getActions(final SchemaContext schemaContext) { + final Map values = new HashMap<>(); + final SchemaInferenceStack stack = SchemaInferenceStack.of((EffectiveModelContext) schemaContext); + findAction(schemaContext, values, stack); + return ImmutableMap.copyOf(values); } - private static void findAction(final DataSchemaNode dataSchemaNode, final List builder) { + private static void findAction(final DataSchemaNode dataSchemaNode, final Map builder, + final SchemaInferenceStack stack) { if (dataSchemaNode instanceof ActionNodeContainer) { for (ActionDefinition actionDefinition : ((ActionNodeContainer) dataSchemaNode).getActions()) { - builder.add(actionDefinition); + stack.enterSchemaTree(actionDefinition.getQName()); + builder.put(stack.toSchemaNodeIdentifier(), actionDefinition); + stack.exit(); } } if (dataSchemaNode instanceof DataNodeContainer) { for (DataSchemaNode innerDataSchemaNode : ((DataNodeContainer) dataSchemaNode).getChildNodes()) { - findAction(innerDataSchemaNode, builder); + stack.enterSchemaTree(innerDataSchemaNode.getQName()); + findAction(innerDataSchemaNode, builder, stack); + stack.exit(); } } else if (dataSchemaNode instanceof ChoiceSchemaNode) { for (CaseSchemaNode caze : ((ChoiceSchemaNode) dataSchemaNode).getCases()) { - findAction(caze, builder); + stack.enterSchemaTree(caze.getQName()); + findAction(caze, builder, stack); + stack.exit(); } } } @@ -187,12 +197,26 @@ public class NetconfMessageTransformer implements MessageTransformer qnames; + if (nestedNotificationInfo != null) { + qnames = nestedNotificationInfo.domDataTreeIdentifier.getRootIdentifier().getPathArguments().stream() + .filter(arg -> !(arg instanceof NodeIdentifierWithPredicates)) + .filter(arg -> !(arg instanceof AugmentationIdentifier)) + .map(PathArgument::getNodeType) + .map(qName -> QName.create(mostRecentNotification.getQName(), qName.getLocalName())) + .collect(Collectors.toList()); + stack = SchemaInferenceStack.of(mountContext.getEffectiveModelContext(), Absolute.of(qnames)); + } else { + stack = SchemaInferenceStack.of(mountContext.getEffectiveModelContext(), + Absolute.of(mostRecentNotification.getQName())); + } + try { final NormalizedNodeResult resultHolder = new NormalizedNodeResult(); final NormalizedNodeStreamWriter writer = ImmutableNormalizedNodeStreamWriter.from(resultHolder); final XmlParserStream xmlParser = XmlParserStream.create(writer, mountContext, - SchemaInferenceStack.ofInstantiatedPath(mountContext.getEffectiveModelContext(), - mostRecentNotification.getPath()).toInference(), strictParsing); + stack.toInference(), strictParsing); xmlParser.traverse(new DOMSource(element)); content = (ContainerNode) resultHolder.getResult(); } catch (XMLStreamException | URISyntaxException | IOException | SAXException @@ -202,8 +226,7 @@ public class NetconfMessageTransformer implements MessageTransformer okResponseElement = XmlElement.fromDomDocument(message.getDocument()) .getOnlyChildElementWithSameNamespaceOptionally("ok"); if (operationDefinition.getOutput().getChildNodes().isEmpty()) { @@ -455,14 +484,14 @@ public class NetconfMessageTransformer implements MessageTransformer actions = NetconfMessageTransformer.getActions(ACTION_SCHEMA); + final Map actions = NetconfMessageTransformer.getActions(ACTION_SCHEMA); assertEquals(schemaPaths.size(), actions.size()); - for (ActionDefinition actionDefinition : actions) { - Absolute path = actionDefinition.getPath().asAbsolute(); - assertTrue(schemaPaths.remove(path)); + for (final Absolute actionPath : actions.keySet()) { + assertTrue(schemaPaths.remove(actionPath)); } } -- 2.36.6