[ONOS-4563][ONOS-4564][ONOS-4551][ONOS-4538]defect fix

Change-Id: Ia3fe844e1e846d2e1d2c4359eefc815e7767aef9
diff --git a/src/main/java/org/onosproject/yangutils/datamodel/YangEnum.java b/src/main/java/org/onosproject/yangutils/datamodel/YangEnum.java
index a9f80e3..df702e9 100644
--- a/src/main/java/org/onosproject/yangutils/datamodel/YangEnum.java
+++ b/src/main/java/org/onosproject/yangutils/datamodel/YangEnum.java
@@ -50,7 +50,7 @@
 /**
  * Represents the ENUM data type information.
  */
-public class YangEnum implements YangCommonInfo, Parsable {
+public class YangEnum implements YangCommonInfo, Parsable, Comparable<YangEnum> {
 
     /**
      * Named value for the ENUM.
@@ -226,4 +226,12 @@
     public void validateDataOnExit() throws DataModelException {
         // TODO auto-generated method stub, to be implemented by parser
     }
+
+    @Override
+    public int compareTo(YangEnum otherEnum) {
+        if (this.namedValue.equals(otherEnum.getNamedValue())) {
+            return 0;
+        }
+        return new Integer(this.value).compareTo(otherEnum.getValue());
+    }
 }
diff --git a/src/main/java/org/onosproject/yangutils/datamodel/YangEnumeration.java b/src/main/java/org/onosproject/yangutils/datamodel/YangEnumeration.java
index 65f733c..9bf924a 100644
--- a/src/main/java/org/onosproject/yangutils/datamodel/YangEnumeration.java
+++ b/src/main/java/org/onosproject/yangutils/datamodel/YangEnumeration.java
@@ -16,8 +16,8 @@
 
 package org.onosproject.yangutils.datamodel;
 
-import java.util.HashSet;
-import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
 
 import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
 import org.onosproject.yangutils.parser.Parsable;
@@ -34,7 +34,7 @@
 public class YangEnumeration extends YangNode implements Parsable, CollisionDetector {
 
     // Enumeration info set.
-    private Set<YangEnum> enumSet;
+    private SortedSet<YangEnum> enumSet;
 
     // Enumeration name.
     private String name;
@@ -44,7 +44,7 @@
      */
     public YangEnumeration() {
         super(YangNodeType.ENUMERATION_NODE);
-        setEnumSet(new HashSet<YangEnum>());
+        setEnumSet(new TreeSet<YangEnum>());
     }
 
     /**
@@ -52,7 +52,7 @@
      *
      * @return the ENUM set
      */
-    public Set<YangEnum> getEnumSet() {
+    public SortedSet<YangEnum> getEnumSet() {
         return enumSet;
     }
 
@@ -61,7 +61,7 @@
      *
      * @param enumSet the ENUM set to set
      */
-    private void setEnumSet(Set<YangEnum> enumSet) {
+    private void setEnumSet(SortedSet<YangEnum> enumSet) {
         this.enumSet = enumSet;
     }
 
diff --git a/src/main/java/org/onosproject/yangutils/datamodel/YangTypeDef.java b/src/main/java/org/onosproject/yangutils/datamodel/YangTypeDef.java
index be2a5ed..a295b48 100644
--- a/src/main/java/org/onosproject/yangutils/datamodel/YangTypeDef.java
+++ b/src/main/java/org/onosproject/yangutils/datamodel/YangTypeDef.java
@@ -21,6 +21,8 @@
 import org.onosproject.yangutils.parser.Parsable;
 import org.onosproject.yangutils.utils.YangConstructType;
 
+import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCollidingChildUtil;
+
 /*-
  * Reference RFC 6020.
  *
@@ -54,7 +56,7 @@
 /**
  * Represents data model node to maintain information defined in YANG typedef.
  */
-public class YangTypeDef extends YangNode implements YangCommonInfo, Parsable, YangTypeHolder {
+public class YangTypeDef extends YangNode implements YangCommonInfo, Parsable, YangTypeHolder, CollisionDetector {
 
     /**
      * Default value in string, needs to be converted to the target object,
@@ -272,4 +274,18 @@
     public List<YangType<?>> getTypeList() {
         return typeList;
     }
+
+    @Override
+    public void detectCollidingChild(String identifierName, YangConstructType dataType) throws DataModelException {
+        // Asks helper to detect colliding child.
+        detectCollidingChildUtil(identifierName, dataType, this);
+    }
+
+    @Override
+    public void detectSelfCollision(String identifierName, YangConstructType dataType) throws DataModelException {
+        if (getName().equals(identifierName)) {
+            throw new DataModelException("YANG file error: Duplicate input identifier detected, same as typedef \""
+                    + getName() + "\"");
+        }
+    }
 }
diff --git a/src/main/java/org/onosproject/yangutils/linker/impl/YangResolutionInfo.java b/src/main/java/org/onosproject/yangutils/linker/impl/YangResolutionInfo.java
index d838440..6332a99 100644
--- a/src/main/java/org/onosproject/yangutils/linker/impl/YangResolutionInfo.java
+++ b/src/main/java/org/onosproject/yangutils/linker/impl/YangResolutionInfo.java
@@ -34,6 +34,8 @@
 import static org.onosproject.yangutils.linker.impl.ResolvableStatus.LINKED;
 import static org.onosproject.yangutils.linker.impl.ResolvableStatus.RESOLVED;
 import static org.onosproject.yangutils.linker.impl.ResolvableStatus.UNRESOLVED;
+import static org.onosproject.yangutils.utils.UtilConstants.TYPEDEF_LINKER_ERROR;
+import static org.onosproject.yangutils.utils.UtilConstants.GROUPING_LINKER_ERROR;
 
 /**
  * Represents resolution object which will be resolved by linker.
@@ -180,9 +182,14 @@
 
                         if (resolvable.getResolvableStatus() == UNRESOLVED) {
                             // If current entity is still not resolved, then linking/resolution has failed.
+                            String errorInfo;
+                            if (resolvable instanceof YangType) {
+                                errorInfo = TYPEDEF_LINKER_ERROR;
+                            } else {
+                                errorInfo = GROUPING_LINKER_ERROR;
+                            }
                             DataModelException dataModelException =
-                                    new DataModelException("YANG file error: Unable to find base "
-                                            + "typedef/grouping for given type/uses");
+                                    new DataModelException(errorInfo);
                             dataModelException.setLine(getLineNumber());
                             dataModelException.setCharPosition(getCharPosition());
                             throw dataModelException;
diff --git a/src/main/java/org/onosproject/yangutils/parser/impl/listeners/BitsListener.java b/src/main/java/org/onosproject/yangutils/parser/impl/listeners/BitsListener.java
index 07dba80..274e467 100644
--- a/src/main/java/org/onosproject/yangutils/parser/impl/listeners/BitsListener.java
+++ b/src/main/java/org/onosproject/yangutils/parser/impl/listeners/BitsListener.java
@@ -45,6 +45,8 @@
 import org.onosproject.yangutils.datamodel.YangLeaf;
 import org.onosproject.yangutils.datamodel.YangLeafList;
 import org.onosproject.yangutils.datamodel.YangType;
+import org.onosproject.yangutils.datamodel.YangTypeDef;
+import org.onosproject.yangutils.datamodel.YangUnion;
 import org.onosproject.yangutils.parser.Parsable;
 import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
 import org.onosproject.yangutils.parser.exceptions.ParserException;
@@ -101,6 +103,12 @@
                 case LEAF_LIST_DATA:
                     bitsNode.setBitsName(((YangLeafList) tmpData).getName());
                     break;
+                case TYPEDEF_DATA:
+                    bitsNode.setBitsName(((YangTypeDef) tmpData).getName());
+                    break;
+                case UNION_DATA:
+                    bitsNode.setBitsName(((YangUnion) tmpData).getName());
+                    break;
                 // TODO typedef, union, deviate.
                 default:
                     throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, TYPE_DATA,
diff --git a/src/main/java/org/onosproject/yangutils/parser/impl/listeners/MaxElementsListener.java b/src/main/java/org/onosproject/yangutils/parser/impl/listeners/MaxElementsListener.java
index efec3d1..eec78ba 100644
--- a/src/main/java/org/onosproject/yangutils/parser/impl/listeners/MaxElementsListener.java
+++ b/src/main/java/org/onosproject/yangutils/parser/impl/listeners/MaxElementsListener.java
@@ -106,7 +106,16 @@
         if (value.equals(UNBOUNDED_KEYWORD)) {
             maxElementsValue = Integer.MAX_VALUE;
         } else if (value.matches(POSITIVE_INTEGER_PATTERN)) {
-            maxElementsValue = Integer.parseInt(value);
+            try {
+                maxElementsValue = Integer.parseInt(value);
+            } catch (NumberFormatException e) {
+                ParserException parserException = new ParserException("YANG file error : " +
+                        YangConstructType.getYangConstructType(MAX_ELEMENT_DATA) + " value " + value + " is not " +
+                        "valid.");
+                parserException.setLine(ctx.getStart().getLine());
+                parserException.setCharPosition(ctx.getStart().getCharPositionInLine());
+                throw parserException;
+            }
         } else {
             ParserException parserException = new ParserException("YANG file error : " +
                     YangConstructType.getYangConstructType(MAX_ELEMENT_DATA) + " value " + value + " is not " +
diff --git a/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeDefListener.java b/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeDefListener.java
index b0a3b69..fc5dfef 100644
--- a/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeDefListener.java
+++ b/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeDefListener.java
@@ -35,6 +35,7 @@
 
 import static org.onosproject.yangutils.datamodel.utils.GeneratedLanguage.JAVA_GENERATION;
 import static org.onosproject.yangutils.datamodel.utils.YangDataModelFactory.getYangTypeDefNode;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerCollisionDetector.detectCollidingChildUtil;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructExtendedListenerErrorMessage;
@@ -117,6 +118,11 @@
         // Validate sub statement cardinality.
         validateSubStatementsCardinality(ctx);
 
+        // Check for identifier collision
+        int line = ctx.getStart().getLine();
+        int charPositionInLine = ctx.getStart().getCharPositionInLine();
+        detectCollidingChildUtil(listener, line, charPositionInLine, identifier, TYPEDEF_DATA);
+
         /*
          * Create a derived type information, the base type must be set in type
          * listener.
diff --git a/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/ListenerUtil.java b/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/ListenerUtil.java
index 7f4e86b..a4ff8ae 100644
--- a/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/ListenerUtil.java
+++ b/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/ListenerUtil.java
@@ -54,6 +54,7 @@
     private static final String DATE_PATTERN = "[0-9]{4}-([0-9]{2}|[0-9])-([0-9]{2}|[0-9])";
     private static final String NON_NEGATIVE_INTEGER_PATTERN = "[0-9]+";
     private static final Pattern INTEGER_PATTERN = Pattern.compile("[-][0-9]+|[0-9]+");
+    private static final String XML = "xml";
     private static final String ONE = "1";
     private static final int IDENTIFIER_LENGTH = 64;
     private static final String DATE_FORMAT = "yyyy-MM-dd";
@@ -102,6 +103,10 @@
             parserException = new ParserException("YANG file error : " +
                     YangConstructType.getYangConstructType(yangConstruct) + " name " + identifierString + " is not " +
                     "valid.");
+        } else if (identifierString.toLowerCase().startsWith(XML)) {
+            parserException = new ParserException("YANG file error : " +
+                    YangConstructType.getYangConstructType(yangConstruct) + " identifier " + identifierString +
+                    " must not start with (('X'|'x') ('M'|'m') ('L'|'l')).");
         } else {
             return identifierString;
         }
@@ -175,7 +180,18 @@
             throw parserException;
         }
 
-        return Integer.parseInt(value);
+        int valueInInteger;
+        try {
+            valueInInteger = Integer.parseInt(value);
+        } catch (NumberFormatException e) {
+            ParserException parserException = new ParserException("YANG file error : " +
+                    YangConstructType.getYangConstructType(yangConstruct) + " value " + value + " is not " +
+                    "valid.");
+            parserException.setLine(ctx.getStart().getLine());
+            parserException.setCharPosition(ctx.getStart().getCharPositionInLine());
+            throw parserException;
+        }
+        return valueInInteger;
     }
 
     /**
diff --git a/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGeneratorUtil.java b/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGeneratorUtil.java
index 5c06f42..47e5c35 100644
--- a/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGeneratorUtil.java
+++ b/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGeneratorUtil.java
@@ -251,8 +251,8 @@
      */
     private static void close(YangNode node)
             throws IOException {
-
-        if (((TempJavaCodeFragmentFilesContainer) node).getTempJavaCodeFragmentFiles() != null) {
+        if (node instanceof JavaCodeGenerator && ((TempJavaCodeFragmentFilesContainer) node)
+                .getTempJavaCodeFragmentFiles() != null) {
             ((TempJavaCodeFragmentFilesContainer) node).getTempJavaCodeFragmentFiles().freeTemporaryResources(true);
         }
     }
diff --git a/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java b/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java
index c35b744..023da61 100644
--- a/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java
+++ b/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java
@@ -1337,19 +1337,6 @@
          */
         if ((fileType & INTERFACE_MASK) != 0 || (fileType &
                 BUILDER_INTERFACE_MASK) != 0) {
-            /*
-             * Adds import for case.
-             */
-            if (curNode instanceof YangCase) {
-                List<String> importData =
-                        ((TempJavaCodeFragmentFilesContainer) curNode).getTempJavaCodeFragmentFiles()
-                                .getBeanTempFiles().getJavaImportData().getImports();
-                for (String importInfo : importData) {
-                    if (!imports.contains(importInfo)) {
-                        imports.add(importInfo);
-                    }
-                }
-            }
 
             /*
              * Create interface file.
diff --git a/src/main/java/org/onosproject/yangutils/translator/tojava/utils/YangJavaModelUtils.java b/src/main/java/org/onosproject/yangutils/translator/tojava/utils/YangJavaModelUtils.java
index 7bea5cd..8e02082 100644
--- a/src/main/java/org/onosproject/yangutils/translator/tojava/utils/YangJavaModelUtils.java
+++ b/src/main/java/org/onosproject/yangutils/translator/tojava/utils/YangJavaModelUtils.java
@@ -42,6 +42,7 @@
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_SERVICE_AND_MANAGER;
 import static org.onosproject.yangutils.translator.tojava.TempJavaFragmentFiles.addCurNodeInfoInParentTempFile;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getCamelCase;
+import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getCapitalCase;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getCurNodePackage;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getPackageDirPathFromJavaJPackage;
 import static org.onosproject.yangutils.utils.UtilConstants.AUGMENTATION_HOLDER;
@@ -279,7 +280,7 @@
         if (javaCodeGeneratorInfo instanceof YangCase) {
             YangNode parent = ((YangCase) javaCodeGeneratorInfo).getParent();
             JavaQualifiedTypeInfo parentsInfo = new JavaQualifiedTypeInfo();
-            String parentName = ((JavaFileInfoContainer) parent).getJavaFileInfo().getJavaName();
+            String parentName = getCapitalCase(((JavaFileInfoContainer) parent).getJavaFileInfo().getJavaName());
             String parentPkg = ((JavaFileInfoContainer) parent).getJavaFileInfo().getPackage();
             parentsInfo.setClassInfo(parentName);
             parentsInfo.setPkgInfo(parentPkg);
diff --git a/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java b/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java
index c96a6ef..9ca906f 100644
--- a/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java
+++ b/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java
@@ -1122,6 +1122,18 @@
             " for YANG utils road map.";
 
     /**
+     * Static attribute for typedef linker error information.
+     */
+    public static final String TYPEDEF_LINKER_ERROR = "YANG file error: Unable to find base "
+            + "typedef for given type";
+
+    /**
+     * Static attribute for grouping linker error information.
+     */
+    public static final String GROUPING_LINKER_ERROR = "YANG file error: Unable to find base "
+            + "grouping for given uses";
+
+    /**
      * Creates an instance of util constants.
      */
     private UtilConstants() {