X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-parser-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fparser%2Futil%2FTypeUtils.java;h=16983c77f32c1018c8a6e199044797223edb3c3c;hb=b4d8e8e73f8cbf2d33b88f853c267bc3ea9783b8;hp=e521f699aad19467888f5af032bbeb98f8de4da8;hpb=66df394c143927524e2ad15b578b9cce38840c66;p=yangtools.git diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/TypeUtils.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/TypeUtils.java index e521f699aa..16983c77f3 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/TypeUtils.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/TypeUtils.java @@ -7,35 +7,18 @@ */ package org.opendaylight.yangtools.yang.parser.util; -import static org.opendaylight.yangtools.yang.parser.util.ParserUtils.*; +import static org.opendaylight.yangtools.yang.parser.util.ParserUtils.findModuleFromBuilders; +import static org.opendaylight.yangtools.yang.parser.util.ParserUtils.findModuleFromContext; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.TreeMap; +import java.util.*; import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.model.api.Module; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; -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.DecimalTypeDefinition; -import org.opendaylight.yangtools.yang.model.api.type.IntegerTypeDefinition; -import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition; -import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition; +import org.opendaylight.yangtools.yang.model.api.*; +import org.opendaylight.yangtools.yang.model.api.type.*; import org.opendaylight.yangtools.yang.model.util.ExtendedType; import org.opendaylight.yangtools.yang.model.util.UnknownType; -import org.opendaylight.yangtools.yang.parser.builder.api.Builder; -import org.opendaylight.yangtools.yang.parser.builder.api.DataNodeContainerBuilder; -import org.opendaylight.yangtools.yang.parser.builder.api.TypeAwareBuilder; -import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder; -import org.opendaylight.yangtools.yang.parser.builder.impl.IdentityrefTypeBuilder; -import org.opendaylight.yangtools.yang.parser.builder.impl.ModuleBuilder; -import org.opendaylight.yangtools.yang.parser.builder.impl.RpcDefinitionBuilder; -import org.opendaylight.yangtools.yang.parser.builder.impl.TypeDefinitionBuilderImpl; -import org.opendaylight.yangtools.yang.parser.builder.impl.UnionTypeBuilder; +import org.opendaylight.yangtools.yang.parser.builder.api.*; +import org.opendaylight.yangtools.yang.parser.builder.impl.*; /** * Utility class which contains helper methods for dealing with type operations. @@ -48,7 +31,7 @@ public final class TypeUtils { /** * Resolve unknown type of node. It is assumed that type of node is either * UnknownType or ExtendedType with UnknownType as base type. - * + * * @param nodeToResolve * node with type to resolve * @param modules @@ -58,21 +41,21 @@ public final class TypeUtils { */ public static void resolveType(final TypeAwareBuilder nodeToResolve, final Map> modules, final ModuleBuilder module) { - TypeDefinitionBuilder resolvedType = null; final int line = nodeToResolve.getLine(); final TypeDefinition nodeToResolveType = nodeToResolve.getType(); final QName unknownTypeQName = nodeToResolveType.getBaseType().getQName(); - final ModuleBuilder dependentModuleBuilder = findDependentModuleBuilder(modules, module, + final ModuleBuilder dependentModuleBuilder = findModuleFromBuilders(modules, module, unknownTypeQName.getPrefix(), line); - resolvedType = findUnknownTypeDefinition(nodeToResolve, dependentModuleBuilder, modules, module); + TypeDefinitionBuilder resolvedType = findUnknownTypeDefinition(nodeToResolve, dependentModuleBuilder, modules, + module); nodeToResolve.setTypedef(resolvedType); } /** * Resolve unknown type of node. It is assumed that type of node is either * UnknownType or ExtendedType with UnknownType as base type. - * + * * @param nodeToResolve * node with type to resolve * @param modules @@ -85,11 +68,10 @@ public final class TypeUtils { public static void resolveTypeWithContext(final TypeAwareBuilder nodeToResolve, final Map> modules, final ModuleBuilder module, final SchemaContext context) { - TypeDefinitionBuilder resolvedType = null; final int line = nodeToResolve.getLine(); final TypeDefinition nodeToResolveType = nodeToResolve.getType(); final QName unknownTypeQName = nodeToResolveType.getBaseType().getQName(); - final ModuleBuilder dependentModuleBuilder = findDependentModuleBuilder(modules, module, + final ModuleBuilder dependentModuleBuilder = findModuleFromBuilders(modules, module, unknownTypeQName.getPrefix(), line); if (dependentModuleBuilder == null) { @@ -117,111 +99,114 @@ public final class TypeUtils { } } else { - resolvedType = findUnknownTypeDefinition(nodeToResolve, dependentModuleBuilder, modules, module); + TypeDefinitionBuilder resolvedType = findUnknownTypeDefinition(nodeToResolve, dependentModuleBuilder, + modules, module); nodeToResolve.setTypedef(resolvedType); } } public static void resolveTypeUnion(final UnionTypeBuilder union, final Map> modules, final ModuleBuilder builder) { - final List> unionTypes = union.getTypes(); - final List> toRemove = new ArrayList>(); + final List> toRemove = new ArrayList<>(); for (TypeDefinition unionType : unionTypes) { if (unionType instanceof UnknownType) { - final UnknownType ut = (UnknownType) unionType; - final ModuleBuilder dependentModule = findDependentModuleBuilder(modules, builder, ut.getQName() + final ModuleBuilder dependentModule = findModuleFromBuilders(modules, builder, unionType.getQName() .getPrefix(), union.getLine()); - final TypeDefinitionBuilder resolvedType = findTypeDefinitionBuilder(union, dependentModule, ut + final TypeDefinitionBuilder resolvedType = findTypeDefinitionBuilder(union, dependentModule, unionType .getQName().getLocalName(), builder.getName(), union.getLine()); union.setTypedef(resolvedType); - toRemove.add(ut); - } else if (unionType instanceof ExtendedType) { - final ExtendedType extType = (ExtendedType) unionType; - final TypeDefinition extTypeBase = extType.getBaseType(); - if (extTypeBase instanceof UnknownType) { - final UnknownType ut = (UnknownType) extTypeBase; - final ModuleBuilder dependentModule = findDependentModuleBuilder(modules, builder, ut.getQName() - .getPrefix(), union.getLine()); - final TypeDefinitionBuilder targetTypeBuilder = findTypeDefinitionBuilder(union, dependentModule, - ut.getQName().getLocalName(), builder.getName(), union.getLine()); - - final TypeDefinitionBuilder newType = extendedTypeWithNewBase(targetTypeBuilder, null, extType, - modules, builder, union.getLine()); - - union.setTypedef(newType); - toRemove.add(extType); - } + toRemove.add(unionType); + } else if (unionType instanceof ExtendedType && unionType.getBaseType() instanceof UnknownType) { + final UnknownType ut = (UnknownType) unionType.getBaseType(); + final ModuleBuilder dependentModule = findModuleFromBuilders(modules, builder, ut.getQName() + .getPrefix(), union.getLine()); + final TypeDefinitionBuilder targetTypeBuilder = findTypeDefinitionBuilder(union, dependentModule, ut + .getQName().getLocalName(), builder.getName(), union.getLine()); + final TypeDefinitionBuilder newType = extendedTypeWithNewBase(targetTypeBuilder, null, + (ExtendedType) unionType, modules, builder, union.getLine()); + union.setTypedef(newType); + toRemove.add(unionType); } } unionTypes.removeAll(toRemove); } + /** + * Resolve union type which contains one or more unresolved types. + * + * @param union + * union type builder to resolve + * @param modules + * all loaded modules + * @param module + * current module + * @param context + * SchemaContext containing already resolved modules + */ public static void resolveTypeUnionWithContext(final UnionTypeBuilder union, final Map> modules, final ModuleBuilder module, final SchemaContext context) { - final List> unionTypes = union.getTypes(); - final List> toRemove = new ArrayList>(); + final List> toRemove = new ArrayList<>(); for (TypeDefinition unionType : unionTypes) { if (unionType instanceof UnknownType) { - final UnknownType ut = (UnknownType) unionType; - final QName utQName = ut.getQName(); - final ModuleBuilder dependentModuleBuilder = findDependentModuleBuilder(modules, module, - utQName.getPrefix(), union.getLine()); - - if (dependentModuleBuilder == null) { - Module dependentModule = findModuleFromContext(context, module, utQName.getPrefix(), - union.getLine()); - Set> types = dependentModule.getTypeDefinitions(); - TypeDefinition type = findTypeByName(types, utQName.getLocalName()); - union.setType(type); - toRemove.add(ut); - } else { - final TypeDefinitionBuilder resolvedType = findTypeDefinitionBuilder(union, dependentModuleBuilder, - utQName.getLocalName(), module.getName(), union.getLine()); - union.setTypedef(resolvedType); - toRemove.add(ut); - } - - } else if (unionType instanceof ExtendedType) { - final ExtendedType extType = (ExtendedType) unionType; - TypeDefinition extTypeBase = extType.getBaseType(); - if (extTypeBase instanceof UnknownType) { - final UnknownType ut = (UnknownType) extTypeBase; - final QName utQName = ut.getQName(); - final ModuleBuilder dependentModuleBuilder = findDependentModuleBuilder(modules, module, - utQName.getPrefix(), union.getLine()); - - if (dependentModuleBuilder == null) { - final Module dependentModule = findModuleFromContext(context, module, utQName.getPrefix(), - union.getLine()); - Set> types = dependentModule.getTypeDefinitions(); - TypeDefinition type = findTypeByName(types, utQName.getLocalName()); - final TypeDefinitionBuilder newType = extendedTypeWithNewBase(null, type, extType, modules, - module, 0); - - union.setTypedef(newType); - toRemove.add(extType); - } else { - final TypeDefinitionBuilder targetTypeBuilder = findTypeDefinitionBuilder(union, - dependentModuleBuilder, utQName.getLocalName(), module.getName(), union.getLine()); - - final TypeDefinitionBuilder newType = extendedTypeWithNewBase(targetTypeBuilder, null, extType, - modules, module, union.getLine()); - - union.setTypedef(newType); - toRemove.add(extType); - } - } + resolveUnionUnknownType(union, (UnknownType) unionType, modules, module, context); + toRemove.add(unionType); + } else if (unionType instanceof ExtendedType && unionType.getBaseType() instanceof UnknownType) { + resolveUnionUnknownType(union, (ExtendedType) unionType, modules, module, context); + toRemove.add(unionType); } } unionTypes.removeAll(toRemove); } + private static void resolveUnionUnknownType(final UnionTypeBuilder union, final UnknownType ut, + final Map> modules, final ModuleBuilder module, + final SchemaContext context) { + final int line = union.getLine(); + final QName utQName = ut.getQName(); + final ModuleBuilder dependentModuleBuilder = findModuleFromBuilders(modules, module, utQName.getPrefix(), line); + + if (dependentModuleBuilder == null) { + Module dependentModule = findModuleFromContext(context, module, utQName.getPrefix(), line); + Set> types = dependentModule.getTypeDefinitions(); + TypeDefinition type = findTypeByName(types, utQName.getLocalName()); + union.setType(type); + } else { + final TypeDefinitionBuilder resolvedType = findTypeDefinitionBuilder(union, dependentModuleBuilder, + utQName.getLocalName(), module.getName(), union.getLine()); + union.setTypedef(resolvedType); + } + } + + private static void resolveUnionUnknownType(final UnionTypeBuilder union, final ExtendedType extType, + final Map> modules, final ModuleBuilder module, + final SchemaContext context) { + final int line = union.getLine(); + final TypeDefinition extTypeBase = extType.getBaseType(); + final UnknownType ut = (UnknownType) extTypeBase; + final QName utQName = ut.getQName(); + final ModuleBuilder dependentModuleBuilder = findModuleFromBuilders(modules, module, utQName.getPrefix(), line); + + if (dependentModuleBuilder == null) { + final Module dependentModule = findModuleFromContext(context, module, utQName.getPrefix(), line); + Set> types = dependentModule.getTypeDefinitions(); + TypeDefinition type = findTypeByName(types, utQName.getLocalName()); + final TypeDefinitionBuilder newType = extendedTypeWithNewBase(null, type, extType, modules, module, 0); + union.setTypedef(newType); + } else { + final TypeDefinitionBuilder targetTypeBuilder = findTypeDefinitionBuilder(union, dependentModuleBuilder, + utQName.getLocalName(), module.getName(), line); + final TypeDefinitionBuilder newType = extendedTypeWithNewBase(targetTypeBuilder, null, extType, modules, + module, line); + union.setTypedef(newType); + } + } + /** * Find type definition of type of unresolved node. - * + * * @param nodeToResolve * node with unresolved type * @param dependentModuleBuilder @@ -238,15 +223,14 @@ public final class TypeUtils { final int line = nodeToResolve.getLine(); final TypeDefinition nodeToResolveType = nodeToResolve.getType(); final QName unknownTypeQName = nodeToResolveType.getBaseType().getQName(); - TypeDefinitionBuilder resolvedType = null; final TypeDefinitionBuilder targetTypeBuilder = findTypeDefinitionBuilder(nodeToResolve, dependentModuleBuilder, unknownTypeQName.getLocalName(), module.getName(), line); + TypeDefinitionBuilder resolvedType; if (nodeToResolveType instanceof ExtendedType) { final ExtendedType extType = (ExtendedType) nodeToResolveType; - final TypeDefinitionBuilder newType = extendedTypeWithNewBase(targetTypeBuilder, null, extType, modules, - module, nodeToResolve.getLine()); - resolvedType = newType; + resolvedType = extendedTypeWithNewBase(targetTypeBuilder, null, extType, modules, module, + nodeToResolve.getLine()); } else { resolvedType = targetTypeBuilder; } @@ -261,7 +245,7 @@ public final class TypeUtils { /** * Search types for type with given name. - * + * * @param types * types to search * @param name @@ -279,7 +263,7 @@ public final class TypeUtils { /** * Find type by name. - * + * * @param types * collection of types * @param typeName @@ -298,7 +282,7 @@ public final class TypeUtils { /** * Pull restriction from type and add them to constraints. - * + * * @param type * type from which constraints will be read * @param constraints @@ -310,6 +294,8 @@ public final class TypeUtils { constraints.addFractionDigits(((DecimalTypeDefinition) type).getFractionDigits()); } else if (type instanceof IntegerTypeDefinition) { constraints.addRanges(((IntegerTypeDefinition) type).getRangeConstraints()); + } else if (type instanceof UnsignedIntegerTypeDefinition) { + constraints.addRanges(((UnsignedIntegerTypeDefinition) type).getRangeConstraints()); } else if (type instanceof StringTypeDefinition) { constraints.addPatterns(((StringTypeDefinition) type).getPatternConstraints()); constraints.addLengths(((StringTypeDefinition) type).getLengthConstraints()); @@ -327,7 +313,7 @@ public final class TypeUtils { /** * Create new type builder based on old type with new base type. Note: only * one of newBaseTypeBuilder or newBaseType can be specified. - * + * * @param newBaseTypeBuilder * new base type builder or null * @param newBaseType @@ -351,9 +337,9 @@ public final class TypeUtils { } final TypeDefinitionBuilderImpl newType = new TypeDefinitionBuilderImpl(module.getModuleName(), line, - oldExtendedType.getQName()); + oldExtendedType.getQName(), oldExtendedType.getPath()); final TypeConstraints tc = new TypeConstraints(module.getName(), line); - TypeConstraints constraints = null; + TypeConstraints constraints; if (newBaseType == null) { tc.addFractionDigits(oldExtendedType.getFractionDigits()); tc.addLengths(oldExtendedType.getLengthConstraints()); @@ -366,7 +352,6 @@ public final class TypeUtils { newType.setType(newBaseType); } - newType.setPath(oldExtendedType.getPath()); newType.setDescription(oldExtendedType.getDescription()); newType.setReference(oldExtendedType.getReference()); newType.setStatus(oldExtendedType.getStatus()); @@ -376,13 +361,12 @@ public final class TypeUtils { newType.setFractionDigits(constraints.getFractionDigits()); newType.setUnits(oldExtendedType.getUnits()); newType.setDefaultValue(oldExtendedType.getDefaultValue()); - newType.setUnknownNodes(oldExtendedType.getUnknownSchemaNodes()); return newType; } /** * Pull restrictions from type and add them to constraints. - * + * * @param typeToResolve * type from which constraints will be read * @param constraints @@ -432,7 +416,7 @@ public final class TypeUtils { } else { QName qname = type.getQName(); if (type instanceof UnknownType) { - ModuleBuilder dependentModuleBuilder = ParserUtils.findDependentModuleBuilder(modules, builder, + ModuleBuilder dependentModuleBuilder = ParserUtils.findModuleFromBuilders(modules, builder, qname.getPrefix(), nodeToResolve.getLine()); if (dependentModuleBuilder == null) { if (context == null) { @@ -454,7 +438,7 @@ public final class TypeUtils { TypeDefinition base = ((ExtendedType) type).getBaseType(); if (base instanceof UnknownType) { - ModuleBuilder dependentModule = ParserUtils.findDependentModuleBuilder(modules, builder, base + ModuleBuilder dependentModule = ParserUtils.findModuleFromBuilders(modules, builder, base .getQName().getPrefix(), nodeToResolve.getLine()); TypeDefinitionBuilder tdb = findTypeDefinitionBuilder(nodeToResolve, dependentModule, base .getQName().getLocalName(), builder.getName(), nodeToResolve.getLine()); @@ -472,9 +456,9 @@ public final class TypeUtils { /** * Search for type definition builder by name. - * - * @param dirtyNodeSchemaPath - * schema path of node which contains unresolved type + * + * @param nodeToResolve + * node which contains unresolved type * @param dependentModule * module which should contains referenced type * @param typeName @@ -483,15 +467,12 @@ public final class TypeUtils { * name of current module * @param line * current line in module - * @return + * @return typeDefinitionBuilder */ private static TypeDefinitionBuilder findTypeDefinitionBuilder(final TypeAwareBuilder nodeToResolve, final ModuleBuilder dependentModule, final String typeName, final String currentModuleName, final int line) { - - TypeDefinitionBuilder result = null; - Set typedefs = dependentModule.getTypeDefinitionBuilders(); - result = findTypedefBuilderByName(typedefs, typeName); + TypeDefinitionBuilder result = findTypedefBuilderByName(typedefs, typeName); if (result != null) { return result; }