Yang parser refactoring.
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / util / TypeUtils.java
index e521f699aad19467888f5af032bbeb98f8de4da8..16983c77f32c1018c8a6e199044797223edb3c3c 100644 (file)
@@ -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<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
@@ -85,11 +68,10 @@ public final class TypeUtils {
     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) {
@@ -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<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
@@ -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<TypeDefinitionBuilder> typedefs = dependentModule.getTypeDefinitionBuilders();
-        result = findTypedefBuilderByName(typedefs, typeName);
+        TypeDefinitionBuilder result = findTypedefBuilderByName(typedefs, typeName);
         if (result != null) {
             return result;
         }