From: Robert Varga Date: Mon, 28 Sep 2015 20:29:22 +0000 (+0200) Subject: Do not store code snippets in BindingRuntimeContext X-Git-Tag: release/beryllium~92 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=c4f699d6bb37200636b7397fe5d8bab936cd3520;p=mdsal.git Do not store code snippets in BindingRuntimeContext 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 --- diff --git a/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/BindingGeneratorImpl.java b/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/BindingGeneratorImpl.java index 8bb235a466..a72855fd0d 100644 --- a/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/BindingGeneratorImpl.java +++ b/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/BindingGeneratorImpl.java @@ -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); } diff --git a/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/BaseTemplate.xtend b/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/BaseTemplate.xtend index 161857f7df..d3c2908c81 100644 --- a/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/BaseTemplate.xtend +++ b/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/BaseTemplate.xtend @@ -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» + ''' } diff --git a/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/ClassTemplate.xtend b/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/ClassTemplate.xtend index 8107e464b3..a9cbeb10bb 100644 --- a/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/ClassTemplate.xtend +++ b/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/ClassTemplate.xtend @@ -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» diff --git a/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/InterfaceTemplate.xtend b/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/InterfaceTemplate.xtend index acca70de90..4212f2fe56 100644 --- a/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/InterfaceTemplate.xtend +++ b/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/InterfaceTemplate.xtend @@ -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»