From 90d0c4f928887171dd1598d844c7939a78beb708 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 3 Jul 2014 22:45:43 +0200 Subject: [PATCH] BUG-1270: optimize Builders with QName(Module) Now that we are exposing QNameModule, we can optimize QName instantiation heavily by passing parent QName and QNameModule instances, so they will get massively reused. Change-Id: If67883ea3873a55b563136b743a7453c365475a9 Signed-off-by: Robert Varga --- .../parser/builder/impl/BuilderUtils.java | 22 ++++++++----------- .../parser/builder/impl/ChoiceBuilder.java | 15 +++++-------- .../builder/impl/ChoiceCaseBuilder.java | 13 +++++------ .../builder/impl/GroupingBuilderImpl.java | 11 ++++------ .../builder/impl/ListSchemaNodeBuilder.java | 14 +++++------- .../builder/impl/NotificationBuilder.java | 14 +++++------- ...actDocumentedDataNodeContainerBuilder.java | 17 +++++--------- .../yang/parser/impl/YangParserImpl.java | 22 +++++++------------ 8 files changed, 48 insertions(+), 80 deletions(-) diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/BuilderUtils.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/BuilderUtils.java index d4ba3d1607..82a2989076 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/BuilderUtils.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/BuilderUtils.java @@ -19,7 +19,6 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; -import java.net.URI; import java.util.ArrayList; import java.util.Collection; import java.util.Date; @@ -29,6 +28,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeMap; + import org.apache.commons.io.IOUtils; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode; @@ -704,12 +704,11 @@ public final class BuilderUtils { } public static Set wrapChildNodes(final String moduleName, final int line, - final Set nodes, final SchemaPath parentPath, final URI ns, final Date rev, - final String pref) { + final Set nodes, final SchemaPath parentPath, final QName parentQName) { Set result = new HashSet<>(); for (DataSchemaNode node : nodes) { - QName qname = new QName(ns, rev, pref, node.getQName().getLocalName()); + QName qname = QName.create(parentQName, node.getQName().getLocalName()); DataSchemaNodeBuilder wrapped = wrapChildNode(moduleName, line, node, parentPath, qname); result.add(wrapped); } @@ -742,11 +741,10 @@ public final class BuilderUtils { } public static Set wrapGroupings(final String moduleName, final int line, - final Set nodes, final SchemaPath parentPath, final URI ns, final Date rev, - final String pref) { + final Set nodes, final SchemaPath parentPath, final QName parentQName) { Set result = new HashSet<>(); for (GroupingDefinition node : nodes) { - QName qname = new QName(ns, rev, pref, node.getQName().getLocalName()); + QName qname = QName.create(parentQName, node.getQName().getLocalName()); SchemaPath schemaPath = parentPath.createChild(qname); result.add(new GroupingBuilderImpl(moduleName, line, qname, schemaPath, node)); } @@ -754,12 +752,11 @@ public final class BuilderUtils { } public static Set wrapTypedefs(final String moduleName, final int line, - final DataNodeContainer dataNode, final SchemaPath parentPath, final URI ns, final Date rev, - final String pref) { + final DataNodeContainer dataNode, final SchemaPath parentPath, final QName parentQName) { Set> nodes = dataNode.getTypeDefinitions(); Set result = new HashSet<>(); for (TypeDefinition node : nodes) { - QName qname = new QName(ns, rev, pref, node.getQName().getLocalName()); + QName qname = QName.create(parentQName, node.getQName().getLocalName()); SchemaPath schemaPath = parentPath.createChild(qname); result.add(new TypeDefinitionBuilderImpl(moduleName, line, qname, schemaPath, ((ExtendedType) node))); } @@ -767,11 +764,10 @@ public final class BuilderUtils { } public static List wrapUnknownNodes(final String moduleName, final int line, - final List nodes, final SchemaPath parentPath, final URI ns, final Date rev, - final String pref) { + final List nodes, final SchemaPath parentPath, final QName parentQName) { List result = new ArrayList<>(); for (UnknownSchemaNode node : nodes) { - QName qname = new QName(ns, rev, pref, node.getQName().getLocalName()); + QName qname = QName.create(parentQName, node.getQName().getLocalName()); SchemaPath schemaPath = parentPath.createChild(qname); result.add(new UnknownSchemaNodeBuilderImpl(moduleName, line, qname, schemaPath, node)); } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ChoiceBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ChoiceBuilder.java index c4dab717b4..bfc549cbbf 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ChoiceBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ChoiceBuilder.java @@ -9,13 +9,13 @@ package org.opendaylight.yangtools.yang.parser.builder.impl; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; -import java.net.URI; + import java.util.ArrayList; -import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.TreeSet; + import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.AugmentationSchema; import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode; @@ -35,7 +35,7 @@ import org.opendaylight.yangtools.yang.parser.builder.util.Comparators; import org.opendaylight.yangtools.yang.parser.util.YangParseException; public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements DataSchemaNodeBuilder, - AugmentationTargetBuilder { +AugmentationTargetBuilder { private ChoiceNodeImpl instance; // DataSchemaNode args @@ -70,19 +70,16 @@ public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements Da configuration = base.isConfiguration(); augmentations.addAll(base.getAvailableAugmentations()); - URI ns = qname.getNamespace(); - Date rev = qname.getRevision(); - String pref = qname.getPrefix(); Set wrapped = BuilderUtils.wrapChildNodes(moduleName, line, new HashSet( - base.getCases()), path, ns, rev, pref); + base.getCases()), path, qname); for (DataSchemaNodeBuilder wrap : wrapped) { if (wrap instanceof ChoiceCaseBuilder) { caseBuilders.add((ChoiceCaseBuilder) wrap); } } - addedUnknownNodes.addAll(BuilderUtils.wrapUnknownNodes(moduleName, line, base.getUnknownSchemaNodes(), path, ns, - rev, pref)); + addedUnknownNodes.addAll(BuilderUtils.wrapUnknownNodes(moduleName, line, base.getUnknownSchemaNodes(), path, + qname)); } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ChoiceCaseBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ChoiceCaseBuilder.java index 57ffe80f79..a090d733e9 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ChoiceCaseBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ChoiceCaseBuilder.java @@ -10,11 +10,11 @@ package org.opendaylight.yangtools.yang.parser.builder.impl; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; -import java.net.URI; + import java.util.ArrayList; -import java.util.Date; import java.util.List; import java.util.Set; + import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.AugmentationSchema; import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode; @@ -33,7 +33,7 @@ import org.opendaylight.yangtools.yang.parser.builder.util.AbstractDocumentedDat import org.opendaylight.yangtools.yang.parser.util.YangParseException; public final class ChoiceCaseBuilder extends AbstractDocumentedDataNodeContainerBuilder implements DataSchemaNodeBuilder, - AugmentationTargetBuilder { +AugmentationTargetBuilder { private ChoiceCaseNodeImpl instance; // SchemaNode args private SchemaPath schemaPath; @@ -67,11 +67,8 @@ public final class ChoiceCaseBuilder extends AbstractDocumentedDataNodeContainer augmenting = base.isAugmenting(); addedByUses = base.isAddedByUses(); - URI ns = qname.getNamespace(); - Date rev = qname.getRevision(); - String pref = qname.getPrefix(); - addedUnknownNodes.addAll(BuilderUtils.wrapUnknownNodes(moduleName, line, base.getUnknownSchemaNodes(), path, ns, - rev, pref)); + addedUnknownNodes.addAll(BuilderUtils.wrapUnknownNodes(moduleName, line, base.getUnknownSchemaNodes(), path, + qname)); augmentations.addAll(base.getAvailableAugmentations()); } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/GroupingBuilderImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/GroupingBuilderImpl.java index 96009d8fd6..042756447f 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/GroupingBuilderImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/GroupingBuilderImpl.java @@ -9,11 +9,11 @@ package org.opendaylight.yangtools.yang.parser.builder.impl; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; -import java.net.URI; -import java.util.Date; + import java.util.HashSet; import java.util.List; import java.util.Set; + import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.GroupingDefinition; import org.opendaylight.yangtools.yang.model.api.SchemaPath; @@ -52,11 +52,8 @@ public final class GroupingBuilderImpl extends AbstractDocumentedDataNodeContain status = base.getStatus(); addedByUses = base.isAddedByUses(); - URI ns = qname.getNamespace(); - Date rev = qname.getRevision(); - String pref = qname.getPrefix(); addedUnknownNodes.addAll(BuilderUtils.wrapUnknownNodes(moduleName, line, base.getUnknownSchemaNodes(), path, - ns, rev, pref)); + qname)); } @Override @@ -195,7 +192,7 @@ public final class GroupingBuilderImpl extends AbstractDocumentedDataNodeContain } private static final class GroupingDefinitionImpl extends AbstractDocumentedDataNodeContainer implements - GroupingDefinition { + GroupingDefinition { private final QName qname; private final SchemaPath path; diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ListSchemaNodeBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ListSchemaNodeBuilder.java index e251aacb87..a41a675f48 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ListSchemaNodeBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ListSchemaNodeBuilder.java @@ -10,11 +10,11 @@ package org.opendaylight.yangtools.yang.parser.builder.impl; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; -import java.net.URI; + import java.util.ArrayList; -import java.util.Date; import java.util.List; import java.util.Set; + import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.AugmentationSchema; import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition; @@ -30,7 +30,7 @@ import org.opendaylight.yangtools.yang.parser.builder.util.AbstractDocumentedDat import org.opendaylight.yangtools.yang.parser.builder.util.AbstractDocumentedDataNodeContainerBuilder; public final class ListSchemaNodeBuilder extends AbstractDocumentedDataNodeContainerBuilder implements DataSchemaNodeBuilder, - AugmentationTargetBuilder { +AugmentationTargetBuilder { private ListSchemaNodeImpl instance; private boolean userOrdered; private List keys; @@ -65,12 +65,8 @@ public final class ListSchemaNodeBuilder extends AbstractDocumentedDataNodeConta addedByUses = base.isAddedByUses(); configuration = base.isConfiguration(); - URI ns = qname.getNamespace(); - Date rev = qname.getRevision(); - String pref = qname.getPrefix(); - addedUnknownNodes.addAll(BuilderUtils.wrapUnknownNodes(moduleName, line, base.getUnknownSchemaNodes(), path, ns, - rev, pref)); - + addedUnknownNodes.addAll(BuilderUtils.wrapUnknownNodes(moduleName, line, base.getUnknownSchemaNodes(), path, + qname)); augmentations.addAll(base.getAvailableAugmentations()); } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/NotificationBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/NotificationBuilder.java index d19d0268ff..7e5c53db66 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/NotificationBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/NotificationBuilder.java @@ -10,11 +10,11 @@ package org.opendaylight.yangtools.yang.parser.builder.impl; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; -import java.net.URI; + import java.util.ArrayList; -import java.util.Date; import java.util.List; import java.util.Set; + import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.AugmentationSchema; import org.opendaylight.yangtools.yang.model.api.NotificationDefinition; @@ -29,7 +29,7 @@ import org.opendaylight.yangtools.yang.parser.builder.util.AbstractDocumentedDat import org.opendaylight.yangtools.yang.parser.util.YangParseException; public final class NotificationBuilder extends AbstractDocumentedDataNodeContainerBuilder implements SchemaNodeBuilder, - AugmentationTargetBuilder { +AugmentationTargetBuilder { private NotificationDefinitionImpl instance; // SchemaNode args private SchemaPath schemaPath; @@ -47,12 +47,8 @@ public final class NotificationBuilder extends AbstractDocumentedDataNodeContain super(moduleName, line, qname, path, base); this.schemaPath = Preconditions.checkNotNull(path, "Schema Path must not be null"); - URI ns = qname.getNamespace(); - Date rev = qname.getRevision(); - String pref = qname.getPrefix(); addedUnknownNodes.addAll(BuilderUtils.wrapUnknownNodes(moduleName, line, base.getUnknownSchemaNodes(), path, - ns, rev, pref)); - + qname)); augmentations.addAll(base.getAvailableAugmentations()); } @@ -111,7 +107,7 @@ public final class NotificationBuilder extends AbstractDocumentedDataNodeContain } private static final class NotificationDefinitionImpl extends AbstractDocumentedDataNodeContainer implements - NotificationDefinition { + NotificationDefinition { private final QName qname; private final SchemaPath path; private ImmutableSet augmentations; diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/util/AbstractDocumentedDataNodeContainerBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/util/AbstractDocumentedDataNodeContainerBuilder.java index cc734408e1..c986712e90 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/util/AbstractDocumentedDataNodeContainerBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/util/AbstractDocumentedDataNodeContainerBuilder.java @@ -6,13 +6,12 @@ */ package org.opendaylight.yangtools.yang.parser.builder.util; -import java.net.URI; -import java.util.Date; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; + import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.DataNodeContainer; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; @@ -55,19 +54,15 @@ public abstract class AbstractDocumentedDataNodeContainerBuilder extends Abstrac super(moduleName, line); this.qname = qname; - URI ns = qname.getNamespace(); - Date rev = qname.getRevision(); - String pref = qname.getPrefix(); - // We do copy of child nodes with namespace change // FIXME: Copy should be part of builder API so impl we prevent // cyclic dependencies and each builder carries its own semantic for copy. - addedChildNodes.addAll(BuilderUtils.wrapChildNodes(moduleName, line, base.getChildNodes(), path, ns, rev, pref)); - addedGroupings.addAll(BuilderUtils.wrapGroupings(moduleName, line, base.getGroupings(), path, ns, rev, pref)); - addedTypedefs.addAll(BuilderUtils.wrapTypedefs(moduleName, line, base, path, ns, rev, pref)); + addedChildNodes.addAll(BuilderUtils.wrapChildNodes(moduleName, line, base.getChildNodes(), path, qname)); + addedGroupings.addAll(BuilderUtils.wrapGroupings(moduleName, line, base.getGroupings(), path, qname)); + addedTypedefs.addAll(BuilderUtils.wrapTypedefs(moduleName, line, base, path, qname)); // FIXME: unkownSchemaNodes should be available in DataNodeContainer -// addedUnknownNodes.addAll(BuilderUtils.wrapUnknownNodes(moduleName, line, base.getUnknownSchemaNodes(), path, ns, -// rev, pref)); + // addedUnknownNodes.addAll(BuilderUtils.wrapUnknownNodes(moduleName, + // line, base.getUnknownSchemaNodes(), path, qname)); usesNodes.addAll(base.getUses()); } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserImpl.java index 44f5dcb055..aefd0ba1b9 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserImpl.java @@ -33,7 +33,6 @@ import com.google.common.io.ByteSource; import java.io.File; import java.io.IOException; import java.io.InputStream; -import java.net.URI; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -1346,49 +1345,44 @@ public final class YangParserImpl implements YangContextParser { DataNodeContainerBuilder parent = usesNode.getParent(); ModuleBuilder module = BuilderUtils.getParentModule(parent); SchemaPath parentPath; - URI ns; - Date rev; - String pref; + + final QName parentQName; if (parent instanceof AugmentationSchemaBuilder || parent instanceof ModuleBuilder) { - ns = module.getNamespace(); - rev = module.getRevision(); - pref = module.getPrefix(); + parentQName = QName.create(module.getQNameModule(), module.getPrefix(), "dummy"); if (parent instanceof AugmentationSchemaBuilder) { parentPath = ((AugmentationSchemaBuilder) parent).getTargetNodeSchemaPath(); } else { parentPath = parent.getPath(); } } else { - ns = parent.getQName().getNamespace(); - rev = parent.getQName().getRevision(); - pref = parent.getQName().getPrefix(); + parentQName = parent.getQName(); parentPath = parent.getPath(); } GroupingDefinition gd = usesNode.getGroupingDefinition(); Set childNodes = wrapChildNodes(module.getModuleName(), line, gd.getChildNodes(), - parentPath, ns, rev, pref); + parentPath, parentQName); parent.getChildNodeBuilders().addAll(childNodes); for (DataSchemaNodeBuilder childNode : childNodes) { setNodeAddedByUses(childNode); } - Set typedefs = wrapTypedefs(module.getModuleName(), line, gd, parentPath, ns, rev, pref); + Set typedefs = wrapTypedefs(module.getModuleName(), line, gd, parentPath, parentQName); parent.getTypeDefinitionBuilders().addAll(typedefs); for (TypeDefinitionBuilder typedef : typedefs) { setNodeAddedByUses(typedef); } Set groupings = wrapGroupings(module.getModuleName(), line, usesNode.getGroupingDefinition() - .getGroupings(), parentPath, ns, rev, pref); + .getGroupings(), parentPath, parentQName); parent.getGroupingBuilders().addAll(groupings); for (GroupingBuilder gb : groupings) { setNodeAddedByUses(gb); } List unknownNodes = wrapUnknownNodes(module.getModuleName(), line, - gd.getUnknownSchemaNodes(), parentPath, ns, rev, pref); + gd.getUnknownSchemaNodes(), parentPath, parentQName); parent.getUnknownNodes().addAll(unknownNodes); for (UnknownSchemaNodeBuilder un : unknownNodes) { un.setAddedByUses(true); -- 2.36.6