Make sure we cache QNameModule instances 30/21930/2
authorRobert Varga <rovarga@cisco.com>
Thu, 28 May 2015 10:21:55 +0000 (12:21 +0200)
committerGerrit Code Review <gerrit@opendaylight.org>
Fri, 5 Jun 2015 10:45:03 +0000 (10:45 +0000)
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 <rovarga@cisco.com>
(cherry picked from commit 9c29d20c9efaaac3f11b0ca54b484fca87afe719)

yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ModuleBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ModuleImpl.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ModuleStatementSupport.java

index 120ebad9575f78081406eaa581fc3b203931042b..ef57f51e3f3fe78aa882a30eb2fad74682ceb8c7 100644 (file)
@@ -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.<QName> 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) {
 
index f6f152fd35b2dbe441e73d9d01bed6085063b9e2..14ef11f123eac57c54d7959340129127bd7507d4 100644 (file)
@@ -66,8 +66,8 @@ public final class ModuleImpl extends AbstractDocumentedDataNodeContainer implem
         this.submodules = ImmutableSet.<Module> 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();
index 963737a7decdb5f6320b5b228d9b9c4d4e27b251..b34c5eef76a3e0b5e0c9030e56f8e715bbdb9a7b 100644 (file)
@@ -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<Date> 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.<URI> absent(), revisionDate);