X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=binding2%2Fmdsal-binding2-generator-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fmdsal%2Fbinding%2Fjavav2%2Fgenerator%2Fyang%2Ftypes%2FTypeProviderImpl.java;h=88ff434cd50cba53051685bf2dfd22049a3622d1;hb=refs%2Fchanges%2F94%2F61594%2F1;hp=ef2109f478994ad8b27be64e89ad5f3214a286b5;hpb=1afe342354d4201c2597968120cba6eb71336bd5;p=mdsal.git 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 ef2109f478..88ff434cd5 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 @@ -9,6 +9,8 @@ package org.opendaylight.mdsal.binding.javav2.generator.yang.types; import static org.opendaylight.mdsal.binding.javav2.generator.util.BindingGeneratorUtil.encodeAngleBrackets; +import static org.opendaylight.mdsal.binding.javav2.generator.util.BindingGeneratorUtil.packageNameWithNamespacePrefix; +import static org.opendaylight.mdsal.binding.javav2.generator.util.Types.getOuterClassPackageName; import static org.opendaylight.mdsal.binding.javav2.generator.yang.types.TypeGenHelper.addStringRegExAsConstant; import static org.opendaylight.mdsal.binding.javav2.generator.yang.types.TypeGenHelper.baseTypeDefForExtendedType; import static org.opendaylight.mdsal.binding.javav2.generator.yang.types.TypeGenHelper.getAllTypedefs; @@ -24,6 +26,7 @@ import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.findD import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.findDataSchemaNodeForRelativeXPath; import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.findParentModule; +import com.google.common.base.Optional; import com.google.common.annotations.Beta; import com.google.common.base.Preconditions; import com.google.common.base.Strings; @@ -38,6 +41,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; @@ -61,6 +65,7 @@ import org.opendaylight.mdsal.binding.javav2.util.BindingMapping; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.DataNodeContainer; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; +import org.opendaylight.yangtools.yang.model.api.DerivableSchemaNode; import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode; import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode; import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; @@ -80,10 +85,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 { @@ -127,8 +133,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); } /** @@ -140,13 +147,15 @@ public final class TypeProviderImpl implements TypeProvider { * @throws IllegalArgumentException * */ @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 @@ -183,17 +192,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()); @@ -205,13 +208,15 @@ public final class TypeProviderImpl implements TypeProvider { } modulesSortedByDependency.stream().filter(module -> module != null).forEach(module -> { - final String basePackageName = getRootPackageName(module); + ModuleContext context = new ModuleContext(); + final String basePackageName = packageNameWithNamespacePrefix(getRootPackageName(module), + BindingNamespaceType.Typedef); final List> typeDefinitions = getAllTypedefs(module); final List> listTypeDefinitions = sortTypeDefinitionAccordingDepth(typeDefinitions); if (listTypeDefinitions != null) { for (final TypeDefinition typedef : listTypeDefinitions) { typedefToGeneratedType(basePackageName, module, typedef, genTypeDefsContextMap, - additionalTypes, schemaContext); + additionalTypes, schemaContext, context); } } }); @@ -294,8 +299,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!"); @@ -303,7 +308,8 @@ public final class TypeProviderImpl implements TypeProvider { if (typeDef instanceof BitsTypeDefinition) { final BitsTypeDefinition bitsTypeDefinition = (BitsTypeDefinition) typeDef; - final GeneratedTOBuilderImpl genTOBuilder = new GeneratedTOBuilderImpl(basePackageName, typeDefName); + final GeneratedTOBuilderImpl genTOBuilder = new GeneratedTOBuilderImpl(basePackageName, typeDefName, + true, false, context); final String typedefDescription = encodeAngleBrackets(typeDef.getDescription()); genTOBuilder.setDescription(typedefDescription); @@ -348,13 +354,13 @@ public final class TypeProviderImpl implements TypeProvider { *
    *
  • if basePackageName is null
  • *
  • if typedef is null
  • - *
  • if Qname of typedef is null
  • + *
  • if QName of typedef is null
  • *
*/ @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!"); @@ -364,16 +370,13 @@ public final class TypeProviderImpl implements TypeProvider { final Module module = findParentModule(schemaContext, parentNode); final GeneratedTOBuilderImpl unionGenTOBuilder; - if (typeDefName != null && !typeDefName.isEmpty()) { - unionGenTOBuilder = new GeneratedTOBuilderImpl(basePackageName, typeDefName); - final String typedefDescription = encodeAngleBrackets(typedef.getDescription()); - unionGenTOBuilder.setDescription(typedefDescription); - unionGenTOBuilder.setReference(typedef.getReference()); - unionGenTOBuilder.setSchemaPath((List) typedef.getPath().getPathFromRoot()); - unionGenTOBuilder.setModuleName(module.getName()); - } else { - unionGenTOBuilder = typedefToTransferObject(basePackageName, typedef, module.getName()); - } + unionGenTOBuilder = new GeneratedTOBuilderImpl(basePackageName, typeDefName, true, false, + context); + final String typedefDescription = encodeAngleBrackets(typedef.getDescription()); + unionGenTOBuilder.setDescription(typedefDescription); + unionGenTOBuilder.setReference(typedef.getReference()); + unionGenTOBuilder.setSchemaPath((List) typedef.getPath().getPathFromRoot()); + unionGenTOBuilder.setModuleName(module.getName()); generatedTOBuilders.add(unionGenTOBuilder); unionGenTOBuilder.setIsUnion(true); @@ -384,15 +387,16 @@ public final class TypeProviderImpl implements TypeProvider { resolveExtendedSubtypeAsUnion(unionGenTOBuilder, unionType, regularExpressions, parentNode, schemaContext, genTypeDefsContextMap); } else if (unionType instanceof UnionTypeDefinition) { - generatedTOBuilders.addAll(resolveUnionSubtypeAsUnion(unionGenTOBuilder, (UnionTypeDefinition) unionType, - basePackageName, parentNode, schemaContext, genTypeDefsContextMap)); + generatedTOBuilders.add(resolveUnionSubtypeAsUnion(unionGenTOBuilder, (UnionTypeDefinition) unionType, + 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); } } @@ -418,8 +422,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!"); @@ -430,19 +435,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); } @@ -450,17 +458,19 @@ public final class TypeProviderImpl implements TypeProvider { return ret; } - Type returnType = javaTypeForExtendedType(typeDefinition, schemaContext, genTypeDefsContextMap); - if (r != null && returnType instanceof GeneratedTransferObject) { + 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); + final Module module1 = findParentModule(schemaContext, typeDefinition); final String basePackageName = BindingMapping.getRootPackageName(module); final String packageName = BindingGeneratorUtil.packageNameForGeneratedType(basePackageName, typeDefinition .getPath(), BindingNamespaceType.Typedef); - final String genTOName = JavaIdentifierNormalizer.normalizeClassIdentifier(packageName, typedefName); + final String genTOName = + JavaIdentifierNormalizer.normalizeSpecificIdentifier(typedefName, JavaIdentifier.CLASS); final String name = packageName + "." + genTOName; - if (!(returnType.getFullyQualifiedName().equals(name))) { - returnType = shadedTOWithRestrictions(gto, r); + if (module.equals(module1) && !(returnType.getFullyQualifiedName().equals(name))) { + returnType = shadedTOWithRestrictions(gto, r, context); } } return returnType; @@ -481,9 +491,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)) { @@ -494,49 +504,34 @@ 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()); makeSerializable((GeneratedTOBuilderImpl) genTOBuilder); returnType = genTOBuilder.toInstance(); - // union builder - final GeneratedTOBuilder unionBuilder = new GeneratedTOBuilderImpl(genTOBuilder.getPackageName(), - genTOBuilder.getName() + "Builder"); - unionBuilder.setIsUnionBuilder(true); - final MethodSignatureBuilder method = unionBuilder.addMethod("getDefaultInstance"); - method.setReturnType(returnType); - method.addParameter(Types.STRING, "defaultValue"); - method.setAccessModifier(AccessModifier.PUBLIC); - method.setStatic(true); - Set types = additionalTypes.get(module); - if (types == null) { - types = Sets.newHashSet(unionBuilder.toInstance()); - additionalTypes.put(module, types); - } else { - types.add(unionBuilder.toInstance()); - } } else if (innerTypeDefinition instanceof EnumTypeDefinition) { // 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); @@ -563,29 +558,25 @@ 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) { - if (baseTypeDef instanceof EnumTypeDefinition) { - final EnumTypeDefinition enumTypeDef = (EnumTypeDefinition) baseTypeDef; - returnType = provideTypeForEnum(enumTypeDef, typedefName, typeDefinition, schemaContext); - } else { - final Module module = findParentModule(schemaContext, typeDefinition); - final Restrictions r = BindingGeneratorUtil.getRestrictions(typeDefinition); - if (module != null) { - final Map> modulesByDate = genTypeDefsContextMap.get(module.getName()); - final Map genTOs = modulesByDate.get(module.getRevision()); - if (genTOs != null) { - returnType = genTOs.get(typedefName); - } - if (returnType == null) { - returnType = BaseYangTypes.BASE_YANG_TYPES_PROVIDER.javaTypeForSchemaDefinitionType( - baseTypeDef, typeDefinition, r); - } + final Module module = findParentModule(schemaContext, typeDefinition); + final Restrictions r = BindingGeneratorUtil.getRestrictions(typeDefinition); + if (module != null) { + final Map> modulesByDate = genTypeDefsContextMap.get(module.getName()); + final Map genTOs = modulesByDate.get(module.getRevision()); + if (genTOs != null) { + returnType = genTOs.get(typedefName); + } + if (returnType == null) { + returnType = BaseYangTypes.BASE_YANG_TYPES_PROVIDER.javaTypeForSchemaDefinitionType( + baseTypeDef, typeDefinition, r, context); } } } @@ -602,14 +593,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); @@ -636,7 +628,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,17 +639,26 @@ public final class TypeProviderImpl implements TypeProvider { final RevisionAwareXPath xpath = leafrefType.getPathStatement(); final String strXPath = xpath.toString(); - if (strXPath != null) { if (strXPath.indexOf('[') == -1) { - final Module module = findParentModule(schemaContext, parentNode); + final Module module; + final SchemaNode actualParentSchemaNode; + if ((parentNode instanceof DerivableSchemaNode) && ((DerivableSchemaNode) parentNode).isAddedByUses()) { + final Optional originalNode = ((DerivableSchemaNode) parentNode).getOriginal(); + Preconditions.checkArgument(originalNode.isPresent(), "originalNode can not be null."); + actualParentSchemaNode = originalNode.get(); + module = findParentModule(schemaContext, originalNode.get()); + } else { + actualParentSchemaNode = parentNode; + module = findParentModule(schemaContext, parentNode); + } Preconditions.checkArgument(module != null, "Failed to find module for parent %s", parentNode); final SchemaNode dataNode; if (xpath.isAbsolute()) { dataNode = findDataSchemaNode(schemaContext, module, xpath); } else { - dataNode = findDataSchemaNodeForRelativeXPath(schemaContext, module, parentNode, xpath); + dataNode = findDataSchemaNodeForRelativeXPath(schemaContext, module, actualParentSchemaNode, xpath); } Preconditions.checkArgument(dataNode != null, "Failed to find leafref target: %s in module %s (%s)", strXPath, getParentModule(parentNode, schemaContext).getName(), parentNode.getQName().getModule()); @@ -666,7 +668,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); @@ -733,17 +735,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; @@ -779,48 +782,19 @@ public final class TypeProviderImpl implements TypeProvider { final String basePackageName = BindingMapping.getRootPackageName(module); final String packageName = BindingGeneratorUtil.packageNameForGeneratedType(basePackageName, identity.getPath - (), BindingNamespaceType.Typedef); - final String genTypeName = - JavaIdentifierNormalizer.normalizeClassIdentifier(packageName, identity.getQName().getLocalName()); + (), BindingNamespaceType.Identity); + + final String genTypeName = JavaIdentifierNormalizer.normalizeSpecificIdentifier(identity.getQName().getLocalName(), + JavaIdentifier.CLASS); final Type baseType = Types.typeForClass(Class.class); - final Type paramType = Types.wildcardTypeFor(packageName, genTypeName); + 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); @@ -869,8 +843,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. @@ -886,22 +859,24 @@ public final class TypeProviderImpl implements TypeProvider { * bigger one due to recursive call of * provideGeneratedTOBuildersForUnionTypeDef method. */ - private List 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 List subUnionGenTOBUilders = provideGeneratedTOBuildersForUnionTypeDef( - basePackageName, unionSubtype, newTOBuilderName, parentNode, schemaContext, genTypeDefsContextMap); + final GeneratedTOBuilder subUnionGenTOBUilder = provideGeneratedTOBuilderForUnionTypeDef( + basePackageName, unionSubtype, newTOBuilderName, parentNode, schemaContext, genTypeDefsContextMap, + context); final GeneratedPropertyBuilder propertyBuilder; propertyBuilder = parentUnionGenTOBuilder .addProperty(JavaIdentifierNormalizer.normalizeSpecificIdentifier(newTOBuilderName, JavaIdentifier.METHOD)); - propertyBuilder.setReturnType(subUnionGenTOBUilders.get(0)); + propertyBuilder.setReturnType(subUnionGenTOBUilder); parentUnionGenTOBuilder.addEqualsIdentity(propertyBuilder); parentUnionGenTOBuilder.addToStringProperty(propertyBuilder); - return subUnionGenTOBUilders; + return subUnionGenTOBUilder; } /** @@ -918,12 +893,13 @@ public final class TypeProviderImpl implements TypeProvider { * @return generated TO builder with the list of enclosed generated TO * builders */ - private GeneratedTOBuilder provideGeneratedTOBuilderForUnionTypeDef(final String basePackageName, - final UnionTypeDefinition typedef, final String typeDefName, final SchemaNode parentNode, final SchemaContext - schemaContext, final Map>> genTypeDefsContextMap) { + public GeneratedTOBuilder provideGeneratedTOBuilderForUnionTypeDef(final String basePackageName, + 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); @@ -931,10 +907,51 @@ public final class TypeProviderImpl implements TypeProvider { resultTOBuilder.addEnclosingTransferObject(genTOBuilder); } - resultTOBuilder.addProperty("value").setReturnType(Types.CHAR_ARRAY); + final GeneratedPropertyBuilder genPropBuilder; + + genPropBuilder = resultTOBuilder.addProperty("value").setReturnType(Types.CHAR_ARRAY).setReadOnly(false); + resultTOBuilder.addEqualsIdentity(genPropBuilder); + resultTOBuilder.addHashIdentity(genPropBuilder); + resultTOBuilder.addToStringProperty(genPropBuilder); + + provideGeneratedTOBuilderForUnionBuilder(findParentModule(schemaContext, parentNode), resultTOBuilder); + return resultTOBuilder; } + + private GeneratedTOBuilder provideGeneratedTOBuilderForUnionBuilder(final Module parentModule, + final GeneratedTOBuilder genTOBuilder) { + final String outerCls = Types.getOuterClassName(genTOBuilder); + final StringBuilder name; + if (outerCls != null) { + name = new StringBuilder(outerCls); + } else { + name = new StringBuilder(); + } + name.append(genTOBuilder.getName()); + name.append("Builder"); + final GeneratedTOBuilderImpl unionBuilder = new GeneratedTOBuilderImpl(getOuterClassPackageName(genTOBuilder), + name.toString(), true); + unionBuilder.setIsUnionBuilder(true); + + final MethodSignatureBuilder method = unionBuilder.addMethod("getDefaultInstance"); + method.setReturnType(genTOBuilder); + method.addParameter(Types.STRING, "defaultValue"); + method.setAccessModifier(AccessModifier.PUBLIC); + method.setStatic(true); + + final Set types = this.getAdditionalTypes().get(parentModule); + if (types == null) { + this.getAdditionalTypes().put(parentModule, + Sets.newHashSet(unionBuilder.toInstance())); + } else { + types.add(unionBuilder.toInstance()); + } + + return unionBuilder; + } + /** * Wraps code which handle case when union subtype is of the type * ExtendedType. @@ -954,19 +971,19 @@ 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); if (genTO != null) { - updateUnionTypeAsProperty(parentUnionGenTOBuilder, genTO, genTO.getName()); + updateUnionTypeAsProperty(parentUnionGenTOBuilder, genTO, unionTypeName); } else { 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); } @@ -1006,7 +1023,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) { @@ -1042,13 +1059,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); @@ -1056,7 +1074,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()