From 1e71e52f219b84d673ca793f02306b6d27b38387 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Fri, 11 Mar 2022 18:22:24 +0100 Subject: [PATCH] Refactor NetconfMessageTransformer We can side-step a few expensive methods, let's just do simple concats and use enterSchemaTree() without an intermediate Absolute. JIRA: NETCONF-817 Change-Id: Id5de2febd90d18348f29a07a49e77b2fa09d3ae0 Signed-off-by: Robert Varga --- .../mapping/NetconfMessageTransformer.java | 60 +++++++++---------- 1 file changed, 29 insertions(+), 31 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 db675ded0a..cad450760b 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 @@ -15,6 +15,7 @@ import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTr import com.google.common.annotations.Beta; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; @@ -56,12 +57,12 @@ import org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransform import org.opendaylight.netconf.sal.connect.util.MessageCounter; import org.opendaylight.yangtools.rfc8528.data.api.MountPointContext; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.common.QNameModule; 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; @@ -116,17 +117,17 @@ public class NetconfMessageTransformer implements MessageTransformer node.getQName().withoutRevision()); this.baseSchema = baseSchema; this.strictParsing = strictParsing; @@ -186,7 +187,7 @@ public class NetconfMessageTransformer implements MessageTransformer nestedNotificationOptional = findNestedNotification(message, element); if (nestedNotificationOptional.isPresent()) { nestedNotificationInfo = nestedNotificationOptional.get(); - notificationDefinitions = Collections.singletonList(nestedNotificationInfo.notificationDefinition); + notificationDefinitions = List.of(nestedNotificationInfo.notificationDefinition); element = (Element) nestedNotificationInfo.notificationNode; } } @@ -196,27 +197,24 @@ public class NetconfMessageTransformer implements MessageTransformer qnames; + final SchemaInferenceStack stack = SchemaInferenceStack.of(mountContext.getEffectiveModelContext()); 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)); + final QNameModule targetModule = mostRecentNotification.getQName().getModule(); + nestedNotificationInfo.domDataTreeIdentifier.getRootIdentifier().getPathArguments().stream() + .filter(arg -> !(arg instanceof NodeIdentifierWithPredicates)) + .filter(arg -> !(arg instanceof AugmentationIdentifier)) + .map(arg -> arg.getNodeType().bindTo(targetModule)) + .forEach(stack::enterSchemaTree); } else { - stack = SchemaInferenceStack.of(mountContext.getEffectiveModelContext(), - Absolute.of(mostRecentNotification.getQName())); + stack.enterSchemaTree(mostRecentNotification.getQName()); } + final ContainerNode content; try { final NormalizedNodeResult resultHolder = new NormalizedNodeResult(); final NormalizedNodeStreamWriter writer = ImmutableNormalizedNodeStreamWriter.from(resultHolder); - final XmlParserStream xmlParser = XmlParserStream.create(writer, mountContext, - stack.toInference(), strictParsing); + final XmlParserStream xmlParser = XmlParserStream.create(writer, mountContext, stack.toInference(), + strictParsing); xmlParser.traverse(new DOMSource(element)); content = (ContainerNode) resultHolder.getResult(); } catch (XMLStreamException | URISyntaxException | IOException | SAXException @@ -447,8 +445,8 @@ public class NetconfMessageTransformer implements MessageTransformer actionIds = action.getNodeIdentifiers(); + final ContainerNode normalizedNode = (ContainerNode) parseResult(message, actionDefinition, + Absolute.of(ImmutableList.builderWithExpectedSize(actionIds.size() + 1) + .addAll(actionIds).add(actionDefinition.getOutput().getQName()) + .build())); if (normalizedNode == null) { - return new SimpleDOMActionResult(Collections.emptyList()); + return new SimpleDOMActionResult(List.of()); } else { - return new SimpleDOMActionResult(normalizedNode, Collections.emptyList()); + return new SimpleDOMActionResult(normalizedNode, List.of()); } } @@ -509,7 +507,7 @@ public class NetconfMessageTransformer implements MessageTransformer