From c7ad3e775c87dd5edb1910bac6e6bb2aa368d513 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Wed, 15 Jun 2016 01:02:09 +0200 Subject: [PATCH] BUG-865: Do not use QName.cachedReference() QName.intern() is the modernized method. Also use it for all constants, allowing greater reuse inside the JVM. Also create NodeIdentifier and LeafNode constants for things that are invariant, improving GC behavior. Finally import YangInstanceIdentifer.{NodeIdentifier,PathArg} to make the code more readable. Change-Id: Id8587407dfbf8746a369fadb23102357082e7535 Signed-off-by: Robert Varga --- ...NetconfRemoteSchemaYangSourceProvider.java | 35 ++++---- .../util/NetconfMessageTransformUtil.java | 84 ++++++++++--------- 2 files changed, 59 insertions(+), 60 deletions(-) diff --git a/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/schema/NetconfRemoteSchemaYangSourceProvider.java b/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/schema/NetconfRemoteSchemaYangSourceProvider.java index 3a65ce7432..bd29ef4395 100644 --- a/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/schema/NetconfRemoteSchemaYangSourceProvider.java +++ b/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/schema/NetconfRemoteSchemaYangSourceProvider.java @@ -31,6 +31,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.mon import org.opendaylight.yangtools.util.concurrent.ExceptionMapper; 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.schema.AnyXmlNode; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild; @@ -67,26 +68,23 @@ public final class NetconfRemoteSchemaYangSourceProvider implements SchemaSource this.rpc = Preconditions.checkNotNull(rpc); } - public static ContainerNode createGetSchemaRequest(final String moduleName, final Optional revision) { - final QName identifierQName = QName.cachedReference(QName.create(NetconfMessageTransformUtil.GET_SCHEMA_QNAME, "identifier")); - final YangInstanceIdentifier.NodeIdentifier identifierId = new YangInstanceIdentifier.NodeIdentifier(identifierQName); - final LeafNode identifier = Builders.leafBuilder().withNodeIdentifier(identifierId).withValue(moduleName).build(); - - final QName formatQName = QName.cachedReference(QName.create(NetconfMessageTransformUtil.GET_SCHEMA_QNAME, "format")); - final YangInstanceIdentifier.NodeIdentifier formatId = new YangInstanceIdentifier.NodeIdentifier(formatQName); - final LeafNode format = Builders.leafBuilder().withNodeIdentifier(formatId).withValue(Yang.QNAME).build(); + private static final NodeIdentifier FORMAT_PATHARG = new NodeIdentifier(QName.create(NetconfMessageTransformUtil.GET_SCHEMA_QNAME, "format").intern()); + private static final NodeIdentifier GET_SCHEMA_PATHARG = new NodeIdentifier(NetconfMessageTransformUtil.GET_SCHEMA_QNAME); + private static final NodeIdentifier IDENTIFIER_PATHARG = new NodeIdentifier(QName.create(NetconfMessageTransformUtil.GET_SCHEMA_QNAME, "identifier").intern()); + private static final NodeIdentifier VERSION_PATHARG = new NodeIdentifier(QName.create(NetconfMessageTransformUtil.GET_SCHEMA_QNAME, "version").intern()); - final DataContainerNodeAttrBuilder builder = Builders.containerBuilder(); + private static final LeafNode FORMAT_LEAF = Builders.leafBuilder().withNodeIdentifier(FORMAT_PATHARG).withValue(Yang.QNAME).build(); - builder.withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(NetconfMessageTransformUtil.GET_SCHEMA_QNAME)) - .withChild(identifier).withChild(format); + private static final QName NETCONF_DATA = QName.create(GET_SCHEMA_QNAME, NETCONF_DATA_QNAME.getLocalName()).intern(); + private static final NodeIdentifier NETCONF_DATA_PATHARG = toId(NETCONF_DATA); - if(revision.isPresent()) { - final QName revisionQName = QName.cachedReference(QName.create(NetconfMessageTransformUtil.GET_SCHEMA_QNAME, "version")); - final YangInstanceIdentifier.NodeIdentifier revisionId = new YangInstanceIdentifier.NodeIdentifier(revisionQName); - final LeafNode revisionNode = Builders.leafBuilder().withNodeIdentifier(revisionId).withValue(revision.get()).build(); + public static ContainerNode createGetSchemaRequest(final String moduleName, final Optional revision) { + final LeafNode identifier = Builders.leafBuilder().withNodeIdentifier(IDENTIFIER_PATHARG).withValue(moduleName).build(); + final DataContainerNodeAttrBuilder builder = Builders.containerBuilder() + .withNodeIdentifier(GET_SCHEMA_PATHARG).withChild(identifier).withChild(FORMAT_LEAF); - builder.withChild(revisionNode); + if (revision.isPresent()) { + builder.withChild(Builders.leafBuilder().withNodeIdentifier(VERSION_PATHARG).withValue(revision.get()).build()); } return builder.build(); @@ -97,12 +95,11 @@ public final class NetconfRemoteSchemaYangSourceProvider implements SchemaSource return Optional.absent(); } - final QName schemaWrapperNode = QName.cachedReference(QName.create(GET_SCHEMA_QNAME, NETCONF_DATA_QNAME.getLocalName())); - final Optional> child = ((ContainerNode) result).getChild(toId(schemaWrapperNode)); + final Optional> child = ((ContainerNode) result).getChild(NETCONF_DATA_PATHARG); Preconditions.checkState(child.isPresent() && child.get() instanceof AnyXmlNode, "%s Unexpected response to get-schema, expected response with one child %s, but was %s", id, - schemaWrapperNode, result); + NETCONF_DATA, result); final DOMSource wrappedNode = ((AnyXmlNode) child.get()).getValue(); Preconditions.checkNotNull(wrappedNode.getNode()); diff --git a/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/util/NetconfMessageTransformUtil.java b/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/util/NetconfMessageTransformUtil.java index 64cb14338f..cebcfb53f1 100644 --- a/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/util/NetconfMessageTransformUtil.java +++ b/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/util/NetconfMessageTransformUtil.java @@ -45,6 +45,8 @@ import org.opendaylight.yangtools.yang.common.RpcError.ErrorSeverity; import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.opendaylight.yangtools.yang.data.api.ModifyAction; 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.AnyXmlNode; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild; @@ -71,7 +73,7 @@ public class NetconfMessageTransformUtil { public static final String MESSAGE_ID_PREFIX = "m"; public static final String MESSAGE_ID_ATTR = "message-id"; - public static final QName CREATE_SUBSCRIPTION_RPC_QNAME = QName.cachedReference(QName.create(CreateSubscriptionInput.QNAME, "create-subscription")); + public static final QName CREATE_SUBSCRIPTION_RPC_QNAME = QName.create(CreateSubscriptionInput.QNAME, "create-subscription").intern(); private static final String SUBTREE = "subtree"; // Blank document used for creation of new DOM nodes @@ -80,41 +82,41 @@ public class NetconfMessageTransformUtil { private NetconfMessageTransformUtil() {} - public static final QName IETF_NETCONF_MONITORING = QName.create(NetconfState.QNAME, "ietf-netconf-monitoring"); - public static final QName GET_DATA_QNAME = QName.create(IETF_NETCONF_MONITORING, "data"); - public static final QName GET_SCHEMA_QNAME = QName.create(IETF_NETCONF_MONITORING, "get-schema"); - public static final QName IETF_NETCONF_MONITORING_SCHEMA_FORMAT = QName.create(IETF_NETCONF_MONITORING, "format"); - public static final QName IETF_NETCONF_MONITORING_SCHEMA_LOCATION = QName.create(IETF_NETCONF_MONITORING, "location"); - public static final QName IETF_NETCONF_MONITORING_SCHEMA_IDENTIFIER = QName.create(IETF_NETCONF_MONITORING, "identifier"); - public static final QName IETF_NETCONF_MONITORING_SCHEMA_VERSION = QName.create(IETF_NETCONF_MONITORING, "version"); - public static final QName IETF_NETCONF_MONITORING_SCHEMA_NAMESPACE = QName.create(IETF_NETCONF_MONITORING, "namespace"); + public static final QName IETF_NETCONF_MONITORING = QName.create(NetconfState.QNAME, "ietf-netconf-monitoring").intern(); + public static final QName GET_DATA_QNAME = QName.create(IETF_NETCONF_MONITORING, "data").intern(); + public static final QName GET_SCHEMA_QNAME = QName.create(IETF_NETCONF_MONITORING, "get-schema").intern(); + public static final QName IETF_NETCONF_MONITORING_SCHEMA_FORMAT = QName.create(IETF_NETCONF_MONITORING, "format").intern(); + public static final QName IETF_NETCONF_MONITORING_SCHEMA_LOCATION = QName.create(IETF_NETCONF_MONITORING, "location").intern(); + public static final QName IETF_NETCONF_MONITORING_SCHEMA_IDENTIFIER = QName.create(IETF_NETCONF_MONITORING, "identifier").intern(); + public static final QName IETF_NETCONF_MONITORING_SCHEMA_VERSION = QName.create(IETF_NETCONF_MONITORING, "version").intern(); + public static final QName IETF_NETCONF_MONITORING_SCHEMA_NAMESPACE = QName.create(IETF_NETCONF_MONITORING, "namespace").intern(); - public static final QName IETF_NETCONF_NOTIFICATIONS = QName.create(NetconfCapabilityChange.QNAME, "ietf-netconf-notifications"); + public static final QName IETF_NETCONF_NOTIFICATIONS = QName.create(NetconfCapabilityChange.QNAME, "ietf-netconf-notifications").intern(); - public static final QName NETCONF_QNAME = QName.cachedReference(QName.create("urn:ietf:params:xml:ns:netconf:base:1.0", "2011-06-01", "netconf")); + public static final QName NETCONF_QNAME = QName.create("urn:ietf:params:xml:ns:netconf:base:1.0", "2011-06-01", "netconf").intern(); public static final URI NETCONF_URI = NETCONF_QNAME.getNamespace(); - public static final QName NETCONF_DATA_QNAME = QName.create(NETCONF_QNAME, "data"); - public static final QName NETCONF_RPC_REPLY_QNAME = QName.create(NETCONF_QNAME, "rpc-reply"); - public static final QName NETCONF_OK_QNAME = QName.create(NETCONF_QNAME, "ok"); - public static final QName NETCONF_ERROR_OPTION_QNAME = QName.create(NETCONF_QNAME, "error-option"); - public static final QName NETCONF_RUNNING_QNAME = QName.create(NETCONF_QNAME, "running"); - public static final QName NETCONF_SOURCE_QNAME = QName.create(NETCONF_QNAME, "source"); - public static final QName NETCONF_CANDIDATE_QNAME = QName.create(NETCONF_QNAME, "candidate"); - public static final QName NETCONF_TARGET_QNAME = QName.create(NETCONF_QNAME, "target"); - public static final QName NETCONF_CONFIG_QNAME = QName.create(NETCONF_QNAME, "config"); - public static final QName NETCONF_COMMIT_QNAME = QName.create(NETCONF_QNAME, "commit"); - public static final QName NETCONF_VALIDATE_QNAME = QName.create(NETCONF_QNAME, "validate"); - public static final QName NETCONF_COPY_CONFIG_QNAME = QName.create(NETCONF_QNAME, "copy-config"); - public static final QName NETCONF_OPERATION_QNAME = QName.create(NETCONF_QNAME, "operation"); - public static final QName NETCONF_DEFAULT_OPERATION_QNAME = QName.create(NETCONF_OPERATION_QNAME, "default-operation"); - public static final QName NETCONF_EDIT_CONFIG_QNAME = QName.create(NETCONF_QNAME, "edit-config"); + public static final QName NETCONF_DATA_QNAME = QName.create(NETCONF_QNAME, "data").intern(); + public static final QName NETCONF_RPC_REPLY_QNAME = QName.create(NETCONF_QNAME, "rpc-reply").intern(); + public static final QName NETCONF_OK_QNAME = QName.create(NETCONF_QNAME, "ok").intern(); + public static final QName NETCONF_ERROR_OPTION_QNAME = QName.create(NETCONF_QNAME, "error-option").intern(); + public static final QName NETCONF_RUNNING_QNAME = QName.create(NETCONF_QNAME, "running").intern(); + public static final QName NETCONF_SOURCE_QNAME = QName.create(NETCONF_QNAME, "source").intern(); + public static final QName NETCONF_CANDIDATE_QNAME = QName.create(NETCONF_QNAME, "candidate").intern(); + public static final QName NETCONF_TARGET_QNAME = QName.create(NETCONF_QNAME, "target").intern(); + public static final QName NETCONF_CONFIG_QNAME = QName.create(NETCONF_QNAME, "config").intern(); + public static final QName NETCONF_COMMIT_QNAME = QName.create(NETCONF_QNAME, "commit").intern(); + public static final QName NETCONF_VALIDATE_QNAME = QName.create(NETCONF_QNAME, "validate").intern(); + public static final QName NETCONF_COPY_CONFIG_QNAME = QName.create(NETCONF_QNAME, "copy-config").intern(); + public static final QName NETCONF_OPERATION_QNAME = QName.create(NETCONF_QNAME, "operation").intern(); + public static final QName NETCONF_DEFAULT_OPERATION_QNAME = QName.create(NETCONF_OPERATION_QNAME, "default-operation").intern(); + public static final QName NETCONF_EDIT_CONFIG_QNAME = QName.create(NETCONF_QNAME, "edit-config").intern(); public static final QName NETCONF_GET_CONFIG_QNAME = QName.create(NETCONF_QNAME, "get-config"); public static final QName NETCONF_DISCARD_CHANGES_QNAME = QName.create(NETCONF_QNAME, "discard-changes"); - public static final QName NETCONF_TYPE_QNAME = QName.create(NETCONF_QNAME, "type"); - public static final QName NETCONF_FILTER_QNAME = QName.create(NETCONF_QNAME, "filter"); - public static final QName NETCONF_GET_QNAME = QName.create(NETCONF_QNAME, "get"); - public static final QName NETCONF_RPC_QNAME = QName.create(NETCONF_QNAME, "rpc"); + public static final QName NETCONF_TYPE_QNAME = QName.create(NETCONF_QNAME, "type").intern(); + public static final QName NETCONF_FILTER_QNAME = QName.create(NETCONF_QNAME, "filter").intern(); + public static final QName NETCONF_GET_QNAME = QName.create(NETCONF_QNAME, "get").intern(); + public static final QName NETCONF_RPC_QNAME = QName.create(NETCONF_QNAME, "rpc").intern(); public static final URI NETCONF_ROLLBACK_ON_ERROR_URI = URI .create("urn:ietf:params:netconf:capability:rollback-on-error:1.0"); @@ -129,29 +131,29 @@ public class NetconfMessageTransformUtil { public static final URI NETCONF_RUNNING_WRITABLE_URI = URI .create("urn:ietf:params:netconf:capability:writable-running:1.0"); - public static final QName NETCONF_LOCK_QNAME = QName.create(NETCONF_QNAME, "lock"); - public static final QName NETCONF_UNLOCK_QNAME = QName.create(NETCONF_QNAME, "unlock"); + public static final QName NETCONF_LOCK_QNAME = QName.create(NETCONF_QNAME, "lock").intern(); + public static final QName NETCONF_UNLOCK_QNAME = QName.create(NETCONF_QNAME, "unlock").intern(); // Discard changes message public static final ContainerNode DISCARD_CHANGES_RPC_CONTENT = - Builders.containerBuilder().withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(NETCONF_DISCARD_CHANGES_QNAME)).build(); + Builders.containerBuilder().withNodeIdentifier(new NodeIdentifier(NETCONF_DISCARD_CHANGES_QNAME)).build(); // Commit changes message public static final ContainerNode COMMIT_RPC_CONTENT = - Builders.containerBuilder().withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(NETCONF_COMMIT_QNAME)).build(); + Builders.containerBuilder().withNodeIdentifier(new NodeIdentifier(NETCONF_COMMIT_QNAME)).build(); // Get message public static final ContainerNode GET_RPC_CONTENT = - Builders.containerBuilder().withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(NETCONF_GET_QNAME)).build(); + Builders.containerBuilder().withNodeIdentifier(new NodeIdentifier(NETCONF_GET_QNAME)).build(); // Create-subscription changes message public static final ContainerNode CREATE_SUBSCRIPTION_RPC_CONTENT = - Builders.containerBuilder().withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(CREATE_SUBSCRIPTION_RPC_QNAME)).build(); + Builders.containerBuilder().withNodeIdentifier(new NodeIdentifier(CREATE_SUBSCRIPTION_RPC_QNAME)).build(); public static final DataContainerChild EMPTY_FILTER; static { - final NormalizedNodeAttrBuilder anyXmlBuilder = Builders.anyXmlBuilder().withNodeIdentifier(toId(NETCONF_FILTER_QNAME)); + final NormalizedNodeAttrBuilder anyXmlBuilder = Builders.anyXmlBuilder().withNodeIdentifier(toId(NETCONF_FILTER_QNAME)); anyXmlBuilder.withAttributes(Collections.singletonMap(NETCONF_TYPE_QNAME, SUBTREE)); final Element element = XmlUtil.createElement(BLANK_DOCUMENT, NETCONF_FILTER_QNAME.getLocalName(), Optional.of(NETCONF_FILTER_QNAME.getNamespace().toString())); @@ -163,7 +165,7 @@ public class NetconfMessageTransformUtil { } public static DataContainerChild toFilterStructure(final YangInstanceIdentifier identifier, final SchemaContext ctx) { - final NormalizedNodeAttrBuilder anyXmlBuilder = Builders.anyXmlBuilder().withNodeIdentifier(toId(NETCONF_FILTER_QNAME)); + final NormalizedNodeAttrBuilder anyXmlBuilder = Builders.anyXmlBuilder().withNodeIdentifier(toId(NETCONF_FILTER_QNAME)); anyXmlBuilder.withAttributes(Collections.singletonMap(NETCONF_TYPE_QNAME, SUBTREE)); final NormalizedNode filterContent = ImmutableNodes.fromInstanceId(ctx, identifier); @@ -248,12 +250,12 @@ public class NetconfMessageTransformUtil { } } - public static YangInstanceIdentifier.NodeIdentifier toId(final YangInstanceIdentifier.PathArgument qname) { + public static NodeIdentifier toId(final PathArgument qname) { return toId(qname.getNodeType()); } - public static YangInstanceIdentifier.NodeIdentifier toId(final QName nodeType) { - return new YangInstanceIdentifier.NodeIdentifier(nodeType); + public static NodeIdentifier toId(final QName nodeType) { + return new NodeIdentifier(nodeType); } public static Element getDataSubtree(final Document doc) { -- 2.36.6