[ONOS-4829] Augmented data method generator implmentation.

Change-Id: I0cb68dd10a748e5b66eec0b832574f408a23ba5c
diff --git a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java
index bbc346d..d8bba5e 100644
--- a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java
+++ b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java
@@ -17,16 +17,18 @@
 
 import java.io.File;
 import java.io.IOException;
-import java.util.ArrayList;
 import java.util.List;
 
-import org.onosproject.yangutils.datamodel.RpcNotificationContainer;
+import org.onosproject.yangutils.datamodel.YangAugmentableNode;
 import org.onosproject.yangutils.datamodel.YangCase;
 import org.onosproject.yangutils.datamodel.YangLeaf;
 import org.onosproject.yangutils.datamodel.YangLeafList;
 import org.onosproject.yangutils.datamodel.YangLeavesHolder;
 import org.onosproject.yangutils.datamodel.YangList;
+import org.onosproject.yangutils.datamodel.YangModule;
 import org.onosproject.yangutils.datamodel.YangNode;
+import org.onosproject.yangutils.datamodel.YangSubModule;
+import org.onosproject.yangutils.datamodel.YangUses;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.javamodel.JavaLeafInfoContainer;
 import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaAugment;
@@ -40,6 +42,7 @@
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.BUILDER_CLASS_MASK;
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.BUILDER_INTERFACE_MASK;
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_ENUM_CLASS;
+import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_INTERFACE_WITH_BUILDER;
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_SERVICE_AND_MANAGER;
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_TYPE_CLASS;
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.IMPL_CLASS_MASK;
@@ -60,10 +63,12 @@
 import static org.onosproject.yangutils.translator.tojava.javamodel.AttributesJavaDataType.updateJavaFileInfo;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.getJavaAttributeDefination;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.getJavaClassDefClose;
+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.generateImplClassFile;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGenerator.generateInterfaceFile;
+import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGeneratorUtils.addResolvedAugmentedDataNodeImports;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGeneratorUtils.getFileObject;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.createPackage;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getAugmentedConstructor;
@@ -74,14 +79,11 @@
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getGetterForClass;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getGetterString;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getHashCodeMethod;
-import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getOfMethod;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getOverRideString;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getSetterForClass;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getSetterString;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getToStringMethod;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.parseBuilderInterfaceBuildMethodString;
-import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.closeFile;
-import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.sortImports;
 import static org.onosproject.yangutils.utils.UtilConstants.ACTIVATE;
 import static org.onosproject.yangutils.utils.UtilConstants.BUILDER;
 import static org.onosproject.yangutils.utils.UtilConstants.COMPONENT;
@@ -100,9 +102,9 @@
 import static org.onosproject.yangutils.utils.UtilConstants.SEMI_COLAN;
 import static org.onosproject.yangutils.utils.UtilConstants.SERVICE;
 import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
+import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.closeFile;
 import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.readAppendFile;
 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.GETTER_METHOD;
-import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.OF_METHOD;
 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.getJavaDoc;
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getAbsolutePackagePath;
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCamelCase;
@@ -113,38 +115,12 @@
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.validateLineLength;
 
 /**
- * Represents implementation of java code fragments temporary implementations.
- * Manages the common temp file required for Java file(s) generated.
+ * Represents implementation of java code fragments temporary implementations. Manages the common temp file required for
+ * Java file(s) generated.
  */
 public class TempJavaFragmentFiles {
 
     /**
-     * Information about the java files being generated.
-     */
-    private JavaFileInfo javaFileInfo;
-
-    /**
-     * Imported class info.
-     */
-    private JavaImportData javaImportData;
-
-    /**
-     * The variable which guides the types of temporary files generated using
-     * the temporary generated file types mask.
-     */
-    private int generatedTempFiles;
-
-    /**
-     * Absolute path where the target java file needs to be generated.
-     */
-    private String absoluteDirPath;
-
-    /**
-     * Contains all the interface(s)/class name which will be extended by generated files.
-     */
-    private JavaExtendsListHolder javaExtendsListHolder;
-
-    /**
      * File type extension for java classes.
      */
     private static final String JAVA_FILE_EXTENSION = ".java";
@@ -228,6 +204,32 @@
      * File name for augment copy constructor method.
      */
     private static final String AUGMENT_CONSTRUCTOR_FILE_NAME = "AugmentConstructor";
+
+    /**
+     * Information about the java files being generated.
+     */
+    private JavaFileInfo javaFileInfo;
+
+    /**
+     * Imported class info.
+     */
+    private JavaImportData javaImportData;
+
+    /**
+     * The variable which guides the types of temporary files generated using the temporary generated file types mask.
+     */
+    private int generatedTempFiles;
+
+    /**
+     * Absolute path where the target java file needs to be generated.
+     */
+    private String absoluteDirPath;
+
+    /**
+     * Contains all the interface(s)/class name which will be extended by generated files.
+     */
+    private JavaExtendsListHolder javaExtendsListHolder;
+
     /**
      * Java file handle for interface file.
      */
@@ -308,6 +310,245 @@
      */
     private File augmentConstructorImplTempFileHandle;
 
+    TempJavaFragmentFiles() {
+    }
+
+    /**
+     * Creates an instance of temporary java code fragment.
+     *
+     * @param javaFileInfo generated java file information
+     * @throws IOException when fails to create new file handle
+     */
+    TempJavaFragmentFiles(JavaFileInfo javaFileInfo)
+            throws IOException {
+        setJavaExtendsListHolder(new JavaExtendsListHolder());
+        setJavaImportData(new JavaImportData());
+        setJavaFileInfo(javaFileInfo);
+        setAbsoluteDirPath(getAbsolutePackagePath(getJavaFileInfo().getBaseCodeGenPath(),
+                getJavaFileInfo().getPackageFilePath()));
+
+        /*
+         * Initialize getter when generation file type matches to interface
+         * mask.
+         */
+        if ((getGeneratedJavaFiles() & INTERFACE_MASK) != 0) {
+            addGeneratedTempFile(GETTER_FOR_INTERFACE_MASK);
+        }
+
+        /*
+         * Initialize getter and setter when generation file type matches to
+         * builder interface mask.
+         */
+        if ((getGeneratedJavaFiles() & BUILDER_INTERFACE_MASK) != 0) {
+            addGeneratedTempFile(GETTER_FOR_INTERFACE_MASK);
+            addGeneratedTempFile(SETTER_FOR_INTERFACE_MASK);
+        }
+
+        /*
+         * Initialize getterImpl, setterImpl and attributes when generation file
+         * type matches to builder class mask.
+         */
+        if ((getGeneratedJavaFiles() & BUILDER_CLASS_MASK) != 0) {
+            addGeneratedTempFile(ATTRIBUTES_MASK);
+            addGeneratedTempFile(GETTER_FOR_CLASS_MASK);
+            addGeneratedTempFile(SETTER_FOR_CLASS_MASK);
+            addGeneratedTempFile(AUGMENTE_CLASS_CONSTRUCTOR_MASK);
+        }
+
+        /*
+         * Initialize getterImpl, attributes, constructor, hash code, equals and
+         * to strings when generation file type matches to impl class mask.
+         */
+        if ((getGeneratedJavaFiles() & IMPL_CLASS_MASK) != 0) {
+            addGeneratedTempFile(ATTRIBUTES_MASK);
+            addGeneratedTempFile(GETTER_FOR_CLASS_MASK);
+            addGeneratedTempFile(HASH_CODE_IMPL_MASK);
+            addGeneratedTempFile(EQUALS_IMPL_MASK);
+            addGeneratedTempFile(TO_STRING_IMPL_MASK);
+        }
+
+        /*
+         * Initialize temp files to generate type class.
+         */
+        if ((getGeneratedJavaFiles() & GENERATE_TYPE_CLASS) != 0) {
+            addGeneratedTempFile(ATTRIBUTES_MASK);
+            addGeneratedTempFile(GETTER_FOR_CLASS_MASK);
+            addGeneratedTempFile(HASH_CODE_IMPL_MASK);
+            addGeneratedTempFile(EQUALS_IMPL_MASK);
+            addGeneratedTempFile(TO_STRING_IMPL_MASK);
+            addGeneratedTempFile(FROM_STRING_IMPL_MASK);
+        }
+
+        /*
+         * Initialize temp files to generate enum class.
+         */
+        if ((getGeneratedJavaFiles() & GENERATE_ENUM_CLASS) != 0) {
+            addGeneratedTempFile(FROM_STRING_IMPL_MASK);
+        }
+
+        /*
+         * Set temporary file handles.
+         */
+        if ((getGeneratedTempFiles() & ATTRIBUTES_MASK) != 0) {
+            setAttributesTempFileHandle(getTemporaryFileHandle(ATTRIBUTE_FILE_NAME));
+        }
+
+        if ((getGeneratedTempFiles() & GETTER_FOR_INTERFACE_MASK) != 0) {
+            setGetterInterfaceTempFileHandle(getTemporaryFileHandle(GETTER_METHOD_FILE_NAME));
+        }
+
+        if ((getGeneratedTempFiles() & SETTER_FOR_INTERFACE_MASK) != 0) {
+            setSetterInterfaceTempFileHandle(getTemporaryFileHandle(SETTER_METHOD_FILE_NAME));
+        }
+
+        if ((getGeneratedTempFiles() & GETTER_FOR_CLASS_MASK) != 0) {
+            setGetterImplTempFileHandle(getTemporaryFileHandle(GETTER_METHOD_IMPL_FILE_NAME));
+        }
+
+        if ((getGeneratedTempFiles() & SETTER_FOR_CLASS_MASK) != 0) {
+            setSetterImplTempFileHandle(getTemporaryFileHandle(SETTER_METHOD_IMPL_FILE_NAME));
+        }
+
+        if ((getGeneratedTempFiles() & HASH_CODE_IMPL_MASK) != 0) {
+            setHashCodeImplTempFileHandle(getTemporaryFileHandle(HASH_CODE_METHOD_FILE_NAME));
+        }
+        if ((getGeneratedTempFiles() & EQUALS_IMPL_MASK) != 0) {
+            setEqualsImplTempFileHandle(getTemporaryFileHandle(EQUALS_METHOD_FILE_NAME));
+        }
+        if ((getGeneratedTempFiles() & TO_STRING_IMPL_MASK) != 0) {
+            setToStringImplTempFileHandle(getTemporaryFileHandle(TO_STRING_METHOD_FILE_NAME));
+        }
+        if ((getGeneratedTempFiles() & FROM_STRING_IMPL_MASK) != 0) {
+            setFromStringImplTempFileHandle(getTemporaryFileHandle(FROM_STRING_METHOD_FILE_NAME));
+        }
+        if ((getGeneratedTempFiles() & AUGMENTE_CLASS_CONSTRUCTOR_MASK) != 0) {
+            setAugmentConstructorImplTempFileHandle(getTemporaryFileHandle(AUGMENT_CONSTRUCTOR_FILE_NAME));
+        }
+
+    }
+
+    /**
+     * Adds current node info as and attribute to the parent generated file.
+     *
+     * @param curNode      current node which needs to be added as an attribute in the parent generated code
+     * @param isList       is list construct
+     * @param pluginConfig plugin configurations
+     * @throws IOException IO operation exception
+     */
+    public static void addCurNodeInfoInParentTempFile(YangNode curNode,
+                                                      boolean isList, YangPluginConfig pluginConfig)
+            throws IOException {
+        YangNode parent = getParentNodeInGenCode(curNode);
+        if (!(parent instanceof JavaCodeGenerator)) {
+            throw new TranslatorException("missing parent node to contain current node info in generated file");
+        }
+
+        if (parent instanceof YangJavaGrouping) {
+            /*
+             * In case of grouping, there is no need to add the information, it
+             * will be taken care in uses
+             */
+            return;
+        }
+        TempJavaBeanFragmentFiles tempJavaBeanFragmentFiles = ((JavaCodeGeneratorInfo) parent)
+                .getTempJavaCodeFragmentFiles().getBeanTempFiles();
+
+        JavaAttributeInfo javaAttributeInfo = getCurNodeAsAttributeInTarget(curNode,
+                parent, isList, tempJavaBeanFragmentFiles);
+        if (!(parent instanceof TempJavaCodeFragmentFilesContainer)) {
+            throw new TranslatorException("missing parent temp file handle");
+        }
+        getNodesInterfaceFragmentFiles(parent, javaAttributeInfo, pluginConfig);
+    }
+
+    /**
+     * Creates an attribute info object corresponding to a data model node and return it.
+     *
+     * @param curNode               current data model node for which the java code generation is being handled
+     * @param targetNode            target node in which the current node is an attribute
+     * @param isListNode            is the current added attribute needs to be a list
+     * @param tempJavaFragmentFiles temp java fragment files
+     * @return AttributeInfo attribute details required to add in temporary files
+     */
+    public static JavaAttributeInfo getCurNodeAsAttributeInTarget(YangNode curNode,
+                                                                  YangNode targetNode, boolean isListNode,
+                                                                  TempJavaFragmentFiles tempJavaFragmentFiles) {
+        String curNodeName = ((JavaFileInfoContainer) curNode).getJavaFileInfo().getJavaName();
+        if (curNodeName == null) {
+            updateJavaFileInfo(curNode, null);
+            curNodeName = ((JavaFileInfoContainer) curNode).getJavaFileInfo().getJavaName();
+        }
+
+        /*
+         * Get the import info corresponding to the attribute for import in
+         * generated java files or qualified access
+         */
+        JavaQualifiedTypeInfo qualifiedTypeInfo = getQualifiedTypeInfoOfCurNode(curNode,
+                getCapitalCase(curNodeName));
+        if (!(targetNode instanceof TempJavaCodeFragmentFilesContainer)) {
+            throw new TranslatorException("Parent node does not have file info");
+        }
+        JavaImportData parentImportData = tempJavaFragmentFiles.getJavaImportData();
+        JavaFileInfo fileInfo = ((JavaFileInfoContainer) targetNode).getJavaFileInfo();
+
+        boolean isQualified;
+        if ((targetNode instanceof YangJavaModule || targetNode instanceof YangJavaSubModule)
+                && (qualifiedTypeInfo.getClassInfo().contentEquals(SERVICE)
+                || qualifiedTypeInfo.getClassInfo().contentEquals(COMPONENT)
+                || qualifiedTypeInfo.getClassInfo().contentEquals(getCapitalCase(ACTIVATE))
+                || qualifiedTypeInfo.getClassInfo().contentEquals(getCapitalCase(DEACTIVATE))
+                || qualifiedTypeInfo.getClassInfo().contentEquals(REFERENCE_CARDINALITY)
+                || qualifiedTypeInfo.getClassInfo().contentEquals(REFERENCE))
+                || qualifiedTypeInfo.getClassInfo().contentEquals(getCapitalCase(fileInfo.getJavaName() + SERVICE))
+                || qualifiedTypeInfo.getClassInfo().contentEquals(getCapitalCase(fileInfo.getJavaName() + MANAGER))) {
+
+            isQualified = true;
+        } else {
+            String className;
+            if (targetNode instanceof YangJavaModule || targetNode instanceof YangJavaSubModule) {
+                className = getCapitalCase(fileInfo.getJavaName()) + "Service";
+            } else {
+                className = getCapitalCase(fileInfo.getJavaName());
+            }
+
+            isQualified = parentImportData.addImportInfo(qualifiedTypeInfo,
+                    className, fileInfo.getPackage());
+        }
+
+        if (isListNode) {
+            parentImportData.setIfListImported(true);
+        }
+
+        return getAttributeInfoForTheData(qualifiedTypeInfo, curNodeName, null, isQualified, isListNode);
+    }
+
+    /**
+     * Adds java code snippet for corresponding files.
+     *
+     * @param node   java node
+     * @param attr   attribute info
+     * @param config plugin configurations
+     * @throws IOException when fails to do IO operations
+     */
+    public static void getNodesInterfaceFragmentFiles(YangNode node, JavaAttributeInfo attr,
+                                                      YangPluginConfig config) throws IOException {
+        TempJavaFragmentFiles tempJavaFragmentFiles;
+        JavaFileInfo javaFileInfo = ((JavaFileInfoContainer) node).getJavaFileInfo();
+        if ((javaFileInfo.getGeneratedFileTypes() & GENERATE_SERVICE_AND_MANAGER) != 0) {
+            tempJavaFragmentFiles = ((TempJavaCodeFragmentFilesContainer) node)
+                    .getTempJavaCodeFragmentFiles()
+                    .getServiceTempFiles();
+            tempJavaFragmentFiles.addJavaSnippetInfoToApplicableTempFiles(attr, config);
+        }
+        if ((javaFileInfo.getGeneratedFileTypes() & GENERATE_INTERFACE_WITH_BUILDER) != 0) {
+            tempJavaFragmentFiles = ((TempJavaCodeFragmentFilesContainer) node)
+                    .getTempJavaCodeFragmentFiles()
+                    .getBeanTempFiles();
+            tempJavaFragmentFiles.addJavaSnippetInfoToApplicableTempFiles(attr, config);
+        }
+
+    }
+
     /**
      * Retrieves the absolute path where the file needs to be generated.
      *
@@ -320,23 +561,13 @@
     /**
      * Sets absolute path where the file needs to be generated.
      *
-     * @param absoluteDirPath absolute path where the file needs to be
-     *                        generated.
+     * @param absoluteDirPath absolute path where the file needs to be generated.
      */
     void setAbsoluteDirPath(String absoluteDirPath) {
         this.absoluteDirPath = absoluteDirPath;
     }
 
     /**
-     * Sets the generated java file information.
-     *
-     * @param javaFileInfo generated java file information
-     */
-    public void setJavaFileInfo(JavaFileInfo javaFileInfo) {
-        this.javaFileInfo = javaFileInfo;
-    }
-
-    /**
      * Retrieves the generated java file information.
      *
      * @return generated java file information
@@ -346,6 +577,15 @@
     }
 
     /**
+     * Sets the generated java file information.
+     *
+     * @param javaFileInfo generated java file information
+     */
+    public void setJavaFileInfo(JavaFileInfo javaFileInfo) {
+        this.javaFileInfo = javaFileInfo;
+    }
+
+    /**
      * Retrieves the generated temp files.
      *
      * @return generated temp files
@@ -355,6 +595,15 @@
     }
 
     /**
+     * Sets generated file files.
+     *
+     * @param fileType generated file type
+     */
+    void setGeneratedTempFiles(int fileType) {
+        generatedTempFiles = fileType;
+    }
+
+    /**
      * Clears the generated file mask.
      */
     void clearGeneratedTempFileMask() {
@@ -372,15 +621,6 @@
     }
 
     /**
-     * Sets generated file files.
-     *
-     * @param fileType generated file type
-     */
-    void setGeneratedTempFiles(int fileType) {
-        generatedTempFiles = fileType;
-    }
-
-    /**
      * Retrieves the generated Java files.
      *
      * @return generated Java files
@@ -500,138 +740,13 @@
     /**
      * Sets from string method's temporary file handle.
      *
-     * @param fromStringImplTempFileHandle from string method's temporary file
-     *                                     handle
+     * @param fromStringImplTempFileHandle from string method's temporary file handle
      */
     private void setFromStringImplTempFileHandle(File fromStringImplTempFileHandle) {
         this.fromStringImplTempFileHandle = fromStringImplTempFileHandle;
     }
 
     /**
-     * Creates an instance of temporary java code fragment.
-     *
-     * @param javaFileInfo generated java file information
-     * @throws IOException when fails to create new file handle
-     */
-    TempJavaFragmentFiles(JavaFileInfo javaFileInfo)
-            throws IOException {
-        setJavaExtendsListHolder(new JavaExtendsListHolder());
-        setJavaImportData(new JavaImportData());
-        setJavaFileInfo(javaFileInfo);
-        setAbsoluteDirPath(getAbsolutePackagePath(getJavaFileInfo().getBaseCodeGenPath(),
-                getJavaFileInfo().getPackageFilePath()));
-
-        /*
-         * Initialize getter when generation file type matches to interface
-         * mask.
-         */
-        if ((getGeneratedJavaFiles() & INTERFACE_MASK) != 0) {
-            addGeneratedTempFile(GETTER_FOR_INTERFACE_MASK);
-        }
-
-        /*
-         * Initialize getter and setter when generation file type matches to
-         * builder interface mask.
-         */
-        if ((getGeneratedJavaFiles() & BUILDER_INTERFACE_MASK) != 0) {
-            addGeneratedTempFile(GETTER_FOR_INTERFACE_MASK);
-            addGeneratedTempFile(SETTER_FOR_INTERFACE_MASK);
-        }
-
-        /*
-         * Initialize getterImpl, setterImpl and attributes when generation file
-         * type matches to builder class mask.
-         */
-        if ((getGeneratedJavaFiles() & BUILDER_CLASS_MASK) != 0) {
-            addGeneratedTempFile(ATTRIBUTES_MASK);
-            addGeneratedTempFile(GETTER_FOR_CLASS_MASK);
-            addGeneratedTempFile(SETTER_FOR_CLASS_MASK);
-            addGeneratedTempFile(AUGMENTE_CLASS_CONSTRUCTOR_MASK);
-        }
-
-        /*
-         * Initialize getterImpl, attributes, constructor, hash code, equals and
-         * to strings when generation file type matches to impl class mask.
-         */
-        if ((getGeneratedJavaFiles() & IMPL_CLASS_MASK) != 0) {
-            addGeneratedTempFile(ATTRIBUTES_MASK);
-            addGeneratedTempFile(GETTER_FOR_CLASS_MASK);
-            addGeneratedTempFile(HASH_CODE_IMPL_MASK);
-            addGeneratedTempFile(EQUALS_IMPL_MASK);
-            addGeneratedTempFile(TO_STRING_IMPL_MASK);
-        }
-
-        /*
-         * Initialize temp files to generate type class.
-         */
-        if ((getGeneratedJavaFiles() & GENERATE_TYPE_CLASS) != 0) {
-            addGeneratedTempFile(ATTRIBUTES_MASK);
-            addGeneratedTempFile(GETTER_FOR_CLASS_MASK);
-            addGeneratedTempFile(HASH_CODE_IMPL_MASK);
-            addGeneratedTempFile(EQUALS_IMPL_MASK);
-            addGeneratedTempFile(TO_STRING_IMPL_MASK);
-            addGeneratedTempFile(FROM_STRING_IMPL_MASK);
-        }
-
-        /*
-         * Initialize temp files to generate enum class.
-         */
-        if ((getGeneratedJavaFiles() & GENERATE_ENUM_CLASS) != 0) {
-            addGeneratedTempFile(FROM_STRING_IMPL_MASK);
-        }
-        /*
-         * Initialize getter and setter when generation file type matches to
-         * builder interface mask.
-         */
-        if ((getGeneratedJavaFiles() & GENERATE_SERVICE_AND_MANAGER) != 0) {
-            addGeneratedTempFile(GETTER_FOR_INTERFACE_MASK);
-            addGeneratedTempFile(SETTER_FOR_INTERFACE_MASK);
-            addGeneratedTempFile(GETTER_FOR_CLASS_MASK);
-            addGeneratedTempFile(SETTER_FOR_CLASS_MASK);
-        }
-
-        /*
-         * Set temporary file handles.
-         */
-        if ((getGeneratedTempFiles() & ATTRIBUTES_MASK) != 0) {
-            setAttributesTempFileHandle(getTemporaryFileHandle(ATTRIBUTE_FILE_NAME));
-        }
-
-        if ((getGeneratedTempFiles() & GETTER_FOR_INTERFACE_MASK) != 0) {
-            setGetterInterfaceTempFileHandle(getTemporaryFileHandle(GETTER_METHOD_FILE_NAME));
-        }
-
-        if ((getGeneratedTempFiles() & SETTER_FOR_INTERFACE_MASK) != 0) {
-            setSetterInterfaceTempFileHandle(getTemporaryFileHandle(SETTER_METHOD_FILE_NAME));
-        }
-
-        if ((getGeneratedTempFiles() & GETTER_FOR_CLASS_MASK) != 0) {
-            setGetterImplTempFileHandle(getTemporaryFileHandle(GETTER_METHOD_IMPL_FILE_NAME));
-        }
-
-        if ((getGeneratedTempFiles() & SETTER_FOR_CLASS_MASK) != 0) {
-            setSetterImplTempFileHandle(getTemporaryFileHandle(SETTER_METHOD_IMPL_FILE_NAME));
-        }
-
-        if ((getGeneratedTempFiles() & HASH_CODE_IMPL_MASK) != 0) {
-            setHashCodeImplTempFileHandle(getTemporaryFileHandle(HASH_CODE_METHOD_FILE_NAME));
-        }
-        if ((getGeneratedTempFiles() & EQUALS_IMPL_MASK) != 0) {
-            setEqualsImplTempFileHandle(getTemporaryFileHandle(EQUALS_METHOD_FILE_NAME));
-        }
-        if ((getGeneratedTempFiles() & TO_STRING_IMPL_MASK) != 0) {
-            setToStringImplTempFileHandle(getTemporaryFileHandle(TO_STRING_METHOD_FILE_NAME));
-        }
-        if ((getGeneratedTempFiles() & FROM_STRING_IMPL_MASK) != 0) {
-            setFromStringImplTempFileHandle(getTemporaryFileHandle(FROM_STRING_METHOD_FILE_NAME));
-        }
-        if ((getGeneratedTempFiles() & AUGMENTE_CLASS_CONSTRUCTOR_MASK) != 0) {
-            setAugmentConstructorImplTempFileHandle(getTemporaryFileHandle(AUGMENT_CONSTRUCTOR_FILE_NAME));
-        }
-
-    }
-
-    /**
      * Returns java file handle for interface file.
      *
      * @return java file handle for interface file
@@ -942,19 +1057,6 @@
     }
 
     /**
-     * Adds default constructor for class.
-     *
-     * @param pluginCnfig plugin configurations
-     * @return default constructor for class
-     * @throws IOException when fails to append to file
-     */
-    public String addOfMethod(YangPluginConfig pluginCnfig)
-            throws IOException {
-        return getJavaDoc(OF_METHOD, getGeneratedJavaClassName(), false, pluginCnfig)
-                + getOfMethod(getGeneratedJavaClassName(), null);
-    }
-
-    /**
      * Adds hash code method for class.
      *
      * @param attr attribute info
@@ -1050,7 +1152,7 @@
     /**
      * Returns data from the temporary files.
      *
-     * @param file temporary file handle
+     * @param file         temporary file handle
      * @param absolutePath absolute path
      * @return stored data from temporary files
      * @throws IOException when failed to get data from the given file
@@ -1117,159 +1219,6 @@
     }
 
     /**
-     * Adds current node info as and attribute to the parent generated file.
-     *
-     * @param curNode      current node which needs to be added as an attribute in
-     *                     the parent generated code
-     * @param isList       is list construct
-     * @param pluginConfig plugin configurations
-     * @throws IOException IO operation exception
-     */
-    public static void addCurNodeInfoInParentTempFile(YangNode curNode,
-                                                      boolean isList, YangPluginConfig pluginConfig)
-            throws IOException {
-        YangNode parent = getParentNodeInGenCode(curNode);
-        if (!(parent instanceof JavaCodeGenerator)) {
-            throw new TranslatorException("missing parent node to contain current node info in generated file");
-        }
-
-        if (parent instanceof YangJavaGrouping) {
-            /*
-             * In case of grouping, there is no need to add the information, it
-             * will be taken care in uses
-             */
-            return;
-        }
-
-        JavaAttributeInfo javaAttributeInfo = getCurNodeAsAttributeInTarget(curNode,
-                parent, isList);
-        if (!(parent instanceof TempJavaCodeFragmentFilesContainer)) {
-            throw new TranslatorException("missing parent temp file handle");
-        }
-        getNodesInterfaceFragmentFiles(parent)
-                .addJavaSnippetInfoToApplicableTempFiles(javaAttributeInfo, pluginConfig);
-    }
-
-    /**
-     * Adds current node info as and attribute to the parent generated file.
-     *
-     * @param curNode      current node which needs to be added as an attribute in
-     *                     the parent generated code
-     * @param pluginConfig plugin configurations
-     * @param targetNode   target node to add the attribute
-     * @throws IOException IO operation exception
-     */
-    public static void addCurNodeAsAttributeInTargetTempFile(YangNode curNode,
-                                                             YangPluginConfig pluginConfig, YangNode targetNode)
-            throws IOException {
-
-        if (!(targetNode instanceof JavaCodeGenerator)) {
-            throw new TranslatorException("invalid target node to generated file");
-        }
-
-        if (targetNode instanceof YangJavaGrouping) {
-            /*
-             * In case of grouping, there is no need to add the information, it
-             * will be taken care in uses
-             */
-            return;
-        }
-
-        boolean isList = curNode instanceof YangList;
-
-        JavaAttributeInfo javaAttributeInfo = getCurNodeAsAttributeInTarget(curNode,
-                targetNode, isList);
-        if (!(targetNode instanceof TempJavaCodeFragmentFilesContainer)) {
-            throw new TranslatorException("missing target node's temp file handle");
-        }
-        getNodesInterfaceFragmentFiles(targetNode)
-                .addJavaSnippetInfoToApplicableTempFiles(javaAttributeInfo, pluginConfig);
-    }
-
-    /**
-     * Creates an attribute info object corresponding to a data model node and
-     * return it.
-     *
-     * @param curNode    current data model node for which the java code generation
-     *                   is being handled
-     * @param targetNode target node in which the current node is an attribute
-     * @param isListNode is the current added attribute needs to be a list
-     * @return AttributeInfo attribute details required to add in temporary
-     * files
-     */
-    public static JavaAttributeInfo getCurNodeAsAttributeInTarget(YangNode curNode,
-                                                                  YangNode targetNode, boolean isListNode) {
-        String curNodeName = ((JavaFileInfoContainer) curNode).getJavaFileInfo().getJavaName();
-        if (curNodeName == null) {
-            updateJavaFileInfo(curNode, null);
-            curNodeName = ((JavaFileInfoContainer) curNode).getJavaFileInfo().getJavaName();
-        }
-
-        /*
-         * Get the import info corresponding to the attribute for import in
-         * generated java files or qualified access
-         */
-        JavaQualifiedTypeInfo qualifiedTypeInfo = getQualifiedTypeInfoOfCurNode(curNode,
-                getCapitalCase(curNodeName));
-        if (!(targetNode instanceof TempJavaCodeFragmentFilesContainer)) {
-            throw new TranslatorException("Parent node does not have file info");
-        }
-        TempJavaFragmentFiles tempJavaFragmentFiles = getNodesInterfaceFragmentFiles(targetNode);
-        JavaImportData parentImportData = tempJavaFragmentFiles.getJavaImportData();
-        JavaFileInfo fileInfo = ((JavaFileInfoContainer) targetNode).getJavaFileInfo();
-
-        boolean isQualified;
-        if ((targetNode instanceof YangJavaModule || targetNode instanceof YangJavaSubModule)
-                && (qualifiedTypeInfo.getClassInfo().contentEquals(SERVICE)
-                || qualifiedTypeInfo.getClassInfo().contentEquals(COMPONENT)
-                || qualifiedTypeInfo.getClassInfo().contentEquals(getCapitalCase(ACTIVATE))
-                || qualifiedTypeInfo.getClassInfo().contentEquals(getCapitalCase(DEACTIVATE))
-                || qualifiedTypeInfo.getClassInfo().contentEquals(REFERENCE_CARDINALITY)
-                || qualifiedTypeInfo.getClassInfo().contentEquals(REFERENCE))
-                || qualifiedTypeInfo.getClassInfo().contentEquals(getCapitalCase(fileInfo.getJavaName() + SERVICE))
-                || qualifiedTypeInfo.getClassInfo().contentEquals(getCapitalCase(fileInfo.getJavaName() + MANAGER))) {
-
-            isQualified = true;
-        } else {
-            String className;
-            if (targetNode instanceof YangJavaModule || targetNode instanceof YangJavaSubModule) {
-                className = getCapitalCase(fileInfo.getJavaName()) + "Service";
-            } else {
-                className = getCapitalCase(fileInfo.getJavaName());
-            }
-
-            isQualified = parentImportData.addImportInfo(qualifiedTypeInfo,
-                    className, fileInfo.getPackage());
-        }
-
-        if (isListNode) {
-            parentImportData.setIfListImported(true);
-        }
-
-        return getAttributeInfoForTheData(qualifiedTypeInfo, curNodeName, null, isQualified, isListNode);
-    }
-
-    /**
-     * Returns interface fragment files for node.
-     *
-     * @param node YANG node
-     * @return interface fragment files for node
-     */
-    public static TempJavaFragmentFiles getNodesInterfaceFragmentFiles(YangNode node) {
-        TempJavaFragmentFiles tempJavaFragmentFiles;
-        if (node instanceof RpcNotificationContainer) {
-            tempJavaFragmentFiles = ((TempJavaCodeFragmentFilesContainer) node)
-                    .getTempJavaCodeFragmentFiles()
-                    .getServiceTempFiles();
-        } else {
-            tempJavaFragmentFiles = ((TempJavaCodeFragmentFilesContainer) node)
-                    .getTempJavaCodeFragmentFiles()
-                    .getBeanTempFiles();
-        }
-        return tempJavaFragmentFiles;
-    }
-
-    /**
      * Adds parent's info to current node import list.
      *
      * @param curNode      current node for which import list needs to be updated
@@ -1378,8 +1327,7 @@
     }
 
     /**
-     * Adds all the leaves in the current data model node as part of the
-     * generated temporary file.
+     * Adds all the leaves in the current data model node as part of the generated temporary file.
      *
      * @param curNode          java file info of the generated file
      * @param yangPluginConfig plugin config
@@ -1399,8 +1347,7 @@
     /**
      * Adds the new attribute info to the target generated temporary files.
      *
-     * @param newAttrInfo  the attribute info that needs to be added to temporary
-     *                     files
+     * @param newAttrInfo  the attribute info that needs to be added to temporary files
      * @param pluginConfig plugin configurations
      * @throws IOException IO operation fail
      */
@@ -1489,8 +1436,12 @@
      */
     public void generateJavaFile(int fileType, YangNode curNode)
             throws IOException {
-        List<String> imports = new ArrayList<>();
-        imports = getJavaImportData().getImports();
+
+        if (curNode instanceof YangModule || curNode instanceof YangSubModule) {
+            addResolvedAugmentedDataNodeImports(curNode);
+        }
+        List<String> imports = ((JavaCodeGeneratorInfo) curNode).getTempJavaCodeFragmentFiles().getBeanTempFiles()
+                .getJavaImportData().getImports();
 
         JavaFileInfo curInfo = ((JavaFileInfoContainer) curNode).getJavaFileInfo();
 
@@ -1543,7 +1494,10 @@
         }
         if ((fileType & BUILDER_CLASS_MASK) != 0 || (fileType & IMPL_CLASS_MASK) != 0) {
             if (isAttributePresent()) {
-                addImportsToStringAndHasCodeMethods(curNode, imports);
+                addImportsToStringAndHasCodeMethods(imports);
+            }
+            if (curNode instanceof YangAugmentableNode) {
+                addImportsForAugmentableClass(imports);
             }
             sortImports(imports);
             /*
@@ -1586,6 +1540,8 @@
             throws IOException {
         YangJavaAugment augment = (YangJavaAugment) curNode;
 
+        TempJavaBeanFragmentFiles tempJavaBeanFragmentFiles = ((JavaCodeGeneratorInfo) curNode)
+                .getTempJavaCodeFragmentFiles().getBeanTempFiles();
         YangNode augmentedNode = augment.getAugmentedNode();
         if (augmentedNode instanceof YangLeavesHolder) {
             YangLeavesHolder holder = (YangLeavesHolder) augmentedNode;
@@ -1610,7 +1566,10 @@
             if (augmentedNode instanceof YangList) {
                 isList = true;
             }
-            addAugmentConstructor(getCurNodeAsAttributeInTarget(augmentedNode, augment, isList), pluginConfig);
+            if (!(augmentedNode instanceof YangUses)) {
+                addAugmentConstructor(getCurNodeAsAttributeInTarget(augmentedNode, augment, isList,
+                        tempJavaBeanFragmentFiles), pluginConfig);
+            }
             augmentedNode = augmentedNode.getNextSibling();
         }
 
@@ -1619,14 +1578,23 @@
     /**
      * Adds imports for ToString and HashCodeMethod.
      *
-     * @param curNode current YANG node
      * @param imports import list
-     * @return import list
      */
-    public List<String> addImportsToStringAndHasCodeMethods(YangNode curNode, List<String> imports) {
+    public void addImportsToStringAndHasCodeMethods(List<String> imports) {
         imports.add(getJavaImportData().getImportForHashAndEquals());
         imports.add(getJavaImportData().getImportForToString());
-        return imports;
+    }
+
+
+    /**
+     * Adds import for map and hash map.
+     *
+     * @param imports import list
+     */
+    public void addImportsForAugmentableClass(List<String> imports) {
+        imports.add(getJavaImportData().getHashMapImport());
+        imports.add(getJavaImportData().getMapImport());
+        imports.add(getJavaImportData().getYangAugmentedInfoImport());
     }
 
     /**
@@ -1636,7 +1604,7 @@
      * @return import for class
      */
     private List<String> removeAugmentedImport(List<String> imports, JavaQualifiedTypeInfo augmentedInfo) {
-        String augmentedNodeImport = null;
+        String augmentedNodeImport;
         if (imports != null && augmentedInfo != null) {
             augmentedNodeImport = IMPORT + augmentedInfo.getPkgInfo() + PERIOD + getCapitalCase(DEFAULT)
                     + augmentedInfo.getClassInfo() + PERIOD + augmentedInfo.getClassInfo()
@@ -1646,6 +1614,7 @@
                     + augmentedInfo.getClassInfo() + PERIOD + augmentedInfo.getClassInfo()
                     + BUILDER + SEMI_COLAN + NEW_LINE;
             imports.remove(augmentedNodeImport);
+            imports.remove(getJavaImportData().getYangAugmentedInfoImport());
         }
         return imports;
     }
@@ -1668,9 +1637,8 @@
     /**
      * Removes all temporary file handles.
      *
-     * @param isErrorOccurred when translator fails to generate java files we
-     *                        need to close all open file handles include temporary files
-     *                        and java files.
+     * @param isErrorOccurred when translator fails to generate java files we need to close all open file handles
+     *                        include temporary files and java files.
      * @throws IOException when failed to delete the temporary files
      */
     public void freeTemporaryResources(boolean isErrorOccurred)
@@ -1719,8 +1687,8 @@
     }
 
     /**
-     * Returns if the attribute needs to be accessed in a qualified manner or
-     * not, if it needs to be imported, then the same needs to be done.
+     * Returns if the attribute needs to be accessed in a qualified manner or not, if it needs to be imported, then the
+     * same needs to be done.
      *
      * @param importInfo import info for the current attribute being added
      * @return status of the qualified access to the attribute
@@ -1732,16 +1700,4 @@
                 getJavaFileInfo().getPackage());
     }
 
-    /**
-     * Checks if the import info is same as the package of the current generated
-     * java file.
-     *
-     * @param importInfo import info for an attribute
-     * @return true if the import info is same as the current nodes package
-     * false otherwise
-     */
-    public boolean isImportPkgEqualCurNodePkg(JavaQualifiedTypeInfo importInfo) {
-        return getJavaFileInfo().getPackage()
-                .contentEquals(importInfo.getPkgInfo());
-    }
 }