Do not store code snippets in BindingRuntimeContext 59/27559/7
authorRobert Varga <rovarga@cisco.com>
Mon, 28 Sep 2015 20:29:22 +0000 (22:29 +0200)
committerGerrit Code Review <gerrit@opendaylight.org>
Tue, 29 Sep 2015 12:37:37 +0000 (12:37 +0000)
Analysis of a heap dump shows we retain a fair amount of strings which
represent the QNAME member of generated classes via ConstantImpl. This
should not be happening, as the logic to create QNames in generated
classes should be part of the templates and only emitted to source code.

Teach ClassTemplate how to generate QName constants and only store the
QName in the Constant, saving the overhead of Strings.

Change-Id: I41951f969e273bc2ef4527ef3d95d4bed45c1b7f
Signed-off-by: Robert Varga <rovarga@cisco.com>
binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/BindingGeneratorImpl.java
binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/BaseTemplate.xtend
binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/ClassTemplate.xtend
binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/InterfaceTemplate.xtend

index 8bb235a466cebb04ddd70a9c7fcd2b1d3261ced2..a72855fd0daf97d183ddc368b5c174d32135cba5 100644 (file)
@@ -11,6 +11,7 @@ import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
 import static org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil.computeDefaultSUID;
+import static org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil.packageNameForAugmentedGeneratedType;
 import static org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil.packageNameForGeneratedType;
 import static org.opendaylight.yangtools.binding.generator.util.BindingTypes.DATA_OBJECT;
 import static org.opendaylight.yangtools.binding.generator.util.BindingTypes.DATA_ROOT;
@@ -25,10 +26,8 @@ import static org.opendaylight.yangtools.binding.generator.util.Types.typeForCla
 import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.findDataSchemaNode;
 import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.findNodeInSchemaContext;
 import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.findParentModule;
-
-import com.google.common.base.Optional;
-
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Splitter;
 import com.google.common.base.Strings;
@@ -115,7 +114,6 @@ public class BindingGeneratorImpl implements BindingGenerator {
     private static final Splitter COLON_SPLITTER = Splitter.on(':');
     private static final Splitter BSDOT_SPLITTER = Splitter.on("\\.");
     private static final char NEW_LINE = '\n';
-    private static final String QNAME_FQCN = QName.class.getName();
 
     /**
      * Constant with the concrete name of identifier.
@@ -663,19 +661,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
 
     private static Constant qnameConstant(final GeneratedTypeBuilderBase<?> toBuilder, final String constantName,
             final QName name) {
-        final StringBuilder sb = new StringBuilder(QNAME_FQCN);
-        sb.append(".cachedReference(");
-        sb.append(QNAME_FQCN);
-        sb.append(".create(");
-        sb.append('"');
-        sb.append(name.getNamespace());
-        sb.append("\",\"");
-        sb.append(name.getFormattedRevision());
-        sb.append("\",\"");
-        sb.append(name.getLocalName());
-        sb.append("\"))");
-
-        return toBuilder.addConstant(typeForClass(QName.class), constantName, sb.toString());
+        return toBuilder.addConstant(typeForClass(QName.class), constantName, name);
     }
 
     /**
@@ -878,8 +864,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
         if (!(targetSchemaNode instanceof ChoiceSchemaNode)) {
             String packageName = augmentPackageName;
             if (usesNodeParent instanceof SchemaNode) {
-                packageName = packageNameForGeneratedType(augmentPackageName, ((SchemaNode) usesNodeParent).getPath(),
-                        true);
+                packageName = packageNameForAugmentedGeneratedType(augmentPackageName, ((SchemaNode) usesNodeParent).getPath());
             }
             addRawAugmentGenTypeDefinition(module, packageName, augmentPackageName, targetTypeBuilder.toInstance(),
                     augSchema);
@@ -1480,7 +1465,6 @@ public class BindingGeneratorImpl implements BindingGenerator {
     private boolean resolveLeafSchemaNodeAsProperty(final GeneratedTOBuilder toBuilder, final LeafSchemaNode leaf,
             final boolean isReadOnly, final Module module) {
         if ((leaf != null) && (toBuilder != null)) {
-            final String leafName = leaf.getQName().getLocalName();
             String leafDesc = leaf.getDescription();
             if (leafDesc == null) {
                 leafDesc = "";
@@ -1991,7 +1975,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
             genTOBuilders.add((((TypeProviderImpl) typeProvider)).provideGeneratedTOBuilderForBitsTypeDefinition(
                     packageName, typeDef, classNameFromLeaf, parentModule.getName()));
         }
-        if (genTOBuilders != null && !genTOBuilders.isEmpty()) {
+        if (!genTOBuilders.isEmpty()) {
             for (final GeneratedTOBuilder genTOBuilder : genTOBuilders) {
                 typeBuilder.addEnclosingTransferObject(genTOBuilder);
             }
index 161857f7dfb55b4b3c598ddea62802de8c57d5cf..d3c2908c81224aaf072c16122e4965b93dd8d1d6 100644 (file)
@@ -24,6 +24,8 @@ import org.opendaylight.yangtools.sal.binding.model.api.GeneratedType
 import org.opendaylight.yangtools.sal.binding.model.api.MethodSignature
 import org.opendaylight.yangtools.sal.binding.model.api.Restrictions
 import org.opendaylight.yangtools.sal.binding.model.api.Type
+import org.opendaylight.yangtools.sal.binding.model.api.Constant
+import org.opendaylight.yangtools.yang.common.QName
 
 abstract class BaseTemplate {
     protected val GeneratedType type;
@@ -386,4 +388,13 @@ abstract class BaseTemplate {
         return null
     }
 
+    def protected emitConstant(Constant c) '''
+        «IF c.value instanceof QName»
+            «val qname = c.value as QName»
+            public static final «c.type.importedName» «c.name» = «QName.name».cachedReference(
+                «QName.name».create("«qname.namespace.toString»", "«qname.formattedRevision»", "«qname.localName»"));
+        «ELSE»
+            public static final «c.type.importedName» «c.name» = «c.value»;
+        «ENDIF»
+    '''
 }
index 8107e464b3c4c34734f35a40eb0b6532b14ac20d..a9cbeb10bbeb1dad237bf699c7e94a305baf7383 100644 (file)
@@ -438,7 +438,7 @@ class ClassTemplate extends BaseTemplate {
                         «generateStaticInicializationBlock»
                     «ENDIF»
                 «ELSE»
-                    public static final «c.type.importedName» «c.name» = «c.value»;
+                    «emitConstant(c)»
                 «ENDIF»
             «ENDFOR»
         «ENDIF»
index acca70de9020dd151f5f63351562bb740c740c49..4212f2fe56540948632842c233eb38e55eaeefcc 100644 (file)
@@ -159,7 +159,7 @@ class InterfaceTemplate extends BaseTemplate {
         «IF !consts.empty»
             «FOR c : consts»
                 «IF c.name != TypeConstants.PATTERN_CONSTANT_NAME»
-                    public static final «c.type.importedName» «c.name» = «c.value»;
+                    «emitConstant(c)»
                 «ENDIF»
             «ENDFOR»
         «ENDIF»