X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=code-generator%2Fbinding-generator-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fsal%2Fbinding%2Fyang%2Ftypes%2FTypeProviderImpl.java;h=fde03cbdb183061cd7969cbd894ae73494cdaa53;hb=694963e826d61dce6a2568d4b4a8cb7f449d58dc;hp=c87c47e6556b7c0ddc981cf7fbb5193b9594dd1e;hpb=eee777b33567d285c56fa0a2f7152bf0bfe6c253;p=yangtools.git diff --git a/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/yang/types/TypeProviderImpl.java b/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/yang/types/TypeProviderImpl.java index c87c47e655..fde03cbdb1 100644 --- a/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/yang/types/TypeProviderImpl.java +++ b/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/yang/types/TypeProviderImpl.java @@ -7,8 +7,13 @@ */ package org.opendaylight.yangtools.sal.binding.yang.types; -import static org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil.*; -import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.*; +import static org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil.moduleNamespaceToPackageName; +import static org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil.packageNameForGeneratedType; +import static org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil.parseToClassName; +import static org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil.parseToValidParamName; +import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.findDataSchemaNode; +import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.findDataSchemaNodeForRelativeXPath; +import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.findParentModule; import java.util.ArrayList; import java.util.HashMap; @@ -20,6 +25,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.lang.StringEscapeUtils; +import org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil; import org.opendaylight.yangtools.binding.generator.util.TypeConstants; import org.opendaylight.yangtools.binding.generator.util.Types; import org.opendaylight.yangtools.binding.generator.util.generated.type.builder.EnumerationBuilderImpl; @@ -31,21 +37,20 @@ import org.opendaylight.yangtools.sal.binding.model.api.Type; import org.opendaylight.yangtools.sal.binding.model.api.type.builder.EnumBuilder; import org.opendaylight.yangtools.sal.binding.model.api.type.builder.GeneratedPropertyBuilder; import org.opendaylight.yangtools.sal.binding.model.api.type.builder.GeneratedTOBuilder; -import org.opendaylight.yangtools.sal.binding.model.api.type.builder.GeneratedTypeBuilder; +import org.opendaylight.yangtools.sal.binding.model.api.type.builder.GeneratedTypeBuilderBase; 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.LeafListSchemaNode; import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath; import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import org.opendaylight.yangtools.yang.model.api.SchemaNode; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition.Bit; import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition; -import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition.EnumPair; import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.PatternConstraint; @@ -84,7 +89,7 @@ public final class TypeProviderImpl implements TypeProvider { * if schemaContext equal null. */ public TypeProviderImpl(final SchemaContext schemaContext) { - Preconditions.checkArgument(schemaContext != null,"Schema Context cannot be null!"); + Preconditions.checkArgument(schemaContext != null, "Schema Context cannot be null!"); this.schemaContext = schemaContext; this.genTypeDefsContextMap = new HashMap<>(); @@ -107,9 +112,10 @@ public final class TypeProviderImpl implements TypeProvider { * */ public void putReferencedType(final SchemaPath refTypePath, final Type refType) { - Preconditions.checkArgument(refTypePath != null,"Path reference of Enumeration Type Definition cannot be NULL!"); + Preconditions.checkArgument(refTypePath != null, + "Path reference of Enumeration Type Definition cannot be NULL!"); - Preconditions.checkArgument(refType != null,"Reference to Enumeration Type cannot be NULL!"); + Preconditions.checkArgument(refType != null, "Reference to Enumeration Type cannot be NULL!"); referencedTypes.put(refTypePath, refType); } @@ -142,21 +148,23 @@ public final class TypeProviderImpl implements TypeProvider { * */ @Override - public Type javaTypeForSchemaDefinitionType(final TypeDefinition typeDefinition) { + public Type javaTypeForSchemaDefinitionType(final TypeDefinition typeDefinition, final SchemaNode parentNode) { Type returnType = null; - Preconditions.checkArgument(typeDefinition != null,"Type Definition cannot be NULL!"); + Preconditions.checkArgument(typeDefinition != null, "Type Definition cannot be NULL!"); if (typeDefinition.getQName() == null) { throw new IllegalArgumentException( "Type Definition cannot have non specified QName (QName cannot be NULL!)"); } - Preconditions.checkArgument(typeDefinition.getQName().getLocalName() != null,"Type Definitions Local Name cannot be NULL!"); + Preconditions.checkArgument(typeDefinition.getQName().getLocalName() != null, + "Type Definitions Local Name cannot be NULL!"); if (typeDefinition instanceof ExtendedType) { returnType = javaTypeForExtendedType(typeDefinition); } else { - returnType = javaTypeForLeafrefOrIdentityRef(typeDefinition); + returnType = javaTypeForLeafrefOrIdentityRef(typeDefinition, parentNode); if (returnType == null) { - returnType = BaseYangTypes.BASE_YANG_TYPES_PROVIDER.javaTypeForSchemaDefinitionType(typeDefinition); + returnType = BaseYangTypes.BASE_YANG_TYPES_PROVIDER.javaTypeForSchemaDefinitionType(typeDefinition, + parentNode); } } // TODO: add throw exception when we will be able to resolve ALL yang @@ -177,10 +185,10 @@ public final class TypeProviderImpl implements TypeProvider { * type definition which is converted to JAVA Type * @return JAVA Type instance for typeDefinition */ - private Type javaTypeForLeafrefOrIdentityRef(TypeDefinition typeDefinition) { + private Type javaTypeForLeafrefOrIdentityRef(TypeDefinition typeDefinition, SchemaNode parentNode) { if (typeDefinition instanceof LeafrefTypeDefinition) { final LeafrefTypeDefinition leafref = (LeafrefTypeDefinition) typeDefinition; - return provideTypeForLeafref(leafref); + return provideTypeForLeafref(leafref, parentNode); } else if (typeDefinition instanceof IdentityrefTypeDefinition) { final IdentityrefTypeDefinition idref = (IdentityrefTypeDefinition) typeDefinition; return provideTypeForIdentityref(idref); @@ -201,26 +209,32 @@ public final class TypeProviderImpl implements TypeProvider { final String typedefName = typeDefinition.getQName().getLocalName(); final TypeDefinition baseTypeDef = baseTypeDefForExtendedType(typeDefinition); Type returnType = null; - returnType = javaTypeForLeafrefOrIdentityRef(baseTypeDef); + returnType = javaTypeForLeafrefOrIdentityRef(baseTypeDef, typeDefinition); if (returnType == null) { if (baseTypeDef instanceof EnumTypeDefinition) { final EnumTypeDefinition enumTypeDef = (EnumTypeDefinition) baseTypeDef; - returnType = provideTypeForEnum(enumTypeDef, typedefName); + returnType = provideTypeForEnum(enumTypeDef, typedefName, typeDefinition); } else { - final Module module = findParentModuleForTypeDefinition(schemaContext, typeDefinition); + final Module module = findParentModule(schemaContext, typeDefinition); if (module != null) { final Map genTOs = genTypeDefsContextMap.get(module.getName()); if (genTOs != null) { returnType = genTOs.get(typedefName); } if (returnType == null) { - returnType = BaseYangTypes.BASE_YANG_TYPES_PROVIDER - .javaTypeForSchemaDefinitionType(baseTypeDef); + returnType = BaseYangTypes.BASE_YANG_TYPES_PROVIDER.javaTypeForSchemaDefinitionType( + baseTypeDef, typeDefinition); } } } } return returnType; + // TODO: add throw exception when we will be able to resolve ALL yang + // types! + // if (returnType == null) { + // throw new IllegalArgumentException("Type Provider can't resolve " + + // "type for specified Type Definition " + typedefName); + // } } /** @@ -240,14 +254,14 @@ public final class TypeProviderImpl implements TypeProvider { */ private Type provideTypeForIdentityref(IdentityrefTypeDefinition idref) { QName baseIdQName = idref.getIdentity(); - Module module = schemaContext.findModuleByNamespace(baseIdQName.getNamespace()); + Module module = schemaContext.findModuleByNamespaceAndRevision(baseIdQName.getNamespace(),baseIdQName.getRevision()); IdentitySchemaNode identity = null; for (IdentitySchemaNode id : module.getIdentities()) { if (id.getQName().equals(baseIdQName)) { identity = id; } } - Preconditions.checkArgument(identity != null,"Target identity '" + baseIdQName + "' do not exists"); + Preconditions.checkArgument(identity != null, "Target identity '" + baseIdQName + "' do not exists"); final String basePackageName = moduleNamespaceToPackageName(module); final String packageName = packageNameForGeneratedType(basePackageName, identity.getPath()); @@ -273,21 +287,23 @@ public final class TypeProviderImpl implements TypeProvider { *
  • if name of typeDefinition
  • * */ - public Type generatedTypeForExtendedDefinitionType(final TypeDefinition typeDefinition) { + public Type generatedTypeForExtendedDefinitionType(final TypeDefinition typeDefinition, + final SchemaNode parentNode) { Type returnType = null; - Preconditions.checkArgument(typeDefinition != null,"Type Definition cannot be NULL!"); + Preconditions.checkArgument(typeDefinition != null, "Type Definition cannot be NULL!"); if (typeDefinition.getQName() == null) { throw new IllegalArgumentException( "Type Definition cannot have non specified QName (QName cannot be NULL!)"); } - Preconditions.checkArgument(typeDefinition.getQName().getLocalName() != null,"Type Definitions Local Name cannot be NULL!"); + Preconditions.checkArgument(typeDefinition.getQName().getLocalName() != null, + "Type Definitions Local Name cannot be NULL!"); final String typedefName = typeDefinition.getQName().getLocalName(); if (typeDefinition instanceof ExtendedType) { final TypeDefinition baseTypeDef = baseTypeDefForExtendedType(typeDefinition); if (!(baseTypeDef instanceof LeafrefTypeDefinition) && !(baseTypeDef instanceof IdentityrefTypeDefinition)) { - final Module module = findParentModuleForTypeDefinition(schemaContext, typeDefinition); + final Module module = findParentModule(schemaContext, parentNode); if (module != null) { final Map genTOs = genTypeDefsContextMap.get(module.getName()); @@ -311,7 +327,7 @@ public final class TypeProviderImpl implements TypeProvider { * if extendTypeDef equal null */ private TypeDefinition baseTypeDefForExtendedType(final TypeDefinition extendTypeDef) { - Preconditions.checkArgument(extendTypeDef != null,"Type Definiition reference cannot be NULL!"); + Preconditions.checkArgument(extendTypeDef != null, "Type Definiition reference cannot be NULL!"); final TypeDefinition baseTypeDef = extendTypeDef.getBaseType(); if (baseTypeDef instanceof ExtendedType) { return baseTypeDefForExtendedType(baseTypeDef); @@ -338,11 +354,12 @@ public final class TypeProviderImpl implements TypeProvider { * * */ - public Type provideTypeForLeafref(final LeafrefTypeDefinition leafrefType) { + public Type provideTypeForLeafref(final LeafrefTypeDefinition leafrefType, final SchemaNode parentNode) { Type returnType = null; - Preconditions.checkArgument(leafrefType != null,"Leafref Type Definition reference cannot be NULL!"); + Preconditions.checkArgument(leafrefType != null, "Leafref Type Definition reference cannot be NULL!"); - Preconditions.checkArgument(leafrefType.getPathStatement() != null,"The Path Statement for Leafref Type Definition cannot be NULL!"); + Preconditions.checkArgument(leafrefType.getPathStatement() != null, + "The Path Statement for Leafref Type Definition cannot be NULL!"); final RevisionAwareXPath xpath = leafrefType.getPathStatement(); final String strXPath = xpath.toString(); @@ -351,13 +368,13 @@ public final class TypeProviderImpl implements TypeProvider { if (strXPath.contains("[")) { returnType = Types.typeForClass(Object.class); } else { - final Module module = findParentModuleForTypeDefinition(schemaContext, leafrefType); + final Module module = findParentModule(schemaContext, parentNode); if (module != null) { - final DataSchemaNode dataNode; + final SchemaNode dataNode; if (xpath.isAbsolute()) { dataNode = findDataSchemaNode(schemaContext, module, xpath); } else { - dataNode = findDataSchemaNodeForRelativeXPath(schemaContext, module, leafrefType, xpath); + dataNode = findDataSchemaNodeForRelativeXPath(schemaContext, module, parentNode, xpath); } if (leafContainsEnumDefinition(dataNode)) { @@ -386,7 +403,7 @@ public final class TypeProviderImpl implements TypeProvider { *
  • false - other cases
  • * */ - private boolean leafContainsEnumDefinition(final DataSchemaNode dataNode) { + private boolean leafContainsEnumDefinition(final SchemaNode dataNode) { if (dataNode instanceof LeafSchemaNode) { final LeafSchemaNode leaf = (LeafSchemaNode) dataNode; if (leaf.getType() instanceof EnumTypeDefinition) { @@ -410,7 +427,7 @@ public final class TypeProviderImpl implements TypeProvider { *
  • false - other cases
  • * */ - private boolean leafListContainsEnumDefinition(final DataSchemaNode dataNode) { + private boolean leafListContainsEnumDefinition(final SchemaNode dataNode) { if (dataNode instanceof LeafListSchemaNode) { final LeafListSchemaNode leafList = (LeafListSchemaNode) dataNode; if (leafList.getType() instanceof EnumTypeDefinition) { @@ -439,15 +456,18 @@ public final class TypeProviderImpl implements TypeProvider { *
  • if name of enumTypeDef equal null
  • * */ - private Enumeration provideTypeForEnum(final EnumTypeDefinition enumTypeDef, final String enumName) { - Preconditions.checkArgument(enumTypeDef != null,"EnumTypeDefinition reference cannot be NULL!"); - Preconditions.checkArgument(enumTypeDef.getValues() != null,"EnumTypeDefinition MUST contain at least ONE value definition!"); - Preconditions.checkArgument(enumTypeDef.getQName() != null,"EnumTypeDefinition MUST contain NON-NULL QName!"); - Preconditions.checkArgument(enumTypeDef.getQName().getLocalName() != null,"Local Name in EnumTypeDefinition QName cannot be NULL!"); + private Enumeration provideTypeForEnum(final EnumTypeDefinition enumTypeDef, final String enumName, + final SchemaNode parentNode) { + Preconditions.checkArgument(enumTypeDef != null, "EnumTypeDefinition reference cannot be NULL!"); + Preconditions.checkArgument(enumTypeDef.getValues() != null, + "EnumTypeDefinition MUST contain at least ONE value definition!"); + Preconditions.checkArgument(enumTypeDef.getQName() != null, "EnumTypeDefinition MUST contain NON-NULL QName!"); + Preconditions.checkArgument(enumTypeDef.getQName().getLocalName() != null, + "Local Name in EnumTypeDefinition QName cannot be NULL!"); final String enumerationName = parseToClassName(enumName); - Module module = findParentModuleForTypeDefinition(schemaContext, enumTypeDef); + Module module = findParentModule(schemaContext, parentNode); final String basePackageName = moduleNamespaceToPackageName(module); final EnumBuilder enumBuilder = new EnumerationBuilderImpl(basePackageName, enumerationName); @@ -479,12 +499,14 @@ public final class TypeProviderImpl implements TypeProvider { * */ private Enumeration addInnerEnumerationToTypeBuilder(final EnumTypeDefinition enumTypeDef, final String enumName, - final GeneratedTypeBuilder typeBuilder) { - Preconditions.checkArgument(enumTypeDef != null,"EnumTypeDefinition reference cannot be NULL!"); - Preconditions.checkArgument(enumTypeDef.getValues() != null,"EnumTypeDefinition MUST contain at least ONE value definition!"); - Preconditions.checkArgument(enumTypeDef.getQName() != null,"EnumTypeDefinition MUST contain NON-NULL QName!"); - 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 GeneratedTypeBuilderBase typeBuilder) { + Preconditions.checkArgument(enumTypeDef != null, "EnumTypeDefinition reference cannot be NULL!"); + Preconditions.checkArgument(enumTypeDef.getValues() != null, + "EnumTypeDefinition MUST contain at least ONE value definition!"); + Preconditions.checkArgument(enumTypeDef.getQName() != null, "EnumTypeDefinition MUST contain NON-NULL QName!"); + 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 String enumerationName = parseToClassName(enumName); @@ -500,15 +522,15 @@ public final class TypeProviderImpl implements TypeProvider { * contains information about YANG type * @return JAVA Type representation of dataNode */ - private Type resolveTypeFromDataSchemaNode(final DataSchemaNode dataNode) { + private Type resolveTypeFromDataSchemaNode(final SchemaNode dataNode) { Type returnType = null; if (dataNode != null) { if (dataNode instanceof LeafSchemaNode) { final LeafSchemaNode leaf = (LeafSchemaNode) dataNode; - returnType = javaTypeForSchemaDefinitionType(leaf.getType()); + returnType = javaTypeForSchemaDefinitionType(leaf.getType(), leaf); } else if (dataNode instanceof LeafListSchemaNode) { final LeafListSchemaNode leafList = (LeafListSchemaNode) dataNode; - returnType = javaTypeForSchemaDefinitionType(leafList.getType()); + returnType = javaTypeForSchemaDefinitionType(leafList.getType(), leafList); } } return returnType; @@ -530,7 +552,7 @@ public final class TypeProviderImpl implements TypeProvider { */ private void resolveTypeDefsFromContext() { final Set modules = schemaContext.getModules(); - Preconditions.checkArgument(modules != null,"Sef of Modules cannot be NULL!"); + Preconditions.checkArgument(modules != null, "Sef of Modules cannot be NULL!"); final Module[] modulesArray = new Module[modules.size()]; int i = 0; for (Module modul : modules) { @@ -588,11 +610,11 @@ public final class TypeProviderImpl implements TypeProvider { returnType = provideGeneratedTOFromExtendedType(innerExtendedType, basePackageName, typedefName); } else if (innerTypeDefinition instanceof UnionTypeDefinition) { final GeneratedTOBuilder genTOBuilder = provideGeneratedTOBuilderForUnionTypeDef(basePackageName, - typedef, typedefName); + typedef, typedefName, typedef); returnType = genTOBuilder.toInstance(); } else if (innerTypeDefinition instanceof EnumTypeDefinition) { final EnumTypeDefinition enumTypeDef = (EnumTypeDefinition) innerTypeDefinition; - returnType = provideTypeForEnum(enumTypeDef, typedefName); + returnType = provideTypeForEnum(enumTypeDef, typedefName, typedef); } else if (innerTypeDefinition instanceof BitsTypeDefinition) { final BitsTypeDefinition bitsTypeDefinition = (BitsTypeDefinition) innerTypeDefinition; @@ -601,8 +623,8 @@ public final class TypeProviderImpl implements TypeProvider { returnType = genTOBuilder.toInstance(); } else { - final Type javaType = BaseYangTypes.BASE_YANG_TYPES_PROVIDER - .javaTypeForSchemaDefinitionType(innerTypeDefinition); + final Type javaType = BaseYangTypes.BASE_YANG_TYPES_PROVIDER.javaTypeForSchemaDefinitionType( + innerTypeDefinition, typedef); returnType = wrapJavaTypeIntoTO(basePackageName, typedef, javaType); } @@ -632,13 +654,10 @@ public final class TypeProviderImpl implements TypeProvider { private GeneratedTransferObject wrapJavaTypeIntoTO(final String basePackageName, final TypeDefinition typedef, final Type javaType) { if (javaType != null) { - final String typedefName = typedef.getQName().getLocalName(); final String propertyName = "value"; final GeneratedTOBuilder genTOBuilder = typedefToTransferObject(basePackageName, typedef); - final GeneratedPropertyBuilder genPropBuilder = genTOBuilder.addProperty(propertyName); - genPropBuilder.setReturnType(javaType); genTOBuilder.addEqualsIdentity(genPropBuilder); genTOBuilder.addHashIdentity(genPropBuilder); @@ -667,9 +686,9 @@ public final class TypeProviderImpl implements TypeProvider { * builders */ public GeneratedTOBuilder provideGeneratedTOBuilderForUnionTypeDef(final String basePackageName, - final TypeDefinition typedef, String typeDefName) { + final TypeDefinition typedef, String typeDefName, SchemaNode parentNode) { final List genTOBuilders = provideGeneratedTOBuildersForUnionTypeDef(basePackageName, - typedef, typeDefName); + typedef, typeDefName, parentNode); GeneratedTOBuilder resultTOBuilder = null; if (!genTOBuilders.isEmpty()) { resultTOBuilder = genTOBuilders.get(0); @@ -702,13 +721,11 @@ public final class TypeProviderImpl implements TypeProvider { * */ public List provideGeneratedTOBuildersForUnionTypeDef(final String basePackageName, - final TypeDefinition typedef, final String typeDefName) { - Preconditions.checkArgument(basePackageName != null,"Base Package Name cannot be NULL!"); - Preconditions.checkArgument(typedef != null,"Type Definition cannot be NULL!"); - if (typedef.getQName() == null) { - throw new IllegalArgumentException( - "Type Definition cannot have non specified QName (QName cannot be NULL!)"); - } + final TypeDefinition typedef, final String typeDefName, final SchemaNode parentNode) { + Preconditions.checkArgument(basePackageName != null, "Base Package Name cannot be NULL!"); + Preconditions.checkArgument(typedef != null, "Type Definition cannot be NULL!"); + Preconditions.checkArgument(typedef.getQName() != null, + "Type Definition cannot have non specified QName (QName cannot be NULL!)"); final List generatedTOBuilders = new ArrayList<>(); @@ -726,33 +743,30 @@ public final class TypeProviderImpl implements TypeProvider { } generatedTOBuilders.add(unionGenTOBuilder); unionGenTOBuilder.setIsUnion(true); - final List regularExpressions = new ArrayList(); for (final TypeDefinition unionType : unionTypes) { final String unionTypeName = unionType.getQName().getLocalName(); if (unionType instanceof UnionType) { - generatedTOBuilders - .addAll(resolveUnionSubtypeAsUnion(unionGenTOBuilder, unionType, basePackageName)); + generatedTOBuilders.addAll(resolveUnionSubtypeAsUnion(unionGenTOBuilder, unionType, + basePackageName, parentNode)); } else if (unionType instanceof ExtendedType) { resolveExtendedSubtypeAsUnion(unionGenTOBuilder, (ExtendedType) unionType, unionTypeName, - regularExpressions); + regularExpressions, parentNode); } else if (unionType instanceof EnumTypeDefinition) { final Enumeration enumeration = addInnerEnumerationToTypeBuilder((EnumTypeDefinition) unionType, unionTypeName, unionGenTOBuilder); updateUnionTypeAsProperty(unionGenTOBuilder, enumeration, unionTypeName); } else { - final Type javaType = BaseYangTypes.BASE_YANG_TYPES_PROVIDER - .javaTypeForSchemaDefinitionType(unionType); - if (javaType != null) { - updateUnionTypeAsProperty(unionGenTOBuilder, javaType, unionTypeName); - } + final Type javaType = BaseYangTypes.BASE_YANG_TYPES_PROVIDER.javaTypeForSchemaDefinitionType( + unionType, parentNode); + updateUnionTypeAsProperty(unionGenTOBuilder, javaType, unionTypeName); } } if (!regularExpressions.isEmpty()) { addStringRegExAsConstant(unionGenTOBuilder, regularExpressions); } - storeGenTO(typedef, unionGenTOBuilder); + storeGenTO(typedef, unionGenTOBuilder, parentNode); } return generatedTOBuilders; } @@ -780,12 +794,14 @@ public final class TypeProviderImpl implements TypeProvider { * provideGeneratedTOBuildersForUnionTypeDef method. */ private List resolveUnionSubtypeAsUnion(final GeneratedTOBuilder parentUnionGenTOBuilder, - final TypeDefinition unionSubtype, final String basePackageName) { + final TypeDefinition unionSubtype, final String basePackageName, final SchemaNode parentNode) { final String newTOBuilderName = provideAvailableNameForGenTOBuilder(parentUnionGenTOBuilder.getName()); final List subUnionGenTOBUilders = provideGeneratedTOBuildersForUnionTypeDef( - basePackageName, unionSubtype, newTOBuilderName); + basePackageName, unionSubtype, newTOBuilderName, parentNode); - GeneratedPropertyBuilder propertyBuilder = parentUnionGenTOBuilder.addProperty(newTOBuilderName); + final GeneratedPropertyBuilder propertyBuilder; + propertyBuilder = parentUnionGenTOBuilder.addProperty(BindingGeneratorUtil + .parseToValidParamName(newTOBuilderName)); propertyBuilder.setReturnType(subUnionGenTOBUilders.get(0)); parentUnionGenTOBuilder.addEqualsIdentity(propertyBuilder); parentUnionGenTOBuilder.addToStringProperty(propertyBuilder); @@ -812,14 +828,16 @@ public final class TypeProviderImpl implements TypeProvider { * list of strings with the regular expressions */ private void resolveExtendedSubtypeAsUnion(final GeneratedTOBuilder parentUnionGenTOBuilder, - final ExtendedType unionSubtype, final String unionTypeName, final List regularExpressions) { - final Type genTO = findGenTO(unionSubtype, unionTypeName); + final ExtendedType unionSubtype, final String unionTypeName, final List regularExpressions, + final SchemaNode parentNode) { + final Type genTO = findGenTO(unionTypeName, parentNode); if (genTO != null) { updateUnionTypeAsProperty(parentUnionGenTOBuilder, genTO, genTO.getName()); } else { final TypeDefinition baseType = baseTypeDefForExtendedType(unionSubtype); if (unionTypeName.equals(baseType.getQName().getLocalName())) { - final Type javaType = BaseYangTypes.BASE_YANG_TYPES_PROVIDER.javaTypeForSchemaDefinitionType(baseType); + final Type javaType = BaseYangTypes.BASE_YANG_TYPES_PROVIDER.javaTypeForSchemaDefinitionType(baseType, + parentNode); if (javaType != null) { updateUnionTypeAsProperty(parentUnionGenTOBuilder, javaType, unionTypeName); } @@ -834,15 +852,13 @@ public final class TypeProviderImpl implements TypeProvider { * Searches for generated TO for searchedTypeDef type * definition in {@link #genTypeDefsContextMap genTypeDefsContextMap} * - * @param searchedTypeDef - * type definition for which is generatet TO sought * @param searchedTypeName * string with name of searchedTypeDef * @return generated TO for searchedTypeDef or * null it it doesn't exist */ - private Type findGenTO(final TypeDefinition searchedTypeDef, final String searchedTypeName) { - final Module typeModule = findParentModuleForTypeDefinition(schemaContext, searchedTypeDef); + private Type findGenTO(final String searchedTypeName, final SchemaNode parentNode) { + final Module typeModule = findParentModule(schemaContext, parentNode); if (typeModule != null && typeModule.getName() != null) { final Map genTOs = genTypeDefsContextMap.get(typeModule.getName()); if (genTOs != null) { @@ -863,10 +879,10 @@ public final class TypeProviderImpl implements TypeProvider { * generated TO builder which is converted to generated TO and * stored */ - private void storeGenTO(TypeDefinition newTypeDef, GeneratedTOBuilder genTOBuilder) { + private void storeGenTO(TypeDefinition newTypeDef, GeneratedTOBuilder genTOBuilder, SchemaNode parentNode) { if (!(newTypeDef instanceof UnionType)) { Map genTOsMap = null; - final Module parentModule = findParentModuleForTypeDefinition(schemaContext, newTypeDef); + final Module parentModule = findParentModule(schemaContext, parentNode); if (parentModule != null && parentModule.getName() != null) { genTOsMap = genTypeDefsContextMap.get(parentModule.getName()); genTOsMap.put(newTypeDef.getQName().getLocalName(), genTOBuilder.toInstance()); @@ -889,16 +905,14 @@ public final class TypeProviderImpl implements TypeProvider { */ private void updateUnionTypeAsProperty(final GeneratedTOBuilder unionGenTransObject, final Type type, final String propertyName) { - if (unionGenTransObject != null && type != null) { - if (!unionGenTransObject.containsProperty(propertyName)) { - final GeneratedPropertyBuilder propBuilder = unionGenTransObject - .addProperty(parseToValidParamName(propertyName)); - propBuilder.setReturnType(type); - - unionGenTransObject.addEqualsIdentity(propBuilder); - unionGenTransObject.addHashIdentity(propBuilder); - unionGenTransObject.addToStringProperty(propBuilder); - } + if (unionGenTransObject != null && type != null && !unionGenTransObject.containsProperty(propertyName)) { + final GeneratedPropertyBuilder propBuilder = unionGenTransObject + .addProperty(parseToValidParamName(propertyName)); + propBuilder.setReturnType(type); + + unionGenTransObject.addEqualsIdentity(propBuilder); + unionGenTransObject.addHashIdentity(propBuilder); + unionGenTransObject.addToStringProperty(propBuilder); } } @@ -920,7 +934,7 @@ public final class TypeProviderImpl implements TypeProvider { if ((packageName != null) && (typedef != null) && (typeDefTOName != null)) { final String genTOName = parseToClassName(typeDefTOName); final GeneratedTOBuilder newType = new GeneratedTOBuilderImpl(packageName, genTOName); - + newType.addComment(typedef.getDescription()); return newType; } return null; @@ -949,8 +963,8 @@ public final class TypeProviderImpl implements TypeProvider { public GeneratedTOBuilder provideGeneratedTOBuilderForBitsTypeDefinition(final String basePackageName, final TypeDefinition typeDef, String typeDefName) { - Preconditions.checkArgument(typeDef != null,"typeDef cannot be NULL!"); - Preconditions.checkArgument(basePackageName != null,"Base Package Name cannot be NULL!"); + Preconditions.checkArgument(typeDef != null, "typeDef cannot be NULL!"); + Preconditions.checkArgument(basePackageName != null, "Base Package Name cannot be NULL!"); if (typeDef instanceof BitsTypeDefinition) { BitsTypeDefinition bitsTypeDefinition = (BitsTypeDefinition) typeDef; @@ -989,7 +1003,7 @@ public final class TypeProviderImpl implements TypeProvider { */ private List resolveRegExpressionsFromTypedef(ExtendedType typedef) { final List regExps = new ArrayList(); - Preconditions.checkArgument(typedef != null,"typedef can't be null"); + Preconditions.checkArgument(typedef != null, "typedef can't be null"); final TypeDefinition strTypeDef = baseTypeDefForExtendedType(typedef); if (strTypeDef instanceof StringType) { final List patternConstraints = typedef.getPatterns(); @@ -1023,11 +1037,12 @@ public final class TypeProviderImpl implements TypeProvider { * */ private void addStringRegExAsConstant(GeneratedTOBuilder genTOBuilder, List regularExpressions) { - if (genTOBuilder == null) - throw new IllegalArgumentException("genTOBuilder can't be null"); - if (regularExpressions == null) - throw new IllegalArgumentException("regularExpressions can't be null"); - + if (genTOBuilder == null) { + throw new IllegalArgumentException("Generated transfer object builder can't be null"); + } + if (regularExpressions == null) { + throw new IllegalArgumentException("List of regular expressions can't be null"); + } if (!regularExpressions.isEmpty()) { genTOBuilder.addConstant(Types.listTypeFor(BaseYangTypes.STRING_TYPE), TypeConstants.PATTERN_CONSTANT_NAME, regularExpressions); @@ -1062,16 +1077,16 @@ public final class TypeProviderImpl implements TypeProvider { private GeneratedTransferObject provideGeneratedTOFromExtendedType(final ExtendedType innerExtendedType, final String basePackageName, final String typedefName) { - Preconditions.checkArgument(innerExtendedType != null,"Extended type cannot be NULL!"); - Preconditions.checkArgument(basePackageName != null,"String with base package name cannot be NULL!"); - Preconditions.checkArgument(typedefName != null,"String with type definition name cannot be NULL!"); + Preconditions.checkArgument(innerExtendedType != null, "Extended type cannot be NULL!"); + Preconditions.checkArgument(basePackageName != null, "String with base package name cannot be NULL!"); + Preconditions.checkArgument(typedefName != null, "String with type definition name cannot be NULL!"); final String classTypedefName = parseToClassName(typedefName); final String innerTypeDef = innerExtendedType.getQName().getLocalName(); final GeneratedTOBuilder genTOBuilder = new GeneratedTOBuilderImpl(basePackageName, classTypedefName); Map typeMap = null; - final Module parentModule = findParentModuleForTypeDefinition(schemaContext, innerExtendedType); + final Module parentModule = findParentModule(schemaContext, innerExtendedType); if (parentModule != null) { typeMap = genTypeDefsContextMap.get(parentModule.getName()); } @@ -1114,9 +1129,8 @@ public final class TypeProviderImpl implements TypeProvider { } typeDefinitionsConcreteDepth.add(unsortedTypeDefinition); } - - Set depths = typeDefinitionsDepths.keySet(); // keys are in - // ascending order + // keys are in ascending order + Set depths = typeDefinitionsDepths.keySet(); for (Integer depth : depths) { sortedTypeDefinition.addAll(typeDefinitionsDepths.get(depth)); } @@ -1134,7 +1148,7 @@ public final class TypeProviderImpl implements TypeProvider { * definition to the base type */ private int getTypeDefinitionDepth(final TypeDefinition typeDefinition) { - Preconditions.checkArgument(typeDefinition != null,"Type definition can't be null"); + Preconditions.checkArgument(typeDefinition != null, "Type definition can't be null"); int depth = 1; TypeDefinition baseType = typeDefinition.getBaseType();