[ONOS-5630][ONOS-5615][ONOS-5634][ONOS-5635][ONOS-5568] defect fix for generated code.

Change-Id: I1d07e8c836005cdc9107186df18b468bc3b13cd1
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java
index b1c45e6..548dbac 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java
@@ -17,7 +17,6 @@
 
 import org.onosproject.yangutils.datamodel.RpcNotificationContainer;
 import org.onosproject.yangutils.datamodel.YangAugment;
-import org.onosproject.yangutils.datamodel.YangAugmentableNode;
 import org.onosproject.yangutils.datamodel.YangCase;
 import org.onosproject.yangutils.datamodel.YangChoice;
 import org.onosproject.yangutils.datamodel.YangDataStructure;
@@ -76,7 +75,6 @@
 import static org.onosproject.yangutils.translator.tojava.javamodel.AttributesJavaDataType.updateJavaFileInfo;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.generateEnumAttributeString;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.getJavaAttributeDefinition;
-import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.sortImports;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGenerator.generateBuilderClassFile;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGenerator.generateBuilderInterfaceFile;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGenerator.generateDefaultClassFile;
@@ -109,13 +107,13 @@
 import static org.onosproject.yangutils.translator.tojava.utils.TranslatorErrorType.MISSING_PARENT_NODE;
 import static org.onosproject.yangutils.translator.tojava.utils.TranslatorUtils.getBeanFiles;
 import static org.onosproject.yangutils.translator.tojava.utils.TranslatorUtils.getErrorMsg;
-import static org.onosproject.yangutils.utils.UtilConstants.ARRAY_LIST_IMPORT;
 import static org.onosproject.yangutils.utils.UtilConstants.AUGMENT_MAP_TYPE;
 import static org.onosproject.yangutils.utils.UtilConstants.BIT_SET;
 import static org.onosproject.yangutils.utils.UtilConstants.BOOLEAN_DATA_TYPE;
 import static org.onosproject.yangutils.utils.UtilConstants.BUILDER;
 import static org.onosproject.yangutils.utils.UtilConstants.CLASS_STRING;
 import static org.onosproject.yangutils.utils.UtilConstants.CLOSE_CURLY_BRACKET;
+import static org.onosproject.yangutils.utils.UtilConstants.COLLECTION_IMPORTS;
 import static org.onosproject.yangutils.utils.UtilConstants.DEFAULT;
 import static org.onosproject.yangutils.utils.UtilConstants.DEFAULT_CAPS;
 import static org.onosproject.yangutils.utils.UtilConstants.DIAMOND_CLOSE_BRACKET;
@@ -123,14 +121,15 @@
 import static org.onosproject.yangutils.utils.UtilConstants.EMPTY_STRING;
 import static org.onosproject.yangutils.utils.UtilConstants.EXTEND;
 import static org.onosproject.yangutils.utils.UtilConstants.FOUR_SPACE_INDENTATION;
+import static org.onosproject.yangutils.utils.UtilConstants.GOOGLE_MORE_OBJECT_IMPORT_CLASS;
+import static org.onosproject.yangutils.utils.UtilConstants.GOOGLE_MORE_OBJECT_IMPORT_PKG;
+import static org.onosproject.yangutils.utils.UtilConstants.HASH_MAP;
 import static org.onosproject.yangutils.utils.UtilConstants.INTERFACE;
 import static org.onosproject.yangutils.utils.UtilConstants.INVOCATION_TARGET_EXCEPTION;
-import static org.onosproject.yangutils.utils.UtilConstants.INVOCATION_TARGET_EXCEPTION_IMPORT;
-import static org.onosproject.yangutils.utils.UtilConstants.ITR_IMPORT;
+import static org.onosproject.yangutils.utils.UtilConstants.JAVA_UTIL_OBJECTS_IMPORT_CLASS;
 import static org.onosproject.yangutils.utils.UtilConstants.JAVA_UTIL_PKG;
 import static org.onosproject.yangutils.utils.UtilConstants.KEYS;
-import static org.onosproject.yangutils.utils.UtilConstants.METHOD;
-import static org.onosproject.yangutils.utils.UtilConstants.METHOD_IMPORT;
+import static org.onosproject.yangutils.utils.UtilConstants.MAP;
 import static org.onosproject.yangutils.utils.UtilConstants.NEW_LINE;
 import static org.onosproject.yangutils.utils.UtilConstants.OPERATION_TYPE_ATTRIBUTE;
 import static org.onosproject.yangutils.utils.UtilConstants.OPERATION_TYPE_CLASS;
@@ -142,7 +141,6 @@
 import static org.onosproject.yangutils.utils.UtilConstants.REFLECT_IMPORTS;
 import static org.onosproject.yangutils.utils.UtilConstants.SELECT_LEAF;
 import static org.onosproject.yangutils.utils.UtilConstants.SERVICE;
-import static org.onosproject.yangutils.utils.UtilConstants.SET_IMPORT;
 import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
 import static org.onosproject.yangutils.utils.UtilConstants.SPACE;
 import static org.onosproject.yangutils.utils.UtilConstants.SUBTREE_FILTERED;
@@ -294,20 +292,11 @@
     private static final String KEY_CLASS_FILE_NAME_SUFFIX = KEYS;
 
     /**
-     * if type is binary.
-     */
-    private boolean isBinary;
-
-    /**
      * Current attributes YANG node
      */
     private YangNode attrNode;
 
     /**
-     * Sub tree filtering requires child class imports for type cast.
-     */
-    private final List<JavaQualifiedTypeInfoTranslator> subTreeImports = new ArrayList<>();
-    /**
      * Information about the java files being generated.
      */
     private JavaFileInfoTranslator javaFileInfo;
@@ -355,29 +344,6 @@
     private File implClassJavaFileHandle;
 
     /**
-     * Returns java file handle for key class.
-     *
-     * @return java file handle for key class
-     */
-    public File getKeyClassJavaFileHandle() {
-        return keyClassJavaFileHandle;
-    }
-
-    /**
-     * Sets java file handle for key class.
-     *
-     * @param keyClassJavaFileHandle java file handle for key class
-     */
-    public void setKeyClassJavaFileHandle(File keyClassJavaFileHandle) {
-        this.keyClassJavaFileHandle = keyClassJavaFileHandle;
-    }
-
-    /**
-     * Java file handle for impl class file.
-     */
-    private File keyClassJavaFileHandle;
-
-    /**
      * Temporary file handle for attribute.
      */
     private File attributesTempFileHandle;
@@ -654,17 +620,17 @@
         TempJavaBeanFragmentFiles tempFiles =
                 getBeanFiles((JavaCodeGeneratorInfo) parent);
         tempFiles.setAttrNode(curNode);
-        if (curNode instanceof YangChoice) {
+        JavaFileInfoTranslator fileInfo = ((JavaCodeGeneratorInfo) parent)
+                .getJavaFileInfo();
+        if (curNode instanceof YangChoice && curNode.isOpTypeReq()) {
             JavaQualifiedTypeInfoTranslator info = new
                     JavaQualifiedTypeInfoTranslator();
             info.setClassInfo(INVOCATION_TARGET_EXCEPTION);
             info.setPkgInfo(REFLECT_IMPORTS);
-            tempFiles.addToSubTreeImports(info);
-            info = new
-                    JavaQualifiedTypeInfoTranslator();
-            info.setClassInfo(METHOD);
-            info.setPkgInfo(REFLECT_IMPORTS);
-            tempFiles.addToSubTreeImports(info);
+            info.setForInterface(false);
+            tempFiles.getJavaImportData().addImportInfo(
+                    info, getCapitalCase(fileInfo.getJavaName()),
+                    fileInfo.getPackage());
         }
         JavaAttributeInfo attr = getCurNodeAsAttributeInTarget(
                 curNode, parent, isList, tempFiles);
@@ -723,10 +689,16 @@
             }
             qualified = parentImportData.addImportInfo(typeInfo, className,
                                                        fileInfo.getPackage());
-            if (!qualified && !(curNode instanceof YangChoice)) {
-                addChildDefaultClassImportForSubTreeFilter(typeInfo.getPkgInfo(),
-                                                           typeInfo.getClassInfo(),
-                                                           tempFiles);
+            if (!qualified && !(curNode instanceof YangChoice) &&
+                    curNode.isOpTypeReq()) {
+                String name = DEFAULT_CAPS + typeInfo.getClassInfo();
+                JavaQualifiedTypeInfoTranslator qInfo =
+                        new JavaQualifiedTypeInfoTranslator();
+                qInfo.setForInterface(false);
+                qInfo.setPkgInfo(typeInfo.getPkgInfo());
+                qInfo.setClassInfo(name);
+                parentImportData.addImportInfo(qInfo, className,
+                                               fileInfo.getPackage());
             }
         }
         boolean collectionSet = false;
@@ -771,16 +743,6 @@
                                           qualified, listNode);
     }
 
-    private static void addChildDefaultClassImportForSubTreeFilter(
-            String pkg, String className, TempJavaFragmentFiles tempFile) {
-        className = DEFAULT_CAPS + getCapitalCase(className);
-        JavaQualifiedTypeInfoTranslator info = new
-                JavaQualifiedTypeInfoTranslator();
-        info.setClassInfo(className);
-        info.setPkgInfo(pkg);
-        tempFile.subTreeImports.add(info);
-    }
-
     /**
      * Returns java attribute for leaf.
      *
@@ -896,9 +858,7 @@
                                                        .getJavaName());
         String containedInPkg = tempFiles.getJavaFileInfo().getPackage();
         JavaQualifiedTypeInfoTranslator info;
-        if (container.getDataType().getDataType() == YangDataTypes.BINARY) {
-            tempFiles.setBinary(true);
-        } else if (container.getDataType().getDataType() == YangDataTypes.BITS) {
+        if (container.getDataType().getDataType() == YangDataTypes.BITS) {
             //Add bitset import for type and leaf value flags.
             info = new JavaQualifiedTypeInfoTranslator();
             info.setClassInfo(BIT_SET);
@@ -1475,9 +1435,16 @@
         String attrType = attr.getImportInfo().getClassInfo();
         if (attr.getAttributeType() != null &&
                 attr.getAttributeType().getDataType() == IDENTITYREF) {
+            String type = attrType;
+            if (pkg != null) {
+                type = pkg + PERIOD + attrType;
+            }
             attrType = CLASS_STRING + DIAMOND_OPEN_BRACKET +
-                    QUESTION_MARK + SPACE + EXTEND + SPACE +
-                    attrType + DIAMOND_CLOSE_BRACKET;
+                    QUESTION_MARK + SPACE + EXTEND + SPACE + type +
+                    DIAMOND_CLOSE_BRACKET;
+            return getJavaAttributeDefinition(
+                    null, attrType, attrName, attr.isListAttr(), attrAccessType,
+                    attr.getCompilerAnnotation());
         }
 
         return getJavaAttributeDefinition(
@@ -1616,13 +1583,14 @@
         typeInfo.setPkgInfo(info.getPackage().toLowerCase() + PERIOD +
                                     getCapitalCase(info.getJavaName()));
         String curNodeName = getCapitalCase(curInfo.getJavaName());
+        boolean isQualified = false;
         if (!(curNode instanceof RpcNotificationContainer)) {
-            javaImportData.addImportInfo(typeInfo, curNodeName, curInfo
-                    .getPackage());
+            isQualified = javaImportData.addImportInfo(typeInfo, curNodeName,
+                                                       curInfo.getPackage());
         }
         JavaAttributeInfo attributeInfo =
                 getAttributeInfoForTheData(typeInfo, YANG + curNodeName +
-                        OPERATION_TYPE_ATTRIBUTE, null, false, false);
+                        OPERATION_TYPE_ATTRIBUTE, null, isQualified, false);
         addJavaSnippetInfoToApplicableTempFiles(attributeInfo, config);
     }
 
@@ -1692,22 +1660,54 @@
     /**
      * Adds value leaf flag to temp files.
      *
-     * @param config YANG plugin config
+     * @param config  YANG plugin config
+     * @param curNode current yang node
      * @throws IOException IO exception
      */
-    protected void addYangAugmentedMap(YangPluginConfig config)
+    protected void addYangAugmentedMap(YangPluginConfig config, YangNode curNode)
             throws IOException {
+        JavaFileInfoTranslator info = ((JavaCodeGeneratorInfo) curNode)
+                .getJavaFileInfo();
         JavaQualifiedTypeInfoTranslator typeInfo =
                 new JavaQualifiedTypeInfoTranslator();
         typeInfo.setClassInfo(AUGMENT_MAP_TYPE);
         //Fix for add yangAugmentedInfo in equals/hashcode/and to string method.
         typeInfo.setPkgInfo(null);
+        typeInfo.setForInterface(false);
         JavaAttributeInfo attributeInfo =
                 getAttributeInfoForTheData(typeInfo, YANG_AUGMENTED_INFO_MAP,
                                            null, false, false);
+        //MAP
+        addImportInfoOfNode(MAP, COLLECTION_IMPORTS,
+                            getCapitalCase(info.getJavaName()),
+                            info.getPackage(), true);
+        //HASH map
+        addImportInfoOfNode(HASH_MAP, COLLECTION_IMPORTS,
+                            getCapitalCase(info.getJavaName()),
+                            info.getPackage(), false);
+
+        if (curNode.isOpTypeReq()) {
+            //exception
+            addImportInfoOfNode(INVOCATION_TARGET_EXCEPTION, REFLECT_IMPORTS,
+                                getCapitalCase(info.getJavaName()),
+                                info.getPackage(), false);
+        }
         addJavaSnippetInfoToApplicableTempFiles(attributeInfo, config);
     }
 
+    private JavaQualifiedTypeInfoTranslator addImportInfoOfNode(
+            String cls, String pkg, String nodeName, String nodePkg,
+            boolean isForInterface) {
+        JavaQualifiedTypeInfoTranslator typeInfo =
+                new JavaQualifiedTypeInfoTranslator();
+        typeInfo.setClassInfo(cls);
+        typeInfo.setPkgInfo(pkg);
+        typeInfo.setForInterface(isForInterface);
+
+        getJavaImportData().addImportInfo(typeInfo, nodeName, nodePkg);
+        return typeInfo;
+    }
+
     /**
      * Adds the new attribute info to the target generated temporary files.
      *
@@ -1845,11 +1845,25 @@
      */
     public void generateJavaFile(int fileType, YangNode curNode)
             throws IOException {
-        List<String> imports =
-                getBeanFiles(curNode).getJavaImportData().getImports();
-        if (curNode instanceof YangAugmentableNode) {
-            addImportsForAugmentableClass(imports, true, true, curNode);
+
+        if (curNode.isOpTypeReq()) {
+            addImportInfoOfNode(BIT_SET, JAVA_UTIL_PKG, getGeneratedJavaClassName(),
+                                getJavaFileInfo().getPackage(), false);
         }
+        if (isAttributePresent) {
+            //Object utils
+            addImportInfoOfNode(JAVA_UTIL_OBJECTS_IMPORT_CLASS, JAVA_UTIL_PKG,
+                                getGeneratedJavaClassName(),
+                                getJavaFileInfo().getPackage(), false);
+            //more objects.
+            addImportInfoOfNode(GOOGLE_MORE_OBJECT_IMPORT_CLASS,
+                                GOOGLE_MORE_OBJECT_IMPORT_PKG,
+                                getGeneratedJavaClassName(),
+                                getJavaFileInfo().getPackage(), false);
+        }
+
+        List<String> imports =
+                getBeanFiles(curNode).getJavaImportData().getImports(true);
         createPackage(curNode);
 
         //Generate java code.
@@ -1882,35 +1896,16 @@
 
             insertDataIntoJavaFile(interfaceJavaFileHandle, CLOSE_CURLY_BRACKET);
             validateLineLength(interfaceJavaFileHandle);
-            if (curNode instanceof YangAugmentableNode) {
-                addImportsForAugmentableClass(imports, false, true, curNode);
-            }
         }
 
-        if (curNode.isOpTypeReq()) {
-            if (curNode instanceof YangAugmentableNode) {
-                addImportsForSubTreeFilterAug(imports);
-            }
-            addSubTreeImportStrings(imports);
-        } else {
+        //add imports for default class.
+        imports = getBeanFiles(curNode).getJavaImportData().getImports(false);
+        if (!curNode.isOpTypeReq()) {
             removeCaseParentImport(curNode, imports);
         }
 
         if ((fileType & BUILDER_CLASS_MASK) != 0 ||
                 (fileType & DEFAULT_CLASS_MASK) != 0) {
-            if (isAttributePresent) {
-                addImportsToStringAndHasCodeMethods(imports, true);
-                addArrayListImport(imports);
-            }
-
-            addBitsAndBase64Imports(curNode, imports);
-            if (curNode instanceof YangAugmentableNode) {
-                addImportsForAugmentableClass(imports, true, false, curNode);
-                if (curNode.isOpTypeReq()) {
-                    addInvocationExceptionImport(imports);
-                }
-            }
-            sortImports(imports);
 
             //Create impl class file.
             implClassJavaFileHandle =
@@ -1939,6 +1934,7 @@
         }
 
         if (curNode instanceof YangList) {
+            File keyClassJavaFileHandle;
             YangList list = (YangList) curNode;
             YangDataStructure data = getYangDataStructure(
                     list.getCompilerAnnotation());
@@ -1946,8 +1942,7 @@
                 keyClassJavaFileHandle =
                         getJavaFileHandle(getJavaClassName(
                                 KEY_CLASS_FILE_NAME_SUFFIX));
-                keyClassJavaFileHandle =
-                        generateKeyClassFile(keyClassJavaFileHandle, curNode);
+                generateKeyClassFile(keyClassJavaFileHandle, curNode);
 
             }
         }
@@ -1964,93 +1959,6 @@
         imports.remove(impt);
     }
 
-    private void addImportsForSubTreeFilterAug(List<String> imports) {
-        if (!imports.contains(SET_IMPORT)) {
-            imports.add(SET_IMPORT);
-        }
-        if (!imports.contains(METHOD_IMPORT)) {
-            imports.add(METHOD_IMPORT);
-        }
-        if (!imports.contains(ITR_IMPORT)) {
-            imports.add(ITR_IMPORT);
-        }
-    }
-
-    //Adds import for array list.
-    private void addArrayListImport(List<String> imports) {
-        if (imports.contains(javaImportData.getImportForList())) {
-            imports.add(ARRAY_LIST_IMPORT);
-        }
-    }
-
-    //Adds import for bitset and base64 list.
-    private void addBitsAndBase64Imports(YangNode curNode, List<String> imports) {
-        if (curNode.isOpTypeReq()) {
-            String impt = getJavaImportData().getImportForToBitSet();
-            if (!imports.contains(impt)) {
-                imports.add(getJavaImportData().getImportForToBitSet());
-            }
-        }
-    }
-
-    /**
-     * Adds imports for ToString and HashCodeMethod.
-     *
-     * @param imports   import list
-     * @param operation add or remove
-     */
-    protected void addImportsToStringAndHasCodeMethods(List<String> imports,
-                                                       boolean operation) {
-        if (operation) {
-            imports.add(javaImportData.getImportForHashAndEquals());
-            imports.add(javaImportData.getImportForToString());
-        } else {
-            imports.remove(javaImportData.getImportForHashAndEquals());
-            imports.remove(javaImportData.getImportForToString());
-        }
-        // TODO change boolean to OPERATION, in all related places.
-    }
-
-    /**
-     * Adds import for map and hash map.
-     *
-     * @param imports         import list
-     * @param operations      true for adding and false for deletion
-     * @param isInterfaceFile if need to add in interface file
-     * @param curNode         current node
-     */
-    private void addImportsForAugmentableClass(List<String> imports,
-                                               boolean operations,
-                                               boolean isInterfaceFile,
-                                               YangNode curNode) {
-        if (operations) {
-            if (!isInterfaceFile) {
-                imports.add(javaImportData.getHashMapImport());
-            }
-            // Add import for hash map only if node is not a YANG choice.
-            if (!(curNode instanceof YangChoice)) {
-                imports.add(javaImportData.getMapImport());
-            }
-        } else {
-            if (!isInterfaceFile) {
-                imports.remove(javaImportData.getHashMapImport());
-            }
-            imports.remove(javaImportData.getMapImport());
-        }
-        sortImports(imports);
-    }
-
-    /**
-     * Adds invocation exception import.
-     *
-     * @param imports list of imports
-     */
-    private void addInvocationExceptionImport(List<String> imports) {
-        if (!imports.contains(INVOCATION_TARGET_EXCEPTION_IMPORT)) {
-            imports.add(INVOCATION_TARGET_EXCEPTION_IMPORT);
-        }
-    }
-
     /**
      * Removes all temporary file handles.
      *
@@ -2231,24 +2139,6 @@
     }
 
     /**
-     * Sets true if binary type is there for leaf/leaf-list.
-     *
-     * @param binary true if binary type is there for leaf/leaf-list
-     */
-    public void setBinary(boolean binary) {
-        isBinary = binary;
-    }
-
-    /**
-     * Returns true if binary type is there for leaf/leaf-list.
-     *
-     * @return true if binary type is there for leaf/leaf-list
-     */
-    public boolean isBinary() {
-        return isBinary;
-    }
-
-    /**
      * Sets attribute's node.
      *
      * @param attrNode attribute's node
@@ -2257,33 +2147,4 @@
         this.attrNode = attrNode;
     }
 
-    /**
-     * Adds info to sub tree import list.
-     *
-     * @param info import info
-     */
-    public void addToSubTreeImports(JavaQualifiedTypeInfoTranslator
-                                            info) {
-        boolean isAdded = false;
-        for (JavaQualifiedTypeInfoTranslator imports : subTreeImports) {
-            if (imports.getClassInfo().equals(info.getClassInfo())) {
-                isAdded = true;
-            }
-        }
-        if (!isAdded) {
-            subTreeImports.add(info);
-        }
-    }
-
-    private void addSubTreeImportStrings(List<String> imports) {
-        for (JavaQualifiedTypeInfoTranslator impt : subTreeImports) {
-            String imp = getImportString(impt.getPkgInfo(), impt
-                    .getClassInfo());
-            if (!imports.contains(imp)) {
-                imports.add(imp);
-            }
-        }
-        sortImports(imports);
-    }
-
 }