From: Robert Varga Date: Thu, 28 May 2015 10:21:55 +0000 (+0200) Subject: Make sure we cache QNameModule instances X-Git-Tag: release/beryllium~480 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=da23daf8c56c75066a7b376bc6603cfc0c278ef2;p=yangtools.git Make sure we cache QNameModule instances Parser should be taking advantege of cached QNameModules, as multiple generations/independent instances within a JVM should still be sharing them. Change-Id: I3c670519056456f8c93591b1e8e24f095131fb9a Signed-off-by: Robert Varga (cherry picked from commit 9c29d20c9efaaac3f11b0ca54b484fca87afe719) --- 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 120ebad957..ef57f51e3f 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 @@ -60,7 +60,7 @@ import org.opendaylight.yangtools.yang.parser.util.YangParseException; * otherwise result may not be valid. */ public class ModuleBuilder extends AbstractDocumentedDataNodeContainerBuilder implements DocumentedNodeBuilder { - + private static final QNameModule EMPTY_QNAME_MODULE = QNameModule.cachedReference(QNameModule.create(null, null)); private static final String GROUPING_STR = "Grouping"; private static final String TYPEDEF_STR = "typedef"; private ModuleImpl instance; @@ -68,7 +68,7 @@ public class ModuleBuilder extends AbstractDocumentedDataNodeContainerBuilder im private final String sourcePath; private static final SchemaPath SCHEMA_PATH = SchemaPath.create(Collections. emptyList(), true); private String prefix; - private QNameModule qnameModule = QNameModule.create(null, null); + private QNameModule qnameModule = EMPTY_QNAME_MODULE; private final boolean submodule; private String belongsTo; @@ -346,7 +346,7 @@ public class ModuleBuilder extends AbstractDocumentedDataNodeContainerBuilder im } public void setNamespace(final URI namespace) { - this.qnameModule = QNameModule.create(namespace, qnameModule.getRevision()); + this.qnameModule = QNameModule.cachedReference(QNameModule.create(namespace, qnameModule.getRevision())); } public String getPrefix() { @@ -408,7 +408,7 @@ public class ModuleBuilder extends AbstractDocumentedDataNodeContainerBuilder im } public void setRevision(final Date revision) { - this.qnameModule = QNameModule.create(qnameModule.getNamespace(), revision); + this.qnameModule = QNameModule.cachedReference(QNameModule.create(qnameModule.getNamespace(), revision)); } public void setPrefix(final String prefix) { @@ -430,7 +430,7 @@ public class ModuleBuilder extends AbstractDocumentedDataNodeContainerBuilder im public void addModuleImport(final String moduleName, final Date revision, final String prefix) { checkPrefix(prefix); checkNotSealed(); - final ModuleImport moduleImport = createModuleImport(moduleName, revision, prefix); + final ModuleImport moduleImport = new ModuleImportImpl(moduleName, revision, prefix); imports.put(prefix, moduleImport); } @@ -1049,10 +1049,6 @@ public class ModuleBuilder extends AbstractDocumentedDataNodeContainerBuilder im } } - private ModuleImport createModuleImport(final String moduleName, final Date revision, final String prefix) { - return new ModuleImportImpl(moduleName, revision, prefix); - } - private void raiseYangParserException(final String cantAddType, final String type, final String name, final int currentLine, final int duplicateLine) { diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ModuleImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ModuleImpl.java index f6f152fd35..14ef11f123 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ModuleImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ModuleImpl.java @@ -66,8 +66,8 @@ public final class ModuleImpl extends AbstractDocumentedDataNodeContainer implem this.submodules = ImmutableSet. copyOf(builder.submodules); this.prefix = builder.getPrefix(); - this.qnameModule = QNameModule.create(builder.getNamespace(), - builder.getRevision() == null ? null : new Date(builder.getRevision().getTime())); + this.qnameModule = QNameModule.cachedReference(QNameModule.create(builder.getNamespace(), + builder.getRevision() == null ? null : new Date(builder.getRevision().getTime()))); this.yangVersion = builder.getYangVersion(); this.organization = builder.getOrganization(); this.contact = builder.getContact(); diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ModuleStatementSupport.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ModuleStatementSupport.java index 963737a7de..b34c5eef76 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ModuleStatementSupport.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ModuleStatementSupport.java @@ -72,10 +72,12 @@ public class ModuleStatementSupport extends + "] is missing."); } + // FIXME: this is wrong, it has to select the newest revision statement, not the first it encounters. + // YANG files are not required to order revisions Optional revisionDate = Optional.fromNullable(firstAttributeOf(stmt.declaredSubstatements(), RevisionStatement.class)); - qNameModule = QNameModule.create(moduleNs.get(), revisionDate.orNull()); + qNameModule = QNameModule.cachedReference(QNameModule.create(moduleNs.get(), revisionDate.orNull())); ModuleIdentifier moduleIdentifier = new ModuleIdentifierImpl(stmt.getStatementArgument(), Optional. absent(), revisionDate);