From: Robert Varga Date: Tue, 15 Jul 2014 20:16:11 +0000 (+0200) Subject: BUG-1270: improve QNameModule reuse X-Git-Tag: release/helium~342 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=364e85967bafce41b84ab2ead45295178a8292bc;p=yangtools.git BUG-1270: improve QNameModule reuse This eliminates calls calls which were causing unneeded QNameModules to be instantiated, reducing memory overhead. Change-Id: I5faa53fa8a5f82ae8b87fde67c0e69271595ce94 Signed-off-by: Robert Varga --- diff --git a/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/QName.java b/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/QName.java index 7c35f67103..1ab33ade49 100644 --- a/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/QName.java +++ b/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/QName.java @@ -284,6 +284,17 @@ public final class QName implements Immutable, Serializable, Comparable { return new QName(base, localName); } + /** + * Creates new QName. + * + * @param qnameModule + * Namespace and revision enclosed as a QNameModule + * @param prefix + * Namespace prefix + * @param localName + * Local name part of QName. MUST NOT BE null. + * @return Instance of QName + */ public static QName create(final QNameModule module, final String prefix, final String localName) { if (module == null) { throw new NullPointerException("module may not be null"); 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 70eb185ca2..0eae6cace8 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 @@ -13,6 +13,7 @@ import com.google.common.base.Preconditions; import com.google.common.base.Splitter; import com.google.common.collect.Collections2; import com.google.common.io.ByteSource; + import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileNotFoundException; @@ -30,6 +31,7 @@ import java.util.TreeMap; import org.apache.commons.io.IOUtils; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.common.QNameModule; import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode; import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode; import org.opendaylight.yangtools.yang.model.api.ChoiceNode; @@ -233,9 +235,9 @@ public final class BuilderUtils { final QName name; if (it.hasNext()) { - name = new QName(null, null, s, it.next()); + name = QName.create(QNameModule.create(null, null), s, it.next()); } else { - name = new QName(null, null, null, s); + name = QName.create(QNameModule.create(null, null), s); } path.add(name); } @@ -745,7 +747,7 @@ public final class BuilderUtils { } } - public static ModuleBuilder getModuleByPrefix(ModuleBuilder module, String prefix) { + public static ModuleBuilder getModuleByPrefix(final ModuleBuilder module, final String prefix) { if (prefix == null || prefix.isEmpty() || prefix.equals(module.getPrefix())) { return module; } else { diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/CopyUtils.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/CopyUtils.java index 5cb6972401..365c34379e 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/CopyUtils.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/CopyUtils.java @@ -455,7 +455,7 @@ public final class CopyUtils { if (newParent instanceof ModuleBuilder) { ModuleBuilder parent = (ModuleBuilder) newParent; if (updateQName) { - newQName = new QName(parent.getNamespace(), parent.getRevision(), parent.getPrefix(), old.getQName() + newQName = QName.create(parent.getQNameModule(), parent.getPrefix(), old.getQName() .getLocalName()); } else { newQName = old.getQName(); @@ -465,7 +465,7 @@ public final class CopyUtils { AugmentationSchemaBuilder augment = (AugmentationSchemaBuilder) newParent; ModuleBuilder parent = BuilderUtils.getParentModule(newParent); if (updateQName) { - newQName = new QName(parent.getNamespace(), parent.getRevision(), parent.getPrefix(), old.getQName() + newQName = QName.create(parent.getQNameModule(), parent.getPrefix(), old.getQName() .getLocalName()); } else { newQName = old.getQName(); diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ModuleBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ModuleBuilder.java index d762af57bf..db1babd6dc 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ModuleBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ModuleBuilder.java @@ -129,7 +129,7 @@ public class ModuleBuilder extends AbstractDocumentedDataNodeContainerBuilder im } public ModuleBuilder(final Module base) { - super(base.getName(), 0, new QName(base.getNamespace(), base.getRevision(), base.getPrefix(), base.getName()), + super(base.getName(), 0, QName.create(base.getQNameModule(), base.getPrefix(), base.getName()), SCHEMA_PATH, base); this.name = base.getName(); this.sourcePath = base.getModuleSourcePath(); 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 0f3c4dd2f8..d80c31bba8 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 @@ -27,6 +27,7 @@ import com.google.common.base.Preconditions; import com.google.common.base.Splitter; import com.google.common.collect.HashBiMap; import com.google.common.io.ByteSource; + import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -36,14 +37,15 @@ import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeMap; + import javax.annotation.concurrent.Immutable; + import org.antlr.v4.runtime.ANTLRInputStream; import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.tree.ParseTree; @@ -117,7 +119,7 @@ public final class YangParserImpl implements YangContextParser { @Override public SchemaContext parseFile(final File yangFile, final File directory) throws IOException, - YangSyntaxErrorException { + YangSyntaxErrorException { Preconditions.checkState(yangFile.exists(), yangFile + " does not exists"); Preconditions.checkState(directory.exists(), directory + " does not exists"); Preconditions.checkState(directory.isDirectory(), directory + " is not a directory"); @@ -182,7 +184,7 @@ public final class YangParserImpl implements YangContextParser { @Override public SchemaContext parseFiles(final Collection yangFiles, final SchemaContext context) throws IOException, - YangSyntaxErrorException { + YangSyntaxErrorException { if (yangFiles == null) { return resolveSchemaContext(Collections. emptySet()); } @@ -204,7 +206,7 @@ public final class YangParserImpl implements YangContextParser { @Override public SchemaContext parseSources(final Collection sources) throws IOException, - YangSyntaxErrorException { + YangSyntaxErrorException { Collection unsorted = parseYangModelSources(sources).values(); Set sorted = new LinkedHashSet<>( ModuleDependencySort.sort(unsorted.toArray(new Module[unsorted.size()]))); @@ -245,8 +247,8 @@ public final class YangParserImpl implements YangContextParser { return resolveSchemaContext(result); } - private LinkedHashMap> resolveModulesWithImports(List sorted, - SchemaContext context) { + private LinkedHashMap> resolveModulesWithImports(final List sorted, + final SchemaContext context) { final LinkedHashMap> modules = orderModules(sorted); for (ModuleBuilder module : sorted) { if (module != null) { @@ -345,7 +347,7 @@ public final class YangParserImpl implements YangContextParser { } private Map parseYangModelSources(final Collection sources) throws IOException, - YangSyntaxErrorException { + YangSyntaxErrorException { if (sources == null || sources.isEmpty()) { return Collections.emptyMap(); } @@ -378,7 +380,7 @@ public final class YangParserImpl implements YangContextParser { */ // TODO: remove ByteSource result after removing YangModelParser private Map resolveSources(final Collection streams) throws IOException, - YangSyntaxErrorException { + YangSyntaxErrorException { Map builders = parseSourcesToBuilders(streams); return resolveSubmodules(builders); } @@ -593,7 +595,7 @@ public final class YangParserImpl implements YangContextParser { } private Map parseYangSources(final Collection sources) throws IOException, - YangSyntaxErrorException { + YangSyntaxErrorException { final Map trees = new HashMap<>(); for (ByteSource source : sources) { trees.put(source, parseYangSource(source)); @@ -799,7 +801,7 @@ public final class YangParserImpl implements YangContextParser { } qnm = currentModule.getQNameModule(); } - newPath.add(new QName(qnm.getNamespace(), qnm.getRevision(), localPrefix, qn.getLocalName())); + newPath.add(QName.create(qnm, localPrefix, qn.getLocalName())); } } augment.setTargetNodeSchemaPath(SchemaPath.create(newPath, true)); @@ -996,7 +998,7 @@ public final class YangParserImpl implements YangContextParser { } } - private void resolveIdentity(final Map> modules, ModuleBuilder module, + private void resolveIdentity(final Map> modules, final ModuleBuilder module, final IdentitySchemaNodeBuilder identity) { final String baseIdentityName = identity.getBaseIdentityName(); if (baseIdentityName != null) { @@ -1203,7 +1205,7 @@ public final class YangParserImpl implements YangContextParser { usnb.setExtensionDefinition(extDef); } } else { - usnb.setNodeType(new QName(extBuilder.getQName().getNamespace(), extBuilder.getQName().getRevision(), + usnb.setNodeType(QName.create(extBuilder.getQName().getModule(), nodeType.getPrefix(), extBuilder.getQName().getLocalName())); usnb.setExtensionBuilder(extBuilder); } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserListenerImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserListenerImpl.java index b51c638717..a536c1cbf8 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserListenerImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserListenerImpl.java @@ -69,6 +69,7 @@ import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.When_stmtContext; import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Yang_version_stmtContext; import org.opendaylight.yangtools.antlrv4.code.gen.YangParserBaseListener; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.common.QNameModule; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; import org.opendaylight.yangtools.yang.model.util.BaseTypes; @@ -199,7 +200,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener { setLog("namespace", namespaceStr); } else if (treeNode instanceof Prefix_stmtContext) { final String yangModelPrefix = stringFromNode(treeNode); - this.moduleQName = new QName(moduleQName.getNamespace(), moduleQName.getRevision(), yangModelPrefix, moduleQName.getLocalName()); + this.moduleQName = QName.create(moduleQName.getModule(), yangModelPrefix, moduleQName.getLocalName()); moduleBuilder.setPrefix(yangModelPrefix); setLog("prefix", yangModelPrefix); } else if (treeNode instanceof Yang_version_stmtContext) { @@ -471,7 +472,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener { if (prefix.equals(moduleQName.getPrefix())) { typeQName = QName.create(moduleQName, name); } else { - typeQName = new QName(null, null, prefix, name); + typeQName = QName.create(QNameModule.create(null, null), prefix, name); } } else { typeQName = QName.create(moduleQName, typeName); @@ -1027,7 +1028,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener { final String e0 = splittedElement.next(); final QName nodeType; if (splittedElement.hasNext()) { - nodeType = new QName(moduleQName.getNamespace(), moduleQName.getRevision(), e0, splittedElement.next()); + nodeType = QName.create(moduleQName.getModule(), e0, splittedElement.next()); } else { nodeType = QName.create(moduleQName, e0); } @@ -1039,7 +1040,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener { final Iterator it = splittedName.iterator(); if (Iterables.size(splittedName) == 2) { - qname = new QName(null, null, it.next(), it.next()); + qname = QName.create(QNameModule.create(null, null), it.next(), it.next()); } else { qname = QName.create(moduleQName, it.next()); }