From 67b940dfbd66ab7e7ed10e98fe8f732409dced74 Mon Sep 17 00:00:00 2001 From: Martin Ciglan Date: Thu, 6 Jul 2017 09:33:19 +0200 Subject: [PATCH] JavaIdentifierNormalizer ThreadSafe/Memory leak fix MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 1. make it thread-safe 2. memory leak fix 3. avoid deep indentations by obeying code conventions Result "org.opendaylight.coretutorials.MyBenchmark.testBindingV2": 165.567 ±(99.9%) 1.548 ops/s [Average] (min, avg, max) = (146.161, 165.567, 180.523), stdev = 6.553 CI (99.9%): [164.019, 167.115] (assumes normal distribution) Benchmark Mode Cnt Score Error Units MyBenchmark.testBindingV2 thrpt 200 165.567 ± 1.548 ops/s We're still around 2.8x slower than binding v1 generator, so there will be follow-up activity to analyse/profile architecture vs. implementation weakness and fixes should/might be necessary to improve binding v2 generator. Change-Id: Id1ca6e5f530c0340c3234526d6babf1f9e3c62b0 Signed-off-by: Martin Ciglan --- .../generator/context}/ModuleContext.java | 29 ++- .../javav2/generator/spi/TypeProvider.java | 6 +- .../builder/GeneratedTypeBuilderBase.java | 3 +- .../generator/impl/AugmentToGenType.java | 1 + .../generator/impl/AuxiliaryGenUtils.java | 21 +- .../generator/impl/BindingGeneratorImpl.java | 7 +- .../javav2/generator/impl/GenHelperUtil.java | 57 +++--- .../generator/impl/ModuleToGenType.java | 9 +- .../generator/impl/RpcActionGenHelper.java | 10 +- .../generator/yang/types/BaseYangTypes.java | 8 +- .../generator/yang/types/TypeGenHelper.java | 22 +- .../yang/types/TypeProviderImpl.java | 189 ++++++++---------- .../generator/impl/AugmentToGenTypeTest.java | 21 +- .../generator/impl/AuxiliaryGenUtilsTest.java | 36 ++-- .../GeneratedClassLoadingStrategyTest.java | 3 +- .../impl/RpcActionGenHelperTest.java | 1 + .../generator/util/AbstractBaseType.java | 21 +- .../generator/util/BindingGeneratorUtil.java | 2 - .../javav2/generator/util/JavaIdentifier.java | 1 + .../util/JavaIdentifierNormalizer.java | 32 +-- .../generator/util/ReferencedTypeImpl.java | 12 +- .../binding/javav2/generator/util/Types.java | 18 +- .../type/builder/AbstractGeneratedType.java | 5 +- .../builder/AbstractGeneratedTypeBuilder.java | 24 ++- .../builder/AnnotationTypeBuilderImpl.java | 2 +- .../type/builder/EnumerationBuilderImpl.java | 14 +- .../type/builder/GeneratedTOBuilderImpl.java | 14 +- .../builder/GeneratedTypeBuilderImpl.java | 14 +- .../util/JavaIdentifierNormalizerTest.java | 78 +++++--- .../builder/EnumerationBuilderImplTest.java | 14 +- .../generator/renderers/BuilderRenderer.java | 10 +- .../renderers/BuilderRendererTest.java | 8 +- .../context/BindingRuntimeContext.java | 8 +- 33 files changed, 379 insertions(+), 321 deletions(-) rename binding2/{mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl => mdsal-binding2-generator-api/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/context}/ModuleContext.java (88%) diff --git a/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/ModuleContext.java b/binding2/mdsal-binding2-generator-api/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/context/ModuleContext.java similarity index 88% rename from binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/ModuleContext.java rename to binding2/mdsal-binding2-generator-api/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/context/ModuleContext.java index df15698b2f..d2f8aa21ab 100644 --- a/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/ModuleContext.java +++ b/binding2/mdsal-binding2-generator-api/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/context/ModuleContext.java @@ -1,17 +1,19 @@ /* - * Copyright (c) 2017 Cisco Systems, Inc. and others. All rights reserved. + * Copyright (c) 2017 Pantheon Technologies s.r.o. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ -package org.opendaylight.mdsal.binding.javav2.generator.impl; +package org.opendaylight.mdsal.binding.javav2.generator.context; import com.google.common.annotations.Beta; +import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; import com.google.common.collect.HashMultimap; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ListMultimap; import com.google.common.collect.Maps; import com.google.common.collect.Multimap; import com.google.common.collect.Multimaps; @@ -58,8 +60,11 @@ public final class ModuleContext { private final BiMap caseTypeToSchema = HashBiMap.create(); private final Map innerTypes = new HashMap<>(); private final Map keyTypes = new HashMap<>(); + //map is getting manipulated based on unique YANG module namespace rule + private final ListMultimap packagesMap = Multimaps.synchronizedListMultimap + (ArrayListMultimap.create()); - List getGeneratedTypes() { + public List getGeneratedTypes() { final List result = new ArrayList<>(); if (this.moduleNode != null) { @@ -204,7 +209,7 @@ public final class ModuleContext { return Collections.unmodifiableMap(this.typeToSchema); } - protected void addTypeToSchema(final Type type, final TypeDefinition typedef) { + public void addTypeToSchema(final Type type, final TypeDefinition typedef) { this.typeToSchema.put(type, typedef); } @@ -214,7 +219,7 @@ public final class ModuleContext { * @param path * @param enumBuilder */ - void addInnerTypedefType(final SchemaPath path, final EnumBuilder enumBuilder) { + public void addInnerTypedefType(final SchemaPath path, final EnumBuilder enumBuilder) { this.innerTypes.put(path, enumBuilder); } @@ -223,7 +228,7 @@ public final class ModuleContext { } - void addKeyType(final SchemaPath path, final GeneratedTypeBuilder genType) { + public void addKeyType(final SchemaPath path, final GeneratedTypeBuilder genType) { this.keyTypes.put(path, genType); } @@ -234,4 +239,16 @@ public final class ModuleContext { public GeneratedTOBuilder getKeyGenTO(final SchemaPath path) { return this.genTOs.get(path); } + + public ListMultimap getPackagesMap() { + return Multimaps.unmodifiableListMultimap(packagesMap); + } + + public void putToPackagesMap(final String packageName, final String actualClassName) { + this.packagesMap.put(packageName, actualClassName); + } + + public void cleanPackagesMap() { + this.packagesMap.clear(); + } } diff --git a/binding2/mdsal-binding2-generator-api/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/spi/TypeProvider.java b/binding2/mdsal-binding2-generator-api/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/spi/TypeProvider.java index e33d63f4c4..6989c3e8ed 100644 --- a/binding2/mdsal-binding2-generator-api/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/spi/TypeProvider.java +++ b/binding2/mdsal-binding2-generator-api/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/spi/TypeProvider.java @@ -9,6 +9,7 @@ package org.opendaylight.mdsal.binding.javav2.generator.spi; import com.google.common.annotations.Beta; +import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext; import org.opendaylight.mdsal.binding.javav2.model.api.Restrictions; import org.opendaylight.mdsal.binding.javav2.model.api.Type; import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; @@ -38,7 +39,7 @@ public interface TypeProvider { * @param parentNode parent node * @return Resolved Type */ - Type javaTypeForSchemaDefinitionType(TypeDefinition type, SchemaNode parentNode); + Type javaTypeForSchemaDefinitionType(TypeDefinition type, SchemaNode parentNode, ModuleContext context); /** * @@ -47,7 +48,8 @@ public interface TypeProvider { * @param restrictions restrictions applied to given type definition * @return Resolved Type */ - Type javaTypeForSchemaDefinitionType(TypeDefinition type, SchemaNode parentNode, Restrictions restrictions); + Type javaTypeForSchemaDefinitionType(TypeDefinition type, SchemaNode parentNode, Restrictions restrictions, + ModuleContext context); /** * Returns string containing code for creation of new type instance. diff --git a/binding2/mdsal-binding2-generator-api/src/main/java/org/opendaylight/mdsal/binding/javav2/model/api/type/builder/GeneratedTypeBuilderBase.java b/binding2/mdsal-binding2-generator-api/src/main/java/org/opendaylight/mdsal/binding/javav2/model/api/type/builder/GeneratedTypeBuilderBase.java index 65b217b6f3..73e87d5ff0 100644 --- a/binding2/mdsal-binding2-generator-api/src/main/java/org/opendaylight/mdsal/binding/javav2/model/api/type/builder/GeneratedTypeBuilderBase.java +++ b/binding2/mdsal-binding2-generator-api/src/main/java/org/opendaylight/mdsal/binding/javav2/model/api/type/builder/GeneratedTypeBuilderBase.java @@ -10,6 +10,7 @@ package org.opendaylight.mdsal.binding.javav2.model.api.type.builder; import com.google.common.annotations.Beta; import java.util.List; +import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext; import org.opendaylight.mdsal.binding.javav2.model.api.Constant; import org.opendaylight.mdsal.binding.javav2.model.api.Type; import org.opendaylight.yangtools.yang.common.QName; @@ -130,7 +131,7 @@ public interface GeneratedTypeBuilderBase> * Enumeration Name * @return new instance of Enumeration Builder. */ - EnumBuilder addEnumeration(String name); + EnumBuilder addEnumeration(String name, ModuleContext context); /** * Sets parent type for data schema node node builder diff --git a/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AugmentToGenType.java b/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AugmentToGenType.java index 641b71232c..1f72bf5578 100644 --- a/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AugmentToGenType.java +++ b/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AugmentToGenType.java @@ -20,6 +20,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.stream.Collectors; +import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext; import org.opendaylight.mdsal.binding.javav2.generator.spi.TypeProvider; import org.opendaylight.mdsal.binding.javav2.generator.util.BindingGeneratorUtil; import org.opendaylight.mdsal.binding.javav2.model.api.Type; diff --git a/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AuxiliaryGenUtils.java b/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AuxiliaryGenUtils.java index 369b7db333..980ae343bb 100644 --- a/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AuxiliaryGenUtils.java +++ b/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AuxiliaryGenUtils.java @@ -23,6 +23,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.regex.Pattern; +import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext; import org.opendaylight.mdsal.binding.javav2.generator.impl.txt.yangTemplateForModule; import org.opendaylight.mdsal.binding.javav2.generator.impl.txt.yangTemplateForNode; import org.opendaylight.mdsal.binding.javav2.generator.impl.txt.yangTemplateForNodes; @@ -350,9 +351,9 @@ final class AuxiliaryGenUtils { * enumTypeDef */ static EnumBuilder resolveInnerEnumFromTypeDefinition(final EnumTypeDefinition enumTypeDef, final QName enumName, - final Map genCtx, final GeneratedTypeBuilder typeBuilder, final Module module) { + final Map genCtx, final GeneratedTypeBuilder typeBuilder, final Module module) { if (enumTypeDef != null && typeBuilder != null && enumTypeDef.getQName().getLocalName() != null) { - final EnumBuilder enumBuilder = typeBuilder.addEnumeration(enumName.getLocalName()); + final EnumBuilder enumBuilder = typeBuilder.addEnumeration(enumName.getLocalName(), genCtx.get(module)); final String enumTypedefDescription = encodeAngleBrackets(enumTypeDef.getDescription()); enumBuilder.setDescription(enumTypedefDescription); enumBuilder.updateEnumPairsFromEnumTypeDef(enumTypeDef); @@ -387,7 +388,7 @@ final class AuxiliaryGenUtils { */ static GeneratedTOBuilder addTOToTypeBuilder(final TypeDefinition typeDef, final GeneratedTypeBuilder typeBuilder, final DataSchemaNode leaf, final Module parentModule, final TypeProvider typeProvider, - final SchemaContext schemaContext) { + final SchemaContext schemaContext, ModuleContext context) { final String classNameFromLeaf = leaf.getQName().getLocalName(); GeneratedTOBuilder genTOBuilder = null; final String packageName = typeBuilder.getFullyQualifiedName(); @@ -395,10 +396,10 @@ final class AuxiliaryGenUtils { genTOBuilder = ((TypeProviderImpl) typeProvider) .provideGeneratedTOBuilderForUnionTypeDef(packageName, ((UnionTypeDefinition) typeDef), classNameFromLeaf, leaf, schemaContext, - ((TypeProviderImpl) typeProvider).getGenTypeDefsContextMap()); + ((TypeProviderImpl) typeProvider).getGenTypeDefsContextMap(), context); } else if (typeDef instanceof BitsTypeDefinition) { genTOBuilder = (((TypeProviderImpl) typeProvider)).provideGeneratedTOBuilderForBitsTypeDefinition( - packageName, typeDef, classNameFromLeaf, parentModule.getName()); + packageName, typeDef, classNameFromLeaf, parentModule.getName(), context); } if (genTOBuilder != null) { typeBuilder.addEnclosingTransferObject(genTOBuilder); @@ -443,26 +444,28 @@ final class AuxiliaryGenUtils { * list or empty TO builder if list is null or list of * key definitions is null or empty. */ - static GeneratedTOBuilder resolveListKeyTOBuilder(final String packageName, final ListSchemaNode list) { + static GeneratedTOBuilder resolveListKeyTOBuilder(final String packageName, final ListSchemaNode list, + ModuleContext context) { GeneratedTOBuilder genTOBuilder = null; if ((list.getKeyDefinition() != null) && (!list.getKeyDefinition().isEmpty())) { // underscore used as separator for distinction of class name parts final String genTOName = new StringBuilder(list.getQName().getLocalName()).append('_').append(BindingNamespaceType.Key) .toString(); - genTOBuilder = new GeneratedTOBuilderImpl(packageName, genTOName); + genTOBuilder = new GeneratedTOBuilderImpl(packageName, genTOName, context); } return genTOBuilder; } - static GeneratedTypeBuilder resolveListKeyTypeBuilder(final String packageName, final ListSchemaNode list) { + static GeneratedTypeBuilder resolveListKeyTypeBuilder(final String packageName, final ListSchemaNode list, + ModuleContext context) { GeneratedTypeBuilder genTypeBuilder = null; if ((list.getKeyDefinition() != null) && (!list.getKeyDefinition().isEmpty())) { // underscore used as separator for distinction of class name parts final String genTOName = new StringBuilder(list.getQName().getLocalName()).append('_').append(BindingNamespaceType.Key) .toString(); - genTypeBuilder = new GeneratedTypeBuilderImpl(packageName, genTOName); + genTypeBuilder = new GeneratedTypeBuilderImpl(packageName, genTOName, context); } return genTypeBuilder; } diff --git a/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/BindingGeneratorImpl.java b/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/BindingGeneratorImpl.java index ba89513fd8..1adff7f400 100644 --- a/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/BindingGeneratorImpl.java +++ b/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/BindingGeneratorImpl.java @@ -15,6 +15,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import org.opendaylight.mdsal.binding.javav2.generator.api.BindingGenerator; +import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext; import org.opendaylight.mdsal.binding.javav2.generator.spi.TypeProvider; import org.opendaylight.mdsal.binding.javav2.generator.yang.types.TypeProviderImpl; import org.opendaylight.mdsal.binding.javav2.model.api.Type; @@ -117,18 +118,18 @@ public class BindingGeneratorImpl implements BindingGenerator { Preconditions.checkArgument(modules != null, "Set of Modules cannot be NULL."); this.typeProvider = new TypeProviderImpl(context); - final Module[] modulesArray = new Module[context.getModules().size()]; - context.getModules().toArray(modulesArray); - final List contextModules = ModuleDependencySort.sort(modulesArray); + final List contextModules = ModuleDependencySort.sort(context.getModules()); this.genTypeBuilders = new HashMap<>(); for (final Module contextModule : contextModules) { this.genCtx = ModuleToGenType.generate(contextModule, this.genTypeBuilders, context, this.typeProvider, this.genCtx, this.verboseClassComments); + this.genCtx.get(contextModule).cleanPackagesMap(); } for (final Module contextModule : contextModules) { this.genCtx = AugmentToGenType.generate(contextModule, context, this.typeProvider, this.genCtx, this.genTypeBuilders, this.verboseClassComments); + this.genCtx.get(contextModule).cleanPackagesMap(); } final List filteredGenTypes = new ArrayList<>(); diff --git a/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/GenHelperUtil.java b/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/GenHelperUtil.java index fbe25ae6b5..11ac9465a1 100644 --- a/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/GenHelperUtil.java +++ b/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/GenHelperUtil.java @@ -37,6 +37,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext; import org.opendaylight.mdsal.binding.javav2.generator.spi.TypeProvider; import org.opendaylight.mdsal.binding.javav2.generator.util.BindingGeneratorUtil; import org.opendaylight.mdsal.binding.javav2.generator.util.BindingTypes; @@ -120,7 +121,8 @@ final class GenHelperUtil { static GeneratedTypeBuilder moduleToDataType(final Module module, final Map genCtx, final boolean verboseClassComments) { Preconditions.checkArgument(module != null, "Module reference cannot be NULL."); - final GeneratedTypeBuilder moduleDataTypeBuilder = moduleTypeBuilder(module, "Data", verboseClassComments); + final GeneratedTypeBuilder moduleDataTypeBuilder = moduleTypeBuilder(module, "Data", verboseClassComments, + genCtx.get(module)); addImplementedInterfaceFromUses(module, moduleDataTypeBuilder, genCtx); moduleDataTypeBuilder.addImplementsType(BindingTypes.TREE_ROOT); moduleDataTypeBuilder.addComment(module.getDescription()); @@ -145,13 +147,13 @@ final class GenHelperUtil { * if module is null */ static GeneratedTypeBuilder moduleTypeBuilder(final Module module, final String postfix, final boolean - verboseClassComments) { + verboseClassComments, ModuleContext context) { Preconditions.checkArgument(module != null, "Module reference cannot be NULL."); final String packageName = BindingMapping.getRootPackageName(module); // underscore used as separator for distinction of module name parts final String moduleName = new StringBuilder(module.getName()).append('_').append(postfix).toString(); - final GeneratedTypeBuilderImpl moduleBuilder = new GeneratedTypeBuilderImpl(packageName, moduleName); + final GeneratedTypeBuilderImpl moduleBuilder = new GeneratedTypeBuilderImpl(packageName, moduleName, context); moduleBuilder.setDescription(createDescription(module, verboseClassComments)); moduleBuilder.setReference(module.getReference()); moduleBuilder.setModuleName(moduleName); @@ -256,7 +258,6 @@ final class GenHelperUtil { if (!schemaNode.isAugmenting()) { return true; } else if (schemaNode.isAugmenting()) { - Preconditions.checkState(schemaNode instanceof ModelStatement); QName qname = schemaNode.getPath().getLastComponent(); final Module originalModule = schemaContext.findModuleByNamespaceAndRevision(qname.getNamespace(), qname.getRevision()); @@ -417,7 +418,7 @@ final class GenHelperUtil { } GeneratedTypeBuilderImpl augTypeBuilder = new GeneratedTypeBuilderImpl(augmentPackageName, augIdentifier, - true, false); + true, false, genCtx.get(module)); augTypeBuilder.addImplementsType(BindingTypes.TREE_NODE); augTypeBuilder.addImplementsType(parameterizedTypeFor(BindingTypes.INSTANTIABLE, augTypeBuilder)); @@ -518,7 +519,7 @@ final class GenHelperUtil { } GeneratedTypeBuilder it = addRawInterfaceDefinition(basePackageName, schemaNode, schemaContext, "", suffix, - verboseClassComments, genTypeBuilders, namespaceType); + verboseClassComments, genTypeBuilders, namespaceType, genCtx.get(module)); if (namespaceType.equals(BindingNamespaceType.Data)) { if (parent == null) { it.addImplementsType(BindingTypes.TREE_NODE); @@ -606,7 +607,7 @@ final class GenHelperUtil { static GeneratedTypeBuilder addRawInterfaceDefinition(final String basePackageName, final SchemaNode schemaNode, final SchemaContext schemaContext, final String prefix, final String suffix, final boolean verboseClassComments, final Map> genTypeBuilders, - final BindingNamespaceType namespaceType) { + final BindingNamespaceType namespaceType, ModuleContext context) { Preconditions.checkArgument(schemaNode != null, "Data Schema Node cannot be NULL."); Preconditions.checkArgument(basePackageName != null, "Base package Name for Generated Type cannot be NULL."); @@ -624,7 +625,7 @@ final class GenHelperUtil { } final String packageName = packageNameForGeneratedType(basePackageName, schemaNode.getPath(), namespaceType); - final GeneratedTypeBuilderImpl newType = new GeneratedTypeBuilderImpl(packageName, schemaNodeName); + final GeneratedTypeBuilderImpl newType = new GeneratedTypeBuilderImpl(packageName, schemaNodeName, context); final Module module = SchemaContextUtil.findParentModule(schemaContext, schemaNode); qNameConstant(newType, BindingMapping.QNAME_STATIC_FIELD_NAME, schemaNode.getQName()); newType.addComment(schemaNode.getDescription()); @@ -709,7 +710,7 @@ final class GenHelperUtil { checkArgument(choiceNode != null, "Choice Schema Node cannot be NULL."); final GeneratedTypeBuilder choiceTypeBuilder = addRawInterfaceDefinition(basePackageName, choiceNode, - schemaContext, "", "", verboseClasssComments, genTypeBuilders, namespaceType); + schemaContext, "", "", verboseClasssComments, genTypeBuilders, namespaceType, genCtx.get(module)); constructGetter(parent, choiceNode.getQName().getLocalName(), choiceNode.getDescription(), choiceTypeBuilder, choiceNode.getStatus()); if (namespaceType.equals(BindingNamespaceType.Data)) { @@ -752,7 +753,7 @@ final class GenHelperUtil { Type getterReturnType = Types.listTypeFor(genType); if (namespaceType.equals(BindingNamespaceType.Grouping)) { getterReturnType = Types.listTypeFor(wildcardTypeFor(genType.getPackageName(), genType.getName(), - true, true)); + true, true, null)); } constructGetter(parent, nodeName, node.getDescription(), getterReturnType, node.getStatus()); @@ -761,7 +762,7 @@ final class GenHelperUtil { BindingNamespaceType.Key)).append('.').append(nodeName).toString(); //FIXME: Is it neccessary to generate interface of key and implemented by class? if (namespaceType.equals(BindingNamespaceType.Grouping)) { - final GeneratedTypeBuilder genTypeBuilder = resolveListKeyTypeBuilder(packageName, node); + final GeneratedTypeBuilder genTypeBuilder = resolveListKeyTypeBuilder(packageName, node, genCtx.get(module)); for (final DataSchemaNode schemaNode : node.getChildNodes()) { if (resolveDataSchemaNodesCheck(module, schemaContext, schemaNode)) { addSchemaNodeToListTypeBuilders(nodeName, basePackageName, schemaNode, genType, genTypeBuilder, listKeys, @@ -773,7 +774,7 @@ final class GenHelperUtil { genCtx.get(module).addKeyType(node.getPath(), genTypeBuilder); } } else { - final GeneratedTOBuilder genTOBuilder = resolveListKeyTOBuilder(packageName, node); + final GeneratedTOBuilder genTOBuilder = resolveListKeyTOBuilder(packageName, node, genCtx.get(module)); for (final DataSchemaNode schemaNode : node.getChildNodes()) { if (resolveDataSchemaNodesCheck(module, schemaContext, schemaNode)) { addSchemaNodeToListBuilders(nodeName, basePackageName, schemaNode, genType, genTOBuilder, listKeys, @@ -802,7 +803,7 @@ final class GenHelperUtil { Type returnKeyType = keyType; if (namespaceType.equals(BindingNamespaceType.Grouping)) { returnKeyType = wildcardTypeFor(keyType.getPackageName(), keyType.getName(), - true, true); + true, true, null); } constructGetter(typeBuilder, "key", "Returns Primary Key of Yang List Type", returnKeyType, Status.CURRENT); @@ -846,7 +847,7 @@ final class GenHelperUtil { final TypeDefinition typeDef = leaf.getType(); if (isInnerType(leaf, typeDef)) { if (typeDef instanceof EnumTypeDefinition) { - returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, leaf); + returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, leaf, genCtx.get(module)); final EnumTypeDefinition enumTypeDef = (EnumTypeDefinition) typeDef; final EnumBuilder enumBuilder = resolveInnerEnumFromTypeDefinition(enumTypeDef, leaf.getQName(), genCtx, typeBuilder, module); @@ -856,14 +857,14 @@ final class GenHelperUtil { ((TypeProviderImpl) typeProvider).putReferencedType(leaf.getPath(), returnType); } else if (typeDef instanceof UnionTypeDefinition) { final GeneratedTOBuilder genTOBuilder = addTOToTypeBuilder(typeDef, typeBuilder, leaf, parentModule, - typeProvider, schemaContext); + typeProvider, schemaContext, genCtx.get(module)); if (genTOBuilder != null) { //TODO: https://bugs.opendaylight.org/show_bug.cgi?id=2289 returnType = createReturnTypeForUnion(genTOBuilder, typeDef, typeBuilder, parentModule, typeProvider); } } else if (typeDef instanceof BitsTypeDefinition) { final GeneratedTOBuilder genTOBuilder = addTOToTypeBuilder(typeDef, typeBuilder, leaf, parentModule, - typeProvider, schemaContext); + typeProvider, schemaContext, genCtx.get(module)); if (genTOBuilder != null) { returnType = genTOBuilder.toInstance(); } @@ -874,11 +875,11 @@ final class GenHelperUtil { // and apply restrictions from leaf type final Restrictions restrictions = BindingGeneratorUtil.getRestrictions(typeDef); returnType = typeProvider.javaTypeForSchemaDefinitionType(getBaseOrDeclaredType(typeDef), leaf, - restrictions); + restrictions, genCtx.get(module)); } } else { final Restrictions restrictions = BindingGeneratorUtil.getRestrictions(typeDef); - returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, leaf, restrictions); + returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, leaf, restrictions, genCtx.get(module)); } if (returnType == null) { @@ -941,29 +942,30 @@ final class GenHelperUtil { Type returnType = null; if (typeDef.getBaseType() == null) { if (typeDef instanceof EnumTypeDefinition) { - returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, node); + returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, node, genCtx.get(module)); final EnumTypeDefinition enumTypeDef = (EnumTypeDefinition) typeDef; final EnumBuilder enumBuilder = resolveInnerEnumFromTypeDefinition(enumTypeDef, nodeName, genCtx, typeBuilder, module); - returnType = new ReferencedTypeImpl(enumBuilder.getPackageName(), enumBuilder.getName()); + returnType = new ReferencedTypeImpl(enumBuilder.getPackageName(), enumBuilder.getName(), + genCtx.get(module)); ((TypeProviderImpl) typeProvider).putReferencedType(node.getPath(), returnType); } else if (typeDef instanceof UnionTypeDefinition) { final GeneratedTOBuilder genTOBuilder = addTOToTypeBuilder(typeDef, typeBuilder, node, parentModule, - typeProvider, schemaContext); + typeProvider, schemaContext, genCtx.get(module)); if (genTOBuilder != null) { returnType = createReturnTypeForUnion(genTOBuilder, typeDef, typeBuilder, parentModule, typeProvider); } } else if (typeDef instanceof BitsTypeDefinition) { final GeneratedTOBuilder genTOBuilder = addTOToTypeBuilder(typeDef, typeBuilder, node, parentModule, - typeProvider, schemaContext); + typeProvider, schemaContext, genCtx.get(module)); returnType = genTOBuilder.toInstance(); } else { final Restrictions restrictions = BindingGeneratorUtil.getRestrictions(typeDef); - returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, node, restrictions); + returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, node, restrictions, genCtx.get(module)); } } else { final Restrictions restrictions = BindingGeneratorUtil.getRestrictions(typeDef); - returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, node, restrictions); + returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, node, restrictions, genCtx.get(module)); } final ParameterizedType listType = Types.listTypeFor(returnType); @@ -1222,7 +1224,7 @@ final class GenHelperUtil { qname.getRevision()); returnType = genCtx.get(enumModule).getInnerType(originalLeaf.getType().getPath()); } else { - returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, leaf); + returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, leaf, genCtx.get(module)); } return AuxiliaryGenUtils.resolveLeafSchemaNodeAsProperty(nodeName, toBuilder, leaf, returnType, isReadOnly); } @@ -1374,13 +1376,14 @@ final class GenHelperUtil { final String packageName = BindingGeneratorUtil.packageNameForGeneratedType(basePackageName, identity.getPath(), BindingNamespaceType.Identity); - newType = new GeneratedTOBuilderImpl(packageName, identity.getQName().getLocalName(), true, false); + newType = new GeneratedTOBuilderImpl(packageName, identity.getQName().getLocalName(), true, false, + genCtx.get(module)); final Set baseIdentities = identity.getBaseIdentities(); if (baseIdentities.size() == 0) { //no base - abstract final GeneratedTOBuilderImpl gto = new GeneratedTOBuilderImpl(BaseIdentity.class.getPackage().getName(), - BaseIdentity.class.getSimpleName()); + BaseIdentity.class.getSimpleName(), genCtx.get(module)); newType.setExtendsType(gto.toInstance()); } else { //one base - inheritance diff --git a/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/ModuleToGenType.java b/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/ModuleToGenType.java index f9c5d04195..72eaa569ef 100644 --- a/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/ModuleToGenType.java +++ b/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/ModuleToGenType.java @@ -20,18 +20,16 @@ import com.google.common.annotations.Beta; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableSet; import java.util.Collection; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext; import org.opendaylight.mdsal.binding.javav2.generator.spi.TypeProvider; -import org.opendaylight.mdsal.binding.javav2.generator.util.generated.type.builder.GeneratedTOBuilderImpl; import org.opendaylight.mdsal.binding.javav2.generator.yang.types.TypeProviderImpl; import org.opendaylight.mdsal.binding.javav2.model.api.Type; import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTypeBuilder; import org.opendaylight.mdsal.binding.javav2.spec.runtime.BindingNamespaceType; import org.opendaylight.mdsal.binding.javav2.util.BindingMapping; -import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode; import org.opendaylight.yangtools.yang.model.api.Module; @@ -131,7 +129,7 @@ final class ModuleToGenType { * iterate over them * @param schemaContext * schema context only used as input parameter for method - * {@link GenHelperUtil#identityToGenType(Module, String, IdentitySchemaNode, SchemaContext, Map, boolean, Map, TypeProvider, Map)} + * {@link GenHelperUtil#identityToGenType(Module, String, IdentitySchemaNode, SchemaContext, Map, boolean)} * @param genCtx generated context * @return returns generated context * @@ -179,7 +177,8 @@ final class ModuleToGenType { return genCtx; } - final GeneratedTypeBuilder listenerInterface = moduleTypeBuilder(module, "Listener", verboseClassComments); + final GeneratedTypeBuilder listenerInterface = moduleTypeBuilder(module, "Listener", verboseClassComments, + genCtx.get(module)); listenerInterface.addImplementsType(NOTIFICATION_LISTENER); final String basePackageName = BindingMapping.getRootPackageName(module); diff --git a/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/RpcActionGenHelper.java b/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/RpcActionGenHelper.java index 5c969e8ea8..d04c5dccd1 100644 --- a/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/RpcActionGenHelper.java +++ b/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/RpcActionGenHelper.java @@ -17,7 +17,6 @@ import static org.opendaylight.mdsal.binding.javav2.generator.impl.GenHelperUtil import static org.opendaylight.mdsal.binding.javav2.generator.impl.GenHelperUtil.moduleTypeBuilder; import static org.opendaylight.mdsal.binding.javav2.generator.impl.GenHelperUtil.processUsesImplements; import static org.opendaylight.mdsal.binding.javav2.generator.util.BindingGeneratorUtil.encodeAngleBrackets; -import static org.opendaylight.mdsal.binding.javav2.generator.util.BindingGeneratorUtil.packageNameForGeneratedType; import static org.opendaylight.mdsal.binding.javav2.generator.util.BindingTypes.ACTION; import static org.opendaylight.mdsal.binding.javav2.generator.util.BindingTypes.INPUT; import static org.opendaylight.mdsal.binding.javav2.generator.util.BindingTypes.INSTANCE_IDENTIFIER; @@ -38,6 +37,7 @@ import com.google.common.base.Optional; import java.util.Collection; import java.util.Map; import java.util.Set; +import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext; import org.opendaylight.mdsal.binding.javav2.generator.spi.TypeProvider; import org.opendaylight.mdsal.binding.javav2.generator.util.BindingTypes; import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedTransferObject; @@ -101,8 +101,8 @@ final class RpcActionGenHelper { * @return generated context */ static Map actionMethodsToGenType(final Module module, Map genCtx, - final SchemaContext schemaContext, final boolean verboseClassComments, Map> genTypeBuilders, TypeProvider typeProvider) { + final SchemaContext schemaContext, final boolean verboseClassComments, + Map> genTypeBuilders, TypeProvider typeProvider) { checkModuleAndModuleName(module); final Collection potentials = module.getChildNodes(); @@ -203,7 +203,7 @@ final class RpcActionGenHelper { sb.append("Rpc"); } final GeneratedTypeBuilder interfaceBuilder = moduleTypeBuilder(module, sb.toString(), - verboseClassComments); + verboseClassComments, genCtx.get(module)); final String basePackageName = interfaceBuilder.getPackageName(); @@ -281,7 +281,7 @@ final class RpcActionGenHelper { GeneratedTypeBuilder>> genTypeBuilders, final Map genCtx, final boolean isInput, final BindingNamespaceType namespaceType) { final GeneratedTypeBuilder nodeType = addRawInterfaceDefinition(basePackageName, operationNode, schemaContext, - operationName, "", verboseClassComments, genTypeBuilders, namespaceType); + operationName, "", verboseClassComments, genTypeBuilders, namespaceType, genCtx.get(module)); addImplementedInterfaceFromUses(operationNode, nodeType, genCtx); nodeType.addImplementsType(parameterizedTypeFor(BindingTypes.TREE_CHILD_NODE, parent, parameterizedTypeFor (BindingTypes.ITEM, parent))); diff --git a/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/yang/types/BaseYangTypes.java b/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/yang/types/BaseYangTypes.java index 01cb8a7024..f471a32d06 100644 --- a/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/yang/types/BaseYangTypes.java +++ b/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/yang/types/BaseYangTypes.java @@ -13,6 +13,7 @@ import com.google.common.collect.ImmutableMap.Builder; import java.math.BigDecimal; import java.math.BigInteger; import java.util.Map; +import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext; import org.opendaylight.mdsal.binding.javav2.generator.spi.TypeProvider; import org.opendaylight.mdsal.binding.javav2.generator.util.JavaIdentifier; import org.opendaylight.mdsal.binding.javav2.generator.util.JavaIdentifierNormalizer; @@ -154,7 +155,8 @@ public final class BaseYangTypes { * returned. */ @Override - public Type javaTypeForSchemaDefinitionType(final TypeDefinition type, final SchemaNode parentNode) { + public Type javaTypeForSchemaDefinitionType(final TypeDefinition type, final SchemaNode parentNode, + ModuleContext context) { if (type != null) { return TYPE_MAP.get(type.getQName().getLocalName()); } @@ -164,7 +166,7 @@ public final class BaseYangTypes { @Override public Type javaTypeForSchemaDefinitionType(final TypeDefinition type, final SchemaNode parentNode, - final Restrictions restrictions) { + final Restrictions restrictions, ModuleContext context) { final String typeName = type.getQName().getLocalName(); switch (typeName) { @@ -195,7 +197,7 @@ public final class BaseYangTypes { case "union" : return UNION_TYPE; default: - return javaTypeForSchemaDefinitionType(type, parentNode); + return javaTypeForSchemaDefinitionType(type, parentNode, context); } } diff --git a/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/yang/types/TypeGenHelper.java b/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/yang/types/TypeGenHelper.java index bb9da5da39..7374bd7bd7 100644 --- a/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/yang/types/TypeGenHelper.java +++ b/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/yang/types/TypeGenHelper.java @@ -25,6 +25,7 @@ import java.util.Map; import java.util.Set; import java.util.TreeMap; import org.apache.commons.lang3.StringEscapeUtils; +import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext; import org.opendaylight.mdsal.binding.javav2.generator.util.BindingGeneratorUtil; import org.opendaylight.mdsal.binding.javav2.generator.util.TypeConstants; import org.opendaylight.mdsal.binding.javav2.generator.util.Types; @@ -123,14 +124,15 @@ final class TypeGenHelper { @SuppressWarnings({ "rawtypes", "unchecked" }) static GeneratedTransferObject provideGeneratedTOFromExtendedType(final TypeDefinition typedef, final TypeDefinition innerExtendedType, final String basePackageName, final String moduleName, final SchemaContext - schemaContext, final Map>> genTypeDefsContextMap) { + schemaContext, final Map>> genTypeDefsContextMap, + ModuleContext context) { Preconditions.checkArgument(innerExtendedType != null, "Extended type cannot be NULL!"); Preconditions.checkArgument(basePackageName != null, "String with base package name cannot be NULL!"); final String typedefName = typedef.getQName().getLocalName(); final String innerTypeDef = innerExtendedType.getQName().getLocalName(); - final GeneratedTOBuilderImpl genTOBuilder = new GeneratedTOBuilderImpl(basePackageName, typedefName); + final GeneratedTOBuilderImpl genTOBuilder = new GeneratedTOBuilderImpl(basePackageName, typedefName, context); final String typedefDescription = encodeAngleBrackets(typedef.getDescription()); genTOBuilder.setDescription(typedefDescription); @@ -179,11 +181,12 @@ final class TypeGenHelper { * JAVA Type to which is typedef mapped * @return generated transfer object which representjavaType */ - static GeneratedTransferObject wrapJavaTypeIntoTO(final String basePackageName, final TypeDefinition typedef, final Type javaType, final String moduleName) { + static GeneratedTransferObject wrapJavaTypeIntoTO(final String basePackageName, final TypeDefinition typedef, + final Type javaType, final String moduleName, ModuleContext context) { Preconditions.checkNotNull(javaType, "javaType cannot be null"); final String propertyName = "value"; - final GeneratedTOBuilder genTOBuilder = typedefToTransferObject(basePackageName, typedef, moduleName); + final GeneratedTOBuilder genTOBuilder = typedefToTransferObject(basePackageName, typedef, moduleName, context); genTOBuilder.setRestrictions(BindingGeneratorUtil.getRestrictions(typedef)); final GeneratedPropertyBuilder genPropBuilder = genTOBuilder.addProperty(propertyName); genPropBuilder.setReturnType(javaType); @@ -437,8 +440,8 @@ final class TypeGenHelper { * */ @SuppressWarnings({ "rawtypes", "unchecked" }) - static Enumeration provideTypeForEnum(final EnumTypeDefinition enumTypeDef, final String enumName, final - SchemaNode parentNode, final SchemaContext schemaContext) { + static Enumeration provideTypeForEnum(final EnumTypeDefinition enumTypeDef, final String enumName, + final SchemaNode parentNode, final SchemaContext schemaContext, ModuleContext context) { Preconditions.checkArgument(enumTypeDef != null, "EnumTypeDefinition reference cannot be NULL!"); Preconditions.checkArgument(enumTypeDef.getQName().getLocalName() != null, "Local Name in EnumTypeDefinition QName cannot be NULL!"); @@ -454,7 +457,7 @@ final class TypeGenHelper { packageName = basePackageName; } - final EnumerationBuilderImpl enumBuilder = new EnumerationBuilderImpl(packageName, enumName); + final EnumerationBuilderImpl enumBuilder = new EnumerationBuilderImpl(packageName, enumName, context); final String enumTypedefDescription = encodeAngleBrackets(enumTypeDef.getDescription()); enumBuilder.setDescription(enumTypedefDescription); enumBuilder.setReference(enumTypeDef.getReference()); @@ -475,11 +478,12 @@ final class TypeGenHelper { * typedef and basePackageName */ @SuppressWarnings({ "unchecked", "rawtypes" }) - private static GeneratedTOBuilderImpl typedefToTransferObject(final String basePackageName, final TypeDefinition typedef, final String moduleName) { + private static GeneratedTOBuilderImpl typedefToTransferObject(final String basePackageName, + final TypeDefinition typedef, final String moduleName, ModuleContext context) { final String typeDefTOName = typedef.getQName().getLocalName(); if ((basePackageName != null) && (typeDefTOName != null)) { - final GeneratedTOBuilderImpl newType = new GeneratedTOBuilderImpl(basePackageName, typeDefTOName); + final GeneratedTOBuilderImpl newType = new GeneratedTOBuilderImpl(basePackageName, typeDefTOName, context); final String typedefDescription = encodeAngleBrackets(typedef.getDescription()); newType.setDescription(typedefDescription); diff --git a/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/yang/types/TypeProviderImpl.java b/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/yang/types/TypeProviderImpl.java index 9ec117fd87..bc4f30078c 100644 --- a/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/yang/types/TypeProviderImpl.java +++ b/binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/yang/types/TypeProviderImpl.java @@ -40,6 +40,7 @@ import java.util.Map; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext; import org.opendaylight.mdsal.binding.javav2.generator.spi.TypeProvider; import org.opendaylight.mdsal.binding.javav2.generator.util.BindingGeneratorUtil; import org.opendaylight.mdsal.binding.javav2.generator.util.JavaIdentifier; @@ -82,10 +83,11 @@ import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition; import org.opendaylight.yangtools.yang.model.util.RevisionAwareXPathImpl; import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil; +import org.opendaylight.yangtools.yang.parser.util.ModuleDependencySort; import org.opendaylight.yangtools.yang.parser.util.YangValidationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - + @Beta public final class TypeProviderImpl implements TypeProvider { @@ -129,8 +131,9 @@ public final class TypeProviderImpl implements TypeProvider { } @Override - public Type javaTypeForSchemaDefinitionType(final TypeDefinition type, final SchemaNode parentNode) { - return javaTypeForSchemaDefinitionType(type, parentNode, null); + public Type javaTypeForSchemaDefinitionType(final TypeDefinition type, final SchemaNode parentNode, + ModuleContext context) { + return javaTypeForSchemaDefinitionType(type, parentNode, null, context); } /** @@ -147,8 +150,10 @@ public final class TypeProviderImpl implements TypeProvider { * */ @Override - public Type javaTypeForSchemaDefinitionType(final TypeDefinition type, final SchemaNode parentNode, final Restrictions restrictions) { - return javaTypeForSchemaDefType(type, parentNode, restrictions, this.schemaContext, this.genTypeDefsContextMap); + public Type javaTypeForSchemaDefinitionType(final TypeDefinition type, final SchemaNode parentNode, final + Restrictions restrictions, ModuleContext context) { + return javaTypeForSchemaDefType(type, parentNode, restrictions, this.schemaContext, this + .genTypeDefsContextMap, context); } @Override @@ -185,17 +190,11 @@ public final class TypeProviderImpl implements TypeProvider { * */ private void resolveTypeDefsFromContext(final SchemaContext schemaContext, final Map>> genTypeDefsContextMap, final Map> additionalTypes) { + Type>>> genTypeDefsContextMap, final Map> additionalTypes) { final Set modules = schemaContext.getModules(); Preconditions.checkArgument(modules != null, "Set of Modules cannot be NULL!"); - final Module[] modulesArray = new Module[modules.size()]; - int i = 0; - for (final Module modul : modules) { - modulesArray[i++] = modul; - } - final List modulesSortedByDependency = org.opendaylight.yangtools.yang.parser.util.ModuleDependencySort - .sort(modulesArray); + final List modulesSortedByDependency = ModuleDependencySort.sort(modules); for (final Module module : modulesSortedByDependency) { Map> dateTypeMap = genTypeDefsContextMap.get(module.getName()); @@ -207,6 +206,7 @@ public final class TypeProviderImpl implements TypeProvider { } modulesSortedByDependency.stream().filter(module -> module != null).forEach(module -> { + ModuleContext context = new ModuleContext(); final String basePackageName = packageNameWithNamespacePrefix(getRootPackageName(module), BindingNamespaceType.Typedef); final List> typeDefinitions = getAllTypedefs(module); @@ -214,7 +214,7 @@ public final class TypeProviderImpl implements TypeProvider { if (listTypeDefinitions != null) { for (final TypeDefinition typedef : listTypeDefinitions) { typedefToGeneratedType(basePackageName, module, typedef, genTypeDefsContextMap, - additionalTypes, schemaContext); + additionalTypes, schemaContext, context); } } }); @@ -297,8 +297,8 @@ public final class TypeProviderImpl implements TypeProvider { * */ @SuppressWarnings({ "rawtypes", "unchecked" }) - public GeneratedTOBuilder provideGeneratedTOBuilderForBitsTypeDefinition(final String basePackageName, final - TypeDefinition typeDef, final String typeDefName, final String moduleName) { + public GeneratedTOBuilder provideGeneratedTOBuilderForBitsTypeDefinition(final String basePackageName, + final TypeDefinition typeDef, final String typeDefName, final String moduleName, ModuleContext context) { Preconditions.checkArgument(typeDef != null, "typeDef cannot be NULL!"); Preconditions.checkArgument(basePackageName != null, "Base Package Name cannot be NULL!"); @@ -306,7 +306,8 @@ public final class TypeProviderImpl implements TypeProvider { if (typeDef instanceof BitsTypeDefinition) { final BitsTypeDefinition bitsTypeDefinition = (BitsTypeDefinition) typeDef; - final GeneratedTOBuilderImpl genTOBuilder = new GeneratedTOBuilderImpl(basePackageName, typeDefName, true, false); + final GeneratedTOBuilderImpl genTOBuilder = new GeneratedTOBuilderImpl(basePackageName, typeDefName, + true, false, context); final String typedefDescription = encodeAngleBrackets(typeDef.getDescription()); genTOBuilder.setDescription(typedefDescription); @@ -356,8 +357,8 @@ public final class TypeProviderImpl implements TypeProvider { */ @SuppressWarnings({ "rawtypes", "unchecked" }) public List provideGeneratedTOBuildersForUnionTypeDef(final String basePackageName, - final UnionTypeDefinition typedef, final String typeDefName, final SchemaNode parentNode, final SchemaContext - schemaContext, final Map>> genTypeDefsContextMap) { + final UnionTypeDefinition typedef, final String typeDefName, final SchemaNode parentNode, + final SchemaContext schemaContext, final Map>> genTypeDefsContextMap, ModuleContext context) { Preconditions.checkNotNull(basePackageName, "Base Package Name cannot be NULL!"); Preconditions.checkNotNull(typedef, "Type Definition cannot be NULL!"); Preconditions.checkNotNull(typedef.getQName(), "Type definition QName cannot be NULL!"); @@ -367,7 +368,8 @@ public final class TypeProviderImpl implements TypeProvider { final Module module = findParentModule(schemaContext, parentNode); final GeneratedTOBuilderImpl unionGenTOBuilder; - unionGenTOBuilder = new GeneratedTOBuilderImpl(basePackageName, typeDefName, true, false); + unionGenTOBuilder = new GeneratedTOBuilderImpl(basePackageName, typeDefName, true, false, + context); final String typedefDescription = encodeAngleBrackets(typedef.getDescription()); unionGenTOBuilder.setDescription(typedefDescription); unionGenTOBuilder.setReference(typedef.getReference()); @@ -384,14 +386,15 @@ public final class TypeProviderImpl implements TypeProvider { parentNode, schemaContext, genTypeDefsContextMap); } else if (unionType instanceof UnionTypeDefinition) { generatedTOBuilders.add(resolveUnionSubtypeAsUnion(unionGenTOBuilder, (UnionTypeDefinition) unionType, - unionGenTOBuilder.getFullyQualifiedName(), parentNode, schemaContext, genTypeDefsContextMap)); + unionGenTOBuilder.getFullyQualifiedName(), parentNode, schemaContext, genTypeDefsContextMap, + context)); } else if (unionType instanceof EnumTypeDefinition) { final Enumeration enumeration = addInnerEnumerationToTypeBuilder((EnumTypeDefinition) unionType, - unionTypeName, unionGenTOBuilder); + unionTypeName, unionGenTOBuilder, context); updateUnionTypeAsProperty(unionGenTOBuilder, enumeration, unionTypeName); } else { final Type javaType = javaTypeForSchemaDefType(unionType, parentNode, null, schemaContext, - genTypeDefsContextMap); + genTypeDefsContextMap, context); updateUnionTypeAsProperty(unionGenTOBuilder, javaType, unionTypeName); } } @@ -417,8 +420,9 @@ public final class TypeProviderImpl implements TypeProvider { } } - private Type javaTypeForSchemaDefType(final TypeDefinition typeDefinition, final SchemaNode - parentNode, final Restrictions r, final SchemaContext schemaContext, final Map>> genTypeDefsContextMap) { + private Type javaTypeForSchemaDefType(final TypeDefinition typeDefinition, final SchemaNode parentNode, + final Restrictions r, final SchemaContext schemaContext, + final Map>> genTypeDefsContextMap, ModuleContext context) { Preconditions.checkArgument(typeDefinition != null, "Type Definition cannot be NULL!"); final String typedefName = typeDefinition.getQName().getLocalName(); Preconditions.checkArgument(typedefName != null, "Type Definitions Local Name cannot be NULL!"); @@ -429,19 +433,22 @@ public final class TypeProviderImpl implements TypeProvider { // and generated an enclosing ExtendedType to hold any range constraints. The new parser instantiates // a base type which holds these constraints. if (typeDefinition instanceof DecimalTypeDefinition) { - final Type ret = BaseYangTypes.BASE_YANG_TYPES_PROVIDER.javaTypeForSchemaDefinitionType(typeDefinition, parentNode, r); + final Type ret = BaseYangTypes.BASE_YANG_TYPES_PROVIDER.javaTypeForSchemaDefinitionType + (typeDefinition, parentNode, r, null); if (ret != null) { return ret; } } // Deal with leafrefs/identityrefs - Type ret = javaTypeForLeafrefOrIdentityRef(typeDefinition, parentNode, schemaContext, genTypeDefsContextMap); + Type ret = javaTypeForLeafrefOrIdentityRef(typeDefinition, parentNode, schemaContext, + genTypeDefsContextMap, context); if (ret != null) { return ret; } - ret = BaseYangTypes.BASE_YANG_TYPES_PROVIDER.javaTypeForSchemaDefinitionType(typeDefinition, parentNode); + ret = BaseYangTypes.BASE_YANG_TYPES_PROVIDER.javaTypeForSchemaDefinitionType(typeDefinition, parentNode, + null); if (ret == null) { LOG.debug("Failed to resolve Java type for {}", typeDefinition); } @@ -449,7 +456,7 @@ public final class TypeProviderImpl implements TypeProvider { return ret; } - Type returnType = javaTypeForExtendedType(typeDefinition, schemaContext, genTypeDefsContextMap); + Type returnType = javaTypeForExtendedType(typeDefinition, schemaContext, genTypeDefsContextMap, context); if (r != null && !r.isEmpty() && returnType instanceof GeneratedTransferObject) { final GeneratedTransferObject gto = (GeneratedTransferObject) returnType; final Module module = findParentModule(schemaContext, parentNode); @@ -461,7 +468,7 @@ public final class TypeProviderImpl implements TypeProvider { JavaIdentifierNormalizer.normalizeSpecificIdentifier(typedefName, JavaIdentifier.CLASS); final String name = packageName + "." + genTOName; if (module.equals(module1) && !(returnType.getFullyQualifiedName().equals(name))) { - returnType = shadedTOWithRestrictions(gto, r); + returnType = shadedTOWithRestrictions(gto, r, context); } } return returnType; @@ -482,9 +489,9 @@ public final class TypeProviderImpl implements TypeProvider { * modulName or typedef or Q name of * typedef equals null */ - private Type typedefToGeneratedType(final String basePackageName, final Module module, final - TypeDefinition typedef, final Map>> genTypeDefsContextMap, final Map> additionalTypes, final SchemaContext schemaContext) { + private Type typedefToGeneratedType(final String basePackageName, final Module module, + final TypeDefinition typedef, final Map>> genTypeDefsContextMap, + final Map> additionalTypes, final SchemaContext schemaContext, ModuleContext context) { final String moduleName = module.getName(); final Date moduleRevision = module.getRevision(); if ((basePackageName != null) && (moduleName != null) && (typedef != null)) { @@ -495,10 +502,11 @@ public final class TypeProviderImpl implements TypeProvider { Type returnType; if (innerTypeDefinition.getBaseType() != null) { returnType = provideGeneratedTOFromExtendedType(typedef, innerTypeDefinition, basePackageName, - module.getName(), schemaContext, genTypeDefsContextMap); + module.getName(), schemaContext, genTypeDefsContextMap, context); } else if (innerTypeDefinition instanceof UnionTypeDefinition) { final GeneratedTOBuilder genTOBuilder = provideGeneratedTOBuilderForUnionTypeDef(basePackageName, - (UnionTypeDefinition) innerTypeDefinition, typedefName, typedef, schemaContext, genTypeDefsContextMap); + (UnionTypeDefinition) innerTypeDefinition, typedefName, typedef, schemaContext, + genTypeDefsContextMap, context); genTOBuilder.setTypedef(true); genTOBuilder.setIsUnion(true); addUnitsToGenTO(genTOBuilder, typedef.getUnits()); @@ -508,20 +516,20 @@ public final class TypeProviderImpl implements TypeProvider { // enums are automatically Serializable final EnumTypeDefinition enumTypeDef = (EnumTypeDefinition) innerTypeDefinition; // TODO units for typedef enum - returnType = provideTypeForEnum(enumTypeDef, typedefName, typedef, schemaContext); + returnType = provideTypeForEnum(enumTypeDef, typedefName, typedef, schemaContext, context); } else if (innerTypeDefinition instanceof BitsTypeDefinition) { final BitsTypeDefinition bitsTypeDefinition = (BitsTypeDefinition) innerTypeDefinition; final GeneratedTOBuilder genTOBuilder = provideGeneratedTOBuilderForBitsTypeDefinition( - basePackageName, bitsTypeDefinition, typedefName, module.getName()); + basePackageName, bitsTypeDefinition, typedefName, module.getName(), context); genTOBuilder.setTypedef(true); addUnitsToGenTO(genTOBuilder, typedef.getUnits()); makeSerializable((GeneratedTOBuilderImpl) genTOBuilder); returnType = genTOBuilder.toInstance(); } else { final Type javaType = javaTypeForSchemaDefType(innerTypeDefinition, typedef, null, - schemaContext, genTypeDefsContextMap); - returnType = wrapJavaTypeIntoTO(basePackageName, typedef, javaType, module.getName()); + schemaContext, genTypeDefsContextMap, context); + returnType = wrapJavaTypeIntoTO(basePackageName, typedef, javaType, module.getName(), context); } if (returnType != null) { final Map> modulesByDate = genTypeDefsContextMap.get(moduleName); @@ -548,12 +556,13 @@ public final class TypeProviderImpl implements TypeProvider { * type definition which is converted to JAVA Type * @return JAVA Type instance for typeDefinition */ - private Type javaTypeForExtendedType(final TypeDefinition typeDefinition, final SchemaContext - schemaContext, final Map>> genTypeDefsContextMap) { + private Type javaTypeForExtendedType(final TypeDefinition typeDefinition, final SchemaContext schemaContext, + final Map>> genTypeDefsContextMap, ModuleContext context) { final String typedefName = typeDefinition.getQName().getLocalName(); final TypeDefinition baseTypeDef = baseTypeDefForExtendedType(typeDefinition); - Type returnType = javaTypeForLeafrefOrIdentityRef(baseTypeDef, typeDefinition, schemaContext, genTypeDefsContextMap); + Type returnType = javaTypeForLeafrefOrIdentityRef(baseTypeDef, typeDefinition, schemaContext, + genTypeDefsContextMap, context); if (returnType == null) { final Module module = findParentModule(schemaContext, typeDefinition); final Restrictions r = BindingGeneratorUtil.getRestrictions(typeDefinition); @@ -565,7 +574,7 @@ public final class TypeProviderImpl implements TypeProvider { } if (returnType == null) { returnType = BaseYangTypes.BASE_YANG_TYPES_PROVIDER.javaTypeForSchemaDefinitionType( - baseTypeDef, typeDefinition, r); + baseTypeDef, typeDefinition, r, null); } } } @@ -582,14 +591,15 @@ public final class TypeProviderImpl implements TypeProvider { * @return JAVA Type instance for typeDefinition */ private Type javaTypeForLeafrefOrIdentityRef(final TypeDefinition typeDefinition, final SchemaNode parentNode, - final SchemaContext schemaContext, final Map>> genTypeDefsContextMap) { + final SchemaContext schemaContext, final Map>> genTypeDefsContextMap, + ModuleContext context) { if (typeDefinition instanceof LeafrefTypeDefinition) { final LeafrefTypeDefinition leafref = (LeafrefTypeDefinition) typeDefinition; if (isLeafRefSelfReference(leafref, parentNode, schemaContext)) { throw new YangValidationException("Leafref " + leafref.toString() + " is referencing itself, incoming" + " StackOverFlowError detected."); } - return provideTypeForLeafref(leafref, parentNode, schemaContext, genTypeDefsContextMap); + return provideTypeForLeafref(leafref, parentNode, schemaContext, genTypeDefsContextMap, context); } else if (typeDefinition instanceof IdentityrefTypeDefinition) { final IdentityrefTypeDefinition idref = (IdentityrefTypeDefinition) typeDefinition; return provideTypeForIdentityref(idref, schemaContext); @@ -616,7 +626,8 @@ public final class TypeProviderImpl implements TypeProvider { * */ public Type provideTypeForLeafref(final LeafrefTypeDefinition leafrefType, final SchemaNode parentNode, - final SchemaContext schemaContext, final Map>> genTypeDefsContextMap) { + final SchemaContext schemaContext, final Map>> genTypeDefsContextMap, + ModuleContext context) { Type returnType = null; Preconditions.checkArgument(leafrefType != null, "Leafref Type Definition reference cannot be NULL!"); @@ -646,7 +657,7 @@ public final class TypeProviderImpl implements TypeProvider { } else if (leafListContainsEnumDefinition(dataNode)) { returnType = Types.listTypeFor(this.referencedTypes.get(dataNode.getPath())); } else { - returnType = resolveTypeFromDataSchemaNode(dataNode, schemaContext, genTypeDefsContextMap); + returnType = resolveTypeFromDataSchemaNode(dataNode, schemaContext, genTypeDefsContextMap, context); } } else { returnType = Types.typeForClass(Object.class); @@ -713,17 +724,18 @@ public final class TypeProviderImpl implements TypeProvider { * @return JAVA Type representation of dataNode */ private Type resolveTypeFromDataSchemaNode(final SchemaNode dataNode, final SchemaContext schemaContext, - final Map>> genTypeDefsContextMap) { + final Map>> genTypeDefsContextMap, ModuleContext context) { Type returnType = null; if (dataNode != null) { if (dataNode instanceof LeafSchemaNode) { final LeafSchemaNode leaf = (LeafSchemaNode) dataNode; //not using CompatUtils here anymore final TypeDefinition type = leaf.getType(); - returnType = javaTypeForSchemaDefType(type, leaf, null, schemaContext, genTypeDefsContextMap); + returnType = javaTypeForSchemaDefType(type, leaf, null, schemaContext, genTypeDefsContextMap, context); } else if (dataNode instanceof LeafListSchemaNode) { final LeafListSchemaNode leafList = (LeafListSchemaNode) dataNode; - returnType = javaTypeForSchemaDefType(leafList.getType(), leafList, null, schemaContext, genTypeDefsContextMap); + returnType = javaTypeForSchemaDefType(leafList.getType(), leafList, null, schemaContext, + genTypeDefsContextMap, context); } } return returnType; @@ -765,43 +777,13 @@ public final class TypeProviderImpl implements TypeProvider { JavaIdentifier.CLASS); final Type baseType = Types.typeForClass(Class.class); - final Type paramType = Types.wildcardTypeFor(packageName, genTypeName, true, true); + final Type paramType = Types.wildcardTypeFor(packageName, genTypeName, true, true, null); return Types.parameterizedTypeFor(baseType, paramType); } - /** - * Converts typedef to the generated TO builder. - * - * @param basePackageName - * string with name of package to which the module belongs - * @param typedef - * type definition from which is the generated TO builder created - * @return generated TO builder which contains data from - * typedef and basePackageName - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - private static GeneratedTOBuilderImpl typedefToTransferObject(final String basePackageName, final TypeDefinition typedef, final String moduleName) { - - final String packageName = BindingGeneratorUtil.packageNameForGeneratedType(basePackageName, typedef.getPath - (), BindingNamespaceType.Typedef); - final String typeDefTOName = typedef.getQName().getLocalName(); - - if ((packageName != null) && (typeDefTOName != null)) { - final GeneratedTOBuilderImpl newType = new GeneratedTOBuilderImpl(packageName, typeDefTOName); - final String typedefDescription = encodeAngleBrackets(typedef.getDescription()); - - newType.setDescription(typedefDescription); - newType.setReference(typedef.getReference()); - newType.setSchemaPath((List) typedef.getPath().getPathFromRoot()); - newType.setModuleName(moduleName); - - return newType; - } - return null; - } - - private static GeneratedTransferObject shadedTOWithRestrictions(final GeneratedTransferObject gto, final Restrictions r) { - final GeneratedTOBuilder gtob = new GeneratedTOBuilderImpl(gto.getPackageName(), gto.getName()); + private static GeneratedTransferObject shadedTOWithRestrictions(final GeneratedTransferObject gto, + final Restrictions r, ModuleContext context) { + final GeneratedTOBuilder gtob = new GeneratedTOBuilderImpl(gto.getPackageName(), gto.getName(), context); final GeneratedTransferObject parent = gto.getSuperType(); if (parent != null) { gtob.setExtendsType(parent); @@ -850,8 +832,7 @@ public final class TypeProviderImpl implements TypeProvider { * * In this case the new generated TO is created for union subtype (recursive * call of method - * {@link #provideGeneratedTOBuildersForUnionTypeDef(String, UnionTypeDefinition, - * String, SchemaNode, SchemaContext, Map)} + * {@link #provideGeneratedTOBuilderForUnionTypeDef(String, UnionTypeDefinition, String, SchemaNode, SchemaContext, Map, ModuleContext)} * provideGeneratedTOBuilderForUnionTypeDef} and in parent TO builder * parentUnionGenTOBuilder is created property which type is * equal to new generated TO. @@ -867,13 +848,15 @@ public final class TypeProviderImpl implements TypeProvider { * bigger one due to recursive call of * provideGeneratedTOBuildersForUnionTypeDef method. */ - private GeneratedTOBuilder resolveUnionSubtypeAsUnion(final GeneratedTOBuilder - parentUnionGenTOBuilder, final UnionTypeDefinition unionSubtype, final String basePackageName, - final SchemaNode parentNode, final SchemaContext schemaContext, final Map>> genTypeDefsContextMap) { + private GeneratedTOBuilder resolveUnionSubtypeAsUnion(final GeneratedTOBuilder parentUnionGenTOBuilder, + final UnionTypeDefinition unionSubtype, final String basePackageName, final SchemaNode parentNode, + final SchemaContext schemaContext, final Map>> genTypeDefsContextMap, + ModuleContext context) { final String newTOBuilderName = provideAvailableNameForGenTOBuilder(parentUnionGenTOBuilder.getName()); final GeneratedTOBuilder subUnionGenTOBUilder = provideGeneratedTOBuilderForUnionTypeDef( - basePackageName, unionSubtype, newTOBuilderName, parentNode, schemaContext, genTypeDefsContextMap); + basePackageName, unionSubtype, newTOBuilderName, parentNode, schemaContext, genTypeDefsContextMap, + context); final GeneratedPropertyBuilder propertyBuilder; propertyBuilder = parentUnionGenTOBuilder @@ -900,11 +883,12 @@ public final class TypeProviderImpl implements TypeProvider { * builders */ public GeneratedTOBuilder provideGeneratedTOBuilderForUnionTypeDef(final String basePackageName, - final UnionTypeDefinition typedef, final String typeDefName, final SchemaNode parentNode, final SchemaContext - schemaContext, final Map>> genTypeDefsContextMap) { + final UnionTypeDefinition typedef, final String typeDefName, final SchemaNode parentNode, + final SchemaContext schemaContext, final Map>> genTypeDefsContextMap, + ModuleContext context) { final List builders = provideGeneratedTOBuildersForUnionTypeDef(basePackageName, - typedef, typeDefName, parentNode, schemaContext, genTypeDefsContextMap); + typedef, typeDefName, parentNode, schemaContext, genTypeDefsContextMap, context); Preconditions.checkState(!builders.isEmpty(), "No GeneratedTOBuilder objects generated from union %s", typedef); final GeneratedTOBuilder resultTOBuilder = builders.remove(0); @@ -926,7 +910,7 @@ public final class TypeProviderImpl implements TypeProvider { private GeneratedTOBuilder provideGeneratedTOBuilderForUnionBuilder(final Module parentModule, - final GeneratedTOBuilder genTOBuilder) { + final GeneratedTOBuilder genTOBuilder) { final String outerCls = Types.getOuterClassName(genTOBuilder); final StringBuilder name; if (outerCls != null) { @@ -976,9 +960,9 @@ public final class TypeProviderImpl implements TypeProvider { * parent Schema Node for Extended Subtype * */ - private static void resolveExtendedSubtypeAsUnion(final GeneratedTOBuilder parentUnionGenTOBuilder, final - TypeDefinition unionSubtype, final List regularExpressions, final SchemaNode parentNode, - final SchemaContext schemaContext, final Map>> genTypeDefsContextMap) { + private static void resolveExtendedSubtypeAsUnion(final GeneratedTOBuilder parentUnionGenTOBuilder, + final TypeDefinition unionSubtype, final List regularExpressions, final SchemaNode parentNode, + final SchemaContext schemaContext, final Map>> genTypeDefsContextMap) { final String unionTypeName = unionSubtype.getQName().getLocalName(); final Type genTO = findGenTO(unionTypeName, unionSubtype, schemaContext, genTypeDefsContextMap); @@ -988,7 +972,7 @@ public final class TypeProviderImpl implements TypeProvider { final TypeDefinition baseType = baseTypeDefForExtendedType(unionSubtype); if (unionTypeName.equals(baseType.getQName().getLocalName())) { final Type javaType = BaseYangTypes.BASE_YANG_TYPES_PROVIDER.javaTypeForSchemaDefinitionType(baseType, - parentNode); + parentNode, null); if (javaType != null) { updateUnionTypeAsProperty(parentUnionGenTOBuilder, javaType, unionTypeName); } @@ -1028,7 +1012,7 @@ public final class TypeProviderImpl implements TypeProvider { * null it it doesn't exist */ private static Type findGenTO(final String searchedTypeName, final SchemaNode parentNode, - final SchemaContext schemaContext, final Map>> genTypeDefsContextMap) { + final SchemaContext schemaContext, final Map>> genTypeDefsContextMap) { final Module typeModule = findParentModule(schemaContext, parentNode); if (typeModule != null && typeModule.getName() != null) { @@ -1064,13 +1048,14 @@ public final class TypeProviderImpl implements TypeProvider { * * */ - private static Enumeration addInnerEnumerationToTypeBuilder(final EnumTypeDefinition enumTypeDef, final String enumName, final GeneratedTypeBuilderBase typeBuilder) { + private static Enumeration addInnerEnumerationToTypeBuilder(final EnumTypeDefinition enumTypeDef, + final String enumName, final GeneratedTypeBuilderBase typeBuilder, ModuleContext context) { Preconditions.checkArgument(enumTypeDef != null, "EnumTypeDefinition reference cannot be NULL!"); Preconditions.checkArgument(enumTypeDef.getQName().getLocalName() != null, "Local Name in EnumTypeDefinition QName cannot be NULL!"); Preconditions.checkArgument(typeBuilder != null, "Generated Type Builder reference cannot be NULL!"); - final EnumBuilder enumBuilder = typeBuilder.addEnumeration(enumName); + final EnumBuilder enumBuilder = typeBuilder.addEnumeration(enumName, context); final String enumTypedefDescription = encodeAngleBrackets(enumTypeDef.getDescription()); enumBuilder.setDescription(enumTypedefDescription); enumBuilder.updateEnumPairsFromEnumTypeDef(enumTypeDef); @@ -1078,7 +1063,7 @@ public final class TypeProviderImpl implements TypeProvider { } private static boolean isLeafRefSelfReference(final LeafrefTypeDefinition leafref, final SchemaNode parentNode, - final SchemaContext schemaContext) { + final SchemaContext schemaContext) { final SchemaNode leafRefValueNode; final RevisionAwareXPath leafRefXPath = leafref.getPathStatement(); final RevisionAwareXPath leafRefStrippedXPath = new RevisionAwareXPathImpl(leafRefXPath.toString() diff --git a/binding2/mdsal-binding2-generator-impl/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AugmentToGenTypeTest.java b/binding2/mdsal-binding2-generator-impl/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AugmentToGenTypeTest.java index 1c0557cc18..fd5f15e370 100644 --- a/binding2/mdsal-binding2-generator-impl/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AugmentToGenTypeTest.java +++ b/binding2/mdsal-binding2-generator-impl/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AugmentToGenTypeTest.java @@ -25,8 +25,8 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import org.junit.Ignore; import org.junit.Test; +import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext; import org.opendaylight.mdsal.binding.javav2.generator.spi.TypeProvider; import org.opendaylight.mdsal.binding.javav2.generator.util.generated.type.builder.GeneratedTypeBuilderImpl; import org.opendaylight.mdsal.binding.javav2.generator.yang.types.TypeProviderImpl; @@ -34,7 +34,6 @@ import org.opendaylight.mdsal.binding.javav2.model.api.Type; import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTypeBuilder; import org.opendaylight.mdsal.binding.javav2.spec.runtime.BindingNamespaceType; import org.opendaylight.mdsal.binding.javav2.spec.structural.Augmentable; -import org.opendaylight.mdsal.binding.javav2.spec.structural.Augmentation; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.AugmentationSchema; import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode; @@ -195,7 +194,7 @@ public class AugmentToGenTypeTest { final QName create = QName.create("urn:test:simple:test", "2017-02-06", "my-cont"); final SchemaNode schemaNode = mock(SchemaNode.class); when(schemaNode.getPath()).thenReturn(SchemaPath.create(true, create)); - moduleContext.addChildNodeType(schemaNode, new GeneratedTypeBuilderImpl("test", "Test")); + moduleContext.addChildNodeType(schemaNode, new GeneratedTypeBuilderImpl("test", "Test", moduleContext)); when(genCtx.values()).thenReturn(moduleContexts); when(genCtx.get(context.getModules().iterator().next())).thenReturn(moduleContext); final Map> genTypeBuilders = new HashMap<>(); @@ -642,7 +641,7 @@ public class AugmentToGenTypeTest { final Map genCtx = mock(Map.class); final Collection moduleContexts = new ArrayList<>(); final ModuleContext mc = new ModuleContext(); - final GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl(augmPackName, "augm"); + final GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl(augmPackName, "augm", mc); mc.addChildNodeType(targetSchNode, gtb); moduleContexts.add(mc); when(genCtx.values()).thenReturn(moduleContexts); @@ -706,7 +705,7 @@ public class AugmentToGenTypeTest { final Collection moduleContexts = new ArrayList<>(); final ModuleContext mc = new ModuleContext(); - final GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl(augmPackName, "augm"); + final GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl(augmPackName, "augm", mc); mc.addChildNodeType(targetSchNode, gtb); moduleContexts.add(mc); genCtx.put(moduleAug, mc); @@ -910,7 +909,7 @@ public class AugmentToGenTypeTest { final Map genCtx = new HashMap<>(); final ModuleContext mc = new ModuleContext(); - final GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl("pckg.test.augm", "GtbAugm"); + final GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl("pckg.test.augm", "GtbAugm", mc); mc.addChildNodeType(schNode, gtb); genCtx.put(moduleAug, mc); @@ -960,7 +959,7 @@ public class AugmentToGenTypeTest { final Map genCtx = new HashMap<>(); final ModuleContext mc = new ModuleContext(); - final GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl("pckg.test.augm", "GtbAugm"); + final GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl("pckg.test.augm", "GtbAugm", mc); mc.addChildNodeType(schNode, gtb); genCtx.put(moduleAug, mc); @@ -1343,9 +1342,9 @@ public class AugmentToGenTypeTest { final ChoiceSchemaNode targetNode = mock(ChoiceSchemaNode.class); when(targetNode.getPath()).thenReturn(path); final Map genCtx = new HashMap<>(); - final ModuleContext moduleContext = new ModuleContext(); - final GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl(pckgName, "test-case-node-augment"); - moduleContext.addCaseType(path, gtb); + genCtx.put(module, new ModuleContext()); + final GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl(pckgName, "test-case-node-augment", genCtx.get(module)); + genCtx.get(module).addCaseType(path, gtb); final Map> genTypeBuilder = new HashMap<>(); when(schemaContext.findModuleByNamespaceAndRevision(qnamePath.getNamespace(), qnamePath.getRevision())) @@ -1409,7 +1408,7 @@ public class AugmentToGenTypeTest { when(targetNode.getPath()).thenReturn(path); final Map genCtx = new HashMap<>(); final ModuleContext moduleContext = new ModuleContext(); - final GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl(pckgName, "test-case-node-augment"); + final GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl(pckgName, "test-case-node-augment", moduleContext); moduleContext.addCaseType(path, gtb); genCtx.put(module, moduleContext); final Map> genTypeBuilder = new HashMap<>(); diff --git a/binding2/mdsal-binding2-generator-impl/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AuxiliaryGenUtilsTest.java b/binding2/mdsal-binding2-generator-impl/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AuxiliaryGenUtilsTest.java index b29d96ac33..bb43516d6d 100644 --- a/binding2/mdsal-binding2-generator-impl/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AuxiliaryGenUtilsTest.java +++ b/binding2/mdsal-binding2-generator-impl/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/impl/AuxiliaryGenUtilsTest.java @@ -26,6 +26,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import org.junit.Test; +import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext; import org.opendaylight.mdsal.binding.javav2.generator.spi.TypeProvider; import org.opendaylight.mdsal.binding.javav2.generator.util.Types; import org.opendaylight.mdsal.binding.javav2.generator.util.generated.type.builder.GeneratedTOBuilderImpl; @@ -84,7 +85,7 @@ public class AuxiliaryGenUtilsTest { generate.setAccessible(true); final GeneratedTypeBuilderImpl generatedTypeBuilder = - new GeneratedTypeBuilderImpl("test.deprecated", "Non_Deprecated"); + new GeneratedTypeBuilderImpl("test.deprecated", "Non_Deprecated", new ModuleContext()); final Status status = Status.CURRENT; final Object[] args = { status, generatedTypeBuilder }; @@ -102,7 +103,7 @@ public class AuxiliaryGenUtilsTest { generate.setAccessible(true); final GeneratedTypeBuilderImpl generatedTypeBuilder = - new GeneratedTypeBuilderImpl("test.deprecated", "Deprecated"); + new GeneratedTypeBuilderImpl("test.deprecated", "Deprecated", new ModuleContext()); final Status status = Status.DEPRECATED; final Object[] args = { status, generatedTypeBuilder }; @@ -144,7 +145,7 @@ public class AuxiliaryGenUtilsTest { assertNotNull(generate); generate.setAccessible(true); - final GeneratedTypeBuilderBase gtbb = new GeneratedTypeBuilderImpl("test", "qname_constants"); + final GeneratedTypeBuilderBase gtbb = new GeneratedTypeBuilderImpl("test", "qname_constants", new ModuleContext()); final String constantName = "ConstantName"; final QName constantQName = QName.create("urn:constant", "2017-04-06", constantName); @@ -162,7 +163,7 @@ public class AuxiliaryGenUtilsTest { assertNotNull(generate); generate.setAccessible(true); - final GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl("test", "Getter_of"); + final GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl("test", "Getter_of", new ModuleContext()); final String schemaNodeName = "schema_node_getter"; final String comment = null; final Type returnType = Types.STRING; @@ -337,8 +338,8 @@ public class AuxiliaryGenUtilsTest { generate.setAccessible(true); final Map builders = new HashMap<>(); - builders.put("genTypeName1", new GeneratedTypeBuilderImpl("pckg.a1", "gen_a_1")); - builders.put("genTypeName2", new GeneratedTypeBuilderImpl("pckg.a2", "gen_a_2")); + builders.put("genTypeName1", new GeneratedTypeBuilderImpl("pckg.a1", "gen_a_1", new ModuleContext())); + builders.put("genTypeName2", new GeneratedTypeBuilderImpl("pckg.a2", "gen_a_2", new ModuleContext())); final String genTypeName = "genTypeName"; final Object[] args_n = { builders, genTypeName }; @@ -424,7 +425,7 @@ public class AuxiliaryGenUtilsTest { when(enumTypeDefinition.getQName()).thenReturn(enumQName); final SchemaPath schemaPath = SchemaPath.create(true, enumQName); when(enumTypeDefinition.getPath()).thenReturn(schemaPath); - final GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl("urn.enum.test.pckg", "enum-test"); + final GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl("urn.enum.test.pckg", "enum-test", new ModuleContext()); final Map map = new HashMap<>(); final Module module = mock(Module.class); final ModuleContext moduleContext = new ModuleContext(); @@ -440,14 +441,14 @@ public class AuxiliaryGenUtilsTest { public void addTOToTypeBuilderNullTest() throws Exception { final Class[] parameterTypes = { TypeDefinition.class, GeneratedTypeBuilder.class, DataSchemaNode.class, Module.class, - TypeProvider.class, SchemaContext.class }; + TypeProvider.class, SchemaContext.class, ModuleContext.class }; final Method generate = AuxiliaryGenUtils.class.getDeclaredMethod("addTOToTypeBuilder", parameterTypes); assertNotNull(generate); generate.setAccessible(true); final BooleanTypeDefinition typeDef = mock(BooleanTypeDefinition.class); final GeneratedTypeBuilder typeBuilder = - new GeneratedTypeBuilderImpl("test.boolean.type.def", "boolean-type-def"); + new GeneratedTypeBuilderImpl("test.boolean.type.def", "boolean-type-def", new ModuleContext()); final DataSchemaNode leaf = mock(DataSchemaNode.class); final QName qnameLeaf = QName.create("urn:leaf:qname:test", "2017-12-04", "leaf-qname-test"); when(leaf.getQName()).thenReturn(qnameLeaf); @@ -457,7 +458,7 @@ public class AuxiliaryGenUtilsTest { when(schemaContext.getModules()).thenReturn(modules); final TypeProviderImpl typeProvider = new TypeProviderImpl(schemaContext); - final Object[] args1 = { typeDef, typeBuilder, leaf, parentModule, typeProvider, schemaContext }; + final Object[] args1 = { typeDef, typeBuilder, leaf, parentModule, typeProvider, schemaContext, new ModuleContext() }; final GeneratedTOBuilder result = (GeneratedTOBuilder) generate.invoke(AuxiliaryGenUtils.class, args1); assertEquals(null, result); } @@ -477,20 +478,20 @@ public class AuxiliaryGenUtilsTest { throws NoSuchMethodException, ReactorException, FileNotFoundException, URISyntaxException, IllegalAccessException, InvocationTargetException { final Class[] parameterTypes = { TypeDefinition.class, GeneratedTypeBuilder.class, DataSchemaNode.class, - Module.class, TypeProvider.class, SchemaContext.class }; + Module.class, TypeProvider.class, SchemaContext.class, ModuleContext.class }; final Method generate = AuxiliaryGenUtils.class.getDeclaredMethod("addTOToTypeBuilder", parameterTypes); assertNotNull(generate); generate.setAccessible(true); final GeneratedTypeBuilder typeBuilder = - new GeneratedTypeBuilderImpl("test.boolean.spc.def", "spec-type-def"); + new GeneratedTypeBuilderImpl("test.boolean.spc.def", "spec-type-def", new ModuleContext()); final SchemaContext schemaContext = YangParserTestUtils.parseYangSource(yangPath); final TypeProviderImpl typeProvider = new TypeProviderImpl(schemaContext); final LeafSchemaNode leafSchemaNode = (LeafSchemaNode) schemaContext.getModules().iterator().next().getChildNodes().iterator().next(); final TypeDefinition> typeDef = leafSchemaNode.getType(); final Object[] args1 = { typeDef, typeBuilder, leafSchemaNode, schemaContext.getModules().iterator().next(), - typeProvider, schemaContext }; + typeProvider, schemaContext, new ModuleContext() }; return (GeneratedTOBuilder) generate.invoke(AuxiliaryGenUtils.class, args1); } @@ -503,7 +504,8 @@ public class AuxiliaryGenUtilsTest { assertNotNull(generate); generate.setAccessible(true); - final GeneratedTypeBuilder typeBuilder = new GeneratedTypeBuilderImpl("test.boolean.spc.def", "spec-type-def"); + final GeneratedTypeBuilder typeBuilder = new GeneratedTypeBuilderImpl("test.boolean.spc.def", + "spec-type-def", new ModuleContext()); final SchemaContext schemaContext = YangParserTestUtils.parseYangSource("/base/test-union.yang"); final TypeProviderImpl typeProvider = new TypeProviderImpl(schemaContext); final LeafSchemaNode leafSchemaNode = @@ -575,7 +577,7 @@ public class AuxiliaryGenUtilsTest { @SuppressWarnings({ "rawtypes" }) @Test public void resolveListKeyTOBuilderTest() throws Exception { - final Class[] parameterTypes = { String.class, ListSchemaNode.class }; + final Class[] parameterTypes = { String.class, ListSchemaNode.class, ModuleContext.class }; final Method generate = AuxiliaryGenUtils.class.getDeclaredMethod("resolveListKeyTOBuilder", parameterTypes); assertNotNull(generate); generate.setAccessible(true); @@ -588,7 +590,7 @@ public class AuxiliaryGenUtilsTest { when(list.getKeyDefinition()).thenReturn(keyDefs); when(list.getQName()).thenReturn(qname); - final Object[] args1 = { pckgName, list }; + final Object[] args1 = { pckgName, list, new ModuleContext() }; final GeneratedTOBuilder result = (GeneratedTOBuilder) generate.invoke(AuxiliaryGenUtils.class, args1); assertNotNull(result); assertEquals("LocalnameKey", result.getName()); @@ -623,7 +625,7 @@ public class AuxiliaryGenUtilsTest { assertNotNull(generate); generate.setAccessible(true); - final GeneratedTOBuilder gtob = new GeneratedTOBuilderImpl("pckg.name.gto.tst", "gto_name"); + final GeneratedTOBuilder gtob = new GeneratedTOBuilderImpl("pckg.name.gto.tst", "gto_name", true); final LeafSchemaNode leaf = mock(LeafSchemaNode.class); final boolean isReadOnly = true; final Type type = mock(Type.class); diff --git a/binding2/mdsal-binding2-generator-impl/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/impl/GeneratedClassLoadingStrategyTest.java b/binding2/mdsal-binding2-generator-impl/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/impl/GeneratedClassLoadingStrategyTest.java index cd2299e019..1b411a2a3a 100644 --- a/binding2/mdsal-binding2-generator-impl/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/impl/GeneratedClassLoadingStrategyTest.java +++ b/binding2/mdsal-binding2-generator-impl/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/impl/GeneratedClassLoadingStrategyTest.java @@ -9,6 +9,7 @@ package org.opendaylight.mdsal.binding.javav2.generator.impl; import org.junit.Assert; import org.junit.Test; +import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext; import org.opendaylight.mdsal.binding.javav2.generator.util.generated.type.builder.GeneratedTypeBuilderImpl; import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTypeBuilder; @@ -17,7 +18,7 @@ public class GeneratedClassLoadingStrategyTest { @Test public void loadClassTest() throws Exception { final Dummy dummy = new Dummy(); - final GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl("test", "dummy"); + final GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl("test", "dummy", new ModuleContext()); final Class loadClass = dummy.loadClass(gtb.toInstance()); Assert.assertNotNull(loadClass); } diff --git a/binding2/mdsal-binding2-generator-impl/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/impl/RpcActionGenHelperTest.java b/binding2/mdsal-binding2-generator-impl/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/impl/RpcActionGenHelperTest.java index 12d04dcf79..2e2b62572f 100644 --- a/binding2/mdsal-binding2-generator-impl/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/impl/RpcActionGenHelperTest.java +++ b/binding2/mdsal-binding2-generator-impl/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/impl/RpcActionGenHelperTest.java @@ -28,6 +28,7 @@ import java.util.Map; import java.util.Set; import org.junit.Ignore; import org.junit.Test; +import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext; import org.opendaylight.mdsal.binding.javav2.generator.spi.TypeProvider; import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTypeBuilder; import org.opendaylight.yangtools.yang.common.QName; diff --git a/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/AbstractBaseType.java b/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/AbstractBaseType.java index c57565bd53..de719fee4a 100644 --- a/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/AbstractBaseType.java +++ b/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/AbstractBaseType.java @@ -11,6 +11,7 @@ package org.opendaylight.mdsal.binding.javav2.generator.util; import com.google.common.annotations.Beta; import com.google.common.base.Preconditions; import java.util.Objects; +import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext; import org.opendaylight.mdsal.binding.javav2.model.api.Type; /** @@ -39,11 +40,13 @@ public abstract class AbstractBaseType implements Type { * @param name * string with the name for this Type */ - protected AbstractBaseType(final String pkName, final String name) { + protected AbstractBaseType(final String pkName, final String name, ModuleContext context) { Preconditions.checkNotNull(pkName, "Package Name for Generated Type cannot be null!"); Preconditions.checkNotNull(name, "Name of Generated Type cannot be null!"); this.packageName = JavaIdentifierNormalizer.normalizeFullPackageName(pkName); - this.name = JavaIdentifierNormalizer.normalizeClassIdentifier(pkName, name); + Preconditions.checkNotNull(context, "In case of not having identifiers normalized, " + + "ModuleContext instance must be provided."); + this.name = JavaIdentifierNormalizer.normalizeClassIdentifier(pkName, name, context); } /** @@ -58,7 +61,8 @@ public abstract class AbstractBaseType implements Type { * @param isNormalized * true if pkName and name are normalized */ - protected AbstractBaseType(final String pkName, final String name, final boolean isNormalized) { + protected AbstractBaseType(final String pkName, final String name, final boolean isNormalized, + ModuleContext context) { Preconditions.checkNotNull(pkName, "Package Name for Generated Type cannot be null!"); Preconditions.checkNotNull(name, "Name of Generated Type cannot be null!"); if (isNormalized) { @@ -66,13 +70,14 @@ public abstract class AbstractBaseType implements Type { this.name = name; } else { this.packageName = JavaIdentifierNormalizer.normalizeFullPackageName(pkName); - this.name = JavaIdentifierNormalizer.normalizeClassIdentifier(pkName, name); + Preconditions.checkNotNull(context, "In case of not having identifiers normalized, " + + "ModuleContext instance must be provided."); + this.name = JavaIdentifierNormalizer.normalizeClassIdentifier(pkName, name, context); } } - protected AbstractBaseType(final String pkName, final String name, final boolean isPkNameNormalized, - final boolean isTypeNormalized) { + final boolean isTypeNormalized, ModuleContext context ) { Preconditions.checkNotNull(pkName, "Package Name for Generated Type cannot be null!"); Preconditions.checkNotNull(name, "Name of Generated Type cannot be null!"); if (isPkNameNormalized) { @@ -84,7 +89,9 @@ public abstract class AbstractBaseType implements Type { if (isTypeNormalized) { this.name = name; } else { - this.name = JavaIdentifierNormalizer.normalizeClassIdentifier(pkName, name); + Preconditions.checkNotNull(context, "In case of not having identifiers normalized, " + + "ModuleContext instance must be provided."); + this.name = JavaIdentifierNormalizer.normalizeClassIdentifier(pkName, name, context); } } diff --git a/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/BindingGeneratorUtil.java b/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/BindingGeneratorUtil.java index d8cd5bd941..ec86229a47 100644 --- a/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/BindingGeneratorUtil.java +++ b/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/BindingGeneratorUtil.java @@ -517,6 +517,4 @@ public final class BindingGeneratorUtil { return false; } - - //TODO: further implementation of static util methods... } diff --git a/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/JavaIdentifier.java b/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/JavaIdentifier.java index 082a932005..d1933db21d 100644 --- a/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/JavaIdentifier.java +++ b/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/JavaIdentifier.java @@ -19,6 +19,7 @@ import com.google.common.annotations.Beta; *
  • method
  • *
  • variable
  • *
  • constant
  • + *
  • package
  • * */ @Beta diff --git a/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/JavaIdentifierNormalizer.java b/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/JavaIdentifierNormalizer.java index 029bf48606..b2cc55207a 100644 --- a/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/JavaIdentifierNormalizer.java +++ b/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/JavaIdentifierNormalizer.java @@ -10,13 +10,13 @@ package org.opendaylight.mdsal.binding.javav2.generator.util; import com.google.common.annotations.Beta; import com.google.common.base.CharMatcher; import com.google.common.base.Splitter; -import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.ListMultimap; import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.stream.Collectors; +import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext; import org.opendaylight.mdsal.binding.javav2.model.api.Enumeration; import org.opendaylight.mdsal.binding.javav2.model.api.Enumeration.Pair; import org.opendaylight.mdsal.binding.javav2.util.BindingMapping; @@ -221,9 +221,6 @@ public final class JavaIdentifierNormalizer { private static final Set WINDOWS_RESERVED_WORDS = BindingMapping.WINDOWS_RESERVED_WORDS.stream() .map(String::toLowerCase).collect(Collectors.collectingAndThen(Collectors.toSet(), ImmutableSet::copyOf)); - // FIXME: this thing makes this class non-threadsafe and leak memory - private static final ListMultimap PACKAGES_MAP = ArrayListMultimap.create(); - private JavaIdentifierNormalizer() { throw new UnsupportedOperationException("Util class"); } @@ -288,7 +285,7 @@ public final class JavaIdentifierNormalizer { * - part of package name * @return normalized name */ - public static String normalizePartialPackageName(final String packageNamePart) { + static String normalizePartialPackageName(final String packageNamePart) { // if part of package name consist from java or windows reserved word, return it with // underscore at the end and in lower case final String lowerPart = packageNamePart.toLowerCase(); @@ -332,7 +329,8 @@ public final class JavaIdentifierNormalizer { * - name of identifier * @return - java acceptable identifier */ - public static String normalizeClassIdentifier(final String packageName, final String className) { + static String normalizeClassIdentifier(final String packageName, final String className, + ModuleContext context) { if (packageName.isEmpty() && PRIMITIVE_TYPES.contains(className)) { return className; } @@ -354,7 +352,7 @@ public final class JavaIdentifierNormalizer { basePackageName = packageName; } - return normalizeClassIdentifier(basePackageName, convertedClassName, convertedClassName, 1); + return normalizeClassIdentifier(basePackageName, convertedClassName, convertedClassName, 1, context); } /** @@ -422,18 +420,22 @@ public final class JavaIdentifierNormalizer { * @return converted identifier */ private static String normalizeClassIdentifier(final String packageName, final String origClassName, - final String actualClassName, final int rank) { + final String actualClassName, final int rank, ModuleContext context) { + + final ListMultimap packagesMap = context.getPackagesMap(); - // FIXME: this does not look thread-safe and seems to leak memory - if (PACKAGES_MAP.containsKey(packageName)) { - for (final String existingName : PACKAGES_MAP.get(packageName)) { - if (actualClassName.equalsIgnoreCase(existingName)) { - return normalizeClassIdentifier(packageName, origClassName, origClassName + rank, rank + 1); + synchronized (packagesMap) { + if (packagesMap.containsKey(packageName)) { + for (final String existingName : packagesMap.get(packageName)) { + if (actualClassName.equalsIgnoreCase(existingName)) { + return normalizeClassIdentifier(packageName, origClassName, origClassName + rank, + rank + 1, context); + } } } + context.putToPackagesMap(packageName, actualClassName); + return actualClassName; } - PACKAGES_MAP.put(packageName, actualClassName); - return actualClassName; } /** diff --git a/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/ReferencedTypeImpl.java b/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/ReferencedTypeImpl.java index 03a812e497..66fb631dd0 100644 --- a/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/ReferencedTypeImpl.java +++ b/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/ReferencedTypeImpl.java @@ -8,6 +8,8 @@ package org.opendaylight.mdsal.binding.javav2.generator.util; +import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext; + /** * * Wraps combination of packageName and name to the @@ -24,8 +26,8 @@ public final class ReferencedTypeImpl extends AbstractBaseType { * @param name * string with the name for referenced type */ - public ReferencedTypeImpl(String packageName, String name) { - super(packageName, name); + public ReferencedTypeImpl(String packageName, String name, ModuleContext context) { + super(packageName, name, context); } /** @@ -39,8 +41,8 @@ public final class ReferencedTypeImpl extends AbstractBaseType { * @param isNormalized * indicates if identifier name is normalized */ - public ReferencedTypeImpl(String packageName, String name, boolean isNormalized) { - super(packageName, name, isNormalized); + public ReferencedTypeImpl(String packageName, String name, boolean isNormalized, ModuleContext context) { + super(packageName, name, isNormalized, context); } @Override @@ -50,7 +52,7 @@ public final class ReferencedTypeImpl extends AbstractBaseType { builder.append(getPackageName()); builder.append(", name="); builder.append(getName()); - builder.append("]"); + builder.append(']'); return builder.toString(); } } diff --git a/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/Types.java b/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/Types.java index 2c22371311..3d3a8f4bd0 100644 --- a/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/Types.java +++ b/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/Types.java @@ -24,6 +24,7 @@ import java.util.Map; import java.util.Set; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext; import org.opendaylight.mdsal.binding.javav2.model.api.BaseTypeWithRestrictions; import org.opendaylight.mdsal.binding.javav2.model.api.ConcreteType; import org.opendaylight.mdsal.binding.javav2.model.api.ParameterizedType; @@ -209,8 +210,8 @@ public final class Types { * packageName and typeName */ public static WildcardType wildcardTypeFor(final String packageName, final String typeName, - final boolean isPkNameNormalized, final boolean isTypeNormalized) { - return new WildcardTypeImpl(packageName, typeName, isPkNameNormalized, isTypeNormalized); + final boolean isPkNameNormalized, final boolean isTypeNormalized, ModuleContext context) { + return new WildcardTypeImpl(packageName, typeName, isPkNameNormalized, isTypeNormalized, context); } /** @@ -289,7 +290,7 @@ public final class Types { * string with the name of the type */ private ConcreteTypeImpl(final String pkName, final String name, final Restrictions restrictions) { - super(pkName, name); + super(pkName, name, true,null); this.restrictions = restrictions; } @@ -317,7 +318,7 @@ public final class Types { * string with the name of the type */ private BaseTypeWithRestrictionsImpl(final String pkName, final String name, final Restrictions restrictions) { - super(pkName, name); + super(pkName, name, null); this.restrictions = Preconditions.checkNotNull(restrictions); } @@ -353,7 +354,7 @@ public final class Types { * array of actual parameters */ public ParameterizedTypeImpl(final Type rawType, final Type[] actTypes) { - super(rawType.getPackageName(), rawType.getName(), true); + super(rawType.getPackageName(), rawType.getName(), true, null); this.rawType = rawType; this.actualTypes = actTypes.clone(); } @@ -384,8 +385,9 @@ public final class Types { * @param typeName * string with the name of type */ + //FIXME: doesn't seem to be called at all public WildcardTypeImpl(final String packageName, final String typeName) { - super(packageName, typeName); + super(packageName, typeName, null); } /** @@ -401,8 +403,8 @@ public final class Types { * if the type name has been normalized */ public WildcardTypeImpl(final String packageName, final String typeName, final boolean isPkNameNormalized, - final boolean isTypeNormalized) { - super(packageName, typeName, isPkNameNormalized, isTypeNormalized); + final boolean isTypeNormalized, ModuleContext context) { + super(packageName, typeName, isPkNameNormalized, isTypeNormalized, context); } } diff --git a/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/AbstractGeneratedType.java b/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/AbstractGeneratedType.java index 752cac29ce..e36bbcb35f 100644 --- a/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/AbstractGeneratedType.java +++ b/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/AbstractGeneratedType.java @@ -45,7 +45,7 @@ abstract class AbstractGeneratedType extends AbstractBaseType implements Generat private final boolean isAbstract; public AbstractGeneratedType(final AbstractGeneratedTypeBuilder builder) { - super(builder.getPackageName(), builder.getName(), true); + super(builder.getPackageName(), builder.getName(), true, null); this.parent = builder.getParent(); this.parentTypeForBuilder = builder.getParentTypeForBuilder(); this.comment = builder.getComment(); @@ -66,7 +66,8 @@ abstract class AbstractGeneratedType extends AbstractBaseType implements Generat final List enclosedGenTOBuilders, final List enumBuilders, final List constants, final List methodBuilders, final List propertyBuilders, final Type parentTypeForBuilder) { - super(packageName, name); + //TODO: not called by actual codebase, fix this up (provide context) if needed - 07/20/2017 + super(packageName, name, null); this.parent = parent; this.parentTypeForBuilder = parentTypeForBuilder; this.comment = comment; diff --git a/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/AbstractGeneratedTypeBuilder.java b/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/AbstractGeneratedTypeBuilder.java index c51a4bca77..01d7c0d156 100644 --- a/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/AbstractGeneratedTypeBuilder.java +++ b/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/AbstractGeneratedTypeBuilder.java @@ -13,6 +13,7 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import java.util.List; import java.util.Objects; +import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext; import org.opendaylight.mdsal.binding.javav2.generator.util.AbstractBaseType; import org.opendaylight.mdsal.binding.javav2.model.api.AccessModifier; import org.opendaylight.mdsal.binding.javav2.model.api.Constant; @@ -42,18 +43,18 @@ abstract class AbstractGeneratedTypeBuilder parameters = ImmutableList.of(); public AnnotationTypeBuilderImpl(final String packageName, final String name) { - super(packageName, name); + super(packageName, name, true, null); this.packageName = packageName; this.name = name; } diff --git a/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/EnumerationBuilderImpl.java b/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/EnumerationBuilderImpl.java index 323baac46f..a8dcb1cdb9 100644 --- a/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/EnumerationBuilderImpl.java +++ b/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/EnumerationBuilderImpl.java @@ -16,6 +16,7 @@ import java.util.Optional; import java.util.stream.Collectors; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext; import org.opendaylight.mdsal.binding.javav2.generator.util.AbstractBaseType; import org.opendaylight.mdsal.binding.javav2.generator.util.JavaIdentifierNormalizer; import org.opendaylight.mdsal.binding.javav2.model.api.AnnotationType; @@ -44,14 +45,13 @@ public class EnumerationBuilderImpl extends AbstractBaseType implements EnumBuil private String moduleName; private List schemaPath; - public EnumerationBuilderImpl(final String packageName, final String name) { - super(packageName, name); + public EnumerationBuilderImpl(final String packageName, final String name, ModuleContext context) { + super(packageName, name, context); } - public EnumerationBuilderImpl(final String packageName, final String name, - final boolean isPkNameNormalized, - final boolean isTypeNormalized) { - super(packageName, name, isPkNameNormalized, isTypeNormalized); + public EnumerationBuilderImpl(final String packageName, final String name, final boolean isPkNameNormalized, + final boolean isTypeNormalized, ModuleContext context) { + super(packageName, name, isPkNameNormalized, isTypeNormalized, context); } public void setReference(final String reference) { @@ -222,7 +222,7 @@ public class EnumerationBuilderImpl extends AbstractBaseType implements EnumBuil public EnumerationImpl(final Type definingType, final List annotationBuilders, final String packageName, final String name, final List values, final String description, final String reference, final String moduleName, final List schemaPath) { - super(packageName, name, true); + super(packageName, name, true, null); this.definingType = definingType; this.values = values; this.description = description; diff --git a/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/GeneratedTOBuilderImpl.java b/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/GeneratedTOBuilderImpl.java index e04cc400f5..d6faa03f89 100644 --- a/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/GeneratedTOBuilderImpl.java +++ b/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/GeneratedTOBuilderImpl.java @@ -13,6 +13,7 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import java.util.List; import java.util.Optional; +import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext; import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedProperty; import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedTransferObject; import org.opendaylight.mdsal.binding.javav2.model.api.ParameterizedType; @@ -44,19 +45,18 @@ public final class GeneratedTOBuilderImpl extends AbstractGeneratedTypeBuilder schemaPath; - public GeneratedTOBuilderImpl(final String packageName, final String name) { - super(packageName, name); + public GeneratedTOBuilderImpl(final String packageName, final String name, ModuleContext context) { + super(packageName, name, context); setAbstract(false); } public GeneratedTOBuilderImpl(final String packageName, final String name, final boolean isNormalized) { - super(packageName, name, true); + super(packageName, name, true, null); } - public GeneratedTOBuilderImpl(final String packageName, final String name, - final boolean isPkNameNormalized, - final boolean isTypeNormalized) { - super(packageName, name, isPkNameNormalized, isTypeNormalized); + public GeneratedTOBuilderImpl(final String packageName, final String name, final boolean isPkNameNormalized, + final boolean isTypeNormalized, ModuleContext context) { + super(packageName, name, isPkNameNormalized, isTypeNormalized, context); setAbstract(false); } diff --git a/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/GeneratedTypeBuilderImpl.java b/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/GeneratedTypeBuilderImpl.java index 78ff3a60c9..349865dd19 100644 --- a/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/GeneratedTypeBuilderImpl.java +++ b/binding2/mdsal-binding2-generator-util/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/GeneratedTypeBuilderImpl.java @@ -9,9 +9,10 @@ package org.opendaylight.mdsal.binding.javav2.generator.util.generated.type.builder; import com.google.common.annotations.Beta; +import com.google.common.base.Preconditions; import java.util.List; import java.util.Optional; -import com.google.common.base.Preconditions; +import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext; import org.opendaylight.mdsal.binding.javav2.generator.util.BindingGeneratorUtil; import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedType; import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedTypeForBuilder; @@ -30,15 +31,14 @@ public final class GeneratedTypeBuilderImpl extends AbstractGeneratedTypeBuilder private boolean isWithBuilder = false; private String basePackageName = null; - public GeneratedTypeBuilderImpl(final String packageName, final String name) { - super(packageName, name); + public GeneratedTypeBuilderImpl(final String packageName, final String name, ModuleContext context) { + super(packageName, name, context); setAbstract(true); } - public GeneratedTypeBuilderImpl(final String packageName, final String name, - final boolean isPkNameNormalized, - final boolean isTypeNormalized) { - super(packageName, name, isPkNameNormalized, isTypeNormalized); + public GeneratedTypeBuilderImpl(final String packageName, final String name, final boolean isPkNameNormalized, + final boolean isTypeNormalized, ModuleContext context) { + super(packageName, name, isPkNameNormalized, isTypeNormalized, context); setAbstract(true); } diff --git a/binding2/mdsal-binding2-generator-util/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/util/JavaIdentifierNormalizerTest.java b/binding2/mdsal-binding2-generator-util/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/util/JavaIdentifierNormalizerTest.java index ab80a93b38..32210f52b2 100644 --- a/binding2/mdsal-binding2-generator-util/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/util/JavaIdentifierNormalizerTest.java +++ b/binding2/mdsal-binding2-generator-util/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/util/JavaIdentifierNormalizerTest.java @@ -11,68 +11,72 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import org.junit.Test; +import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext; import org.opendaylight.mdsal.binding.javav2.util.BindingMapping; public class JavaIdentifierNormalizerTest { @Test public void specialPathsTest() { + ModuleContext context = new ModuleContext(); // QName - reserved & non reserved String normalizeIdentifier = - JavaIdentifierNormalizer.normalizeClassIdentifier("org.opendaylight.yangtools.yang.common", "QName"); + JavaIdentifierNormalizer.normalizeClassIdentifier("org.opendaylight.yangtools.yang.common", + "QName", context); assertEquals("QName", normalizeIdentifier); // again reserved normalizeIdentifier = - JavaIdentifierNormalizer.normalizeClassIdentifier("org.opendaylight.yangtools.yang.common", "QName"); + JavaIdentifierNormalizer.normalizeClassIdentifier("org.opendaylight.yangtools.yang.common", + "QName", context); assertEquals("QName", normalizeIdentifier); // non reserved - normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("qname.non.reserved", "QName"); + normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("qname.non.reserved", "QName", context); assertEquals("Qname", normalizeIdentifier); // again non reserved - normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("qname.non.reserved", "QName"); + normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("qname.non.reserved", "QName", context); assertEquals("Qname1", normalizeIdentifier); // Augmentable - reserved & non reserved normalizeIdentifier = JavaIdentifierNormalizer - .normalizeClassIdentifier("org.opendaylight.mdsal.binding.javav2.spec.structural", "Augmentable"); + .normalizeClassIdentifier("org.opendaylight.mdsal.binding.javav2.spec.structural", "Augmentable", context); assertEquals("Augmentable", normalizeIdentifier); // again reserved normalizeIdentifier = JavaIdentifierNormalizer - .normalizeClassIdentifier("org.opendaylight.mdsal.binding.javav2.spec.structural", "Augmentable"); + .normalizeClassIdentifier("org.opendaylight.mdsal.binding.javav2.spec.structural", "Augmentable", context); assertEquals("Augmentable", normalizeIdentifier); // non reserved normalizeIdentifier = JavaIdentifierNormalizer - .normalizeClassIdentifier("augmentable.non.reserved", "Augmentable"); + .normalizeClassIdentifier("augmentable.non.reserved", "Augmentable", context); assertEquals("Augmentable", normalizeIdentifier); // again non reserved normalizeIdentifier = - JavaIdentifierNormalizer.normalizeClassIdentifier("augmentable.non.reserved", "Augmentable"); + JavaIdentifierNormalizer.normalizeClassIdentifier("augmentable.non.reserved", "Augmentable", context); assertEquals("Augmentable1", normalizeIdentifier); // List - reserved & non reserved - normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("java.util", "List"); + normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("java.util", "List", context); assertEquals("List", normalizeIdentifier); // again reserved - normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("java.util", "List"); + normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("java.util", "List", context); assertEquals("List", normalizeIdentifier); // non reserved - normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("list.non.reserved", "List"); + normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("list.non.reserved", "List", context); assertEquals("List", normalizeIdentifier); // again non reserved - normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("list.non.reserved", "List"); + normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("list.non.reserved", "List", context); assertEquals("List1", normalizeIdentifier); // String - reserved & non reserved - normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("java.lang", "String"); + normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("java.lang", "String", context); assertEquals("String", normalizeIdentifier); // again reserved - normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("java.lang", "String"); + normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("java.lang", "String", context); assertEquals("String", normalizeIdentifier); // non reserved - normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("string.non.reserved", "String"); + normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("string.non.reserved", "String", context); assertEquals("String", normalizeIdentifier); // again non reserved - normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("string.non.reserved", "String"); + normalizeIdentifier = JavaIdentifierNormalizer.normalizeClassIdentifier("string.non.reserved", "String", context); assertEquals("String1", normalizeIdentifier); } @@ -81,16 +85,21 @@ public class JavaIdentifierNormalizerTest { */ @Test public void sameClassNamesSamePackageTest() { - String normalizeIdentifier1 = JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.same.package", "Foo"); - String normalizeIdentifier2 = JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.same.package", "fOo"); + ModuleContext context = new ModuleContext(); + String normalizeIdentifier1 = JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.same.package", + "Foo", context); + String normalizeIdentifier2 = JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.same.package", + "fOo", context); final String normalizeIdentifier3 = - JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.same.package", "foo"); + JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.same.package", "foo", context); assertEquals(normalizeIdentifier1, "Foo"); assertEquals(normalizeIdentifier2, "Foo1"); assertEquals(normalizeIdentifier3, "Foo2"); - normalizeIdentifier1 = JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.same.package", "*"); - normalizeIdentifier2 = JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.same.package", "asterisk"); + normalizeIdentifier1 = JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.same.package", "*", + context); + normalizeIdentifier2 = JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.same.package", + "asterisk", context); assertEquals(normalizeIdentifier1, "Asterisk"); assertEquals(normalizeIdentifier2, "Asterisk1"); } @@ -100,19 +109,21 @@ public class JavaIdentifierNormalizerTest { */ @Test public void sameClassNamesOtherPackageTest() { + ModuleContext context = new ModuleContext(); String normalizeIdentifier1 = - JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.other.package", "Foo"); + JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.other.package", "Foo", context); String normalizeIdentifier2 = - JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.other.package.next", "fOo"); + JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.other.package.next", "fOo", context); final String normalizeIdentifier3 = - JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.other.package.next.next", "foo"); + JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.other.package.next.next", "foo", context); assertEquals(normalizeIdentifier1, "Foo"); assertEquals(normalizeIdentifier2, "Foo"); assertEquals(normalizeIdentifier3, "Foo"); - normalizeIdentifier1 = JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.other.package", "*"); + normalizeIdentifier1 = JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.other.package", "*", + context); normalizeIdentifier2 = - JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.other.package.next", "asterisk"); + JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.other.package.next", "asterisk", context); assertEquals(normalizeIdentifier1, "Asterisk"); assertEquals(normalizeIdentifier2, "Asterisk"); } @@ -122,12 +133,13 @@ public class JavaIdentifierNormalizerTest { */ @Test public void sameClassNamesSamePackageReservedWordsTest() { + ModuleContext context = new ModuleContext(); final String normalizeIdentifier1 = - JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.keywords.same.package", "int"); + JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.keywords.same.package", "int", context); final String normalizeIdentifier2 = - JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.keywords.same.package", "InT"); + JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.keywords.same.package", "InT", context); final String normalizeIdentifier3 = - JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.keywords.same.package", "inT"); + JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.keywords.same.package", "inT", context); assertEquals(normalizeIdentifier1, "IntReservedKeyword"); assertEquals(normalizeIdentifier2, "IntReservedKeyword1"); assertEquals(normalizeIdentifier3, "IntReservedKeyword2"); @@ -138,12 +150,14 @@ public class JavaIdentifierNormalizerTest { */ @Test public void sameClassNamesOtherPackageReservedWordsTest() { + ModuleContext context = new ModuleContext(); final String normalizeIdentifier1 = - JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.keywords.other.package", "int"); + JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.keywords.other.package", "int", context); final String normalizeIdentifier2 = - JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.keywords.other.package.next", "InT"); + JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.keywords.other.package.next", "InT", context); final String normalizeIdentifier3 = - JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.keywords.other.package.next.next", "inT"); + JavaIdentifierNormalizer.normalizeClassIdentifier("org.example.keywords.other.package.next.next", + "inT", context); assertEquals(normalizeIdentifier1, "IntReservedKeyword"); assertEquals(normalizeIdentifier2, "IntReservedKeyword"); assertEquals(normalizeIdentifier3, "IntReservedKeyword"); diff --git a/binding2/mdsal-binding2-generator-util/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/EnumerationBuilderImplTest.java b/binding2/mdsal-binding2-generator-util/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/EnumerationBuilderImplTest.java index 307b41ea32..e192f426c2 100644 --- a/binding2/mdsal-binding2-generator-util/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/EnumerationBuilderImplTest.java +++ b/binding2/mdsal-binding2-generator-util/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/util/generated/type/builder/EnumerationBuilderImplTest.java @@ -11,6 +11,7 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import org.junit.Test; +import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext; import org.opendaylight.mdsal.binding.javav2.model.api.Enumeration; import org.opendaylight.yangtools.yang.model.api.Status; @@ -18,7 +19,8 @@ public class EnumerationBuilderImplTest { @Test public void sameEnumTest() { - EnumerationBuilderImpl enumerationBuilderImpl = new EnumerationBuilderImpl("package.same.test", "test"); + ModuleContext context = new ModuleContext(); + EnumerationBuilderImpl enumerationBuilderImpl = new EnumerationBuilderImpl("package.same.test", "test", context); Enumeration enumeration = enumerationBuilderImpl.toInstance(enumerationBuilderImpl); String formattedString = enumeration.toFormattedString(); @@ -26,7 +28,7 @@ public class EnumerationBuilderImplTest { assertTrue(!formattedString.isEmpty()); assertTrue(formattedString.contains("Test")); - enumerationBuilderImpl = new EnumerationBuilderImpl("package.same.test", "Test"); + enumerationBuilderImpl = new EnumerationBuilderImpl("package.same.test", "Test", context); enumeration = enumerationBuilderImpl.toInstance(enumerationBuilderImpl); formattedString = enumeration.toFormattedString(); @@ -38,7 +40,7 @@ public class EnumerationBuilderImplTest { @Test public void enumTest() { final EnumerationBuilderImpl enumerationBuilderImpl = - new EnumerationBuilderImpl("package.test", "test**"); + new EnumerationBuilderImpl("package.test", "test**", new ModuleContext()); enumerationBuilderImpl.addValue("value", 1, "des", "ref", Status.CURRENT); final Enumeration enumeration = enumerationBuilderImpl.toInstance(enumerationBuilderImpl); final String formattedString = enumeration.toFormattedString(); @@ -52,7 +54,7 @@ public class EnumerationBuilderImplTest { @Test public void enumUniqueTest() { final EnumerationBuilderImpl enumerationBuilderImpl = - new EnumerationBuilderImpl("package.ex.ex.ex.test", "test"); + new EnumerationBuilderImpl("package.ex.ex.ex.test", "test", new ModuleContext()); enumerationBuilderImpl.addValue("foo", 1, "des", "ref", Status.CURRENT); enumerationBuilderImpl.addValue("Foo", 1, "des", "ref", Status.CURRENT); enumerationBuilderImpl.addValue("foo1", 1, "des", "ref", Status.CURRENT); @@ -110,7 +112,7 @@ public class EnumerationBuilderImplTest { @Test public void asteriskInEnumTest() { final EnumerationBuilderImpl enumerationBuilderImpl = - new EnumerationBuilderImpl("package.ex.test", "test**"); + new EnumerationBuilderImpl("package.ex.test", "test**", new ModuleContext()); enumerationBuilderImpl.addValue("val**ue", 1, "des", "ref", Status.CURRENT); enumerationBuilderImpl.addValue("val*ue", 1, "des", "ref", Status.CURRENT); enumerationBuilderImpl.addValue("*value*", 1, "des", "ref", Status.CURRENT); @@ -130,7 +132,7 @@ public class EnumerationBuilderImplTest { @Test public void reverseSolidusInEnumTest() { final EnumerationBuilderImpl enumerationBuilderImpl = - new EnumerationBuilderImpl("package.ex.ex.test", "test\\\\"); + new EnumerationBuilderImpl("package.ex.ex.test", "test\\\\", new ModuleContext()); enumerationBuilderImpl.addValue("val\\\\ue", 1, "des", "ref", Status.CURRENT); enumerationBuilderImpl.addValue("val\\ue", 1, "des", "ref", Status.CURRENT); enumerationBuilderImpl.addValue("\\value\\", 1, "des", "ref", Status.CURRENT); diff --git a/binding2/mdsal-binding2-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/javav2/java/api/generator/renderers/BuilderRenderer.java b/binding2/mdsal-binding2-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/javav2/java/api/generator/renderers/BuilderRenderer.java index 9decef1310..31e3520f55 100644 --- a/binding2/mdsal-binding2-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/javav2/java/api/generator/renderers/BuilderRenderer.java +++ b/binding2/mdsal-binding2-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/javav2/java/api/generator/renderers/BuilderRenderer.java @@ -138,7 +138,7 @@ public class BuilderRenderer extends BaseRenderer { final String prefix = Types.BOOLEAN.equals(method.getReturnType()) ? "is" : "get"; if (method.getName().startsWith(prefix)) { final String fieldName = toFirstLower(method.getName().substring(prefix.length())); - final GeneratedTOBuilderImpl tmpGenTO = new GeneratedTOBuilderImpl("foo", "foo"); + final GeneratedTOBuilderImpl tmpGenTO = new GeneratedTOBuilderImpl("foo", "foo", true); tmpGenTO.addProperty(fieldName) .setReturnType(method.getReturnType()); return tmpGenTO.toInstance().getProperties().get(0); @@ -185,10 +185,12 @@ public class BuilderRenderer extends BaseRenderer { final String fullyQualifiedName = method.getReturnType().getName(); final String aPackage = getPackage(fullyQualifiedName); final String name = getName(fullyQualifiedName); - final GeneratedTOBuilderImpl generatedTOBuilder = new GeneratedTOBuilderImpl(aPackage, name); - final ReferencedTypeImpl referencedType = new ReferencedTypeImpl(aPackage, name, true); + final GeneratedTOBuilderImpl generatedTOBuilder = new GeneratedTOBuilderImpl(aPackage, + name, true); + final ReferencedTypeImpl referencedType = new ReferencedTypeImpl(aPackage, name, true, + null); final ReferencedTypeImpl generic = new ReferencedTypeImpl(getType().getPackageName(), - getType().getName(), true); + getType().getName(), true, null); final ParameterizedType parametrizedReturnType = Types.parameterizedTypeFor(referencedType, generic); generatedTOBuilder.addMethod(method.getName()).setReturnType(parametrizedReturnType); augmentField = propertyFromGetter(generatedTOBuilder.toInstance().getMethodDefinitions().get(0)); diff --git a/binding2/mdsal-binding2-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/javav2/java/api/generator/renderers/BuilderRendererTest.java b/binding2/mdsal-binding2-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/javav2/java/api/generator/renderers/BuilderRendererTest.java index c8b18d3552..11a8c5c22a 100644 --- a/binding2/mdsal-binding2-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/javav2/java/api/generator/renderers/BuilderRendererTest.java +++ b/binding2/mdsal-binding2-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/javav2/java/api/generator/renderers/BuilderRendererTest.java @@ -11,9 +11,11 @@ import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; + import java.util.ArrayList; import java.util.List; import org.junit.Test; +import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext; import org.opendaylight.mdsal.binding.javav2.generator.util.generated.type.builder.GeneratedTypeBuilderImpl; import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedType; import org.opendaylight.mdsal.binding.javav2.model.api.MethodSignature; @@ -123,7 +125,8 @@ public class BuilderRendererTest { final GeneratedType genType = spy(GeneratedType.class); doReturn(TEST).when(genType).getName(); doReturn(TEST).when(genType).getPackageName(); - doReturn(new GeneratedTypeBuilderImpl(new StringBuilder(methodeName).append("test").toString(), methodeName) + doReturn(new GeneratedTypeBuilderImpl(new StringBuilder(methodeName).append("test").toString(), methodeName, + new ModuleContext()) .toInstance()).when(genType).getParentTypeForBuilder(); final List listMethodSign = new ArrayList<>(); @@ -147,7 +150,8 @@ public class BuilderRendererTest { final GeneratedType genType = spy(GeneratedType.class); doReturn(TEST).when(genType).getName(); doReturn(TEST).when(genType).getPackageName(); - doReturn(new GeneratedTypeBuilderImpl(new StringBuilder(methodeName).append("test").toString(), methodeName) + doReturn(new GeneratedTypeBuilderImpl(new StringBuilder(methodeName).append("test").toString(), methodeName, + new ModuleContext()) .toInstance()).when(genType).getParentTypeForBuilder(); final List listMethodSign = new ArrayList<>(); diff --git a/binding2/mdsal-binding2-runtime/src/main/java/org/opendaylight/mdsal/binding/javav2/runtime/context/BindingRuntimeContext.java b/binding2/mdsal-binding2-runtime/src/main/java/org/opendaylight/mdsal/binding/javav2/runtime/context/BindingRuntimeContext.java index 11a1646fe5..3389b96f16 100644 --- a/binding2/mdsal-binding2-runtime/src/main/java/org/opendaylight/mdsal/binding/javav2/runtime/context/BindingRuntimeContext.java +++ b/binding2/mdsal-binding2-runtime/src/main/java/org/opendaylight/mdsal/binding/javav2/runtime/context/BindingRuntimeContext.java @@ -30,7 +30,7 @@ import java.util.Set; import javax.annotation.Nullable; import org.opendaylight.mdsal.binding.javav2.generator.api.ClassLoadingStrategy; import org.opendaylight.mdsal.binding.javav2.generator.impl.BindingGeneratorImpl; -import org.opendaylight.mdsal.binding.javav2.generator.impl.ModuleContext; +import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext; import org.opendaylight.mdsal.binding.javav2.generator.util.JavaIdentifier; import org.opendaylight.mdsal.binding.javav2.generator.util.JavaIdentifierNormalizer; import org.opendaylight.mdsal.binding.javav2.generator.util.ReferencedTypeImpl; @@ -287,13 +287,13 @@ public class BindingRuntimeContext implements Immutable { } private static Type referencedType(final Class type) { - return new ReferencedTypeImpl(type.getPackage().getName(), type.getSimpleName(), true); + return new ReferencedTypeImpl(type.getPackage().getName(), type.getSimpleName(), true, null); } static Type referencedType(final String type) { final int packageClassSeparator = type.lastIndexOf(DOT); return new ReferencedTypeImpl(type.substring(0, packageClassSeparator), - type.substring(packageClassSeparator + 1), true); + type.substring(packageClassSeparator + 1), true, null); } /** @@ -447,7 +447,7 @@ public class BindingRuntimeContext implements Immutable { if (type instanceof ReferencedTypeImpl) { return type; } - return new ReferencedTypeImpl(type.getPackageName(), type.getName()); + return new ReferencedTypeImpl(type.getPackageName(), type.getName(), true, null); } private static Set collectAllContainerTypes(final GeneratedType type, final Set collection) { -- 2.36.6