[ONOS-4286],[ONOS-3911] YANG typedef and YANG augment
                        translator implementation.

Change-Id: I3e21d1cb52bcb90b935b672eee42b836c21f448b
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/AttributesJavaDataType.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/AttributesJavaDataType.java
index 3dffc96..077e39f 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/AttributesJavaDataType.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/AttributesJavaDataType.java
@@ -16,35 +16,19 @@
 
 package org.onosproject.yangutils.translator.tojava.utils;
 
-import java.util.Set;
-import java.util.TreeSet;
-
 import org.onosproject.yangutils.datamodel.YangDataTypes;
+import org.onosproject.yangutils.datamodel.YangDerivedInfo;
+import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangType;
-import org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfo;
+import org.onosproject.yangutils.datamodel.YangTypeDef;
+import org.onosproject.yangutils.translator.exception.TranslatorException;
+import org.onosproject.yangutils.translator.tojava.HasJavaFileInfo;
+import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
+import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaTypeDef;
 
-import static org.onosproject.yangutils.datamodel.YangDataTypes.BINARY;
-import static org.onosproject.yangutils.datamodel.YangDataTypes.BITS;
-import static org.onosproject.yangutils.datamodel.YangDataTypes.BOOLEAN;
-import static org.onosproject.yangutils.datamodel.YangDataTypes.DECIMAL64;
-import static org.onosproject.yangutils.datamodel.YangDataTypes.DERIVED;
-import static org.onosproject.yangutils.datamodel.YangDataTypes.EMPTY;
-import static org.onosproject.yangutils.datamodel.YangDataTypes.ENUMERATION;
-import static org.onosproject.yangutils.datamodel.YangDataTypes.IDENTITYREF;
-import static org.onosproject.yangutils.datamodel.YangDataTypes.INSTANCE_IDENTIFIER;
-import static org.onosproject.yangutils.datamodel.YangDataTypes.INT16;
-import static org.onosproject.yangutils.datamodel.YangDataTypes.INT32;
-import static org.onosproject.yangutils.datamodel.YangDataTypes.INT64;
-import static org.onosproject.yangutils.datamodel.YangDataTypes.INT8;
-import static org.onosproject.yangutils.datamodel.YangDataTypes.LEAFREF;
-import static org.onosproject.yangutils.datamodel.YangDataTypes.STRING;
-import static org.onosproject.yangutils.datamodel.YangDataTypes.UINT16;
-import static org.onosproject.yangutils.datamodel.YangDataTypes.UINT32;
-import static org.onosproject.yangutils.datamodel.YangDataTypes.UINT64;
-import static org.onosproject.yangutils.datamodel.YangDataTypes.UINT8;
-import static org.onosproject.yangutils.datamodel.YangDataTypes.UNION;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getCamelCase;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getCaptialCase;
+import static org.onosproject.yangutils.utils.UtilConstants.BIG_INTEGER;
 import static org.onosproject.yangutils.utils.UtilConstants.BOOLEAN_DATA_TYPE;
 import static org.onosproject.yangutils.utils.UtilConstants.BOOLEAN_WRAPPER;
 import static org.onosproject.yangutils.utils.UtilConstants.BYTE;
@@ -52,8 +36,10 @@
 import static org.onosproject.yangutils.utils.UtilConstants.INT;
 import static org.onosproject.yangutils.utils.UtilConstants.INTEGER_WRAPPER;
 import static org.onosproject.yangutils.utils.UtilConstants.JAVA_LANG;
+import static org.onosproject.yangutils.utils.UtilConstants.JAVA_MATH;
 import static org.onosproject.yangutils.utils.UtilConstants.LONG;
 import static org.onosproject.yangutils.utils.UtilConstants.LONG_WRAPPER;
+import static org.onosproject.yangutils.utils.UtilConstants.PERIOD;
 import static org.onosproject.yangutils.utils.UtilConstants.SHORT;
 import static org.onosproject.yangutils.utils.UtilConstants.SHORT_WRAPPER;
 import static org.onosproject.yangutils.utils.UtilConstants.STRING_DATA_TYPE;
@@ -63,8 +49,6 @@
  */
 public final class AttributesJavaDataType {
 
-    private static Set<JavaQualifiedTypeInfo> importInfo = new TreeSet<>();
-
     /**
      * Creates an instance of attribute java data type.
      */
@@ -72,26 +56,6 @@
     }
 
     /**
-     * Returns import info.
-     *
-     * @return import info
-     */
-    public static Set<JavaQualifiedTypeInfo> getImportInfo() {
-
-        return importInfo;
-    }
-
-    /**
-     * Adds import info to the import info set.
-     *
-     * @param importData import info
-     */
-    public static void addImportInfo(JavaQualifiedTypeInfo importData) {
-
-        getImportInfo().add(importData);
-    }
-
-    /**
      * Returns java type.
      *
      * @param yangType YANG type
@@ -101,48 +65,32 @@
 
         YangDataTypes type = yangType.getDataType();
 
-        if (type.equals(INT8)) {
-            return BYTE;
-        } else if (type.equals(INT16)) {
-            return SHORT;
-        } else if (type.equals(INT32)) {
-            return INT;
-        } else if (type.equals(INT64)) {
-            return LONG;
-        } else if (type.equals(UINT8)) {
-            return SHORT;
-        } else if (type.equals(UINT16)) {
-            return INT;
-        } else if (type.equals(UINT32)) {
-            return LONG;
-        } else if (type.equals(UINT64)) {
-            //TODO: BIGINTEGER.
-        } else if (type.equals(DECIMAL64)) {
-            //TODO: DECIMAL64.
-        } else if (type.equals(STRING)) {
-            return STRING_DATA_TYPE;
-        } else if (type.equals(BOOLEAN)) {
-            return BOOLEAN_DATA_TYPE;
-        } else if (type.equals(ENUMERATION)) {
-            //TODO: ENUMERATION.
-        } else if (type.equals(BITS)) {
-            //TODO:BITS
-        } else if (type.equals(BINARY)) {
-            //TODO:BINARY
-        } else if (type.equals(LEAFREF)) {
-            //TODO:LEAFREF
-        } else if (type.equals(IDENTITYREF)) {
-            //TODO:IDENTITYREF
-        } else if (type.equals(EMPTY)) {
-            //TODO:EMPTY
-        } else if (type.equals(UNION)) {
-            //TODO:UNION
-        } else if (type.equals(INSTANCE_IDENTIFIER)) {
-            //TODO:INSTANCE_IDENTIFIER
-        } else if (type.equals(DERIVED)) {
-            return yangType.getDataTypeName();
+        switch (type) {
+            case INT8:
+                return BYTE;
+            case INT16:
+                return SHORT;
+            case INT32:
+                return INT;
+            case INT64:
+                return LONG;
+            case UINT8:
+                return SHORT;
+            case UINT16:
+                return INT;
+            case UINT32:
+                return LONG;
+            case UINT64:
+                return BIG_INTEGER;
+            case DECIMAL64:
+                //TODO: DECIMAL64.
+            case STRING:
+                return STRING_DATA_TYPE;
+            case BOOLEAN:
+                return BOOLEAN_DATA_TYPE;
+            default:
+                throw new TranslatorException("given data type is not supported.");
         }
-        return null;
     }
 
     /**
@@ -157,75 +105,80 @@
         YangDataTypes type = yangType.getDataType();
 
         if (isListAttr) {
-            if (type.equals(INT8)) {
-                return BYTE_WRAPPER;
-            } else if (type.equals(INT16)) {
-                return SHORT_WRAPPER;
-            } else if (type.equals(INT32)) {
-                return INTEGER_WRAPPER;
-            } else if (type.equals(INT64)) {
-                return LONG_WRAPPER;
-            } else if (type.equals(UINT8)) {
-                return SHORT_WRAPPER;
-            } else if (type.equals(UINT16)) {
-                return INTEGER_WRAPPER;
-            } else if (type.equals(UINT32)) {
-                return LONG_WRAPPER;
-            } else if (type.equals(UINT64)) {
-                //TODO: BIGINTEGER.
-            } else if (type.equals(DECIMAL64)) {
-                //TODO: DECIMAL64.
-            } else if (type.equals(STRING)) {
-                return STRING_DATA_TYPE;
-            } else if (type.equals(BOOLEAN)) {
-                return BOOLEAN_WRAPPER;
-            } else if (type.equals(ENUMERATION)) {
-                //TODO: ENUMERATION.
-            } else if (type.equals(BITS)) {
-                //TODO:BITS
-            } else if (type.equals(BINARY)) {
-                //TODO:BINARY
-            } else if (type.equals(LEAFREF)) {
-                //TODO:LEAFREF
-            } else if (type.equals(IDENTITYREF)) {
-                //TODO:IDENTITYREF
-            } else if (type.equals(EMPTY)) {
-                //TODO:EMPTY
-            } else if (type.equals(UNION)) {
-                //TODO:UNION
-            } else if (type.equals(INSTANCE_IDENTIFIER)) {
-                //TODO:INSTANCE_IDENTIFIER
-            } else if (type.equals(DERIVED)) {
-                return getCaptialCase(getCamelCase(yangType.getDataTypeName(), null));
+            switch (type) {
+                case INT8:
+                    return BYTE_WRAPPER;
+                case INT16:
+                    return SHORT_WRAPPER;
+                case INT32:
+                    return INTEGER_WRAPPER;
+                case INT64:
+                    return LONG_WRAPPER;
+                case UINT8:
+                    return SHORT_WRAPPER;
+                case UINT16:
+                    return INTEGER_WRAPPER;
+                case UINT32:
+                    return LONG_WRAPPER;
+                case UINT64:
+                    return BIG_INTEGER;
+                case DECIMAL64:
+                    //TODO: DECIMAL64.
+                case STRING:
+                    return STRING_DATA_TYPE;
+                case BOOLEAN:
+                    return BOOLEAN_WRAPPER;
+                case ENUMERATION:
+                    //TODO: ENUMERATION.
+                case BITS:
+                    //TODO:BITS
+                case BINARY:
+                    //TODO:BINARY
+                case LEAFREF:
+                    //TODO:LEAFREF
+                case IDENTITYREF:
+                    //TODO:IDENTITYREF
+                case EMPTY:
+                    return BOOLEAN_WRAPPER;
+                case UNION:
+                    //TODO:UNION
+                case INSTANCE_IDENTIFIER:
+                    //TODO:INSTANCE_IDENTIFIER
+                case DERIVED:
+                    return getCaptialCase(getCamelCase(yangType.getDataTypeName(), null));
+                default:
+                    throw new TranslatorException("given data type is not supported.");
             }
         } else {
-            if (type.equals(UINT64)) {
-                //TODO: BIGINTEGER.
-            } else if (type.equals(DECIMAL64)) {
-                //TODO: DECIMAL64.
-            } else if (type.equals(STRING)) {
-                return STRING_DATA_TYPE;
-            } else if (type.equals(ENUMERATION)) {
-                //TODO: ENUMERATION.
-            } else if (type.equals(BITS)) {
-                //TODO:BITS
-            } else if (type.equals(BINARY)) {
-                //TODO:BINARY
-            } else if (type.equals(LEAFREF)) {
-                //TODO:LEAFREF
-            } else if (type.equals(IDENTITYREF)) {
-                //TODO:IDENTITYREF
-            } else if (type.equals(EMPTY)) {
-                //TODO:EMPTY
-            } else if (type.equals(UNION)) {
-                //TODO:UNION
-            } else if (type.equals(INSTANCE_IDENTIFIER)) {
-                //TODO:INSTANCE_IDENTIFIER
-            } else if (type.equals(DERIVED)) {
-                return getCaptialCase(getCamelCase(yangType.getDataTypeName(), null));
+            switch (type) {
+                case UINT64:
+                    return BIG_INTEGER;
+                case DECIMAL64:
+                    //TODO: DECIMAL64.
+                case STRING:
+                    return STRING_DATA_TYPE;
+                case ENUMERATION:
+                    //TODO: ENUMERATION.
+                case BITS:
+                    //TODO:BITS
+                case BINARY:
+                    //TODO:BINARY
+                case LEAFREF:
+                    //TODO:LEAFREF
+                case IDENTITYREF:
+                    //TODO:IDENTITYREF
+                case EMPTY:
+                    //TODO:EMPTY
+                case UNION:
+                    //TODO:UNION
+                case INSTANCE_IDENTIFIER:
+                    //TODO:INSTANCE_IDENTIFIER
+                case DERIVED:
+                    return getCaptialCase(getCamelCase(yangType.getDataTypeName(), null));
+                default:
+                    return null;
             }
         }
-        return null;
     }
 
     /**
@@ -241,75 +194,108 @@
         YangDataTypes type = yangType.getDataType();
 
         if (isListAttr) {
-            if (type.equals(INT8)
-                    || type.equals(INT16)
-                    || type.equals(INT32)
-                    || type.equals(INT64)
-                    || type.equals(UINT8)
-                    || type.equals(UINT16)
-                    || type.equals(UINT32)
-                    || type.equals(STRING)
-                    || type.equals(BOOLEAN)) {
-                return JAVA_LANG;
-            } else if (type.equals(UINT64)) {
-                //TODO: BIGINTEGER.
-            } else if (type.equals(DECIMAL64)) {
-                //TODO: DECIMAL64.
-            } else if (type.equals(ENUMERATION)) {
-                //TODO: ENUMERATION.
-            } else if (type.equals(BITS)) {
-                //TODO:BITS
-            } else if (type.equals(BINARY)) {
-                //TODO:BINARY
-            } else if (type.equals(LEAFREF)) {
-                //TODO:LEAFREF
-            } else if (type.equals(IDENTITYREF)) {
-                //TODO:IDENTITYREF
-            } else if (type.equals(EMPTY)) {
-                //TODO:EMPTY
-            } else if (type.equals(UNION)) {
-                //TODO:UNION
-            } else if (type.equals(INSTANCE_IDENTIFIER)) {
-                //TODO:INSTANCE_IDENTIFIER
-            } else if (type.equals(DERIVED)) {
-                for (JavaQualifiedTypeInfo imports : getImportInfo()) {
-                    if (imports.getClassInfo().equals(classInfo)) {
-                        return imports.getPkgInfo();
-                    }
-                }
+            switch (type) {
+                case INT8:
+                case INT16:
+                case INT32:
+                case INT64:
+                case UINT8:
+                case UINT16:
+                case UINT32:
+                case STRING:
+                case BOOLEAN:
+                    return JAVA_LANG;
+                case UINT64:
+                    return JAVA_MATH;
+                case DECIMAL64:
+                    //TODO: DECIMAL64.
+                case ENUMERATION:
+                    //TODO: ENUMERATION.
+                case BITS:
+                    //TODO:BITS
+                case BINARY:
+                    //TODO:BINARY
+                case LEAFREF:
+                    //TODO:LEAFREF
+                case IDENTITYREF:
+                    //TODO:IDENTITYREF
+                case EMPTY:
+                    //TODO:EMPTY
+                case UNION:
+                    //TODO:UNION
+                case INSTANCE_IDENTIFIER:
+                    //TODO:INSTANCE_IDENTIFIER
+                case DERIVED:
+                    return getTypDefsPackage(yangType);
+                default:
+                    throw new TranslatorException("given data type is not supported.");
             }
         } else {
-
-            if (type.equals(UINT64)) {
-                //TODO: BIGINTEGER.
-            } else if (type.equals(DECIMAL64)) {
-                //TODO: DECIMAL64.
-            } else if (type.equals(STRING)) {
-                return JAVA_LANG;
-            } else if (type.equals(ENUMERATION)) {
-                //TODO: ENUMERATION.
-            } else if (type.equals(BITS)) {
-                //TODO:BITS
-            } else if (type.equals(BINARY)) {
-                //TODO:BINARY
-            } else if (type.equals(LEAFREF)) {
-                //TODO:LEAFREF
-            } else if (type.equals(IDENTITYREF)) {
-                //TODO:IDENTITYREF
-            } else if (type.equals(EMPTY)) {
-                //TODO:EMPTY
-            } else if (type.equals(UNION)) {
-                //TODO:UNION
-            } else if (type.equals(INSTANCE_IDENTIFIER)) {
-                //TODO:INSTANCE_IDENTIFIER
-            } else if (type.equals(DERIVED)) {
-                for (JavaQualifiedTypeInfo imports : getImportInfo()) {
-                    if (imports.getClassInfo().equals(classInfo)) {
-                        return imports.getPkgInfo();
-                    }
-                }
+            switch (type) {
+                case UINT64:
+                    //TODO: BIGINTEGER.
+                case DECIMAL64:
+                    //TODO: DECIMAL64
+                case STRING:
+                    return JAVA_LANG;
+                case ENUMERATION:
+                    //TODO: ENUMERATION.
+                case BITS:
+                    //TODO:BITS
+                case BINARY:
+                    //TODO:BINARY
+                case LEAFREF:
+                    //TODO:LEAFREF
+                case IDENTITYREF:
+                    //TODO:IDENTITYREF
+                case EMPTY:
+                    //TODO:EMPTY
+                case UNION:
+                    //TODO:UNION
+                case INSTANCE_IDENTIFIER:
+                    //TODO:INSTANCE_IDENTIFIER
+                case DERIVED:
+                    return getTypDefsPackage(yangType);
+                default:
+                    return null;
             }
         }
-        return null;
+    }
+
+    /**
+     * Returns java package for typedef node.
+     *
+     * @param type YANG type
+     * @return java package for typedef node
+     */
+    private static String getTypDefsPackage(YangType<?> type) {
+        Object var = type.getDataTypeExtendedInfo();
+        if (!(var instanceof YangDerivedInfo)) {
+            throw new TranslatorException("type should have been derived.");
+        }
+
+        if (!(((YangDerivedInfo<?>) var).getReferredTypeDef() instanceof YangTypeDef)) {
+            throw new TranslatorException("derived info is not an instance of typedef.");
+        }
+
+        YangJavaTypeDef typedef = (YangJavaTypeDef) ((YangDerivedInfo<?>) var).getReferredTypeDef();
+        if (typedef.getJavaFileInfo().getPackage() == null) {
+            return getPackageFromParent(typedef.getParent());
+        }
+        return typedef.getJavaFileInfo().getPackage();
+    }
+
+    /**
+     * Returns package from parent node.
+     *
+     * @param parent parent YANG node
+     * @return java package from parent node
+     */
+    private static String getPackageFromParent(YangNode parent) {
+        if (!(parent instanceof HasJavaFileInfo)) {
+            throw new TranslatorException("Invalid child node is being processed.");
+        }
+        JavaFileInfo parentInfo = ((HasJavaFileInfo) parent).getJavaFileInfo();
+        return parentInfo.getPackage() + PERIOD + parentInfo.getJavaName().toLowerCase();
     }
 }