X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;ds=sidebyside;f=binding%2Fmdsal-binding-generator-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fsal%2Fbinding%2Fyang%2Ftypes%2FTypeProviderImpl.java;h=4c91e037f2f93576efc4745ad2cfd30dbd861817;hb=refs%2Fchanges%2F19%2F57619%2F10;hp=80571e4b6a7b60e4330367b7201edf3bd8032d3a;hpb=e48bd1d8063e49ea4d5604ce5dbeff9ac1de4e63;p=mdsal.git diff --git a/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/yang/types/TypeProviderImpl.java b/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/yang/types/TypeProviderImpl.java index 80571e4b6a..4c91e037f2 100644 --- a/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/yang/types/TypeProviderImpl.java +++ b/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/yang/types/TypeProviderImpl.java @@ -11,7 +11,6 @@ import static org.opendaylight.yangtools.binding.generator.util.BindingGenerator 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 com.google.common.base.Preconditions; import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; @@ -66,6 +65,7 @@ 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.Status; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.BinaryTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition; @@ -80,11 +80,8 @@ import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.PatternConstraint; 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.Decimal64; -import org.opendaylight.yangtools.yang.model.util.ExtendedType; import org.opendaylight.yangtools.yang.model.util.RevisionAwareXPathImpl; import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil; -import org.opendaylight.yangtools.yang.model.util.UnionType; import org.opendaylight.yangtools.yang.model.util.type.BaseTypes; import org.opendaylight.yangtools.yang.model.util.type.CompatUtils; import org.opendaylight.yangtools.yang.parser.util.YangValidationException; @@ -95,6 +92,11 @@ public final class TypeProviderImpl implements TypeProvider { private static final Logger LOG = LoggerFactory.getLogger(TypeProviderImpl.class); private static final Pattern NUMBERS_PATTERN = Pattern.compile("[0-9]+\\z"); + // Backwards compatibility: Union types used to be instantiated in YANG namespace, which is no longer + // the case, as unions are emitted to their correct schema path. + private static final SchemaPath UNION_PATH = SchemaPath.create(true, + org.opendaylight.yangtools.yang.model.util.BaseTypes.UNION_QNAME); + /** * Contains the schema data red from YANG files. */ @@ -147,11 +149,11 @@ public final class TypeProviderImpl implements TypeProvider { Preconditions.checkArgument(refTypePath != null, "Path reference of Enumeration Type Definition cannot be NULL!"); Preconditions.checkArgument(refType != null, "Reference to Enumeration Type cannot be NULL!"); - referencedTypes.put(refTypePath, refType); + this.referencedTypes.put(refTypePath, refType); } public Map> getAdditionalTypes() { - return additionalTypes; + return this.additionalTypes; } /** @@ -192,15 +194,15 @@ public final class TypeProviderImpl implements TypeProvider { Preconditions.checkArgument(typeDefinition != null, "Type Definition cannot be NULL!"); Preconditions.checkArgument(typeDefinition.getQName() != null, "Type Definition cannot have non specified QName (QName cannot be NULL!)"); - String typedefName = typeDefinition.getQName().getLocalName(); + final String typedefName = typeDefinition.getQName().getLocalName(); Preconditions.checkArgument(typedefName != null, "Type Definitions Local Name cannot be NULL!"); // Deal with base types if (typeDefinition.getBaseType() == null) { // We have to deal with differing handling of decimal64. The old parser used a fixed Decimal64 type // and generated an enclosing ExtendedType to hold any range constraints. The new parser instantiates - // a base type which holds these constraints -- and the class is not a Decimal64. - if (typeDefinition instanceof DecimalTypeDefinition && !(typeDefinition instanceof Decimal64)) { + // a base type which holds these constraints. + if (typeDefinition instanceof DecimalTypeDefinition) { final Type ret = BaseYangTypes.BASE_YANG_TYPES_PROVIDER.javaTypeForSchemaDefinitionType(typeDefinition, parentNode, r); if (ret != null) { return ret; @@ -224,12 +226,12 @@ public final class TypeProviderImpl implements TypeProvider { Type returnType = javaTypeForExtendedType(typeDefinition); if (r != null && returnType instanceof GeneratedTransferObject) { - GeneratedTransferObject gto = (GeneratedTransferObject) returnType; - Module module = findParentModule(schemaContext, parentNode); - String basePackageName = BindingMapping.getRootPackageName(module.getQNameModule()); - String packageName = BindingGeneratorUtil.packageNameForGeneratedType(basePackageName, typeDefinition.getPath()); - String genTOName = BindingMapping.getClassName(typedefName); - String name = packageName + "." + genTOName; + final GeneratedTransferObject gto = (GeneratedTransferObject) returnType; + final Module module = findParentModule(this.schemaContext, parentNode); + final String basePackageName = BindingMapping.getRootPackageName(module.getQNameModule()); + final String packageName = BindingGeneratorUtil.packageNameForGeneratedType(basePackageName, typeDefinition.getPath()); + final String genTOName = BindingMapping.getClassName(typedefName); + final String name = packageName + "." + genTOName; if (!(returnType.getFullyQualifiedName().equals(name))) { returnType = shadedTOWithRestrictions(gto, r); } @@ -238,14 +240,14 @@ public final class TypeProviderImpl implements TypeProvider { } private static GeneratedTransferObject shadedTOWithRestrictions(final GeneratedTransferObject gto, final Restrictions r) { - GeneratedTOBuilder gtob = new GeneratedTOBuilderImpl(gto.getPackageName(), gto.getName()); - GeneratedTransferObject parent = gto.getSuperType(); + final GeneratedTOBuilder gtob = new GeneratedTOBuilderImpl(gto.getPackageName(), gto.getName()); + final GeneratedTransferObject parent = gto.getSuperType(); if (parent != null) { gtob.setExtendsType(parent); } gtob.setRestrictions(r); - for (GeneratedProperty gp : gto.getProperties()) { - GeneratedPropertyBuilder gpb = gtob.addProperty(gp.getName()); + for (final GeneratedProperty gp : gto.getProperties()) { + final GeneratedPropertyBuilder gpb = gtob.addProperty(gp.getName()); gpb.setValue(gp.getValue()); gpb.setReadOnly(gp.isReadOnly()); gpb.setAccessModifier(gp.getAccessModifier()); @@ -271,7 +273,7 @@ public final class TypeProviderImpl implements TypeProvider { while (iterator.hasNext() && !isAugmenting) { final QName next = iterator.next(); if (current == null) { - dataChildByName = schemaContext.getDataChildByName(next); + dataChildByName = this.schemaContext.getDataChildByName(next); } else { dataChildByName = current.getDataChildByName(next); } @@ -289,12 +291,12 @@ public final class TypeProviderImpl implements TypeProvider { } ///// - Module parentModule = getParentModule(parentNode); + final Module parentModule = getParentModule(parentNode); if (!leafRefStrippedXPath.isAbsolute()) { - leafRefValueNode = SchemaContextUtil.findDataSchemaNodeForRelativeXPath(schemaContext, parentModule, + leafRefValueNode = SchemaContextUtil.findDataSchemaNodeForRelativeXPath(this.schemaContext, parentModule, parentNode, leafRefStrippedXPath); } else { - leafRefValueNode = SchemaContextUtil.findDataSchemaNode(schemaContext, parentModule, leafRefStrippedXPath); + leafRefValueNode = SchemaContextUtil.findDataSchemaNode(this.schemaContext, parentModule, leafRefStrippedXPath); } return (leafRefValueNode != null) ? leafRefValueNode.equals(parentNode) : false; } @@ -341,10 +343,10 @@ public final class TypeProviderImpl implements TypeProvider { final EnumTypeDefinition enumTypeDef = (EnumTypeDefinition) baseTypeDef; returnType = provideTypeForEnum(enumTypeDef, typedefName, typeDefinition); } else { - final Module module = findParentModule(schemaContext, typeDefinition); - Restrictions r = BindingGeneratorUtil.getRestrictions(typeDefinition); + final Module module = findParentModule(this.schemaContext, typeDefinition); + final Restrictions r = BindingGeneratorUtil.getRestrictions(typeDefinition); if (module != null) { - final Map> modulesByDate = genTypeDefsContextMap.get(module.getName()); + final Map> modulesByDate = this.genTypeDefsContextMap.get(module.getName()); final Map genTOs = modulesByDate.get(module.getRevision()); if (genTOs != null) { returnType = genTOs.get(typedefName); @@ -375,11 +377,11 @@ public final class TypeProviderImpl implements TypeProvider { * idref */ private Type provideTypeForIdentityref(final IdentityrefTypeDefinition idref) { - QName baseIdQName = idref.getIdentity().getQName(); - Module module = schemaContext.findModuleByNamespaceAndRevision(baseIdQName.getNamespace(), + final QName baseIdQName = idref.getIdentity().getQName(); + final Module module = this.schemaContext.findModuleByNamespaceAndRevision(baseIdQName.getNamespace(), baseIdQName.getRevision()); IdentitySchemaNode identity = null; - for (IdentitySchemaNode id : module.getIdentities()) { + for (final IdentitySchemaNode id : module.getIdentities()) { if (id.getQName().equals(baseIdQName)) { identity = id; } @@ -390,8 +392,8 @@ public final class TypeProviderImpl implements TypeProvider { final String packageName = BindingGeneratorUtil.packageNameForGeneratedType(basePackageName, identity.getPath()); final String genTypeName = BindingMapping.getClassName(identity.getQName()); - Type baseType = Types.typeForClass(Class.class); - Type paramType = Types.wildcardTypeFor(packageName, genTypeName); + final Type baseType = Types.typeForClass(Class.class); + final Type paramType = Types.wildcardTypeFor(packageName, genTypeName); return Types.parameterizedTypeFor(baseType, paramType); } @@ -421,10 +423,10 @@ public final class TypeProviderImpl implements TypeProvider { final TypeDefinition baseTypeDef = baseTypeDefForExtendedType(typeDefinition); if (!(baseTypeDef instanceof LeafrefTypeDefinition) && !(baseTypeDef instanceof IdentityrefTypeDefinition)) { - final Module module = findParentModule(schemaContext, parentNode); + final Module module = findParentModule(this.schemaContext, parentNode); if (module != null) { - final Map> modulesByDate = genTypeDefsContextMap.get(module.getName()); + final Map> modulesByDate = this.genTypeDefsContextMap.get(module.getName()); final Map genTOs = modulesByDate.get(module.getRevision()); if (genTOs != null) { return genTOs.get(typeDefinition.getQName().getLocalName()); @@ -484,23 +486,22 @@ public final class TypeProviderImpl implements TypeProvider { if (strXPath != null) { if (strXPath.indexOf('[') == -1) { - final Module module = findParentModule(schemaContext, parentNode); + final Module module = findParentModule(this.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); + dataNode = findDataSchemaNode(this.schemaContext, module, xpath); } else { - dataNode = findDataSchemaNodeForRelativeXPath(schemaContext, module, parentNode, xpath); + dataNode = findDataSchemaNodeForRelativeXPath(this.schemaContext, module, parentNode, xpath); } - Preconditions.checkArgument(dataNode != null, "Failed to find leafref target: %s in module %s (%s) at %s", - strXPath, this.getParentModule(parentNode).getName(), - parentNode.getQName().getModule(), this.getParentModule(parentNode).getModuleSourcePath()); + Preconditions.checkArgument(dataNode != null, "Failed to find leafref target: %s in module %s (%s)", + strXPath, this.getParentModule(parentNode).getName(), parentNode.getQName().getModule()); if (leafContainsEnumDefinition(dataNode)) { - returnType = referencedTypes.get(dataNode.getPath()); + returnType = this.referencedTypes.get(dataNode.getPath()); } else if (leafListContainsEnumDefinition(dataNode)) { - returnType = Types.listTypeFor(referencedTypes.get(dataNode.getPath())); + returnType = Types.listTypeFor(this.referencedTypes.get(dataNode.getPath())); } else { returnType = resolveTypeFromDataSchemaNode(dataNode); } @@ -508,9 +509,8 @@ public final class TypeProviderImpl implements TypeProvider { returnType = Types.typeForClass(Object.class); } } - Preconditions.checkArgument(returnType != null, "Failed to find leafref target: %s in module %s (%s) at %s", - strXPath, this.getParentModule(parentNode).getName(), parentNode.getQName().getModule(), this - .getParentModule(parentNode).getModuleSourcePath()); + Preconditions.checkArgument(returnType != null, "Failed to find leafref target: %s in module %s (%s)", + strXPath, this.getParentModule(parentNode).getName(), parentNode.getQName().getModule(), this); return returnType; } @@ -563,7 +563,7 @@ public final class TypeProviderImpl implements TypeProvider { /** * Converts enumTypeDef to - * {@link org.opendaylight.yangtools.sal.binding.model.api.Enumeration + * {@link Enumeration * enumeration}. * * @param enumTypeDef @@ -590,7 +590,7 @@ public final class TypeProviderImpl implements TypeProvider { final String enumerationName = BindingMapping.getClassName(enumName); - Module module = findParentModule(schemaContext, parentNode); + final Module module = findParentModule(this.schemaContext, parentNode); final String basePackageName = BindingMapping.getRootPackageName(module.getQNameModule()); final EnumerationBuilderImpl enumBuilder = new EnumerationBuilderImpl(basePackageName, enumerationName); @@ -681,23 +681,23 @@ public final class TypeProviderImpl implements TypeProvider { * */ private void resolveTypeDefsFromContext() { - final Set modules = schemaContext.getModules(); + final Set modules = this.schemaContext.getModules(); Preconditions.checkArgument(modules != null, "Set of Modules cannot be NULL!"); final Module[] modulesArray = new Module[modules.size()]; int i = 0; - for (Module modul : modules) { + for (final Module modul : modules) { modulesArray[i++] = modul; } final List modulesSortedByDependency = org.opendaylight.yangtools.yang.parser.util.ModuleDependencySort .sort(modulesArray); for (final Module module : modulesSortedByDependency) { - Map> dateTypeMap = genTypeDefsContextMap.get(module.getName()); + Map> dateTypeMap = this.genTypeDefsContextMap.get(module.getName()); if (dateTypeMap == null) { dateTypeMap = new HashMap<>(); } dateTypeMap.put(module.getRevision(), Collections.emptyMap()); - genTypeDefsContextMap.put(module.getName(), dateTypeMap); + this.genTypeDefsContextMap.put(module.getName(), dateTypeMap); } for (final Module module : modulesSortedByDependency) { @@ -731,7 +731,8 @@ 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) { + private Type typedefToGeneratedType(final String basePackageName, final Module module, + final TypeDefinition typedef) { final String moduleName = module.getName(); final Date moduleRevision = module.getRevision(); if ((basePackageName != null) && (moduleName != null) && (typedef != null) && (typedef.getQName() != null)) { @@ -751,18 +752,18 @@ public final class TypeProviderImpl implements TypeProvider { makeSerializable((GeneratedTOBuilderImpl) genTOBuilder); returnType = genTOBuilder.toInstance(); // union builder - GeneratedTOBuilder unionBuilder = new GeneratedTOBuilderImpl(genTOBuilder.getPackageName(), + final GeneratedTOBuilder unionBuilder = new GeneratedTOBuilderImpl(genTOBuilder.getPackageName(), genTOBuilder.getName() + "Builder"); unionBuilder.setIsUnionBuilder(true); - MethodSignatureBuilder method = unionBuilder.addMethod("getDefaultInstance"); + 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); + Set types = this.additionalTypes.get(module); if (types == null) { types = Sets. newHashSet(unionBuilder.toInstance()); - additionalTypes.put(module, types); + this.additionalTypes.put(module, types); } else { types.add(unionBuilder.toInstance()); } @@ -780,12 +781,11 @@ public final class TypeProviderImpl implements TypeProvider { makeSerializable((GeneratedTOBuilderImpl) genTOBuilder); returnType = genTOBuilder.toInstance(); } else { - final Type javaType = BaseYangTypes.BASE_YANG_TYPES_PROVIDER.javaTypeForSchemaDefinitionType( - innerTypeDefinition, typedef); + final Type javaType = javaTypeForSchemaDefinitionType(innerTypeDefinition, typedef); returnType = wrapJavaTypeIntoTO(basePackageName, typedef, javaType, module.getName()); } if (returnType != null) { - final Map> modulesByDate = genTypeDefsContextMap.get(moduleName); + final Map> modulesByDate = this.genTypeDefsContextMap.get(moduleName); Map typeMap = modulesByDate.get(moduleRevision); if (typeMap != null) { if (typeMap.isEmpty()) { @@ -823,6 +823,9 @@ public final class TypeProviderImpl implements TypeProvider { genTOBuilder.addEqualsIdentity(genPropBuilder); genTOBuilder.addHashIdentity(genPropBuilder); genTOBuilder.addToStringProperty(genPropBuilder); + if (typedef.getStatus() == Status.DEPRECATED) { + genTOBuilder.addAnnotation("", "Deprecated"); + } if (javaType instanceof ConcreteType && "String".equals(javaType.getName()) && typedef.getBaseType() != null) { final List regExps = resolveRegExpressionsFromTypedef(typedef); addStringRegExAsConstant(genTOBuilder, regExps); @@ -847,25 +850,18 @@ public final class TypeProviderImpl implements TypeProvider { * @return generated TO builder with the list of enclosed generated TO * builders */ - public GeneratedTOBuilder provideGeneratedTOBuilderForUnionTypeDef(final String basePackageName, final UnionTypeDefinition typedef, final String typeDefName, final SchemaNode parentNode) { - final List genTOBuilders = provideGeneratedTOBuildersForUnionTypeDef(basePackageName, + public GeneratedTOBuilder provideGeneratedTOBuilderForUnionTypeDef(final String basePackageName, + final UnionTypeDefinition typedef, final String typeDefName, final SchemaNode parentNode) { + final List builders = provideGeneratedTOBuildersForUnionTypeDef(basePackageName, typedef, typeDefName, parentNode); - GeneratedTOBuilder resultTOBuilder = null; - if (genTOBuilders.isEmpty()) { - throw new IllegalStateException("No GeneratedTOBuilder objects generated from union " + typedef); - } + Preconditions.checkState(!builders.isEmpty(), "No GeneratedTOBuilder objects generated from union %s", typedef); - resultTOBuilder = genTOBuilders.remove(0); - for (GeneratedTOBuilder genTOBuilder : genTOBuilders) { + final GeneratedTOBuilder resultTOBuilder = builders.remove(0); + for (final GeneratedTOBuilder genTOBuilder : builders) { resultTOBuilder.addEnclosingTransferObject(genTOBuilder); } - final GeneratedPropertyBuilder genPropBuilder = resultTOBuilder.addProperty("value"); - genPropBuilder.setReturnType(Types.CHAR_ARRAY); - resultTOBuilder.addEqualsIdentity(genPropBuilder); - resultTOBuilder.addHashIdentity(genPropBuilder); - resultTOBuilder.addToStringProperty(genPropBuilder); - + resultTOBuilder.addProperty("value").setReturnType(Types.CHAR_ARRAY); return resultTOBuilder; } @@ -889,14 +885,15 @@ public final class TypeProviderImpl implements TypeProvider { *
  • if Qname of typedef is null
  • * */ - public List provideGeneratedTOBuildersForUnionTypeDef(final String basePackageName, final UnionTypeDefinition typedef, final String typeDefName, final SchemaNode parentNode) { + public List provideGeneratedTOBuildersForUnionTypeDef(final String basePackageName, + final UnionTypeDefinition typedef, final String typeDefName, final SchemaNode parentNode) { 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!"); final List generatedTOBuilders = new ArrayList<>(); final List> unionTypes = typedef.getTypes(); - final Module module = findParentModule(schemaContext, parentNode); + final Module module = findParentModule(this.schemaContext, parentNode); final GeneratedTOBuilderImpl unionGenTOBuilder; if (typeDefName != null && !typeDefName.isEmpty()) { @@ -927,8 +924,7 @@ public final class TypeProviderImpl implements TypeProvider { unionTypeName, unionGenTOBuilder); updateUnionTypeAsProperty(unionGenTOBuilder, enumeration, unionTypeName); } else { - final Type javaType = BaseYangTypes.BASE_YANG_TYPES_PROVIDER.javaTypeForSchemaDefinitionType(unionType, - parentNode); + final Type javaType = javaTypeForSchemaDefinitionType(unionType, parentNode); updateUnionTypeAsProperty(unionGenTOBuilder, javaType, unionTypeName); } } @@ -947,8 +943,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)} + * {@link #provideGeneratedTOBuildersForUnionTypeDef(String, UnionTypeDefinition, String, SchemaNode)} * provideGeneratedTOBuilderForUnionTypeDef} and in parent TO builder * parentUnionGenTOBuilder is created property which type is * equal to new generated TO. @@ -964,7 +959,8 @@ 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) { + private List resolveUnionSubtypeAsUnion(final GeneratedTOBuilder parentUnionGenTOBuilder, + final UnionTypeDefinition unionSubtype, final String basePackageName, final SchemaNode parentNode) { final String newTOBuilderName = provideAvailableNameForGenTOBuilder(parentUnionGenTOBuilder.getName()); final List subUnionGenTOBUilders = provideGeneratedTOBuildersForUnionTypeDef( basePackageName, unionSubtype, newTOBuilderName, parentNode); @@ -997,7 +993,8 @@ public final class TypeProviderImpl implements TypeProvider { * parent Schema Node for Extended Subtype * */ - private void resolveExtendedSubtypeAsUnion(final GeneratedTOBuilder parentUnionGenTOBuilder, final TypeDefinition unionSubtype, final List regularExpressions, final SchemaNode parentNode) { + private void resolveExtendedSubtypeAsUnion(final GeneratedTOBuilder parentUnionGenTOBuilder, + final TypeDefinition unionSubtype, final List regularExpressions, final SchemaNode parentNode) { final String unionTypeName = unionSubtype.getQName().getLocalName(); final Type genTO = findGenTO(unionTypeName, unionSubtype); if (genTO != null) { @@ -1005,11 +1002,26 @@ public final class TypeProviderImpl implements TypeProvider { } else { final TypeDefinition baseType = baseTypeDefForExtendedType(unionSubtype); if (unionTypeName.equals(baseType.getQName().getLocalName())) { - final Type javaType = BaseYangTypes.BASE_YANG_TYPES_PROVIDER.javaTypeForSchemaDefinitionType(baseType, - parentNode); + final Type javaType = + BaseYangTypes.BASE_YANG_TYPES_PROVIDER.javaTypeForSchemaDefinitionType(baseType, parentNode); if (javaType != null) { updateUnionTypeAsProperty(parentUnionGenTOBuilder, javaType, unionTypeName); } + } else if (baseType instanceof LeafrefTypeDefinition) { + final Type javaType = javaTypeForSchemaDefinitionType(baseType, parentNode); + boolean typeExist = false; + for (final GeneratedPropertyBuilder generatedPropertyBuilder : parentUnionGenTOBuilder + .getProperties()) { + final Type origType = ((GeneratedPropertyBuilderImpl) generatedPropertyBuilder).getReturnType(); + if (origType != null && javaType != null && javaType == origType) { + typeExist = true; + break; + } + } + if (!typeExist && javaType != null) { + updateUnionTypeAsProperty(parentUnionGenTOBuilder, javaType, new StringBuilder(javaType.getName()) + .append(parentUnionGenTOBuilder.getName()).append("Value").toString()); + } } if (baseType instanceof StringTypeDefinition) { regularExpressions.addAll(resolveRegExpressionsFromTypedef(unionSubtype)); @@ -1027,9 +1039,9 @@ public final class TypeProviderImpl implements TypeProvider { * null it it doesn't exist */ private Type findGenTO(final String searchedTypeName, final SchemaNode parentNode) { - final Module typeModule = findParentModule(schemaContext, parentNode); + final Module typeModule = findParentModule(this.schemaContext, parentNode); if (typeModule != null && typeModule.getName() != null) { - final Map> modulesByDate = genTypeDefsContextMap.get(typeModule.getName()); + final Map> modulesByDate = this.genTypeDefsContextMap.get(typeModule.getName()); final Map genTOs = modulesByDate.get(typeModule.getRevision()); if (genTOs != null) { return genTOs.get(searchedTypeName); @@ -1051,10 +1063,10 @@ public final class TypeProviderImpl implements TypeProvider { */ private void storeGenTO(final TypeDefinition newTypeDef, final GeneratedTOBuilder genTOBuilder, final SchemaNode parentNode) { if (!(newTypeDef instanceof UnionTypeDefinition)) { - final Module parentModule = findParentModule(schemaContext, parentNode); + final Module parentModule = findParentModule(this.schemaContext, parentNode); if (parentModule != null && parentModule.getName() != null) { - Map> modulesByDate = genTypeDefsContextMap.get(parentModule.getName()); - Map genTOsMap = modulesByDate.get(parentModule.getRevision()); + final Map> modulesByDate = this.genTypeDefsContextMap.get(parentModule.getName()); + final Map genTOsMap = modulesByDate.get(parentModule.getRevision()); genTOsMap.put(newTypeDef.getQName().getLocalName(), genTOBuilder.toInstance()); } } @@ -1062,7 +1074,7 @@ public final class TypeProviderImpl implements TypeProvider { /** * Adds a new property with the name propertyName and with type - * type to unonGenTransObject. + * type to unionGenTransObject. * * @param unionGenTransObject * generated TO to which should be property added @@ -1141,7 +1153,7 @@ public final class TypeProviderImpl implements TypeProvider { Preconditions.checkArgument(basePackageName != null, "Base Package Name cannot be NULL!"); if (typeDef instanceof BitsTypeDefinition) { - BitsTypeDefinition bitsTypeDefinition = (BitsTypeDefinition) typeDef; + final BitsTypeDefinition bitsTypeDefinition = (BitsTypeDefinition) typeDef; final String typeName = BindingMapping.getClassName(typeDefName); final GeneratedTOBuilderImpl genTOBuilder = new GeneratedTOBuilderImpl(basePackageName, typeName); @@ -1156,7 +1168,7 @@ public final class TypeProviderImpl implements TypeProvider { final List bitList = bitsTypeDefinition.getBits(); GeneratedPropertyBuilder genPropertyBuilder; for (final Bit bit : bitList) { - String name = bit.getName(); + final String name = bit.getName(); genPropertyBuilder = genTOBuilder.addProperty(BindingMapping.getPropertyName(name)); genPropertyBuilder.setReadOnly(true); genPropertyBuilder.setReturnType(BaseYangTypes.BOOLEAN_TYPE); @@ -1186,14 +1198,7 @@ public final class TypeProviderImpl implements TypeProvider { Preconditions.checkArgument(typedef != null, "typedef can't be null"); final List patternConstraints; - if (typedef instanceof ExtendedType) { - final TypeDefinition strTypeDef = baseTypeDefForExtendedType(typedef); - if (strTypeDef instanceof StringTypeDefinition) { - patternConstraints = ((ExtendedType)typedef).getPatternConstraints(); - } else { - patternConstraints = ImmutableList.of(); - } - } else if (typedef instanceof StringTypeDefinition) { + if (typedef instanceof StringTypeDefinition) { // FIXME: run diff against base patternConstraints = ((StringTypeDefinition) typedef).getPatternConstraints(); } else { @@ -1201,7 +1206,7 @@ public final class TypeProviderImpl implements TypeProvider { } final List regExps = new ArrayList<>(patternConstraints.size()); - for (PatternConstraint patternConstraint : patternConstraints) { + for (final PatternConstraint patternConstraint : patternConstraints) { final String regEx = patternConstraint.getRegularExpression(); final String modifiedRegEx = StringEscapeUtils.escapeJava(regEx); regExps.add(modifiedRegEx); @@ -1281,8 +1286,11 @@ public final class TypeProviderImpl implements TypeProvider { genTOBuilder.setSchemaPath(typedef.getPath().getPathFromRoot()); genTOBuilder.setModuleName(moduleName); genTOBuilder.setTypedef(true); - Restrictions r = BindingGeneratorUtil.getRestrictions(typedef); + final Restrictions r = BindingGeneratorUtil.getRestrictions(typedef); genTOBuilder.setRestrictions(r); + if (typedef.getStatus() == Status.DEPRECATED) { + genTOBuilder.addAnnotation("", "Deprecated"); + } if (baseTypeDefForExtendedType(innerExtendedType) instanceof UnionTypeDefinition) { genTOBuilder.setIsUnion(true); @@ -1290,14 +1298,14 @@ public final class TypeProviderImpl implements TypeProvider { Map> modulesByDate = null; Map typeMap = null; - final Module parentModule = findParentModule(schemaContext, innerExtendedType); + final Module parentModule = findParentModule(this.schemaContext, innerExtendedType); if (parentModule != null) { - modulesByDate = genTypeDefsContextMap.get(parentModule.getName()); + modulesByDate = this.genTypeDefsContextMap.get(parentModule.getName()); typeMap = modulesByDate.get(parentModule.getRevision()); } if (typeMap != null) { - Type type = typeMap.get(innerTypeDef); + final Type type = typeMap.get(innerTypeDef); if (type instanceof GeneratedTransferObject) { genTOBuilder.setExtendsType((GeneratedTransferObject) type); } @@ -1317,7 +1325,7 @@ public final class TypeProviderImpl implements TypeProvider { */ private static void makeSerializable(final GeneratedTOBuilderImpl gto) { gto.addImplementsType(Types.typeForClass(Serializable.class)); - GeneratedPropertyBuilder prop = new GeneratedPropertyBuilderImpl("serialVersionUID"); + final GeneratedPropertyBuilder prop = new GeneratedPropertyBuilderImpl("serialVersionUID"); prop.setValue(Long.toString(BindingGeneratorUtil.computeDefaultSUID(gto))); gto.setSUID(prop); } @@ -1338,10 +1346,10 @@ public final class TypeProviderImpl implements TypeProvider { */ private static List> sortTypeDefinitionAccordingDepth( final Collection> unsortedTypeDefinitions) { - List> sortedTypeDefinition = new ArrayList<>(); + final List> sortedTypeDefinition = new ArrayList<>(); - Map>> typeDefinitionsDepths = new TreeMap<>(); - for (TypeDefinition unsortedTypeDefinition : unsortedTypeDefinitions) { + final Map>> typeDefinitionsDepths = new TreeMap<>(); + for (final TypeDefinition unsortedTypeDefinition : unsortedTypeDefinitions) { final int depth = getTypeDefinitionDepth(unsortedTypeDefinition); List> typeDefinitionsConcreteDepth = typeDefinitionsDepths.get(depth); if (typeDefinitionsConcreteDepth == null) { @@ -1352,7 +1360,7 @@ public final class TypeProviderImpl implements TypeProvider { } // SortedMap guarantees order corresponding to keys in ascending order - for (List> v : typeDefinitionsDepths.values()) { + for (final List> v : typeDefinitionsDepths.values()) { sortedTypeDefinition.addAll(v); } @@ -1369,11 +1377,11 @@ public final class TypeProviderImpl implements TypeProvider { * definition to the base type */ private static int getTypeDefinitionDepth(final TypeDefinition typeDefinition) { - // FIXME: rewrite this in a non-recursive manner, without ExtendedType and UnionType + // FIXME: rewrite this in a non-recursive manner if (typeDefinition == null) { return 1; } - TypeDefinition baseType = typeDefinition.getBaseType(); + final TypeDefinition baseType = typeDefinition.getBaseType(); if (baseType == null) { return 1; } @@ -1382,10 +1390,10 @@ public final class TypeProviderImpl implements TypeProvider { if (baseType.getBaseType() != null) { depth = depth + getTypeDefinitionDepth(baseType); } else if (baseType instanceof UnionTypeDefinition) { - List> childTypeDefinitions = ((UnionTypeDefinition) baseType).getTypes(); + final List> childTypeDefinitions = ((UnionTypeDefinition) baseType).getTypes(); int maxChildDepth = 0; int childDepth = 1; - for (TypeDefinition childTypeDefinition : childTypeDefinitions) { + for (final TypeDefinition childTypeDefinition : childTypeDefinitions) { childDepth = childDepth + getTypeDefinitionDepth(childTypeDefinition); if (childDepth > maxChildDepth) { maxChildDepth = childDepth; @@ -1406,7 +1414,7 @@ public final class TypeProviderImpl implements TypeProvider { * @return string with the number suffix incremented by one (or 1 is added) */ private static String provideAvailableNameForGenTOBuilder(final String name) { - Matcher mtch = NUMBERS_PATTERN.matcher(name); + final Matcher mtch = NUMBERS_PATTERN.matcher(name); if (mtch.find()) { final int newSuffix = Integer.valueOf(name.substring(mtch.start())) + 1; return name.substring(0, mtch.start()) + newSuffix; @@ -1418,7 +1426,7 @@ public final class TypeProviderImpl implements TypeProvider { public static void addUnitsToGenTO(final GeneratedTOBuilder to, final String units) { if (!Strings.isNullOrEmpty(units)) { to.addConstant(Types.STRING, "_UNITS", "\"" + units + "\""); - GeneratedPropertyBuilder prop = new GeneratedPropertyBuilderImpl("UNITS"); + final GeneratedPropertyBuilder prop = new GeneratedPropertyBuilderImpl("UNITS"); prop.setReturnType(Types.STRING); to.addToStringProperty(prop); } @@ -1430,30 +1438,30 @@ public final class TypeProviderImpl implements TypeProvider { } public String getTypeDefaultConstruction(final LeafSchemaNode node, final String defaultValue) { - TypeDefinition type = CompatUtils.compatLeafType(node); - QName typeQName = type.getQName(); - TypeDefinition base = baseTypeDefForExtendedType(type); + final TypeDefinition type = CompatUtils.compatLeafType(node); + final QName typeQName = type.getQName(); + final TypeDefinition base = baseTypeDefForExtendedType(type); Preconditions.checkNotNull(type, "Cannot provide default construction for null type of %s", node); Preconditions.checkNotNull(defaultValue, "Cannot provide default construction for null default statement of %s", node); - StringBuilder sb = new StringBuilder(); + final StringBuilder sb = new StringBuilder(); String result = null; if (base instanceof BinaryTypeDefinition) { result = binaryToDef(defaultValue); } else if (base instanceof BitsTypeDefinition) { String parentName; String className; - Module parent = getParentModule(node); - Iterator path = node.getPath().getPathFromRoot().iterator(); + final Module parent = getParentModule(node); + final Iterator path = node.getPath().getPathFromRoot().iterator(); path.next(); if (!(path.hasNext())) { parentName = BindingMapping.getClassName(parent.getName()) + "Data"; - String basePackageName = BindingMapping.getRootPackageName(parent.getQNameModule()); + final String basePackageName = BindingMapping.getRootPackageName(parent.getQNameModule()); className = basePackageName + "." + parentName + "." + BindingMapping.getClassName(node.getQName()); } else { - String basePackageName = BindingMapping.getRootPackageName(parent.getQNameModule()); - String packageName = BindingGeneratorUtil.packageNameForGeneratedType(basePackageName, type.getPath()); + final String basePackageName = BindingMapping.getRootPackageName(parent.getQNameModule()); + final String packageName = BindingGeneratorUtil.packageNameForGeneratedType(basePackageName, type.getPath()); parentName = BindingMapping.getClassName(parent.getName()); className = packageName + "." + parentName + "." + BindingMapping.getClassName(node.getQName()); } @@ -1465,20 +1473,20 @@ public final class TypeProviderImpl implements TypeProvider { } else if (base instanceof EmptyTypeDefinition) { result = typeToDef(Boolean.class, defaultValue); } else if (base instanceof EnumTypeDefinition) { - char[] defValArray = defaultValue.toCharArray(); - char first = Character.toUpperCase(defaultValue.charAt(0)); + final char[] defValArray = defaultValue.toCharArray(); + final char first = Character.toUpperCase(defaultValue.charAt(0)); defValArray[0] = first; - String newDefVal = new String(defValArray); + final String newDefVal = new String(defValArray); String className; if (type.getBaseType() != null) { - Module m = getParentModule(type); - String basePackageName = BindingMapping.getRootPackageName(m.getQNameModule()); - String packageName = BindingGeneratorUtil.packageNameForGeneratedType(basePackageName, type.getPath()); + final Module m = getParentModule(type); + final String basePackageName = BindingMapping.getRootPackageName(m.getQNameModule()); + final String packageName = BindingGeneratorUtil.packageNameForGeneratedType(basePackageName, type.getPath()); className = packageName + "." + BindingMapping.getClassName(typeQName); } else { - Module parentModule = getParentModule(node); - String basePackageName = BindingMapping.getRootPackageName(parentModule.getQNameModule()); - String packageName = BindingGeneratorUtil.packageNameForGeneratedType(basePackageName, node.getPath()); + final Module parentModule = getParentModule(node); + final String basePackageName = BindingMapping.getRootPackageName(parentModule.getQNameModule()); + final String packageName = BindingGeneratorUtil.packageNameForGeneratedType(basePackageName, node.getPath()); className = packageName + "." + BindingMapping.getClassName(node.getQName()); } result = className + "." + newDefVal; @@ -1515,10 +1523,10 @@ public final class TypeProviderImpl implements TypeProvider { if (type.getBaseType() != null && !(base instanceof LeafrefTypeDefinition) && !(base instanceof EnumTypeDefinition) && !(base instanceof UnionTypeDefinition)) { - Module m = getParentModule(type); - String basePackageName = BindingMapping.getRootPackageName(m.getQNameModule()); - String packageName = BindingGeneratorUtil.packageNameForGeneratedType(basePackageName, type.getPath()); - String className = packageName + "." + BindingMapping.getClassName(typeQName); + final Module m = getParentModule(type); + final String basePackageName = BindingMapping.getRootPackageName(m.getQNameModule()); + final String packageName = BindingGeneratorUtil.packageNameForGeneratedType(basePackageName, type.getPath()); + final String className = packageName + "." + BindingMapping.getClassName(typeQName); sb.insert(0, "new " + className + "("); sb.insert(sb.length(), ')'); } @@ -1531,9 +1539,9 @@ public final class TypeProviderImpl implements TypeProvider { } private static String binaryToDef(final String defaultValue) { - StringBuilder sb = new StringBuilder(); - BaseEncoding en = BaseEncoding.base64(); - byte[] encoded = en.decode(defaultValue); + final StringBuilder sb = new StringBuilder(); + final BaseEncoding en = BaseEncoding.base64(); + final byte[] encoded = en.decode(defaultValue); sb.append("new byte[] {"); for (int i = 0; i < encoded.length; i++) { sb.append(encoded[i]); @@ -1545,17 +1553,12 @@ public final class TypeProviderImpl implements TypeProvider { return sb.toString(); } - private static final Comparator BIT_NAME_COMPARATOR = new Comparator() { - @Override - public int compare(final Bit o1, final Bit o2) { - return o1.getName().compareTo(o2.getName()); - } - }; + private static final Comparator BIT_NAME_COMPARATOR = (o1, o2) -> o1.getName().compareTo(o2.getName()); private static String bitsToDef(final BitsTypeDefinition type, final String className, final String defaultValue, final boolean isExt) { - List bits = new ArrayList<>(type.getBits()); + final List bits = new ArrayList<>(type.getBits()); Collections.sort(bits, BIT_NAME_COMPARATOR); - StringBuilder sb = new StringBuilder(); + final StringBuilder sb = new StringBuilder(); if (!isExt) { sb.append("new "); sb.append(className); @@ -1578,10 +1581,10 @@ public final class TypeProviderImpl implements TypeProvider { } private Module getParentModule(final SchemaNode node) { - QName qname = node.getPath().getPathFromRoot().iterator().next(); - URI namespace = qname.getNamespace(); - Date revision = qname.getRevision(); - return schemaContext.findModuleByNamespaceAndRevision(namespace, revision); + final QName qname = node.getPath().getPathFromRoot().iterator().next(); + final URI namespace = qname.getNamespace(); + final Date revision = qname.getRevision(); + return this.schemaContext.findModuleByNamespaceAndRevision(namespace, revision); } private String leafrefToDef(final LeafSchemaNode parentNode, final LeafrefTypeDefinition leafrefType, final String defaultValue) { @@ -1594,15 +1597,15 @@ public final class TypeProviderImpl implements TypeProvider { if (strXPath != null) { if (strXPath.indexOf('[') == -1) { - final Module module = findParentModule(schemaContext, parentNode); + final Module module = findParentModule(this.schemaContext, parentNode); if (module != null) { final SchemaNode dataNode; if (xpath.isAbsolute()) { - dataNode = findDataSchemaNode(schemaContext, module, xpath); + dataNode = findDataSchemaNode(this.schemaContext, module, xpath); } else { - dataNode = findDataSchemaNodeForRelativeXPath(schemaContext, module, parentNode, xpath); + dataNode = findDataSchemaNodeForRelativeXPath(this.schemaContext, module, parentNode, xpath); } - String result = getTypeDefaultConstruction((LeafSchemaNode) dataNode, defaultValue); + final String result = getTypeDefaultConstruction((LeafSchemaNode) dataNode, defaultValue); return result; } } else { @@ -1619,59 +1622,43 @@ public final class TypeProviderImpl implements TypeProvider { String className; if (type.getBaseType() != null) { - QName typeQName = type.getQName(); + final QName typeQName = type.getQName(); Module module = null; - Set modules = schemaContext.findModuleByNamespace(typeQName.getNamespace()); + final Set modules = this.schemaContext.findModuleByNamespace(typeQName.getNamespace()); if (modules.size() > 1) { - for (Module m : modules) { + for (final Module m : modules) { if (m.getRevision().equals(typeQName.getRevision())) { module = m; break; } } if (module == null) { - List modulesList = new ArrayList<>(modules); - Collections.sort(modulesList, new Comparator() { - @Override - public int compare(final Module o1, final Module o2) { - return o1.getRevision().compareTo(o2.getRevision()); - } - }); + final List modulesList = new ArrayList<>(modules); + Collections.sort(modulesList, (o1, o2) -> o1.getRevision().compareTo(o2.getRevision())); module = modulesList.get(0); } } else { module = modules.iterator().next(); } - String basePackageName = BindingMapping.getRootPackageName(module.getQNameModule()); + final String basePackageName = BindingMapping.getRootPackageName(module.getQNameModule()); className = basePackageName + "." + BindingMapping.getClassName(typeQName); } else { - Iterator path = node.getPath().getPathFromRoot().iterator(); - QName first = path.next(); + final Iterator path = node.getPath().getPathFromRoot().iterator(); + final QName first = path.next(); if (!(path.hasNext())) { - URI namespace = first.getNamespace(); - Date revision = first.getRevision(); - Module parent = schemaContext.findModuleByNamespaceAndRevision(namespace, revision); + final URI namespace = first.getNamespace(); + final Date revision = first.getRevision(); + final Module parent = this.schemaContext.findModuleByNamespaceAndRevision(namespace, revision); parentName = BindingMapping.getClassName((parent).getName()) + "Data"; - String basePackageName = BindingMapping.getRootPackageName(parent.getQNameModule()); + final String basePackageName = BindingMapping.getRootPackageName(parent.getQNameModule()); className = basePackageName + "." + parentName + "." + BindingMapping.getClassName(node.getQName()); } else { - URI namespace = first.getNamespace(); - Date revision = first.getRevision(); - Module parentModule = schemaContext.findModuleByNamespaceAndRevision(namespace, revision); - String basePackageName = BindingMapping.getRootPackageName(parentModule.getQNameModule()); - - // Backwards compatibility: Union types used to be instantiated in YANG namespace, which is no longer - // the case, as unions are emitted to their correct schema path. Create a proxy instance to meet the - // codepath's expectations - final SchemaPath typePath; - if (type instanceof UnionType) { - typePath = type.getPath(); - } else { - typePath = UnionType.create(((UnionTypeDefinition)type).getTypes()).getPath(); - } - - String packageName = BindingGeneratorUtil.packageNameForGeneratedType(basePackageName, typePath); + final URI namespace = first.getNamespace(); + final Date revision = first.getRevision(); + final Module parentModule = this.schemaContext.findModuleByNamespaceAndRevision(namespace, revision); + final String basePackageName = BindingMapping.getRootPackageName(parentModule.getQNameModule()); + final String packageName = BindingGeneratorUtil.packageNameForGeneratedType(basePackageName, UNION_PATH); className = packageName + "." + BindingMapping.getClassName(node.getQName()); } } @@ -1679,7 +1666,7 @@ public final class TypeProviderImpl implements TypeProvider { } private static String union(final String className, final String defaultValue, final LeafSchemaNode node) { - StringBuilder sb = new StringBuilder(); + final StringBuilder sb = new StringBuilder(); sb.append("new "); sb.append(className); sb.append("(\""); @@ -1702,4 +1689,4 @@ public final class TypeProviderImpl implements TypeProvider { return BindingMapping.getPropertyName(type.getQName().getLocalName()); } -} \ No newline at end of file +}