*/
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.
/**
* 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
*/
public static void resolveType(final TypeAwareBuilder nodeToResolve,
final Map<String, TreeMap<Date, ModuleBuilder>> 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
public static void resolveTypeWithContext(final TypeAwareBuilder nodeToResolve,
final Map<String, TreeMap<Date, ModuleBuilder>> 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) {
}
} 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<String, TreeMap<Date, ModuleBuilder>> modules, final ModuleBuilder builder) {
-
final List<TypeDefinition<?>> unionTypes = union.getTypes();
- final List<TypeDefinition<?>> toRemove = new ArrayList<TypeDefinition<?>>();
+ final List<TypeDefinition<?>> 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<String, TreeMap<Date, ModuleBuilder>> modules, final ModuleBuilder module,
final SchemaContext context) {
-
final List<TypeDefinition<?>> unionTypes = union.getTypes();
- final List<TypeDefinition<?>> toRemove = new ArrayList<TypeDefinition<?>>();
+ final List<TypeDefinition<?>> 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<TypeDefinition<?>> 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<TypeDefinition<?>> 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<String, TreeMap<Date, ModuleBuilder>> 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<TypeDefinition<?>> 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<String, TreeMap<Date, ModuleBuilder>> 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<TypeDefinition<?>> 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
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;
}
/**
* Search types for type with given name.
- *
+ *
* @param types
* types to search
* @param name
/**
* Find type by name.
- *
+ *
* @param types
* collection of types
* @param typeName
/**
* Pull restriction from type and add them to constraints.
- *
+ *
* @param type
* type from which constraints will be read
* @param constraints
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());
/**
* 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
}
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());
newType.setType(newBaseType);
}
- newType.setPath(oldExtendedType.getPath());
newType.setDescription(oldExtendedType.getDescription());
newType.setReference(oldExtendedType.getReference());
newType.setStatus(oldExtendedType.getStatus());
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
} 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) {
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());
/**
* 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
* 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<TypeDefinitionBuilder> typedefs = dependentModule.getTypeDefinitionBuilders();
- result = findTypedefBuilderByName(typedefs, typeName);
+ TypeDefinitionBuilder result = findTypedefBuilderByName(typedefs, typeName);
if (result != null) {
return result;
}