Refactored YangModelParserImpl 05/105/1
authormvitez <mvitez@cisco.com>
Thu, 4 Apr 2013 13:48:56 +0000 (15:48 +0200)
committermvitez <mvitez@cisco.com>
Thu, 4 Apr 2013 14:57:08 +0000 (16:57 +0200)
Renamed Identityref to IdentityrefType
Renamed IdentityType to IdentitySchemaNode and moved from yang-model-util to yang-model-api + refactored as interface
Added tests

Signed-off-by: mvitez <mvitez@cisco.com>
14 files changed:
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/builder/impl/IdentitySchemaNodeBuilder.java [new file with mode: 0644]
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/builder/impl/ModuleBuilder.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/impl/YangModelParserImpl.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/impl/YangModelParserListenerImpl.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/util/YangModelBuilderUtil.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/model/parser/impl/TypesResolutionTest.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/model/parser/impl/YangModelParserListenerTest.java
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/resources/abstract-topology.yang
opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/resources/types/custom-types-test@2012-4-4.yang [new file with mode: 0644]
opendaylight/sal/yang-prototype/yang/yang-model-api/src/main/java/org/opendaylight/controller/yang/model/api/IdentitySchemaNode.java [new file with mode: 0644]
opendaylight/sal/yang-prototype/yang/yang-model-api/src/main/java/org/opendaylight/controller/yang/model/api/Module.java
opendaylight/sal/yang-prototype/yang/yang-model-api/src/main/java/org/opendaylight/controller/yang/model/api/type/IdentityrefTypeDefinition.java
opendaylight/sal/yang-prototype/yang/yang-model-util/src/main/java/org/opendaylight/controller/yang/model/util/IdentityrefType.java [moved from opendaylight/sal/yang-prototype/yang/yang-model-util/src/main/java/org/opendaylight/controller/yang/model/util/Identityref.java with 50% similarity]
opendaylight/sal/yang-prototype/yang/yang-model-util/src/main/java/org/opendaylight/controller/yang/model/util/YangTypesConverter.java

diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/builder/impl/IdentitySchemaNodeBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/model/parser/builder/impl/IdentitySchemaNodeBuilder.java
new file mode 100644 (file)
index 0000000..0abc959
--- /dev/null
@@ -0,0 +1,201 @@
+/*
+ * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.yang.model.parser.builder.impl;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.opendaylight.controller.yang.common.QName;
+import org.opendaylight.controller.yang.model.api.IdentitySchemaNode;
+import org.opendaylight.controller.yang.model.api.SchemaPath;
+import org.opendaylight.controller.yang.model.api.Status;
+import org.opendaylight.controller.yang.model.api.UnknownSchemaNode;
+import org.opendaylight.controller.yang.model.parser.builder.api.SchemaNodeBuilder;
+
+public class IdentitySchemaNodeBuilder implements SchemaNodeBuilder {
+
+    private final QName qname;
+    private final IdentitySchemaNodeImpl instance;
+    private IdentitySchemaNodeBuilder baseIdentity;
+    private String baseIdentityName;
+
+    IdentitySchemaNodeBuilder(QName qname) {
+        this.qname = qname;
+        instance = new IdentitySchemaNodeImpl(qname);
+    }
+
+    @Override
+    public IdentitySchemaNode build() {
+        if(baseIdentity != null) {
+            IdentitySchemaNode base = baseIdentity.build();
+            instance.setBaseIdentity(base);
+        }
+        return instance;
+    }
+
+    @Override
+    public QName getQName() {
+        return qname;
+    }
+
+    @Override
+    public void setPath(SchemaPath path) {
+        instance.setPath(path);
+    }
+
+    @Override
+    public void setDescription(String description) {
+        instance.setDescription(description);
+    }
+
+    @Override
+    public void setReference(String reference) {
+        instance.setReference(reference);
+    }
+
+    @Override
+    public void setStatus(Status status) {
+        if (status != null) {
+            instance.setStatus(status);
+        }
+    }
+
+    @Override
+    public void addUnknownSchemaNode(
+            UnknownSchemaNodeBuilder unknownSchemaNodeBuilder) {
+        throw new IllegalStateException(
+                "Can not add schema node to identity statement");
+    }
+
+    public String getBaseIdentityName() {
+        return baseIdentityName;
+    }
+
+    public void setBaseIdentityName(String baseIdentityName) {
+        this.baseIdentityName = baseIdentityName;
+    }
+
+    public void setBaseIdentity(IdentitySchemaNodeBuilder baseType) {
+        this.baseIdentity = baseType;
+    }
+
+    private class IdentitySchemaNodeImpl implements IdentitySchemaNode {
+        private final QName qname;
+        private IdentitySchemaNode baseIdentity;
+        private String description;
+        private String reference;
+        private Status status = Status.CURRENT;
+        private SchemaPath path;
+
+        private IdentitySchemaNodeImpl(QName qname) {
+            this.qname = qname;
+        }
+
+        @Override
+        public QName getQName() {
+            return qname;
+        }
+
+        @Override
+        public IdentitySchemaNode getBaseIdentity() {
+            return baseIdentity;
+        }
+
+        private void setBaseIdentity(IdentitySchemaNode baseIdentity) {
+            this.baseIdentity = baseIdentity;
+        }
+
+        @Override
+        public String getDescription() {
+            return description;
+        }
+
+        private void setDescription(String description) {
+            this.description = description;
+        }
+
+        @Override
+        public String getReference() {
+            return reference;
+        }
+
+        private void setReference(String reference) {
+            this.reference = reference;
+        }
+
+        @Override
+        public Status getStatus() {
+            return status;
+        }
+
+        private void setStatus(Status status) {
+            if (status != null) {
+                this.status = status;
+            }
+        }
+
+        @Override
+        public SchemaPath getPath() {
+            return path;
+        }
+
+        private void setPath(SchemaPath path) {
+            this.path = path;
+        }
+
+        @Override
+        public List<UnknownSchemaNode> getUnknownSchemaNodes() {
+            return Collections.emptyList();
+        }
+
+        @Override
+        public int hashCode() {
+            final int prime = 31;
+            int result = 1;
+            result = prime * result + ((qname == null) ? 0 : qname.hashCode());
+            return result;
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj) {
+                return true;
+            }
+            if (obj == null) {
+                return false;
+            }
+            if (getClass() != obj.getClass()) {
+                return false;
+            }
+            IdentitySchemaNodeImpl other = (IdentitySchemaNodeImpl) obj;
+            if (qname == null) {
+                if (other.qname != null) {
+                    return false;
+                }
+            } else if (!qname.equals(other.qname)) {
+                return false;
+            }
+            return true;
+        }
+
+        @Override
+        public String toString() {
+            StringBuilder sb = new StringBuilder(
+                    IdentitySchemaNodeImpl.class.getSimpleName());
+            sb.append("[");
+            sb.append("base=" + baseIdentity);
+            sb.append(", qname=" + qname);
+            sb.append(", description=" + description);
+            sb.append(", reference=" + reference);
+            sb.append(", status=" + status);
+            sb.append("]");
+            return sb.toString();
+        }
+    }
+
+}
index 90a4547f38f90054c139eaa2f8f753e20c28883e..d22295ae66e3b0eb6d0fb6928cccc88a1c05c19e 100644 (file)
@@ -24,6 +24,7 @@ import org.opendaylight.controller.yang.model.api.Deviation;
 import org.opendaylight.controller.yang.model.api.ExtensionDefinition;\r
 import org.opendaylight.controller.yang.model.api.FeatureDefinition;\r
 import org.opendaylight.controller.yang.model.api.GroupingDefinition;\r
+import org.opendaylight.controller.yang.model.api.IdentitySchemaNode;\r
 import org.opendaylight.controller.yang.model.api.Module;\r
 import org.opendaylight.controller.yang.model.api.ModuleImport;\r
 import org.opendaylight.controller.yang.model.api.NotificationDefinition;\r
@@ -71,6 +72,7 @@ public class ModuleBuilder implements Builder {
     private final Map<List<String>, UsesNodeBuilder> addedUsesNodes = new HashMap<List<String>, UsesNodeBuilder>();\r
     private final Map<List<String>, RpcDefinitionBuilder> addedRpcs = new HashMap<List<String>, RpcDefinitionBuilder>();\r
     private final Set<NotificationBuilder> addedNotifications = new HashSet<NotificationBuilder>();\r
+    private final Set<IdentitySchemaNodeBuilder> addedIdentities = new HashSet<IdentitySchemaNodeBuilder>();\r
     private final Map<List<String>, FeatureBuilder> addedFeatures = new HashMap<List<String>, FeatureBuilder>();\r
     private final Map<String, DeviationBuilder> addedDeviations = new HashMap<String, DeviationBuilder>();\r
     private final Map<List<String>, TypeDefinitionBuilder> addedTypedefs = new HashMap<List<String>, TypeDefinitionBuilder>();\r
@@ -85,7 +87,6 @@ public class ModuleBuilder implements Builder {
     }\r
 \r
 \r
-\r
     /**\r
      * Build new Module object based on this builder.\r
      */\r
@@ -142,6 +143,13 @@ public class ModuleBuilder implements Builder {
         }\r
         instance.setExtensionSchemaNodes(extensions);\r
 \r
+        // IDENTITIES\r
+        final Set<IdentitySchemaNode> identities = new HashSet<IdentitySchemaNode>();\r
+        for(IdentitySchemaNodeBuilder idBuilder : addedIdentities) {\r
+            identities.add(idBuilder.build());\r
+        }\r
+        instance.setIdentities(identities);\r
+\r
         return instance;\r
     }\r
 \r
@@ -153,6 +161,14 @@ public class ModuleBuilder implements Builder {
         return dirtyNodes;\r
     }\r
 \r
+    public Set<AugmentationSchemaBuilder> getAddedAugments() {\r
+        return addedAugments;\r
+    }\r
+\r
+    public Set<IdentitySchemaNodeBuilder> getAddedIdentities() {\r
+        return addedIdentities;\r
+    }\r
+\r
     public String getName() {\r
         return name;\r
     }\r
@@ -165,10 +181,6 @@ public class ModuleBuilder implements Builder {
         return revision;\r
     }\r
 \r
-    public Set<AugmentationSchemaBuilder> getAddedAugments() {\r
-        return addedAugments;\r
-    }\r
-\r
     public void addDirtyNode(List<String> path) {\r
         List<String> dirtyNodePath = new ArrayList<String>(path);\r
         TypeAwareBuilder nodeBuilder = (TypeAwareBuilder) moduleNodes\r
@@ -468,6 +480,13 @@ public class ModuleBuilder implements Builder {
         return builder;\r
     }\r
 \r
+    public IdentitySchemaNodeBuilder addIdentity(QName qname) {\r
+        IdentitySchemaNodeBuilder builder = new IdentitySchemaNodeBuilder(qname);\r
+        addedIdentities.add(builder);\r
+\r
+        return builder;\r
+    }\r
+\r
     public void addConfiguration(boolean configuration, List<String> parentPath) {\r
         Builder builder = moduleNodes.get(parentPath);\r
         if (builder instanceof DeviationBuilder) {\r
@@ -506,6 +525,7 @@ public class ModuleBuilder implements Builder {
         private Set<GroupingDefinition> groupings = Collections.emptySet();\r
         private Set<UsesNode> uses = Collections.emptySet();\r
         private List<ExtensionDefinition> extensionSchemaNodes = Collections.emptyList();\r
+        private Set<IdentitySchemaNode> identities = Collections.emptySet();\r
 \r
         private ModuleImpl(String name) {\r
             this.name = name;\r
@@ -709,6 +729,17 @@ public class ModuleBuilder implements Builder {
             }\r
         }\r
 \r
+        @Override\r
+        public Set<IdentitySchemaNode> getIdentities() {\r
+            return identities;\r
+        }\r
+\r
+        private void setIdentities(Set<IdentitySchemaNode> identities) {\r
+            if(identities != null) {\r
+                this.identities = identities;\r
+            }\r
+        }\r
+\r
         @Override\r
         public DataSchemaNode getDataChildByName(QName name) {\r
             return childNodes.get(name);\r
index fce723edff9ea6ebd32b7d814ad371d00abaa53a..f30780f30ce7b30d70d730592b618cfc7def41e0 100644 (file)
@@ -41,14 +41,13 @@ import org.opendaylight.controller.yang.model.api.SchemaPath;
 import org.opendaylight.controller.yang.model.api.TypeDefinition;
 import org.opendaylight.controller.yang.model.api.type.BinaryTypeDefinition;
 import org.opendaylight.controller.yang.model.api.type.BitsTypeDefinition;
+import org.opendaylight.controller.yang.model.api.type.BitsTypeDefinition.Bit;
 import org.opendaylight.controller.yang.model.api.type.DecimalTypeDefinition;
-import org.opendaylight.controller.yang.model.api.type.InstanceIdentifierTypeDefinition;
 import org.opendaylight.controller.yang.model.api.type.IntegerTypeDefinition;
 import org.opendaylight.controller.yang.model.api.type.LengthConstraint;
 import org.opendaylight.controller.yang.model.api.type.PatternConstraint;
 import org.opendaylight.controller.yang.model.api.type.RangeConstraint;
 import org.opendaylight.controller.yang.model.api.type.StringTypeDefinition;
-import org.opendaylight.controller.yang.model.api.type.BitsTypeDefinition.Bit;
 import org.opendaylight.controller.yang.model.parser.api.YangModelParser;
 import org.opendaylight.controller.yang.model.parser.builder.api.AugmentationSchemaBuilder;
 import org.opendaylight.controller.yang.model.parser.builder.api.AugmentationTargetBuilder;
@@ -56,6 +55,7 @@ import org.opendaylight.controller.yang.model.parser.builder.api.ChildNodeBuilde
 import org.opendaylight.controller.yang.model.parser.builder.api.DataSchemaNodeBuilder;
 import org.opendaylight.controller.yang.model.parser.builder.api.TypeAwareBuilder;
 import org.opendaylight.controller.yang.model.parser.builder.api.TypeDefinitionBuilder;
+import org.opendaylight.controller.yang.model.parser.builder.impl.IdentitySchemaNodeBuilder;
 import org.opendaylight.controller.yang.model.parser.builder.impl.ModuleBuilder;
 import org.opendaylight.controller.yang.model.parser.builder.impl.UnionTypeBuilder;
 import org.opendaylight.controller.yang.model.util.BaseConstraints;
@@ -102,14 +102,15 @@ public class YangModelParserImpl implements YangModelParser {
     private Map<String, TreeMap<Date, ModuleBuilder>> resolveModuleBuildersFromStreams(
             String... yangFiles) {
         InputStream[] streams = new InputStream[yangFiles.length];
-        for(int i = 0; i < yangFiles.length; i++) {
+        for (int i = 0; i < yangFiles.length; i++) {
             final String yangFileName = yangFiles[i];
             final File yangFile = new File(yangFileName);
             FileInputStream inStream = null;
             try {
                 inStream = new FileInputStream(yangFile);
-            } catch(FileNotFoundException e) {
-                logger.warn("Exception while reading yang stream: " + inStream, e);
+            } catch (FileNotFoundException e) {
+                logger.warn("Exception while reading yang stream: " + inStream,
+                        e);
             }
             streams[i] = inStream;
         }
@@ -138,14 +139,12 @@ public class YangModelParserImpl implements YangModelParser {
             if (builderRevision == null) {
                 builderRevision = createEpochTime();
             }
-
             TreeMap<Date, ModuleBuilder> builderByRevision = modules
                     .get(builderName);
             if (builderByRevision == null) {
                 builderByRevision = new TreeMap<Date, ModuleBuilder>();
             }
             builderByRevision.put(builderRevision, builder);
-
             modules.put(builderName, builderByRevision);
         }
         return modules;
@@ -205,6 +204,7 @@ public class YangModelParserImpl implements YangModelParser {
             ModuleBuilder builder) {
         resolveTypedefs(modules, builder);
         resolveAugments(modules, builder);
+        resolveIdentities(modules, builder);
     }
 
     /**
@@ -219,8 +219,7 @@ public class YangModelParserImpl implements YangModelParser {
     private void resolveTypedefs(
             Map<String, TreeMap<Date, ModuleBuilder>> modules,
             ModuleBuilder module) {
-        Map<List<String>, TypeAwareBuilder> dirtyNodes = module
-                .getDirtyNodes();
+        Map<List<String>, TypeAwareBuilder> dirtyNodes = module.getDirtyNodes();
         if (dirtyNodes.size() == 0) {
             return;
         } else {
@@ -244,7 +243,6 @@ public class YangModelParserImpl implements YangModelParser {
     private UnionTypeBuilder resolveUnionTypeBuilder(
             Map<String, TreeMap<Date, ModuleBuilder>> modules,
             ModuleBuilder builder, UnionTypeBuilder unionTypeBuilderToResolve) {
-
         List<TypeDefinition<?>> resolvedTypes = new ArrayList<TypeDefinition<?>>();
         List<TypeDefinition<?>> typesToRemove = new ArrayList<TypeDefinition<?>>();
 
@@ -277,26 +275,42 @@ public class YangModelParserImpl implements YangModelParser {
                 .iterator().next().getValue();
 
         TypeDefinition<?> targetTypeBaseType = targetType.getBaseType();
-        String targetTypeBaseTypeName = targetTypeBaseType.getQName()
-                .getLocalName();
 
         // RANGE
         List<RangeConstraint> ranges = ut.getRangeStatements();
         resolveRanges(ranges, targetType, modules, builder);
-
         // LENGTH
         List<LengthConstraint> lengths = ut.getLengthStatements();
         resolveLengths(lengths, targetType, modules, builder);
-
         // PATTERN
         List<PatternConstraint> patterns = ut.getPatterns();
-
         // Fraction Digits
         Integer fractionDigits = ut.getFractionDigits();
 
-        // MERGE CONSTRAINTS (enumeration and leafref omitted
-        // because
-        // they have no restrictions)
+        targetTypeBaseType = mergeConstraints(targetTypeBaseType, constraints, ranges, lengths,
+                patterns, fractionDigits);
+
+        return targetTypeBaseType;
+    }
+
+    /**
+     * Merge curent constraints with founded type constraints
+     *
+     * @param targetTypeBaseType
+     * @param constraints
+     * @param ranges
+     * @param lengths
+     * @param patterns
+     * @param fractionDigits
+     */
+    private TypeDefinition<?> mergeConstraints(TypeDefinition<?> targetTypeBaseType,
+            TypeConstraints constraints, List<RangeConstraint> ranges,
+            List<LengthConstraint> lengths, List<PatternConstraint> patterns,
+            Integer fractionDigits) {
+        String targetTypeBaseTypeName = targetTypeBaseType.getQName()
+                .getLocalName();
+        // enumeration, leafref and identityref omitted because they have no
+        // restrictions
         if (targetTypeBaseType instanceof DecimalTypeDefinition) {
             List<RangeConstraint> fullRanges = new ArrayList<RangeConstraint>();
             fullRanges.addAll(constraints.getRanges());
@@ -332,14 +346,7 @@ public class YangModelParserImpl implements YangModelParser {
             targetTypeBaseType = new BitsType(bits);
         } else if (targetTypeBaseType instanceof BinaryTypeDefinition) {
             targetTypeBaseType = new BinaryType(null, lengths, null);
-        } else if (targetTypeBaseTypeName.equals("instance-identifier")) {
-            // TODO: instance-identifier
-            /*
-             * boolean requireInstance = isRequireInstance(typeBody); type = new
-             * InstanceIdentifier(null, requireInstance);
-             */
         }
-
         return targetTypeBaseType;
     }
 
@@ -362,10 +369,14 @@ public class YangModelParserImpl implements YangModelParser {
      * Traverse through all referenced types chain until base YANG type is
      * founded.
      *
-     * @param constraints current type constraints
-     * @param modules all available modules
-     * @param unknownType unknown type
-     * @param builder current module
+     * @param constraints
+     *            current type constraints
+     * @param modules
+     *            all available modules
+     * @param unknownType
+     *            unknown type
+     * @param builder
+     *            current module
      * @return map, where key is type referenced and value is its constraints
      */
     private Map<TypeDefinitionBuilder, TypeConstraints> findTypeDefinitionBuilderWithConstraints(
@@ -373,8 +384,6 @@ public class YangModelParserImpl implements YangModelParser {
             Map<String, TreeMap<Date, ModuleBuilder>> modules,
             UnknownType unknownType, ModuleBuilder builder) {
         Map<TypeDefinitionBuilder, TypeConstraints> result = new HashMap<TypeDefinitionBuilder, TypeConstraints>();
-
-        // TypeDefinition<?> unknownType = typeBuilder.getType();
         QName unknownTypeQName = unknownType.getQName();
         String unknownTypeName = unknownTypeQName.getLocalName();
         String unknownTypePrefix = unknownTypeQName.getPrefix();
@@ -384,19 +393,8 @@ public class YangModelParserImpl implements YangModelParser {
         if (unknownTypePrefix.equals(builder.getPrefix())) {
             dependentModuleBuilder = builder;
         } else {
-            ModuleImport dependentModuleImport = getModuleImport(builder,
+            dependentModuleBuilder = findDependentModule(modules, builder,
                     unknownTypePrefix);
-            String dependentModuleName = dependentModuleImport.getModuleName();
-            Date dependentModuleRevision = dependentModuleImport.getRevision();
-            TreeMap<Date, ModuleBuilder> moduleBuildersByRevision = modules
-                    .get(dependentModuleName);
-            if (dependentModuleRevision == null) {
-                dependentModuleBuilder = moduleBuildersByRevision.lastEntry()
-                        .getValue();
-            } else {
-                dependentModuleBuilder = moduleBuildersByRevision
-                        .get(dependentModuleRevision);
-            }
         }
 
         // pull all typedef statements from dependent module...
@@ -445,10 +443,7 @@ public class YangModelParserImpl implements YangModelParser {
             } else if (referencedType instanceof BinaryTypeDefinition) {
                 constraints.addLengths(((BinaryTypeDefinition) referencedType)
                         .getLengthConstraints());
-            } else if (referencedType instanceof InstanceIdentifierTypeDefinition) {
-                // TODO: instance-identifier
             }
-
             result.put(lookedUpBuilder, constraints);
             return result;
         }
@@ -474,27 +469,17 @@ public class YangModelParserImpl implements YangModelParser {
             SchemaPath augmentTargetSchemaPath = augmentBuilder.getTargetPath();
             String prefix = null;
             List<String> augmentTargetPath = new ArrayList<String>();
+
             for (QName pathPart : augmentTargetSchemaPath.getPath()) {
                 prefix = pathPart.getPrefix();
                 augmentTargetPath.add(pathPart.getLocalName());
             }
-            ModuleImport dependentModuleImport = getModuleImport(module,
-                    prefix);
-            String dependentModuleName = dependentModuleImport.getModuleName();
-            augmentTargetPath.add(0, dependentModuleName);
-
-            Date dependentModuleRevision = dependentModuleImport.getRevision();
-
-            TreeMap<Date, ModuleBuilder> moduleBuildersByRevision = modules
-                    .get(dependentModuleName);
-            ModuleBuilder dependentModule;
-            if (dependentModuleRevision == null) {
-                dependentModule = moduleBuildersByRevision.lastEntry()
-                        .getValue();
-            } else {
-                dependentModule = moduleBuildersByRevision
-                        .get(dependentModuleRevision);
-            }
+            ModuleBuilder dependentModule = findDependentModule(modules,
+                    module, prefix);
+            //
+            augmentTargetPath.add(0, dependentModule.getName());
+            //
+
 
             AugmentationTargetBuilder augmentTarget = (AugmentationTargetBuilder) dependentModule
                     .getNode(augmentTargetPath);
@@ -520,6 +505,82 @@ public class YangModelParserImpl implements YangModelParser {
         }
     }
 
+    /**
+     * Go through identity statements defined in current module and resolve
+     * their 'base' statement if present.
+     *
+     * @param modules
+     *            all modules
+     * @param module
+     *            module being resolved
+     */
+    private void resolveIdentities(
+            Map<String, TreeMap<Date, ModuleBuilder>> modules,
+            ModuleBuilder module) {
+        Set<IdentitySchemaNodeBuilder> identities = module.getAddedIdentities();
+        for (IdentitySchemaNodeBuilder identity : identities) {
+            String baseIdentityName = identity.getBaseIdentityName();
+            if (baseIdentityName != null) {
+                String baseIdentityPrefix = null;
+                String baseIdentityLocalName = null;
+                if (baseIdentityName.contains(":")) {
+                    String[] splitted = baseIdentityName.split(":");
+                    baseIdentityPrefix = splitted[0];
+                    baseIdentityLocalName = splitted[1];
+                } else {
+                    baseIdentityPrefix = module.getPrefix();
+                    baseIdentityLocalName = baseIdentityName;
+                }
+                ModuleBuilder dependentModule;
+                if (baseIdentityPrefix.equals(module.getPrefix())) {
+                    dependentModule = module;
+                } else {
+                    dependentModule = findDependentModule(modules, module,
+                            baseIdentityPrefix);
+                }
+
+                Set<IdentitySchemaNodeBuilder> dependentModuleIdentities = dependentModule
+                        .getAddedIdentities();
+                for (IdentitySchemaNodeBuilder idBuilder : dependentModuleIdentities) {
+                    if (idBuilder.getQName().getLocalName()
+                            .equals(baseIdentityLocalName)) {
+                        identity.setBaseIdentity(idBuilder);
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * Find dependent module based on given prefix
+     *
+     * @param modules
+     *            all available modules
+     * @param module
+     *            current module
+     * @param prefix
+     *            target module prefix
+     * @return dependent module builder
+     */
+    private ModuleBuilder findDependentModule(
+            Map<String, TreeMap<Date, ModuleBuilder>> modules,
+            ModuleBuilder module, String prefix) {
+        ModuleImport dependentModuleImport = getModuleImport(module, prefix);
+        String dependentModuleName = dependentModuleImport.getModuleName();
+        Date dependentModuleRevision = dependentModuleImport.getRevision();
+
+        TreeMap<Date, ModuleBuilder> moduleBuildersByRevision = modules
+                .get(dependentModuleName);
+        ModuleBuilder dependentModule;
+        if (dependentModuleRevision == null) {
+            dependentModule = moduleBuildersByRevision.lastEntry().getValue();
+        } else {
+            dependentModule = moduleBuildersByRevision
+                    .get(dependentModuleRevision);
+        }
+        return dependentModule;
+    }
+
     /**
      * Get module import referenced by given prefix.
      *
@@ -544,10 +605,14 @@ public class YangModelParserImpl implements YangModelParser {
      * Helper method for resolving special 'min' or 'max' values in range
      * constraint
      *
-     * @param ranges ranges to resolve
-     * @param targetType target type
-     * @param modules all available modules
-     * @param builder current module
+     * @param ranges
+     *            ranges to resolve
+     * @param targetType
+     *            target type
+     * @param modules
+     *            all available modules
+     * @param builder
+     *            current module
      */
     private void resolveRanges(List<RangeConstraint> ranges,
             TypeDefinitionBuilder targetType,
@@ -584,10 +649,14 @@ public class YangModelParserImpl implements YangModelParser {
      * Helper method for resolving special 'min' or 'max' values in length
      * constraint
      *
-     * @param lengths lengths to resolve
-     * @param targetType target type
-     * @param modules all available modules
-     * @param builder current module
+     * @param lengths
+     *            lengths to resolve
+     * @param targetType
+     *            target type
+     * @param modules
+     *            all available modules
+     * @param builder
+     *            current module
      */
     private void resolveLengths(List<LengthConstraint> lengths,
             TypeDefinitionBuilder targetType,
index 24f6b381b677032563392878c15277aee48f2680..7e64c6e41cc82fd27cd6b8a61125e60a863755f9 100644 (file)
-/*
- * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.controller.yang.model.parser.impl;
-
-import static org.opendaylight.controller.yang.model.parser.util.YangModelBuilderUtil.*;
-
-import java.net.URI;
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-import java.util.Stack;
-import java.util.TreeMap;
-
-import org.antlr.v4.runtime.tree.ParseTree;
-import org.opendaylight.controller.antlrv4.code.gen.YangParser;
-import org.opendaylight.controller.antlrv4.code.gen.YangParser.Contact_stmtContext;
-import org.opendaylight.controller.antlrv4.code.gen.YangParser.Container_stmtContext;
-import org.opendaylight.controller.antlrv4.code.gen.YangParser.Description_stmtContext;
-import org.opendaylight.controller.antlrv4.code.gen.YangParser.Deviate_add_stmtContext;
-import org.opendaylight.controller.antlrv4.code.gen.YangParser.Deviate_delete_stmtContext;
-import org.opendaylight.controller.antlrv4.code.gen.YangParser.Deviate_not_supported_stmtContext;
-import org.opendaylight.controller.antlrv4.code.gen.YangParser.Deviate_replace_stmtContext;
-import org.opendaylight.controller.antlrv4.code.gen.YangParser.Import_stmtContext;
-import org.opendaylight.controller.antlrv4.code.gen.YangParser.Key_stmtContext;
-import org.opendaylight.controller.antlrv4.code.gen.YangParser.Leaf_list_stmtContext;
-import org.opendaylight.controller.antlrv4.code.gen.YangParser.Leaf_stmtContext;
-import org.opendaylight.controller.antlrv4.code.gen.YangParser.List_stmtContext;
-import org.opendaylight.controller.antlrv4.code.gen.YangParser.Module_header_stmtsContext;
-import org.opendaylight.controller.antlrv4.code.gen.YangParser.Namespace_stmtContext;
-import org.opendaylight.controller.antlrv4.code.gen.YangParser.Ordered_by_stmtContext;
-import org.opendaylight.controller.antlrv4.code.gen.YangParser.Organization_stmtContext;
-import org.opendaylight.controller.antlrv4.code.gen.YangParser.Prefix_stmtContext;
-import org.opendaylight.controller.antlrv4.code.gen.YangParser.Presence_stmtContext;
-import org.opendaylight.controller.antlrv4.code.gen.YangParser.Reference_stmtContext;
-import org.opendaylight.controller.antlrv4.code.gen.YangParser.Revision_date_stmtContext;
-import org.opendaylight.controller.antlrv4.code.gen.YangParser.Revision_stmtContext;
-import org.opendaylight.controller.antlrv4.code.gen.YangParser.Revision_stmtsContext;
-import org.opendaylight.controller.antlrv4.code.gen.YangParser.Status_stmtContext;
-import org.opendaylight.controller.antlrv4.code.gen.YangParser.Type_body_stmtsContext;
-import org.opendaylight.controller.antlrv4.code.gen.YangParser.Union_specificationContext;
-import org.opendaylight.controller.antlrv4.code.gen.YangParser.Yang_version_stmtContext;
-import org.opendaylight.controller.antlrv4.code.gen.YangParserBaseListener;
-import org.opendaylight.controller.yang.common.QName;
-import org.opendaylight.controller.yang.model.api.Status;
-import org.opendaylight.controller.yang.model.api.TypeDefinition;
-import org.opendaylight.controller.yang.model.parser.builder.api.AugmentationSchemaBuilder;
-import org.opendaylight.controller.yang.model.parser.builder.api.GroupingBuilder;
-import org.opendaylight.controller.yang.model.parser.builder.impl.ContainerSchemaNodeBuilder;
-import org.opendaylight.controller.yang.model.parser.builder.impl.DeviationBuilder;
-import org.opendaylight.controller.yang.model.parser.builder.impl.ExtensionBuilder;
-import org.opendaylight.controller.yang.model.parser.builder.impl.FeatureBuilder;
-import org.opendaylight.controller.yang.model.parser.builder.impl.LeafListSchemaNodeBuilder;
-import org.opendaylight.controller.yang.model.parser.builder.impl.LeafSchemaNodeBuilder;
-import org.opendaylight.controller.yang.model.parser.builder.impl.ListSchemaNodeBuilder;
-import org.opendaylight.controller.yang.model.parser.builder.impl.ModuleBuilder;
-import org.opendaylight.controller.yang.model.parser.builder.impl.NotificationBuilder;
-import org.opendaylight.controller.yang.model.parser.builder.impl.RpcDefinitionBuilder;
-import org.opendaylight.controller.yang.model.parser.builder.impl.TypedefBuilder;
-import org.opendaylight.controller.yang.model.parser.builder.impl.UnknownSchemaNodeBuilder;
-import org.opendaylight.controller.yang.model.util.YangTypesConverter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-final class YangModelParserListenerImpl extends YangParserBaseListener {
-
-    private static final Logger logger = LoggerFactory
-            .getLogger(YangModelParserListenerImpl.class);
-
-    private ModuleBuilder moduleBuilder;
-
-    private String moduleName;
-    private URI namespace;
-    private String yangModelPrefix;
-    private Date revision;
-
-    private final DateFormat simpleDateFormat = new SimpleDateFormat(
-            "yyyy-mm-dd");
-    private final Stack<String> actualPath = new Stack<String>();
-
-
-    @Override
-    public void enterModule_stmt(YangParser.Module_stmtContext ctx) {
-        moduleName = stringFromNode(ctx);
-        actualPath.push(moduleName);
-        moduleBuilder = new ModuleBuilder(moduleName);
-
-        String description = null;
-        String reference = null;
-
-        for (int i = 0; i < ctx.getChildCount(); i++) {
-            ParseTree child = ctx.getChild(i);
-            if (child instanceof Description_stmtContext) {
-                description = stringFromNode(child);
-            } else if (child instanceof Reference_stmtContext) {
-                reference = stringFromNode(child);
-            } else {
-                if (description != null && reference != null) {
-                    break;
-                }
-            }
-        }
-        moduleBuilder.setDescription(description);
-        moduleBuilder.setReference(reference);
-    }
-
-    @Override
-    public void exitModule_stmt(YangParser.Module_stmtContext ctx) {
-        final String moduleName = actualPath.pop();
-        logger.debug("Exiting module " + moduleName);
-    }
-
-    @Override
-    public void enterModule_header_stmts(final Module_header_stmtsContext ctx) {
-        super.enterModule_header_stmts(ctx);
-
-        for (int i = 0; i < ctx.getChildCount(); ++i) {
-            final ParseTree treeNode = ctx.getChild(i);
-            if (treeNode instanceof Namespace_stmtContext) {
-                final String namespaceStr = stringFromNode(treeNode);
-                namespace = URI.create(namespaceStr);
-                moduleBuilder.setNamespace(namespace);
-            } else if (treeNode instanceof Prefix_stmtContext) {
-                yangModelPrefix = stringFromNode(treeNode);
-                moduleBuilder.setPrefix(yangModelPrefix);
-            } else if (treeNode instanceof Yang_version_stmtContext) {
-                final String yangVersion = stringFromNode(treeNode);
-                moduleBuilder.setYangVersion(yangVersion);
-            }
-        }
-    }
-
-    @Override
-    public void enterMeta_stmts(YangParser.Meta_stmtsContext ctx) {
-        for (int i = 0; i < ctx.getChildCount(); i++) {
-            ParseTree child = ctx.getChild(i);
-            if (child instanceof Organization_stmtContext) {
-                final String organization = stringFromNode(child);
-                moduleBuilder.setOrganization(organization);
-            } else if (child instanceof Contact_stmtContext) {
-                final String contact = stringFromNode(child);
-                moduleBuilder.setContact(contact);
-            } else if (child instanceof Description_stmtContext) {
-                final String description = stringFromNode(child);
-                moduleBuilder.setDescription(description);
-            } else if (child instanceof Reference_stmtContext) {
-                final String reference = stringFromNode(child);
-                moduleBuilder.setReference(reference);
-            }
-        }
-    }
-
-    @Override
-    public void exitSubmodule_header_stmts(
-            YangParser.Submodule_header_stmtsContext ctx) {
-        final String submodule = actualPath.pop();
-        logger.debug("exiting submodule " + submodule);
-    }
-
-    @Override
-    public void enterRevision_stmts(Revision_stmtsContext ctx) {
-        TreeMap<Date, Revision_stmtContext> revisions = new TreeMap<Date, Revision_stmtContext>();
-
-        for (int i = 0; i < ctx.getChildCount(); ++i) {
-            final ParseTree treeNode = ctx.getChild(i);
-            if (treeNode instanceof Revision_stmtContext) {
-                final String revisionDateStr = stringFromNode(treeNode);
-                try {
-                    Date revision = simpleDateFormat.parse(revisionDateStr);
-                    revisions.put(revision, (Revision_stmtContext)treeNode);
-
-                } catch (ParseException e) {
-                    final String message = "Failed to parse revision string: "+ revisionDateStr;
-                    logger.warn(message);
-                }
-            }
-        }
-        if(revisions.size() > 0) {
-            Revision_stmtContext revisionCtx = revisions.firstEntry().getValue();
-            moduleBuilder.setRevision(revisions.firstKey());
-
-            for(int i = 0; i < revisionCtx.getChildCount(); i++) {
-                ParseTree child = revisionCtx.getChild(i);
-                if(child instanceof Reference_stmtContext) {
-                    moduleBuilder.setReference(stringFromNode(child));
-                }
-            }
-        }
-    }
-
-    @Override
-    public void enterImport_stmt(Import_stmtContext ctx) {
-        super.enterImport_stmt(ctx);
-
-        final String importName = stringFromNode(ctx);
-        String importPrefix = null;
-        Date importRevision = null;
-
-        for (int i = 0; i < ctx.getChildCount(); ++i) {
-            final ParseTree treeNode = ctx.getChild(i);
-            if (treeNode instanceof Prefix_stmtContext) {
-                importPrefix = stringFromNode(treeNode);
-            }
-            if (treeNode instanceof Revision_date_stmtContext) {
-                String importRevisionStr = stringFromNode(treeNode);
-                try {
-                    importRevision = simpleDateFormat.parse(importRevisionStr);
-                } catch(ParseException e) {
-                    logger.warn("Failed to parse import revision-date: "+ importRevisionStr);
-                }
-            }
-        }
-        moduleBuilder.addModuleImport(importName, importRevision, importPrefix);
-    }
-
-    @Override
-    public void enterAugment_stmt(YangParser.Augment_stmtContext ctx) {
-        final String augmentPath = stringFromNode(ctx);
-        AugmentationSchemaBuilder builder = moduleBuilder.addAugment(
-                augmentPath, getActualPath());
-        updatePath(augmentPath);
-
-        for (int i = 0; i < ctx.getChildCount(); i++) {
-            ParseTree child = ctx.getChild(i);
-            if (child instanceof Description_stmtContext) {
-                String desc = stringFromNode(child);
-                builder.setDescription(desc);
-            } else if (child instanceof Reference_stmtContext) {
-                String ref = stringFromNode(child);
-                builder.setReference(ref);
-            } else if (child instanceof Status_stmtContext) {
-                Status status = parseStatus((Status_stmtContext) child);
-                builder.setStatus(status);
-            }
-        }
-    }
-
-    @Override
-    public void exitAugment_stmt(YangParser.Augment_stmtContext ctx) {
-        final String augment = actualPath.pop();
-        logger.debug("exiting augment " + augment);
-    }
-
-    @Override
-    public void enterExtension_stmt(YangParser.Extension_stmtContext ctx) {
-        String argument = stringFromNode(ctx);
-        QName qname = new QName(namespace, revision, yangModelPrefix, argument);
-        ExtensionBuilder builder = moduleBuilder.addExtension(qname);
-        parseSchemaNodeArgs(ctx, builder);
-    }
-
-    @Override
-    public void enterTypedef_stmt(YangParser.Typedef_stmtContext ctx) {
-        String typedefName = stringFromNode(ctx);
-        QName typedefQName = new QName(namespace, revision, yangModelPrefix,
-                typedefName);
-        TypedefBuilder builder = moduleBuilder.addTypedef(typedefQName,
-                getActualPath());
-        updatePath(typedefName);
-
-        builder.setPath(createActualSchemaPath(actualPath, namespace, revision,
-                yangModelPrefix));
-        parseSchemaNodeArgs(ctx, builder);
-        builder.setUnits(parseUnits(ctx));
-    }
-
-    @Override
-    public void exitTypedef_stmt(YangParser.Typedef_stmtContext ctx) {
-        final String actContainer = actualPath.pop();
-        logger.debug("exiting " + actContainer);
-    }
-
-    @Override
-    public void enterType_stmt(YangParser.Type_stmtContext ctx) {
-        String typeName = stringFromNode(ctx);
-        QName typeQName;
-        if (typeName.contains(":")) {
-            String[] splittedName = typeName.split(":");
-            String prefix = splittedName[0];
-            String name = splittedName[1];
-            if (prefix.equals(yangModelPrefix)) {
-                typeQName = new QName(namespace, revision, prefix, name);
-            } else {
-                typeQName = new QName(null, null, prefix, name);
-            }
-        } else {
-            typeQName = new QName(namespace, revision, yangModelPrefix,
-                    typeName);
-        }
-
-        TypeDefinition<?> type = null;
-        Type_body_stmtsContext typeBody = null;
-        for (int i = 0; i < ctx.getChildCount(); i++) {
-            if (ctx.getChild(i) instanceof Type_body_stmtsContext) {
-                typeBody = (Type_body_stmtsContext) ctx.getChild(i);
-                break;
-            }
-        }
-
-
-
-        // if this is base yang type...
-        if(YangTypesConverter.isBaseYangType(typeName)) {
-            if (typeBody == null) {
-                // if there are no constraints, just grab default base yang type
-                type = YangTypesConverter.javaTypeForBaseYangType(typeName);
-                moduleBuilder.setType(type, actualPath);
-            } else {
-                if(typeName.equals("union")) {
-                    List<String> types = new ArrayList<String>();
-                    for(int i = 0; i < typeBody.getChildCount(); i++) {
-                        ParseTree unionSpec = typeBody.getChild(i);
-                        if(unionSpec instanceof Union_specificationContext) {
-                            for(int j = 0; j < unionSpec.getChildCount(); j++) {
-                                ParseTree typeSpec = unionSpec.getChild(j);
-                                types.add(stringFromNode(typeSpec));
-                            }
-                        }
-                    }
-                    moduleBuilder.addUnionType(actualPath);
-                } else {
-                    type = parseTypeBody(typeName, typeBody, actualPath, namespace, revision, yangModelPrefix);
-                    moduleBuilder.setType(type, actualPath);
-                }
-            }
-        } else {
-            type = parseUnknownTypeBody(typeQName, typeBody);
-            // mark parent node of this type statement as dirty
-            moduleBuilder.addDirtyNode(actualPath);
-            moduleBuilder.setType(type, actualPath);
-        }
-
-        updatePath(typeName);
-
-    }
-
-    @Override
-    public void exitType_stmt(YangParser.Type_stmtContext ctx) {
-        final String actContainer = actualPath.pop();
-        logger.debug("exiting " + actContainer);
-    }
-
-    @Override
-    public void enterGrouping_stmt(YangParser.Grouping_stmtContext ctx) {
-        final String groupName = stringFromNode(ctx);
-        QName groupQName = new QName(namespace, revision, yangModelPrefix,
-                groupName);
-        GroupingBuilder groupBuilder = moduleBuilder.addGrouping(groupQName,
-                actualPath);
-        updatePath("grouping");
-        updatePath(groupName);
-        parseSchemaNodeArgs(ctx, groupBuilder);
-    }
-
-    @Override
-    public void exitGrouping_stmt(YangParser.Grouping_stmtContext ctx) {
-        String actContainer = actualPath.pop();
-        actContainer += "-" + actualPath.pop();
-        logger.debug("exiting " + actContainer);
-    }
-
-    @Override
-    public void enterContainer_stmt(Container_stmtContext ctx) {
-        super.enterContainer_stmt(ctx);
-        String containerName = stringFromNode(ctx);
-        QName containerQName = new QName(namespace, revision, yangModelPrefix,
-                containerName);
-        ContainerSchemaNodeBuilder containerBuilder = moduleBuilder
-                .addContainerNode(containerQName, actualPath);
-        updatePath(containerName);
-
-        containerBuilder.setPath(createActualSchemaPath(actualPath, namespace, revision, yangModelPrefix));
-        parseSchemaNodeArgs(ctx, containerBuilder);
-        parseConstraints(ctx, containerBuilder.getConstraintsBuilder());
-
-        for (int i = 0; i < ctx.getChildCount(); ++i) {
-            final ParseTree childNode = ctx.getChild(i);
-            if (childNode instanceof Presence_stmtContext) {
-                containerBuilder.setPresenceContainer(true);
-                break;
-            }
-        }
-    }
-
-    @Override
-    public void exitContainer_stmt(Container_stmtContext ctx) {
-        super.exitContainer_stmt(ctx);
-        final String actContainer = actualPath.pop();
-        logger.debug("exiting " + actContainer);
-    }
-
-    @Override
-    public void enterLeaf_stmt(Leaf_stmtContext ctx) {
-        super.enterLeaf_stmt(ctx);
-
-        final String leafName = stringFromNode(ctx);
-        QName leafQName = new QName(namespace, revision, yangModelPrefix,
-                leafName);
-        LeafSchemaNodeBuilder leafBuilder = moduleBuilder.addLeafNode(
-                leafQName, actualPath);
-        updatePath(leafName);
-
-        leafBuilder.setPath(createActualSchemaPath(actualPath, namespace, revision, yangModelPrefix));
-        parseSchemaNodeArgs(ctx, leafBuilder);
-        parseConstraints(ctx, leafBuilder.getConstraintsBuilder());
-    }
-
-    @Override
-    public void exitLeaf_stmt(YangParser.Leaf_stmtContext ctx) {
-        final String actLeaf = actualPath.pop();
-        logger.debug("exiting " + actLeaf);
-    }
-
-    @Override
-    public void enterUses_stmt(YangParser.Uses_stmtContext ctx) {
-        final String groupingPathStr = stringFromNode(ctx);
-        moduleBuilder.addUsesNode(groupingPathStr, actualPath);
-        updatePath(groupingPathStr);
-    }
-
-    @Override
-    public void exitUses_stmt(YangParser.Uses_stmtContext ctx) {
-        final String actContainer = actualPath.pop();
-        logger.debug("exiting " + actContainer);
-    }
-
-    @Override
-    public void enterLeaf_list_stmt(Leaf_list_stmtContext ctx) {
-        super.enterLeaf_list_stmt(ctx);
-
-        final String leafListName = stringFromNode(ctx);
-        QName leafListQName = new QName(namespace, revision, yangModelPrefix,
-                leafListName);
-        LeafListSchemaNodeBuilder leafListBuilder = moduleBuilder
-                .addLeafListNode(leafListQName, actualPath);
-        updatePath(leafListName);
-
-        parseSchemaNodeArgs(ctx, leafListBuilder);
-        parseConstraints(ctx, leafListBuilder.getConstraintsBuilder());
-
-        for (int i = 0; i < ctx.getChildCount(); ++i) {
-            final ParseTree childNode = ctx.getChild(i);
-            if (childNode instanceof Ordered_by_stmtContext) {
-                final Ordered_by_stmtContext orderedBy = (Ordered_by_stmtContext) childNode;
-                final boolean userOrdered = parseUserOrdered(orderedBy);
-                leafListBuilder.setUserOrdered(userOrdered);
-                break;
-            }
-        }
-    }
-
-    @Override
-    public void exitLeaf_list_stmt(YangParser.Leaf_list_stmtContext ctx) {
-        final String actContainer = actualPath.pop();
-        logger.debug("exiting " + actContainer);
-    }
-
-    @Override
-    public void enterList_stmt(List_stmtContext ctx) {
-        super.enterList_stmt(ctx);
-
-        final String containerName = stringFromNode(ctx);
-        QName containerQName = new QName(namespace, revision, yangModelPrefix,
-                containerName);
-        ListSchemaNodeBuilder listBuilder = moduleBuilder.addListNode(
-                containerQName, actualPath);
-        updatePath(containerName);
-
-        listBuilder.setPath(createActualSchemaPath(actualPath, namespace, revision, yangModelPrefix));
-        parseSchemaNodeArgs(ctx, listBuilder);
-        parseConstraints(ctx, listBuilder.getConstraintsBuilder());
-
-        String keyDefinition = "";
-        for (int i = 0; i < ctx.getChildCount(); ++i) {
-            ParseTree childNode = ctx.getChild(i);
-            if (childNode instanceof Ordered_by_stmtContext) {
-                final Ordered_by_stmtContext orderedBy = (Ordered_by_stmtContext) childNode;
-                final boolean userOrdered = parseUserOrdered(orderedBy);
-                listBuilder.setUserOrdered(userOrdered);
-            } else if (childNode instanceof Key_stmtContext) {
-                keyDefinition = stringFromNode(childNode);
-                List<QName> key = createListKey(keyDefinition, namespace,
-                        revision, yangModelPrefix);
-                listBuilder.setKeyDefinition(key);
-            }
-        }
-    }
-
-    @Override
-    public void exitList_stmt(List_stmtContext ctx) {
-        final String actContainer = actualPath.pop();
-        logger.debug("exiting " + actContainer);
-    }
-
-    @Override
-    public void enterNotification_stmt(YangParser.Notification_stmtContext ctx) {
-        final String notificationName = stringFromNode(ctx);
-        QName notificationQName = new QName(namespace, revision,
-                yangModelPrefix, notificationName);
-        NotificationBuilder notificationBuilder = moduleBuilder
-                .addNotification(notificationQName, actualPath);
-        updatePath(notificationName);
-
-        notificationBuilder.setPath(createActualSchemaPath(actualPath, namespace,
-                revision, yangModelPrefix));
-        parseSchemaNodeArgs(ctx, notificationBuilder);
-    }
-
-    @Override
-    public void exitNotification_stmt(YangParser.Notification_stmtContext ctx) {
-        final String actContainer = actualPath.pop();
-        logger.debug("exiting " + actContainer);
-    }
-
-    // Unknown types
-    @Override
-    public void enterIdentifier_stmt(YangParser.Identifier_stmtContext ctx) {
-        String name = stringFromNode(ctx);
-
-        QName qname;
-        if(name != null) {
-            String[] splittedName = name.split(":");
-            if(splittedName.length == 2) {
-                qname = new QName(null, null, splittedName[0], splittedName[1]);
-            } else {
-                qname = new QName(namespace, revision, yangModelPrefix, splittedName[0]);
-            }
-        } else {
-            qname = new QName(namespace, revision, yangModelPrefix, name);
-        }
-
-        UnknownSchemaNodeBuilder builder = moduleBuilder.addUnknownSchemaNode(qname, getActualPath());
-        updatePath(name);
-
-        builder.setPath(createActualSchemaPath(actualPath, namespace, revision, yangModelPrefix));
-        parseSchemaNodeArgs(ctx, builder);
-    }
-
-    @Override
-    public void exitIdentifier_stmt(YangParser.Identifier_stmtContext ctx) {
-        final String actContainer = actualPath.pop();
-        logger.debug("exiting " + actContainer);
-    }
-
-    @Override
-    public void enterRpc_stmt(YangParser.Rpc_stmtContext ctx) {
-        final String rpcName = stringFromNode(ctx);
-        QName rpcQName = new QName(namespace, revision, yangModelPrefix,
-                rpcName);
-        RpcDefinitionBuilder rpcBuilder = moduleBuilder.addRpc(rpcQName,
-                actualPath);
-        updatePath(rpcName);
-
-        rpcBuilder.setPath(createActualSchemaPath(actualPath, namespace, revision,
-                yangModelPrefix));
-        parseSchemaNodeArgs(ctx, rpcBuilder);
-    }
-
-    @Override
-    public void exitRpc_stmt(YangParser.Rpc_stmtContext ctx) {
-        final String actContainer = actualPath.pop();
-        logger.debug("exiting " + actContainer);
-    }
-
-    @Override
-    public void enterInput_stmt(YangParser.Input_stmtContext ctx) {
-        updatePath("input");
-    }
-
-    @Override
-    public void exitInput_stmt(YangParser.Input_stmtContext ctx) {
-        final String actContainer = actualPath.pop();
-        logger.debug("exiting " + actContainer);
-    }
-
-    @Override
-    public void enterOutput_stmt(YangParser.Output_stmtContext ctx) {
-        updatePath("output");
-    }
-
-    @Override
-    public void exitOutput_stmt(YangParser.Output_stmtContext ctx) {
-        final String actContainer = actualPath.pop();
-        logger.debug("exiting " + actContainer);
-    }
-
-    @Override
-    public void enterFeature_stmt(YangParser.Feature_stmtContext ctx) {
-        final String featureName = stringFromNode(ctx);
-        QName featureQName = new QName(namespace, revision, yangModelPrefix,
-                featureName);
-        FeatureBuilder featureBuilder = moduleBuilder.addFeature(featureQName,
-                actualPath);
-        updatePath(featureName);
-
-        featureBuilder.setPath(createActualSchemaPath(actualPath, namespace,
-                revision, yangModelPrefix));
-        parseSchemaNodeArgs(ctx, featureBuilder);
-    }
-
-    @Override
-    public void exitFeature_stmt(YangParser.Feature_stmtContext ctx) {
-        final String actContainer = actualPath.pop();
-        logger.debug("exiting " + actContainer);
-    }
-
-    @Override
-    public void enterDeviation_stmt(YangParser.Deviation_stmtContext ctx) {
-        final String targetPath = stringFromNode(ctx);
-        String reference = null;
-        String deviate = null;
-        DeviationBuilder builder = moduleBuilder.addDeviation(targetPath);
-        updatePath(targetPath);
-
-        for (int i = 0; i < ctx.getChildCount(); i++) {
-            ParseTree child = ctx.getChild(i);
-            if (child instanceof Reference_stmtContext) {
-                reference = stringFromNode(child);
-            } else if (child instanceof Deviate_not_supported_stmtContext) {
-                deviate = stringFromNode(child);
-            } else if (child instanceof Deviate_add_stmtContext) {
-                deviate = stringFromNode(child);
-            } else if (child instanceof Deviate_replace_stmtContext) {
-                deviate = stringFromNode(child);
-            } else if (child instanceof Deviate_delete_stmtContext) {
-                deviate = stringFromNode(child);
-            }
-        }
-        builder.setReference(reference);
-        builder.setDeviate(deviate);
-    }
-
-    @Override
-    public void exitDeviation_stmt(YangParser.Deviation_stmtContext ctx) {
-        final String actContainer = actualPath.pop();
-        logger.debug("exiting " + actContainer);
-    }
-
-    @Override
-    public void enterConfig_stmt(YangParser.Config_stmtContext ctx) {
-        boolean configuration = parseConfig(ctx);
-        moduleBuilder.addConfiguration(configuration, actualPath);
-    }
-
-    public ModuleBuilder getModuleBuilder() {
-        return moduleBuilder;
-    }
-
-    private void updatePath(String containerName) {
-        actualPath.push(containerName);
-    }
-
-    private List<String> getActualPath() {
-        return Collections.unmodifiableList(actualPath);
-    }
+/*\r
+ * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+package org.opendaylight.controller.yang.model.parser.impl;\r
+\r
+import static org.opendaylight.controller.yang.model.parser.util.YangModelBuilderUtil.*;\r
+\r
+import java.net.URI;\r
+import java.text.DateFormat;\r
+import java.text.ParseException;\r
+import java.text.SimpleDateFormat;\r
+import java.util.ArrayList;\r
+import java.util.Collections;\r
+import java.util.Date;\r
+import java.util.List;\r
+import java.util.Stack;\r
+import java.util.TreeMap;\r
+\r
+import org.antlr.v4.runtime.tree.ParseTree;\r
+import org.opendaylight.controller.antlrv4.code.gen.YangParser;\r
+import org.opendaylight.controller.antlrv4.code.gen.YangParser.Base_stmtContext;\r
+import org.opendaylight.controller.antlrv4.code.gen.YangParser.Contact_stmtContext;\r
+import org.opendaylight.controller.antlrv4.code.gen.YangParser.Container_stmtContext;\r
+import org.opendaylight.controller.antlrv4.code.gen.YangParser.Description_stmtContext;\r
+import org.opendaylight.controller.antlrv4.code.gen.YangParser.Deviate_add_stmtContext;\r
+import org.opendaylight.controller.antlrv4.code.gen.YangParser.Deviate_delete_stmtContext;\r
+import org.opendaylight.controller.antlrv4.code.gen.YangParser.Deviate_not_supported_stmtContext;\r
+import org.opendaylight.controller.antlrv4.code.gen.YangParser.Deviate_replace_stmtContext;\r
+import org.opendaylight.controller.antlrv4.code.gen.YangParser.Import_stmtContext;\r
+import org.opendaylight.controller.antlrv4.code.gen.YangParser.Key_stmtContext;\r
+import org.opendaylight.controller.antlrv4.code.gen.YangParser.Leaf_list_stmtContext;\r
+import org.opendaylight.controller.antlrv4.code.gen.YangParser.Leaf_stmtContext;\r
+import org.opendaylight.controller.antlrv4.code.gen.YangParser.List_stmtContext;\r
+import org.opendaylight.controller.antlrv4.code.gen.YangParser.Module_header_stmtsContext;\r
+import org.opendaylight.controller.antlrv4.code.gen.YangParser.Namespace_stmtContext;\r
+import org.opendaylight.controller.antlrv4.code.gen.YangParser.Ordered_by_stmtContext;\r
+import org.opendaylight.controller.antlrv4.code.gen.YangParser.Organization_stmtContext;\r
+import org.opendaylight.controller.antlrv4.code.gen.YangParser.Prefix_stmtContext;\r
+import org.opendaylight.controller.antlrv4.code.gen.YangParser.Presence_stmtContext;\r
+import org.opendaylight.controller.antlrv4.code.gen.YangParser.Reference_stmtContext;\r
+import org.opendaylight.controller.antlrv4.code.gen.YangParser.Revision_date_stmtContext;\r
+import org.opendaylight.controller.antlrv4.code.gen.YangParser.Revision_stmtContext;\r
+import org.opendaylight.controller.antlrv4.code.gen.YangParser.Revision_stmtsContext;\r
+import org.opendaylight.controller.antlrv4.code.gen.YangParser.Status_stmtContext;\r
+import org.opendaylight.controller.antlrv4.code.gen.YangParser.Type_body_stmtsContext;\r
+import org.opendaylight.controller.antlrv4.code.gen.YangParser.Union_specificationContext;\r
+import org.opendaylight.controller.antlrv4.code.gen.YangParser.Yang_version_stmtContext;\r
+import org.opendaylight.controller.antlrv4.code.gen.YangParserBaseListener;\r
+import org.opendaylight.controller.yang.common.QName;\r
+import org.opendaylight.controller.yang.model.api.Status;\r
+import org.opendaylight.controller.yang.model.api.TypeDefinition;\r
+import org.opendaylight.controller.yang.model.parser.builder.api.AugmentationSchemaBuilder;\r
+import org.opendaylight.controller.yang.model.parser.builder.api.GroupingBuilder;\r
+import org.opendaylight.controller.yang.model.parser.builder.impl.ContainerSchemaNodeBuilder;\r
+import org.opendaylight.controller.yang.model.parser.builder.impl.DeviationBuilder;\r
+import org.opendaylight.controller.yang.model.parser.builder.impl.ExtensionBuilder;\r
+import org.opendaylight.controller.yang.model.parser.builder.impl.FeatureBuilder;\r
+import org.opendaylight.controller.yang.model.parser.builder.impl.IdentitySchemaNodeBuilder;\r
+import org.opendaylight.controller.yang.model.parser.builder.impl.LeafListSchemaNodeBuilder;\r
+import org.opendaylight.controller.yang.model.parser.builder.impl.LeafSchemaNodeBuilder;\r
+import org.opendaylight.controller.yang.model.parser.builder.impl.ListSchemaNodeBuilder;\r
+import org.opendaylight.controller.yang.model.parser.builder.impl.ModuleBuilder;\r
+import org.opendaylight.controller.yang.model.parser.builder.impl.NotificationBuilder;\r
+import org.opendaylight.controller.yang.model.parser.builder.impl.RpcDefinitionBuilder;\r
+import org.opendaylight.controller.yang.model.parser.builder.impl.TypedefBuilder;\r
+import org.opendaylight.controller.yang.model.parser.builder.impl.UnknownSchemaNodeBuilder;\r
+import org.opendaylight.controller.yang.model.util.YangTypesConverter;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+\r
+final class YangModelParserListenerImpl extends YangParserBaseListener {\r
+\r
+    private static final Logger logger = LoggerFactory\r
+            .getLogger(YangModelParserListenerImpl.class);\r
+\r
+    private ModuleBuilder moduleBuilder;\r
+\r
+    private String moduleName;\r
+    private URI namespace;\r
+    private String yangModelPrefix;\r
+    private Date revision;\r
+\r
+    private final DateFormat simpleDateFormat = new SimpleDateFormat(\r
+            "yyyy-mm-dd");\r
+    private final Stack<String> actualPath = new Stack<String>();\r
+\r
+\r
+    @Override\r
+    public void enterModule_stmt(YangParser.Module_stmtContext ctx) {\r
+        moduleName = stringFromNode(ctx);\r
+        actualPath.push(moduleName);\r
+        moduleBuilder = new ModuleBuilder(moduleName);\r
+\r
+        String description = null;\r
+        String reference = null;\r
+\r
+        for (int i = 0; i < ctx.getChildCount(); i++) {\r
+            ParseTree child = ctx.getChild(i);\r
+            if (child instanceof Description_stmtContext) {\r
+                description = stringFromNode(child);\r
+            } else if (child instanceof Reference_stmtContext) {\r
+                reference = stringFromNode(child);\r
+            } else {\r
+                if (description != null && reference != null) {\r
+                    break;\r
+                }\r
+            }\r
+        }\r
+        moduleBuilder.setDescription(description);\r
+        moduleBuilder.setReference(reference);\r
+    }\r
+\r
+    @Override\r
+    public void exitModule_stmt(YangParser.Module_stmtContext ctx) {\r
+        final String moduleName = actualPath.pop();\r
+        logger.debug("Exiting module " + moduleName);\r
+    }\r
+\r
+    @Override\r
+    public void enterModule_header_stmts(final Module_header_stmtsContext ctx) {\r
+        super.enterModule_header_stmts(ctx);\r
+\r
+        for (int i = 0; i < ctx.getChildCount(); ++i) {\r
+            final ParseTree treeNode = ctx.getChild(i);\r
+            if (treeNode instanceof Namespace_stmtContext) {\r
+                final String namespaceStr = stringFromNode(treeNode);\r
+                namespace = URI.create(namespaceStr);\r
+                moduleBuilder.setNamespace(namespace);\r
+            } else if (treeNode instanceof Prefix_stmtContext) {\r
+                yangModelPrefix = stringFromNode(treeNode);\r
+                moduleBuilder.setPrefix(yangModelPrefix);\r
+            } else if (treeNode instanceof Yang_version_stmtContext) {\r
+                final String yangVersion = stringFromNode(treeNode);\r
+                moduleBuilder.setYangVersion(yangVersion);\r
+            }\r
+        }\r
+    }\r
+\r
+    @Override\r
+    public void enterMeta_stmts(YangParser.Meta_stmtsContext ctx) {\r
+        for (int i = 0; i < ctx.getChildCount(); i++) {\r
+            ParseTree child = ctx.getChild(i);\r
+            if (child instanceof Organization_stmtContext) {\r
+                final String organization = stringFromNode(child);\r
+                moduleBuilder.setOrganization(organization);\r
+            } else if (child instanceof Contact_stmtContext) {\r
+                final String contact = stringFromNode(child);\r
+                moduleBuilder.setContact(contact);\r
+            } else if (child instanceof Description_stmtContext) {\r
+                final String description = stringFromNode(child);\r
+                moduleBuilder.setDescription(description);\r
+            } else if (child instanceof Reference_stmtContext) {\r
+                final String reference = stringFromNode(child);\r
+                moduleBuilder.setReference(reference);\r
+            }\r
+        }\r
+    }\r
+\r
+    @Override\r
+    public void exitSubmodule_header_stmts(\r
+            YangParser.Submodule_header_stmtsContext ctx) {\r
+        final String submodule = actualPath.pop();\r
+        logger.debug("exiting submodule " + submodule);\r
+    }\r
+\r
+    @Override\r
+    public void enterRevision_stmts(Revision_stmtsContext ctx) {\r
+        TreeMap<Date, Revision_stmtContext> revisions = new TreeMap<Date, Revision_stmtContext>();\r
+\r
+        for (int i = 0; i < ctx.getChildCount(); ++i) {\r
+            final ParseTree treeNode = ctx.getChild(i);\r
+            if (treeNode instanceof Revision_stmtContext) {\r
+                final String revisionDateStr = stringFromNode(treeNode);\r
+                try {\r
+                    Date revision = simpleDateFormat.parse(revisionDateStr);\r
+                    revisions.put(revision, (Revision_stmtContext)treeNode);\r
+\r
+                } catch (ParseException e) {\r
+                    final String message = "Failed to parse revision string: "+ revisionDateStr;\r
+                    logger.warn(message);\r
+                }\r
+            }\r
+        }\r
+        if(revisions.size() > 0) {\r
+            Revision_stmtContext revisionCtx = revisions.firstEntry().getValue();\r
+            moduleBuilder.setRevision(revisions.firstKey());\r
+\r
+            for(int i = 0; i < revisionCtx.getChildCount(); i++) {\r
+                ParseTree child = revisionCtx.getChild(i);\r
+                if(child instanceof Reference_stmtContext) {\r
+                    moduleBuilder.setReference(stringFromNode(child));\r
+                }\r
+            }\r
+        }\r
+    }\r
+\r
+    @Override\r
+    public void enterImport_stmt(Import_stmtContext ctx) {\r
+        super.enterImport_stmt(ctx);\r
+\r
+        final String importName = stringFromNode(ctx);\r
+        String importPrefix = null;\r
+        Date importRevision = null;\r
+\r
+        for (int i = 0; i < ctx.getChildCount(); ++i) {\r
+            final ParseTree treeNode = ctx.getChild(i);\r
+            if (treeNode instanceof Prefix_stmtContext) {\r
+                importPrefix = stringFromNode(treeNode);\r
+            }\r
+            if (treeNode instanceof Revision_date_stmtContext) {\r
+                String importRevisionStr = stringFromNode(treeNode);\r
+                try {\r
+                    importRevision = simpleDateFormat.parse(importRevisionStr);\r
+                } catch(ParseException e) {\r
+                    logger.warn("Failed to parse import revision-date: "+ importRevisionStr);\r
+                }\r
+            }\r
+        }\r
+        moduleBuilder.addModuleImport(importName, importRevision, importPrefix);\r
+    }\r
+\r
+    @Override\r
+    public void enterAugment_stmt(YangParser.Augment_stmtContext ctx) {\r
+        final String augmentPath = stringFromNode(ctx);\r
+        AugmentationSchemaBuilder builder = moduleBuilder.addAugment(\r
+                augmentPath, getActualPath());\r
+        updatePath(augmentPath);\r
+\r
+        for (int i = 0; i < ctx.getChildCount(); i++) {\r
+            ParseTree child = ctx.getChild(i);\r
+            if (child instanceof Description_stmtContext) {\r
+                String desc = stringFromNode(child);\r
+                builder.setDescription(desc);\r
+            } else if (child instanceof Reference_stmtContext) {\r
+                String ref = stringFromNode(child);\r
+                builder.setReference(ref);\r
+            } else if (child instanceof Status_stmtContext) {\r
+                Status status = parseStatus((Status_stmtContext) child);\r
+                builder.setStatus(status);\r
+            }\r
+        }\r
+    }\r
+\r
+    @Override\r
+    public void exitAugment_stmt(YangParser.Augment_stmtContext ctx) {\r
+        final String augment = actualPath.pop();\r
+        logger.debug("exiting augment " + augment);\r
+    }\r
+\r
+    @Override\r
+    public void enterExtension_stmt(YangParser.Extension_stmtContext ctx) {\r
+        String argument = stringFromNode(ctx);\r
+        QName qname = new QName(namespace, revision, yangModelPrefix, argument);\r
+        ExtensionBuilder builder = moduleBuilder.addExtension(qname);\r
+        parseSchemaNodeArgs(ctx, builder);\r
+    }\r
+\r
+    @Override\r
+    public void enterTypedef_stmt(YangParser.Typedef_stmtContext ctx) {\r
+        String typedefName = stringFromNode(ctx);\r
+        QName typedefQName = new QName(namespace, revision, yangModelPrefix,\r
+                typedefName);\r
+        TypedefBuilder builder = moduleBuilder.addTypedef(typedefQName,\r
+                getActualPath());\r
+        updatePath(typedefName);\r
+\r
+        builder.setPath(createActualSchemaPath(actualPath, namespace, revision,\r
+                yangModelPrefix));\r
+        parseSchemaNodeArgs(ctx, builder);\r
+        builder.setUnits(parseUnits(ctx));\r
+    }\r
+\r
+    @Override\r
+    public void exitTypedef_stmt(YangParser.Typedef_stmtContext ctx) {\r
+        final String actContainer = actualPath.pop();\r
+        logger.debug("exiting " + actContainer);\r
+    }\r
+\r
+    @Override\r
+    public void enterType_stmt(YangParser.Type_stmtContext ctx) {\r
+        String typeName = stringFromNode(ctx);\r
+        QName typeQName;\r
+        if (typeName.contains(":")) {\r
+            String[] splittedName = typeName.split(":");\r
+            String prefix = splittedName[0];\r
+            String name = splittedName[1];\r
+            if (prefix.equals(yangModelPrefix)) {\r
+                typeQName = new QName(namespace, revision, prefix, name);\r
+            } else {\r
+                typeQName = new QName(null, null, prefix, name);\r
+            }\r
+        } else {\r
+            typeQName = new QName(namespace, revision, yangModelPrefix,\r
+                    typeName);\r
+        }\r
+\r
+        TypeDefinition<?> type = null;\r
+        Type_body_stmtsContext typeBody = null;\r
+        for (int i = 0; i < ctx.getChildCount(); i++) {\r
+            if (ctx.getChild(i) instanceof Type_body_stmtsContext) {\r
+                typeBody = (Type_body_stmtsContext) ctx.getChild(i);\r
+                break;\r
+            }\r
+        }\r
+\r
+        // if this is base yang type...\r
+        if(YangTypesConverter.isBaseYangType(typeName)) {\r
+            if (typeBody == null) {\r
+                // if there are no constraints, just grab default base yang type\r
+                type = YangTypesConverter.javaTypeForBaseYangType(typeName);\r
+                moduleBuilder.setType(type, actualPath);\r
+            } else {\r
+                if(typeName.equals("union")) {\r
+                    List<String> types = new ArrayList<String>();\r
+                    for(int i = 0; i < typeBody.getChildCount(); i++) {\r
+                        ParseTree unionSpec = typeBody.getChild(i);\r
+                        if(unionSpec instanceof Union_specificationContext) {\r
+                            for(int j = 0; j < unionSpec.getChildCount(); j++) {\r
+                                ParseTree typeSpec = unionSpec.getChild(j);\r
+                                types.add(stringFromNode(typeSpec));\r
+                            }\r
+                        }\r
+                    }\r
+                    moduleBuilder.addUnionType(actualPath);\r
+                } else {\r
+                    type = parseTypeBody(typeName, typeBody, actualPath, namespace, revision, yangModelPrefix);\r
+                    moduleBuilder.setType(type, actualPath);\r
+                }\r
+            }\r
+        } else {\r
+            type = parseUnknownTypeBody(typeQName, typeBody);\r
+            // mark parent node of this type statement as dirty\r
+            moduleBuilder.addDirtyNode(actualPath);\r
+            moduleBuilder.setType(type, actualPath);\r
+        }\r
+\r
+        updatePath(typeName);\r
+\r
+    }\r
+\r
+    @Override\r
+    public void exitType_stmt(YangParser.Type_stmtContext ctx) {\r
+        final String actContainer = actualPath.pop();\r
+        logger.debug("exiting " + actContainer);\r
+    }\r
+\r
+    @Override\r
+    public void enterGrouping_stmt(YangParser.Grouping_stmtContext ctx) {\r
+        final String groupName = stringFromNode(ctx);\r
+        QName groupQName = new QName(namespace, revision, yangModelPrefix,\r
+                groupName);\r
+        GroupingBuilder groupBuilder = moduleBuilder.addGrouping(groupQName,\r
+                actualPath);\r
+        updatePath("grouping");\r
+        updatePath(groupName);\r
+        parseSchemaNodeArgs(ctx, groupBuilder);\r
+    }\r
+\r
+    @Override\r
+    public void exitGrouping_stmt(YangParser.Grouping_stmtContext ctx) {\r
+        String actContainer = actualPath.pop();\r
+        actContainer += "-" + actualPath.pop();\r
+        logger.debug("exiting " + actContainer);\r
+    }\r
+\r
+    @Override\r
+    public void enterContainer_stmt(Container_stmtContext ctx) {\r
+        super.enterContainer_stmt(ctx);\r
+        String containerName = stringFromNode(ctx);\r
+        QName containerQName = new QName(namespace, revision, yangModelPrefix,\r
+                containerName);\r
+        ContainerSchemaNodeBuilder containerBuilder = moduleBuilder\r
+                .addContainerNode(containerQName, actualPath);\r
+        updatePath(containerName);\r
+\r
+        containerBuilder.setPath(createActualSchemaPath(actualPath, namespace, revision, yangModelPrefix));\r
+        parseSchemaNodeArgs(ctx, containerBuilder);\r
+        parseConstraints(ctx, containerBuilder.getConstraintsBuilder());\r
+\r
+        for (int i = 0; i < ctx.getChildCount(); ++i) {\r
+            final ParseTree childNode = ctx.getChild(i);\r
+            if (childNode instanceof Presence_stmtContext) {\r
+                containerBuilder.setPresenceContainer(true);\r
+                break;\r
+            }\r
+        }\r
+    }\r
+\r
+    @Override\r
+    public void exitContainer_stmt(Container_stmtContext ctx) {\r
+        super.exitContainer_stmt(ctx);\r
+        final String actContainer = actualPath.pop();\r
+        logger.debug("exiting " + actContainer);\r
+    }\r
+\r
+    @Override\r
+    public void enterLeaf_stmt(Leaf_stmtContext ctx) {\r
+        super.enterLeaf_stmt(ctx);\r
+\r
+        final String leafName = stringFromNode(ctx);\r
+        QName leafQName = new QName(namespace, revision, yangModelPrefix,\r
+                leafName);\r
+        LeafSchemaNodeBuilder leafBuilder = moduleBuilder.addLeafNode(\r
+                leafQName, actualPath);\r
+        updatePath(leafName);\r
+\r
+        leafBuilder.setPath(createActualSchemaPath(actualPath, namespace, revision, yangModelPrefix));\r
+        parseSchemaNodeArgs(ctx, leafBuilder);\r
+        parseConstraints(ctx, leafBuilder.getConstraintsBuilder());\r
+    }\r
+\r
+    @Override\r
+    public void exitLeaf_stmt(YangParser.Leaf_stmtContext ctx) {\r
+        final String actLeaf = actualPath.pop();\r
+        logger.debug("exiting " + actLeaf);\r
+    }\r
+\r
+    @Override\r
+    public void enterUses_stmt(YangParser.Uses_stmtContext ctx) {\r
+        final String groupingPathStr = stringFromNode(ctx);\r
+        moduleBuilder.addUsesNode(groupingPathStr, actualPath);\r
+        updatePath(groupingPathStr);\r
+    }\r
+\r
+    @Override\r
+    public void exitUses_stmt(YangParser.Uses_stmtContext ctx) {\r
+        final String actContainer = actualPath.pop();\r
+        logger.debug("exiting " + actContainer);\r
+    }\r
+\r
+    @Override\r
+    public void enterLeaf_list_stmt(Leaf_list_stmtContext ctx) {\r
+        super.enterLeaf_list_stmt(ctx);\r
+\r
+        final String leafListName = stringFromNode(ctx);\r
+        QName leafListQName = new QName(namespace, revision, yangModelPrefix,\r
+                leafListName);\r
+        LeafListSchemaNodeBuilder leafListBuilder = moduleBuilder\r
+                .addLeafListNode(leafListQName, actualPath);\r
+        updatePath(leafListName);\r
+\r
+        parseSchemaNodeArgs(ctx, leafListBuilder);\r
+        parseConstraints(ctx, leafListBuilder.getConstraintsBuilder());\r
+\r
+        for (int i = 0; i < ctx.getChildCount(); ++i) {\r
+            final ParseTree childNode = ctx.getChild(i);\r
+            if (childNode instanceof Ordered_by_stmtContext) {\r
+                final Ordered_by_stmtContext orderedBy = (Ordered_by_stmtContext) childNode;\r
+                final boolean userOrdered = parseUserOrdered(orderedBy);\r
+                leafListBuilder.setUserOrdered(userOrdered);\r
+                break;\r
+            }\r
+        }\r
+    }\r
+\r
+    @Override\r
+    public void exitLeaf_list_stmt(YangParser.Leaf_list_stmtContext ctx) {\r
+        final String actContainer = actualPath.pop();\r
+        logger.debug("exiting " + actContainer);\r
+    }\r
+\r
+    @Override\r
+    public void enterList_stmt(List_stmtContext ctx) {\r
+        super.enterList_stmt(ctx);\r
+\r
+        final String containerName = stringFromNode(ctx);\r
+        QName containerQName = new QName(namespace, revision, yangModelPrefix,\r
+                containerName);\r
+        ListSchemaNodeBuilder listBuilder = moduleBuilder.addListNode(\r
+                containerQName, actualPath);\r
+        updatePath(containerName);\r
+\r
+        listBuilder.setPath(createActualSchemaPath(actualPath, namespace, revision, yangModelPrefix));\r
+        parseSchemaNodeArgs(ctx, listBuilder);\r
+        parseConstraints(ctx, listBuilder.getConstraintsBuilder());\r
+\r
+        String keyDefinition = "";\r
+        for (int i = 0; i < ctx.getChildCount(); ++i) {\r
+            ParseTree childNode = ctx.getChild(i);\r
+            if (childNode instanceof Ordered_by_stmtContext) {\r
+                final Ordered_by_stmtContext orderedBy = (Ordered_by_stmtContext) childNode;\r
+                final boolean userOrdered = parseUserOrdered(orderedBy);\r
+                listBuilder.setUserOrdered(userOrdered);\r
+            } else if (childNode instanceof Key_stmtContext) {\r
+                keyDefinition = stringFromNode(childNode);\r
+                List<QName> key = createListKey(keyDefinition, namespace,\r
+                        revision, yangModelPrefix);\r
+                listBuilder.setKeyDefinition(key);\r
+            }\r
+        }\r
+    }\r
+\r
+    @Override\r
+    public void exitList_stmt(List_stmtContext ctx) {\r
+        final String actContainer = actualPath.pop();\r
+        logger.debug("exiting " + actContainer);\r
+    }\r
+\r
+    @Override\r
+    public void enterNotification_stmt(YangParser.Notification_stmtContext ctx) {\r
+        final String notificationName = stringFromNode(ctx);\r
+        QName notificationQName = new QName(namespace, revision,\r
+                yangModelPrefix, notificationName);\r
+        NotificationBuilder notificationBuilder = moduleBuilder\r
+                .addNotification(notificationQName, actualPath);\r
+        updatePath(notificationName);\r
+\r
+        notificationBuilder.setPath(createActualSchemaPath(actualPath, namespace,\r
+                revision, yangModelPrefix));\r
+        parseSchemaNodeArgs(ctx, notificationBuilder);\r
+    }\r
+\r
+    @Override\r
+    public void exitNotification_stmt(YangParser.Notification_stmtContext ctx) {\r
+        final String actContainer = actualPath.pop();\r
+        logger.debug("exiting " + actContainer);\r
+    }\r
+\r
+    // Unknown types\r
+    @Override\r
+    public void enterIdentifier_stmt(YangParser.Identifier_stmtContext ctx) {\r
+        String name = stringFromNode(ctx);\r
+\r
+        QName qname;\r
+        if(name != null) {\r
+            String[] splittedName = name.split(":");\r
+            if(splittedName.length == 2) {\r
+                qname = new QName(null, null, splittedName[0], splittedName[1]);\r
+            } else {\r
+                qname = new QName(namespace, revision, yangModelPrefix, splittedName[0]);\r
+            }\r
+        } else {\r
+            qname = new QName(namespace, revision, yangModelPrefix, name);\r
+        }\r
+\r
+        UnknownSchemaNodeBuilder builder = moduleBuilder.addUnknownSchemaNode(qname, getActualPath());\r
+        updatePath(name);\r
+\r
+        builder.setPath(createActualSchemaPath(actualPath, namespace, revision, yangModelPrefix));\r
+        parseSchemaNodeArgs(ctx, builder);\r
+    }\r
+\r
+    @Override\r
+    public void exitIdentifier_stmt(YangParser.Identifier_stmtContext ctx) {\r
+        final String actContainer = actualPath.pop();\r
+        logger.debug("exiting " + actContainer);\r
+    }\r
+\r
+    @Override\r
+    public void enterRpc_stmt(YangParser.Rpc_stmtContext ctx) {\r
+        final String rpcName = stringFromNode(ctx);\r
+        QName rpcQName = new QName(namespace, revision, yangModelPrefix,\r
+                rpcName);\r
+        RpcDefinitionBuilder rpcBuilder = moduleBuilder.addRpc(rpcQName,\r
+                actualPath);\r
+        updatePath(rpcName);\r
+\r
+        rpcBuilder.setPath(createActualSchemaPath(actualPath, namespace, revision,\r
+                yangModelPrefix));\r
+        parseSchemaNodeArgs(ctx, rpcBuilder);\r
+    }\r
+\r
+    @Override\r
+    public void exitRpc_stmt(YangParser.Rpc_stmtContext ctx) {\r
+        final String actContainer = actualPath.pop();\r
+        logger.debug("exiting " + actContainer);\r
+    }\r
+\r
+    @Override\r
+    public void enterInput_stmt(YangParser.Input_stmtContext ctx) {\r
+        updatePath("input");\r
+    }\r
+\r
+    @Override\r
+    public void exitInput_stmt(YangParser.Input_stmtContext ctx) {\r
+        final String actContainer = actualPath.pop();\r
+        logger.debug("exiting " + actContainer);\r
+    }\r
+\r
+    @Override\r
+    public void enterOutput_stmt(YangParser.Output_stmtContext ctx) {\r
+        updatePath("output");\r
+    }\r
+\r
+    @Override\r
+    public void exitOutput_stmt(YangParser.Output_stmtContext ctx) {\r
+        final String actContainer = actualPath.pop();\r
+        logger.debug("exiting " + actContainer);\r
+    }\r
+\r
+    @Override\r
+    public void enterFeature_stmt(YangParser.Feature_stmtContext ctx) {\r
+        final String featureName = stringFromNode(ctx);\r
+        QName featureQName = new QName(namespace, revision, yangModelPrefix,\r
+                featureName);\r
+        FeatureBuilder featureBuilder = moduleBuilder.addFeature(featureQName,\r
+                actualPath);\r
+        updatePath(featureName);\r
+\r
+        featureBuilder.setPath(createActualSchemaPath(actualPath, namespace,\r
+                revision, yangModelPrefix));\r
+        parseSchemaNodeArgs(ctx, featureBuilder);\r
+    }\r
+\r
+    @Override\r
+    public void exitFeature_stmt(YangParser.Feature_stmtContext ctx) {\r
+        final String actContainer = actualPath.pop();\r
+        logger.debug("exiting " + actContainer);\r
+    }\r
+\r
+    @Override\r
+    public void enterDeviation_stmt(YangParser.Deviation_stmtContext ctx) {\r
+        final String targetPath = stringFromNode(ctx);\r
+        String reference = null;\r
+        String deviate = null;\r
+        DeviationBuilder builder = moduleBuilder.addDeviation(targetPath);\r
+        updatePath(targetPath);\r
+\r
+        for (int i = 0; i < ctx.getChildCount(); i++) {\r
+            ParseTree child = ctx.getChild(i);\r
+            if (child instanceof Reference_stmtContext) {\r
+                reference = stringFromNode(child);\r
+            } else if (child instanceof Deviate_not_supported_stmtContext) {\r
+                deviate = stringFromNode(child);\r
+            } else if (child instanceof Deviate_add_stmtContext) {\r
+                deviate = stringFromNode(child);\r
+            } else if (child instanceof Deviate_replace_stmtContext) {\r
+                deviate = stringFromNode(child);\r
+            } else if (child instanceof Deviate_delete_stmtContext) {\r
+                deviate = stringFromNode(child);\r
+            }\r
+        }\r
+        builder.setReference(reference);\r
+        builder.setDeviate(deviate);\r
+    }\r
+\r
+    @Override\r
+    public void exitDeviation_stmt(YangParser.Deviation_stmtContext ctx) {\r
+        final String actContainer = actualPath.pop();\r
+        logger.debug("exiting " + actContainer);\r
+    }\r
+\r
+    @Override\r
+    public void enterConfig_stmt(YangParser.Config_stmtContext ctx) {\r
+        boolean configuration = parseConfig(ctx);\r
+        moduleBuilder.addConfiguration(configuration, actualPath);\r
+    }\r
+\r
+    @Override\r
+    public void enterIdentity_stmt(YangParser.Identity_stmtContext ctx) {\r
+        final String identityName = stringFromNode(ctx);\r
+        final QName identityQName = new QName(namespace, revision,\r
+                yangModelPrefix, identityName);\r
+        IdentitySchemaNodeBuilder builder = moduleBuilder.addIdentity(identityQName);\r
+        updatePath(identityName);\r
+\r
+        builder.setPath(createActualSchemaPath(actualPath, namespace,\r
+                revision, yangModelPrefix));\r
+        parseSchemaNodeArgs(ctx, builder);\r
+\r
+        for(int i = 0; i < ctx.getChildCount(); i++) {\r
+            ParseTree child = ctx.getChild(i);\r
+            if(child instanceof Base_stmtContext) {\r
+                String baseIdentityName = stringFromNode(child);\r
+                builder.setBaseIdentityName(baseIdentityName);\r
+            }\r
+        }\r
+    }\r
+\r
+    @Override\r
+    public void exitIdentity_stmt(YangParser.Identity_stmtContext ctx) {\r
+        final String actContainer = actualPath.pop();\r
+        logger.debug("exiting " + actContainer);\r
+    }\r
+\r
+    public ModuleBuilder getModuleBuilder() {\r
+        return moduleBuilder;\r
+    }\r
+\r
+    private void updatePath(String containerName) {\r
+        actualPath.push(containerName);\r
+    }\r
+\r
+    private List<String> getActualPath() {\r
+        return Collections.unmodifiableList(actualPath);\r
+    }\r
 
 }
index a27108e4715bd668fc720f7ce5b0c232bf2e678b..31ec7654233625adcae2652ec0083a37fb3d5b55 100644 (file)
@@ -622,11 +622,27 @@ public class YangModelBuilderUtil {
                 reference = stringFromNode(child);
             }
         }
-        String pattern = stringFromNode(ctx);
+        String pattern = patternStringFromNode(ctx);
         return BaseConstraints.patternConstraint(pattern, description,
                 reference);
     }
 
+    public static String patternStringFromNode(final Pattern_stmtContext treeNode) {
+        String result = "";
+        for (int i = 0; i < treeNode.getChildCount(); ++i) {
+            ParseTree child = treeNode.getChild(i);
+            if (child instanceof StringContext) {
+                for(int j = 0; j < child.getChildCount(); j++) {
+                    if(j % 2 == 0) {
+                        String patternToken = child.getChild(j).getText();
+                        result += patternToken.substring(1, patternToken.length()-1);
+                    }
+                }
+            }
+        }
+        return result;
+    }
+
     private static Integer getFractionDigits(Type_body_stmtsContext ctx) {
         for (int j = 0; j < ctx.getChildCount(); j++) {
             ParseTree dec64specChild = ctx.getChild(j);
@@ -974,7 +990,7 @@ public class YangModelBuilderUtil {
         if (typeName.equals("decimal64")) {
             type = YangTypesConverter.javaTypeForBaseYangDecimal64Type(
                     rangeStatements, fractionDigits);
-        } else if (typeName.startsWith("int") || typeName.startsWith("uint")) {
+        } else if (typeName.startsWith("int")) {
             type = YangTypesConverter.javaTypeForBaseYangSignedIntegerType(typeName,
                     rangeStatements);
         } else if(typeName.startsWith("uint")) {
index 1dd7f2dd2c5ef72f7a72686aab1c2ece37740031..0c8de22fefe105fb324fb67b4986907a4fa3ad8b 100644 (file)
@@ -7,7 +7,7 @@
  */
 package org.opendaylight.controller.yang.model.parser.impl;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.*;
 
 import java.io.File;
 import java.util.List;
@@ -15,11 +15,18 @@ import java.util.Set;
 
 import org.junit.Before;
 import org.junit.Test;
+import org.opendaylight.controller.yang.model.api.IdentitySchemaNode;
+import org.opendaylight.controller.yang.model.api.LeafSchemaNode;
 import org.opendaylight.controller.yang.model.api.Module;
 import org.opendaylight.controller.yang.model.api.TypeDefinition;
 import org.opendaylight.controller.yang.model.api.type.EnumTypeDefinition.EnumPair;
+import org.opendaylight.controller.yang.model.api.type.LengthConstraint;
+import org.opendaylight.controller.yang.model.api.type.PatternConstraint;
 import org.opendaylight.controller.yang.model.parser.api.YangModelParser;
 import org.opendaylight.controller.yang.model.util.EnumerationType;
+import org.opendaylight.controller.yang.model.util.InstanceIdentifier;
+import org.opendaylight.controller.yang.model.util.StringType;
+import org.opendaylight.controller.yang.model.util.UnionType;
 
 public class TypesResolutionTest {
 
@@ -30,30 +37,29 @@ public class TypesResolutionTest {
     @Before
     public void init() {
         parser = new YangModelParserImpl();
-        testFiles = new String[5];
-
         File testDir = new File("src/test/resources/types");
         String[] fileList = testDir.list();
+        testFiles = new String[fileList.length];
         int i = 0;
         for(String fileName : fileList) {
             File file = new File(testDir, fileName);
             testFiles[i] = file.getAbsolutePath();
             i++;
         }
-
         modules = parser.parseYangModels(testFiles);
-        assertEquals(5, modules.size());
+        assertEquals(fileList.length, modules.size());
     }
 
     @Test
-    public void testIetfInetTypes() {
+    public void testIPVersion() {
         Module tested = findModule(modules, "ietf-inet-types");
         Set<TypeDefinition<?>> typedefs = tested.getTypeDefinitions();
         assertEquals(14, typedefs.size());
 
-        TypeDefinition<?> t1 = findTypedef(typedefs, "ip-version");
-        EnumerationType en = (EnumerationType)t1.getBaseType();
+        TypeDefinition<?> type = findTypedef(typedefs, "ip-version");
+        EnumerationType en = (EnumerationType)type.getBaseType();
         List<EnumPair> values = en.getValues();
+        assertEquals(3, values.size());
 
         EnumPair value0 = values.get(0);
         assertEquals("unknown", value0.getName());
@@ -68,6 +74,88 @@ public class TypesResolutionTest {
         assertEquals(2, (int)value2.getValue());
     }
 
+    @Test
+    public void testIpAddress() {
+        Module tested = findModule(modules, "ietf-inet-types");
+        Set<TypeDefinition<?>> typedefs = tested.getTypeDefinitions();
+        TypeDefinition<?> type = findTypedef(typedefs, "ip-address");
+        UnionType baseType = (UnionType)type.getBaseType();
+        List<TypeDefinition<?>> unionTypes = baseType.getTypes();
+
+        StringType ipv4 = (StringType)unionTypes.get(0);
+        String expectedPattern =
+        "(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.){3}"
+      +  "([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])"
+      + "(%[\\p{N}\\p{L}]+)?";
+        assertEquals(expectedPattern, ipv4.getPatterns().get(0).getRegularExpression());
+
+        StringType ipv6 = (StringType)unionTypes.get(1);
+        List<PatternConstraint> ipv6Patterns = ipv6.getPatterns();
+        expectedPattern = "((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}"
+        + "((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|"
+        + "(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}"
+        + "(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))"
+        + "(%[\\p{N}\\p{L}]+)?";
+        assertEquals(expectedPattern, ipv6Patterns.get(0).getRegularExpression());
+
+        expectedPattern = "(([^:]+:){6}(([^:]+:[^:]+)|(.*\\..*)))|"
+        + "((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)"
+        + "(%.+)?";
+        assertEquals(expectedPattern, ipv6Patterns.get(1).getRegularExpression());
+    }
+
+    @Test
+    public void testDomainName() {
+        Module tested = findModule(modules, "ietf-inet-types");
+        Set<TypeDefinition<?>> typedefs = tested.getTypeDefinitions();
+        TypeDefinition<?> type = findTypedef(typedefs, "domain-name");
+        StringType baseType = (StringType)type.getBaseType();
+        List<PatternConstraint> patterns = baseType.getPatterns();
+        assertEquals(1, patterns.size());
+        String expectedPattern = "((([a-zA-Z0-9_]([a-zA-Z0-9\\-_]){0,61})?[a-zA-Z0-9]\\.)*"
+        +  "([a-zA-Z0-9_]([a-zA-Z0-9\\-_]){0,61})?[a-zA-Z0-9]\\.?)"
+        +  "|\\.";
+        assertEquals(expectedPattern, patterns.get(0).getRegularExpression());
+
+        List<LengthConstraint> lengths = baseType.getLengthStatements();
+        assertEquals(1, lengths.size());
+        LengthConstraint length = baseType.getLengthStatements().get(0);
+        assertEquals(1L, (long)length.getMin());
+        assertEquals(253L, (long)length.getMax());
+    }
+
+    @Test
+    public void testInstanceIdentifier1() {
+        Module tested = findModule(modules, "custom-types-test");
+        LeafSchemaNode leaf = (LeafSchemaNode)tested.getDataChildByName("inst-id-leaf1");
+        InstanceIdentifier leafType = (InstanceIdentifier)leaf.getType();
+        assertFalse(leafType.requireInstance());
+    }
+
+    @Test
+    public void testInstanceIdentifier2() {
+        Module tested = findModule(modules, "custom-types-test");
+        LeafSchemaNode leaf = (LeafSchemaNode)tested.getDataChildByName("inst-id-leaf2");
+        InstanceIdentifier leafType = (InstanceIdentifier)leaf.getType();
+        assertTrue(leafType.requireInstance());
+    }
+
+    @Test
+    public void testIdentity() {
+        Module tested = findModule(modules, "custom-types-test");
+        Set<IdentitySchemaNode> identities = tested.getIdentities();
+        IdentitySchemaNode testedIdentity = null;
+        for(IdentitySchemaNode id : identities) {
+            if(id.getQName().getLocalName().equals("crypto-alg")) {
+                testedIdentity = id;
+                IdentitySchemaNode baseIdentity = id.getBaseIdentity();
+                assertEquals("crypto-base", baseIdentity.getQName().getLocalName());
+                assertNull(baseIdentity.getBaseIdentity());
+            }
+        }
+        assertNotNull(testedIdentity);
+    }
+
     private Module findModule(Set<Module> modules, String name) {
         for(Module module : modules) {
             if(module.getName().equals(name)) {
index 4bd54f3364762af736f51521ed55bddd3f8882e0..54561f4fe92672e99c82e71b44b0ceba71a8ef94 100644 (file)
@@ -93,7 +93,7 @@ public class YangModelParserListenerTest {
         assertEquals(2, typedefs.size());
         for(TypeDefinition<?> td : typedefs) {
             Leafref baseType = (Leafref)td.getBaseType();
-            if(td.getQName().getLocalName().equals("network-node-id-ref")) {
+            if(td.getQName().getLocalName().equals("node-id-ref")) {
                 assertEquals("/tp:topology/tp:network-nodes/tp:network-node/tp:node-id", baseType.getPathStatement().toString());
             } else {
                 assertEquals("/tp:topology/tp:network-links/tp:network-link/tp:link-id", baseType.getPathStatement().toString());
index dbece9a9971ace779dc806cd154937b022ac644a..46aac7878946762d9464a0d92c08f23a13a505bd 100644 (file)
@@ -19,7 +19,7 @@ module abstract-topology {
         reference "~~~ WILL BE DEFINED LATER";
     }
     
-    typedef network-node-id-ref {
+    typedef node-id-ref {
         type leafref {
             path "/tp:topology/tp:network-nodes/tp:network-node/tp:node-id";
         }
diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/resources/types/custom-types-test@2012-4-4.yang b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/resources/types/custom-types-test@2012-4-4.yang
new file mode 100644 (file)
index 0000000..4231699
--- /dev/null
@@ -0,0 +1,29 @@
+module custom-types-test {
+
+       yang-version 1;
+    namespace "urn:simple.container.demo";
+    prefix "iit";
+    
+    organization "Cisco";
+    contact "WILL-BE-DEFINED-LATER";
+     
+    leaf inst-id-leaf1 {
+        type instance-identifier {
+           require-instance false;
+        }
+    }
+     
+    leaf inst-id-leaf2 {
+        type instance-identifier;
+    }
+
+    identity crypto-base {
+        description "crypto-base description";
+    }
+     
+    identity crypto-alg {
+        base "crypto-base";
+        description "crypto-alg description";
+    }
+       
+}
diff --git a/opendaylight/sal/yang-prototype/yang/yang-model-api/src/main/java/org/opendaylight/controller/yang/model/api/IdentitySchemaNode.java b/opendaylight/sal/yang-prototype/yang/yang-model-api/src/main/java/org/opendaylight/controller/yang/model/api/IdentitySchemaNode.java
new file mode 100644 (file)
index 0000000..d1e6818
--- /dev/null
@@ -0,0 +1,14 @@
+/*\r
+  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.\r
+  *\r
+  * This program and the accompanying materials are made available under the\r
+  * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+  * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+  */\r
+package org.opendaylight.controller.yang.model.api;\r
+\r
+public interface IdentitySchemaNode extends SchemaNode {\r
+\r
+    IdentitySchemaNode getBaseIdentity();\r
+\r
+}\r
index 7dda61ec7e76a05684da5ce55a56ee1368c6afbd..f2171480a07c2b2316358a826afe9c70c162a03b 100644 (file)
@@ -44,6 +44,8 @@ public interface Module extends DataNodeContainer {
 \r
     Set<Deviation> getDeviations();\r
 \r
+    Set<IdentitySchemaNode> getIdentities();\r
+\r
     List<ExtensionDefinition> getExtensionSchemaNodes();\r
 \r
 }\r
index b2b78d43a63b0a281cb838513cb35b4744380f3d..e2297d65aaad2a5ecdca915982e7510cb51cad8e 100644 (file)
@@ -1,19 +1,18 @@
-/*
- * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.controller.yang.model.api.type;
-
-import org.opendaylight.controller.yang.model.api.RevisionAwareXPath;
-import org.opendaylight.controller.yang.model.api.TypeDefinition;
-
-public interface IdentityrefTypeDefinition extends
-        TypeDefinition<IdentityTypeDefinition> {
-    
-    public RevisionAwareXPath getPathStatement();
-    
-    public IdentityTypeDefinition getIdentity();
+/*\r
+ * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+package org.opendaylight.controller.yang.model.api.type;\r
+\r
+import org.opendaylight.controller.yang.common.QName;\r
+import org.opendaylight.controller.yang.model.api.TypeDefinition;\r
+\r
+public interface IdentityrefTypeDefinition extends\r
+        TypeDefinition<IdentityrefTypeDefinition> {\r
+\r
+    public QName getIdentity();\r
+\r
 }
-/*
-  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
-  *
-  * This program and the accompanying materials are made available under the
-  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
-  * and is available at http://www.eclipse.org/legal/epl-v10.html
-  */
-package org.opendaylight.controller.yang.model.util;
-
-import java.util.Collections;
-import java.util.List;
-
-import org.opendaylight.controller.yang.common.QName;
-import org.opendaylight.controller.yang.model.api.RevisionAwareXPath;
-import org.opendaylight.controller.yang.model.api.SchemaPath;
-import org.opendaylight.controller.yang.model.api.Status;
-import org.opendaylight.controller.yang.model.api.UnknownSchemaNode;
-import org.opendaylight.controller.yang.model.api.type.IdentityTypeDefinition;
-import org.opendaylight.controller.yang.model.api.type.IdentityrefTypeDefinition;
-
-/**
- * The <code>default</code> implementation of Identityref Type Definition interface.
- *
- * @see IdentityrefTypeDefinition
- */
-public class Identityref implements IdentityrefTypeDefinition {
-
-    private final QName name = BaseTypes.constructQName("identityref");
-    private final SchemaPath path = BaseTypes.schemaPath(name);
-    private final String description = "The identityref type is used to reference an existing identity.";
-    private final String reference = "https://tools.ietf.org/html/rfc6020#section-9.10";
-
-    private final IdentityTypeDefinition identity;
-    private final RevisionAwareXPath xpath;
-
-    private String units = "";
-
-    public Identityref(RevisionAwareXPath xpath, IdentityTypeDefinition identity) {
-        super();
-        this.identity = identity;
-        this.xpath = xpath;
-    }
-    
-    public Identityref(RevisionAwareXPath xpath) {
-        super();
-        this.xpath = xpath;
-        this.identity = null;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.opendaylight.controller.yang.model.api.TypeDefinition#getBaseType()
-     */
-    @Override
-    public IdentityTypeDefinition getBaseType() {
-        return identity;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.opendaylight.controller.yang.model.api.TypeDefinition#getUnits()
-     */
-    @Override
-    public String getUnits() {
-        return units;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.opendaylight.controller.yang.model.api.TypeDefinition#getDefaultValue()
-     */
-    @Override
-    public Object getDefaultValue() {
-        return identity;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.opendaylight.controller.yang.model.api.SchemaNode#getQName()
-     */
-    @Override
-    public QName getQName() {
-        return name;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.opendaylight.controller.yang.model.api.SchemaNode#getPath()
-     */
-    @Override
-    public SchemaPath getPath() {
-        return path;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.opendaylight.controller.yang.model.api.SchemaNode#getDescription()
-     */
-    @Override
-    public String getDescription() {
-        return description;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.opendaylight.controller.yang.model.api.SchemaNode#getReference()
-     */
-    @Override
-    public String getReference() {
-        return reference;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.opendaylight.controller.yang.model.api.SchemaNode#getStatus()
-     */
-    @Override
-    public Status getStatus() {
-        return Status.CURRENT;
-    }
-
-    @Override
-    public List<UnknownSchemaNode> getUnknownSchemaNodes() {
-        return Collections.emptyList();
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.opendaylight.controller.yang.model.base.type.api.IdentityrefTypeDefinition#getIdentityName
-     * ()
-     */
-    @Override
-    public IdentityTypeDefinition getIdentity() {
-        return identity;
-    }
-    
-    @Override
-    public RevisionAwareXPath getPathStatement() {
-        return xpath;
-    }
-    
-    
-}
+/*\r
+  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.\r
+  *\r
+  * This program and the accompanying materials are made available under the\r
+  * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+  * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+  */\r
+package org.opendaylight.controller.yang.model.util;\r
+\r
+import java.util.Collections;\r
+import java.util.List;\r
+\r
+import org.opendaylight.controller.yang.common.QName;\r
+import org.opendaylight.controller.yang.model.api.SchemaPath;\r
+import org.opendaylight.controller.yang.model.api.Status;\r
+import org.opendaylight.controller.yang.model.api.UnknownSchemaNode;\r
+import org.opendaylight.controller.yang.model.api.type.IdentityrefTypeDefinition;\r
+\r
+/**\r
+ * The <code>default</code> implementation of Identityref Type Definition interface.\r
+ *\r
+ * @see IdentityrefTypeDefinition\r
+ */\r
+public class IdentityrefType implements IdentityrefTypeDefinition {\r
+\r
+    private final QName name = BaseTypes.constructQName("identityref");\r
+    private final SchemaPath path = BaseTypes.schemaPath(name);\r
+    private final String description = "The identityref type is used to reference an existing identity.";\r
+    private final String reference = "https://tools.ietf.org/html/rfc6020#section-9.10";\r
+\r
+    private final QName identity;\r
+\r
+    private String units = "";\r
+\r
+    public IdentityrefType(QName identity) {\r
+        this.identity = identity;\r
+    }\r
+\r
+    @Override\r
+    public String getUnits() {\r
+        return units;\r
+    }\r
+\r
+    @Override\r
+    public Object getDefaultValue() {\r
+        return identity;\r
+    }\r
+\r
+    @Override\r
+    public QName getQName() {\r
+        return name;\r
+    }\r
+\r
+    @Override\r
+    public SchemaPath getPath() {\r
+        return path;\r
+    }\r
+\r
+    @Override\r
+    public String getDescription() {\r
+        return description;\r
+    }\r
+\r
+    @Override\r
+    public String getReference() {\r
+        return reference;\r
+    }\r
+\r
+    @Override\r
+    public Status getStatus() {\r
+        return Status.CURRENT;\r
+    }\r
+\r
+    @Override\r
+    public List<UnknownSchemaNode> getUnknownSchemaNodes() {\r
+        return Collections.emptyList();\r
+    }\r
+\r
+    @Override\r
+    public QName getIdentity() {\r
+        return identity;\r
+    }\r
+\r
+    @Override\r
+    public IdentityrefTypeDefinition getBaseType() {\r
+        return this;\r
+    }\r
+\r
+}\r
index fdaf57f7b216aa89f0d1df2261ae49bae42e4523..f20c6aae6e6b8e3a8a0a3b8e5af227e25e148cee 100644 (file)
-/*
- * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.controller.yang.model.util;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.opendaylight.controller.yang.common.QName;
-import org.opendaylight.controller.yang.model.api.TypeDefinition;
-import org.opendaylight.controller.yang.model.api.type.BinaryTypeDefinition;
-import org.opendaylight.controller.yang.model.api.type.BitsTypeDefinition;
-import org.opendaylight.controller.yang.model.api.type.BooleanTypeDefinition;
-import org.opendaylight.controller.yang.model.api.type.DecimalTypeDefinition;
-import org.opendaylight.controller.yang.model.api.type.IntegerTypeDefinition;
-import org.opendaylight.controller.yang.model.api.type.RangeConstraint;
-import org.opendaylight.controller.yang.model.api.type.StringTypeDefinition;
-import org.opendaylight.controller.yang.model.api.type.UnsignedIntegerTypeDefinition;
-
-public class YangTypesConverter {
-
-    private static final Map<String, TypeDefinition<? extends TypeDefinition<?>>> baseYangTypeMap = new HashMap<String, TypeDefinition<? extends TypeDefinition<?>>>();
-    private static final Set<String> baseYangTypes = new HashSet<String>();
-
-    private static final TypeDefinition<BinaryTypeDefinition> BINARY = new BinaryType();
-    private static final TypeDefinition<BitsTypeDefinition> BITS = new BitsType();
-    private static final TypeDefinition<BooleanTypeDefinition> BOOLEAN_TYPE = new BooleanType();
-    private static final TypeDefinition<IntegerTypeDefinition> INT8_TYPE = new Int8();
-    private static final TypeDefinition<IntegerTypeDefinition> INT16_TYPE = new Int16();
-    private static final TypeDefinition<IntegerTypeDefinition> INT32_TYPE = new Int32();
-    private static final TypeDefinition<IntegerTypeDefinition> INT64_TYPE = new Int64();
-    private static final TypeDefinition<StringTypeDefinition> STRING_TYPE = new StringType();
-    private static final TypeDefinition<UnsignedIntegerTypeDefinition> UINT8_TYPE = new Uint8();
-    private static final TypeDefinition<UnsignedIntegerTypeDefinition> UINT16_TYPE = new Uint16();
-    private static final TypeDefinition<UnsignedIntegerTypeDefinition> UINT32_TYPE = new Uint32();
-    private static final TypeDefinition<UnsignedIntegerTypeDefinition> UINT64_TYPE = new Uint64();
-
-    static {
-        baseYangTypeMap.put("binary", BINARY);
-        baseYangTypeMap.put("bits", BITS);
-        baseYangTypeMap.put("boolean", BOOLEAN_TYPE);
-        baseYangTypeMap.put("int8", INT8_TYPE);
-        baseYangTypeMap.put("int16", INT16_TYPE);
-        baseYangTypeMap.put("int32", INT32_TYPE);
-        baseYangTypeMap.put("int64", INT64_TYPE);
-        baseYangTypeMap.put("string", STRING_TYPE);
-        baseYangTypeMap.put("uint8", UINT8_TYPE);
-        baseYangTypeMap.put("uint16", UINT16_TYPE);
-        baseYangTypeMap.put("uint32", UINT32_TYPE);
-        baseYangTypeMap.put("uint64", UINT64_TYPE);
-
-        baseYangTypes.add("binary");
-        baseYangTypes.add("bits");
-        baseYangTypes.add("boolean");
-        baseYangTypes.add("decimal64");
-        baseYangTypes.add("empty");
-        baseYangTypes.add("enumeration");
-        baseYangTypes.add("identityref");
-        baseYangTypes.add("instance-identifier");
-        baseYangTypes.add("int8");
-        baseYangTypes.add("int16");
-        baseYangTypes.add("int32");
-        baseYangTypes.add("int64");
-        baseYangTypes.add("leafref");
-        baseYangTypes.add("string");
-        baseYangTypes.add("uint8");
-        baseYangTypes.add("uint16");
-        baseYangTypes.add("uint32");
-        baseYangTypes.add("uint64");
-        baseYangTypes.add("union");
-    }
-
-    public static boolean isBaseYangType(String type) {
-        return baseYangTypes.contains(type);
-    }
-
-    public static TypeDefinition<?> javaTypeForBaseYangType(QName typeQName) {
-        TypeDefinition<?> type = baseYangTypeMap.get(typeQName.getLocalName());
-        return type;
-    }
-
-    public static TypeDefinition<?> javaTypeForBaseYangType(String typeName) {
-        TypeDefinition<?> type = baseYangTypeMap.get(typeName);
-        return type;
-    }
-
-    public static TypeDefinition<IntegerTypeDefinition> javaTypeForBaseYangSignedIntegerType(
-            String typeName, List<RangeConstraint> ranges) {
-        if (typeName.equals("int8")) {
-            return new Int8(ranges, null, null);
-        } else if (typeName.equals("int16")) {
-            return new Int16(ranges, null, null);
-        } else if (typeName.equals("int32")) {
-            return new Int32(ranges, null, null);
-        } else if (typeName.equals("int64")) {
-            return new Int64(ranges, null, null);
-        }
-        return null;
-    }
-
-    public static TypeDefinition<UnsignedIntegerTypeDefinition> javaTypeForBaseYangUnsignedIntegerType(
-            final String typeName, List<RangeConstraint> ranges) {
-        if (typeName.equals("uint8")) {
-            return new Uint8(ranges, null, null);
-        } else if (typeName.equals("uint16")) {
-            return new Uint16(ranges, null, null);
-        } else if (typeName.equals("uint32")) {
-            return new Uint32(ranges, null, null);
-        } else if (typeName.equals("uint64")) {
-            return new Uint64(ranges, null, null);
-        }
-        return null;
-    }
-
-    public static TypeDefinition<DecimalTypeDefinition> javaTypeForBaseYangDecimal64Type(
-            List<RangeConstraint> rangeStatements, int fractionDigits) {
-        return new Decimal64(rangeStatements, fractionDigits);
-    }
-
+/*\r
+ * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+package org.opendaylight.controller.yang.model.util;\r
+\r
+import java.util.HashMap;\r
+import java.util.HashSet;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.Set;\r
+\r
+import org.opendaylight.controller.yang.common.QName;\r
+import org.opendaylight.controller.yang.model.api.TypeDefinition;\r
+import org.opendaylight.controller.yang.model.api.type.BinaryTypeDefinition;\r
+import org.opendaylight.controller.yang.model.api.type.BitsTypeDefinition;\r
+import org.opendaylight.controller.yang.model.api.type.BooleanTypeDefinition;\r
+import org.opendaylight.controller.yang.model.api.type.DecimalTypeDefinition;\r
+import org.opendaylight.controller.yang.model.api.type.InstanceIdentifierTypeDefinition;\r
+import org.opendaylight.controller.yang.model.api.type.IntegerTypeDefinition;\r
+import org.opendaylight.controller.yang.model.api.type.RangeConstraint;\r
+import org.opendaylight.controller.yang.model.api.type.StringTypeDefinition;\r
+import org.opendaylight.controller.yang.model.api.type.UnsignedIntegerTypeDefinition;\r
+\r
+public class YangTypesConverter {\r
+\r
+    private static final Map<String, TypeDefinition<? extends TypeDefinition<?>>> baseYangTypeMap = new HashMap<String, TypeDefinition<? extends TypeDefinition<?>>>();\r
+    private static final Set<String> baseYangTypes = new HashSet<String>();\r
+\r
+    private static final TypeDefinition<BinaryTypeDefinition> BINARY = new BinaryType();\r
+    private static final TypeDefinition<BitsTypeDefinition> BITS = new BitsType();\r
+    private static final TypeDefinition<BooleanTypeDefinition> BOOLEAN_TYPE = new BooleanType();\r
+    private static final TypeDefinition<InstanceIdentifierTypeDefinition> INST_ID_TYPE = new InstanceIdentifier(null, true);\r
+    private static final TypeDefinition<IntegerTypeDefinition> INT8_TYPE = new Int8();\r
+    private static final TypeDefinition<IntegerTypeDefinition> INT16_TYPE = new Int16();\r
+    private static final TypeDefinition<IntegerTypeDefinition> INT32_TYPE = new Int32();\r
+    private static final TypeDefinition<IntegerTypeDefinition> INT64_TYPE = new Int64();\r
+    private static final TypeDefinition<StringTypeDefinition> STRING_TYPE = new StringType();\r
+    private static final TypeDefinition<UnsignedIntegerTypeDefinition> UINT8_TYPE = new Uint8();\r
+    private static final TypeDefinition<UnsignedIntegerTypeDefinition> UINT16_TYPE = new Uint16();\r
+    private static final TypeDefinition<UnsignedIntegerTypeDefinition> UINT32_TYPE = new Uint32();\r
+    private static final TypeDefinition<UnsignedIntegerTypeDefinition> UINT64_TYPE = new Uint64();\r
+\r
+    static {\r
+        baseYangTypeMap.put("binary", BINARY);\r
+        baseYangTypeMap.put("bits", BITS);\r
+        baseYangTypeMap.put("boolean", BOOLEAN_TYPE);\r
+        baseYangTypeMap.put("instance-identifier", INST_ID_TYPE);\r
+        baseYangTypeMap.put("int8", INT8_TYPE);\r
+        baseYangTypeMap.put("int16", INT16_TYPE);\r
+        baseYangTypeMap.put("int32", INT32_TYPE);\r
+        baseYangTypeMap.put("int64", INT64_TYPE);\r
+        baseYangTypeMap.put("string", STRING_TYPE);\r
+        baseYangTypeMap.put("uint8", UINT8_TYPE);\r
+        baseYangTypeMap.put("uint16", UINT16_TYPE);\r
+        baseYangTypeMap.put("uint32", UINT32_TYPE);\r
+        baseYangTypeMap.put("uint64", UINT64_TYPE);\r
+\r
+        baseYangTypes.add("binary");\r
+        baseYangTypes.add("bits");\r
+        baseYangTypes.add("boolean");\r
+        baseYangTypes.add("decimal64");\r
+        baseYangTypes.add("empty");\r
+        baseYangTypes.add("enumeration");\r
+        baseYangTypes.add("identityref");\r
+        baseYangTypes.add("instance-identifier");\r
+        baseYangTypes.add("int8");\r
+        baseYangTypes.add("int16");\r
+        baseYangTypes.add("int32");\r
+        baseYangTypes.add("int64");\r
+        baseYangTypes.add("leafref");\r
+        baseYangTypes.add("string");\r
+        baseYangTypes.add("uint8");\r
+        baseYangTypes.add("uint16");\r
+        baseYangTypes.add("uint32");\r
+        baseYangTypes.add("uint64");\r
+        baseYangTypes.add("union");\r
+    }\r
+\r
+    public static boolean isBaseYangType(String type) {\r
+        return baseYangTypes.contains(type);\r
+    }\r
+\r
+    public static TypeDefinition<?> javaTypeForBaseYangType(QName typeQName) {\r
+        TypeDefinition<?> type = baseYangTypeMap.get(typeQName.getLocalName());\r
+        return type;\r
+    }\r
+\r
+    public static TypeDefinition<?> javaTypeForBaseYangType(String typeName) {\r
+        TypeDefinition<?> type = baseYangTypeMap.get(typeName);\r
+        return type;\r
+    }\r
+\r
+    public static TypeDefinition<IntegerTypeDefinition> javaTypeForBaseYangSignedIntegerType(\r
+            String typeName, List<RangeConstraint> ranges) {\r
+        if (typeName.equals("int8")) {\r
+            return new Int8(ranges, null, null);\r
+        } else if (typeName.equals("int16")) {\r
+            return new Int16(ranges, null, null);\r
+        } else if (typeName.equals("int32")) {\r
+            return new Int32(ranges, null, null);\r
+        } else if (typeName.equals("int64")) {\r
+            return new Int64(ranges, null, null);\r
+        }\r
+        return null;\r
+    }\r
+\r
+    public static TypeDefinition<UnsignedIntegerTypeDefinition> javaTypeForBaseYangUnsignedIntegerType(\r
+            final String typeName, List<RangeConstraint> ranges) {\r
+        if (typeName.equals("uint8")) {\r
+            return new Uint8(ranges, null, null);\r
+        } else if (typeName.equals("uint16")) {\r
+            return new Uint16(ranges, null, null);\r
+        } else if (typeName.equals("uint32")) {\r
+            return new Uint32(ranges, null, null);\r
+        } else if (typeName.equals("uint64")) {\r
+            return new Uint64(ranges, null, null);\r
+        }\r
+        return null;\r
+    }\r
+\r
+    public static TypeDefinition<DecimalTypeDefinition> javaTypeForBaseYangDecimal64Type(\r
+            List<RangeConstraint> rangeStatements, int fractionDigits) {\r
+        return new Decimal64(rangeStatements, fractionDigits);\r
+    }\r
+\r
 }