[ONOS-4839] update file priority for translator and OP param file impl defect fix

Change-Id: Ieaef43f915996ed0a34dfa17c338ab612716b2bc
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 d4bb888..33ca972 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
@@ -19,19 +19,17 @@
 import java.io.IOException;
 import java.util.List;
 
+import org.onosproject.yangutils.datamodel.YangAugment;
 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;
 import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaGrouping;
 import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaModule;
 import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaSubModule;
@@ -69,9 +67,9 @@
 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.JavaFileGenerator.generateOpParamBuilderClassFile;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGenerator.generateOpParamImplClassFile;
+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;
@@ -99,15 +97,16 @@
 import static org.onosproject.yangutils.utils.UtilConstants.INTERFACE;
 import static org.onosproject.yangutils.utils.UtilConstants.MANAGER;
 import static org.onosproject.yangutils.utils.UtilConstants.NEW_LINE;
+import static org.onosproject.yangutils.utils.UtilConstants.OPERATION;
 import static org.onosproject.yangutils.utils.UtilConstants.PERIOD;
+import static org.onosproject.yangutils.utils.UtilConstants.PRIVATE;
+import static org.onosproject.yangutils.utils.UtilConstants.PROTECTED;
 import static org.onosproject.yangutils.utils.UtilConstants.REFERENCE;
 import static org.onosproject.yangutils.utils.UtilConstants.REFERENCE_CARDINALITY;
 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.UtilConstants.OPERATION;
-import static org.onosproject.yangutils.utils.UtilConstants.PRIVATE;
-import static org.onosproject.yangutils.utils.UtilConstants.PROTECTED;
+import static org.onosproject.yangutils.utils.UtilConstants.YANG_AUGMENTED_INFO;
 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;
@@ -340,6 +339,11 @@
     private boolean isAttributePresent;
 
     /**
+     * Base code gen path.
+     */
+    private String baseCodePath;
+
+    /**
      * Temporary file handle for augments copy constructor method of class.
      */
     private File augmentConstructorImplTempFileHandle;
@@ -358,9 +362,15 @@
         setJavaExtendsListHolder(new JavaExtendsListHolder());
         setJavaImportData(new JavaImportData());
         setJavaFileInfo(javaFileInfo);
-        setAbsoluteDirPath(getAbsolutePackagePath(getJavaFileInfo().getBaseCodeGenPath(),
-                getJavaFileInfo().getPackageFilePath()));
-
+        if ((javaFileInfo.getGeneratedFileTypes() & GENERATE_SERVICE_AND_MANAGER) != 0) {
+            setBaseCodePath(getJavaFileInfo().getPluginConfig().getCodeGenDir());
+            setAbsoluteDirPath(getAbsolutePackagePath(getJavaFileInfo().getPluginConfig().getCodeGenDir(),
+                    getJavaFileInfo().getPackageFilePath()));
+        } else {
+            setBaseCodePath(getJavaFileInfo().getBaseCodeGenPath());
+            setAbsoluteDirPath(getAbsolutePackagePath(getJavaFileInfo().getBaseCodeGenPath(),
+                    getJavaFileInfo().getPackageFilePath()));
+        }
         /*
          * Initialize getter when generation file type matches to interface
          * mask.
@@ -584,6 +594,24 @@
     }
 
     /**
+     * Returns base code path.
+     *
+     * @return base code path
+     */
+    public String getBaseCodePath() {
+        return baseCodePath;
+    }
+
+    /**
+     * Sets base code path.
+     *
+     * @param baseCodePath base code path
+     */
+    public void setBaseCodePath(String baseCodePath) {
+        this.baseCodePath = baseCodePath;
+    }
+
+    /*
      * Retrieves the absolute path where the file needs to be generated.
      *
      * @return absolute path where the file needs to be generated
@@ -1180,7 +1208,7 @@
      */
     File getJavaFileHandle(String fileName)
             throws IOException {
-        return getFileObject(getDirPath(), fileName, JAVA_FILE_EXTENSION, getJavaFileInfo());
+        return getFileObject(getDirPath(), fileName, JAVA_FILE_EXTENSION, getBaseCodePath());
     }
 
     /**
@@ -1500,6 +1528,8 @@
         if (curNode instanceof YangModule || curNode instanceof YangSubModule) {
             addResolvedAugmentedDataNodeImports(curNode);
         }
+        TempJavaBeanFragmentFiles tempJavaBeanFragmentFiles = ((JavaCodeGeneratorInfo) curNode)
+                .getTempJavaCodeFragmentFiles().getBeanTempFiles();
         List<String> imports = ((JavaCodeGeneratorInfo) curNode).getTempJavaCodeFragmentFiles().getBeanTempFiles()
                 .getJavaImportData().getImports();
 
@@ -1539,17 +1569,9 @@
             if (curNode instanceof YangCase) {
                 removeCaseImport(imports);
             }
-            if (curNode instanceof YangJavaAugment) {
-                updateAugmentConstructorTempFile(curNode, curInfo.getPluginConfig());
-                YangJavaAugment augment = (YangJavaAugment) curNode;
-                List<JavaQualifiedTypeInfo> infoList = augment.getExtendedClassInfo();
-                for (JavaQualifiedTypeInfo info : infoList) {
-                    if (info.getClassInfo()
-                            .equals(getCapitalCase(getCamelCase(augment.getAugmentedNode().getName(), null)))) {
-                        removeAugmentedImport(imports, info);
-                    }
 
-                }
+            if (curNode instanceof YangAugment) {
+                removeAugmentedInfoImport(imports);
             }
         }
         if ((fileType & BUILDER_CLASS_MASK) != 0 || (fileType & IMPL_CLASS_MASK) != 0) {
@@ -1557,7 +1579,7 @@
                 addImportsToStringAndHasCodeMethods(imports, true);
             }
             if (curNode instanceof YangAugmentableNode) {
-                addImportsForAugmentableClass(imports);
+                addImportsForAugmentableClass(imports, true);
             }
             sortImports(imports);
             /*
@@ -1582,19 +1604,33 @@
                 validateLineLength(getImplClassJavaFileHandle());
             }
             insertDataIntoJavaFile(getImplClassJavaFileHandle(), getJavaClassDefClose());
-
+            if (curNode instanceof YangAugmentableNode) {
+                addImportsForAugmentableClass(imports, false);
+            }
             if (!(curNode instanceof YangModule)) {
                 if (isAttributePresent()) {
                     addImportsToStringAndHasCodeMethods(imports, false);
                 }
+                if (curNode instanceof YangAugmentableNode) {
+                    addYangAugmentedOpParamInfoImport(imports);
+                }
+                JavaQualifiedTypeInfo qualifiedTypeInfo = new JavaQualifiedTypeInfo();
+                qualifiedTypeInfo.setClassInfo(getCapitalCase(DEFAULT) + getCapitalCase(getJavaFileInfo()
+                        .getJavaName()));
+                qualifiedTypeInfo.setPkgInfo(getJavaFileInfo().getPackage());
+                getJavaExtendsListHolder().addToExtendsList(qualifiedTypeInfo, curNode,
+                        tempJavaBeanFragmentFiles);
                 addBitsetImport(imports, true);
+                if (curNode instanceof YangAugment) {
+                    addYangAugmentedOpParamInfoImport(imports);
+                }
                 /*
                  * Create impl class file.
                  */
                 setOpParamClassJavaFileHandle(getJavaFileHandle(getOpParamImplClassName()));
                 setOpParamClassJavaFileHandle(
                         generateOpParamImplClassFile(getOpParamClassJavaFileHandle(), curNode,
-                                                     isAttributePresent(), imports));
+                                isAttributePresent(), imports));
 
                 /*
                  * Create builder class file.
@@ -1603,7 +1639,7 @@
                     setBuilderOpParmClassJavaFileHandle(getJavaFileHandle(getOpParamBuilderImplClassName()));
                     setBuilderOpParmClassJavaFileHandle(
                             generateOpParamBuilderClassFile(getBuilderOpParmClassJavaFileHandle(), curNode,
-                                                            isAttributePresent()));
+                                    isAttributePresent()));
                     /*
                      * Append impl class to builder class and close it.
                      */
@@ -1613,6 +1649,7 @@
                     addBitsetImport(imports, false);
                 }
                 insertDataIntoJavaFile(getOpParamClassJavaFileHandle(), getJavaClassDefClose());
+
             }
         }
         /*
@@ -1621,56 +1658,15 @@
         freeTemporaryResources(false);
     }
 
-    /**
-     * Updates augment constructor temp file.
-     *
-     * @param curNode      current augment node
-     * @param pluginConfig plugin configurations
-     * @throws IOException when fails to do IO operations
-     */
-    private void updateAugmentConstructorTempFile(YangNode curNode, YangPluginConfig pluginConfig)
-            throws IOException {
-        YangJavaAugment augment = (YangJavaAugment) curNode;
-
-        TempJavaBeanFragmentFiles tempJavaBeanFragmentFiles = ((JavaCodeGeneratorInfo) curNode)
-                .getTempJavaCodeFragmentFiles().getBeanTempFiles();
-        YangNode augmentedNode = augment.getAugmentedNode();
-        if (augmentedNode instanceof YangLeavesHolder) {
-            YangLeavesHolder holder = (YangLeavesHolder) augmentedNode;
-            if (holder.getListOfLeaf() != null) {
-                for (YangLeaf leaf : holder.getListOfLeaf()) {
-                    addAugmentConstructor(getJavaAttributeOfLeaf(this, leaf,
-                                                                 pluginConfig), pluginConfig);
-                }
-
-            }
-            if (holder.getListOfLeafList() != null) {
-                for (YangLeafList leafList : holder.getListOfLeafList()) {
-                    addAugmentConstructor(getJavaAttributeOfLeafList(this, leafList,
-                                                                     pluginConfig), pluginConfig);
-                }
-
-            }
-        }
-        augmentedNode = augmentedNode.getChild();
-        boolean isList = false;
-        while (augmentedNode != null) {
-            if (augmentedNode instanceof YangList) {
-                isList = true;
-            }
-            if (!(augmentedNode instanceof YangUses)) {
-                addAugmentConstructor(getCurNodeAsAttributeInTarget(augmentedNode, augment, isList,
-                        tempJavaBeanFragmentFiles), pluginConfig);
-            }
-            augmentedNode = augmentedNode.getNextSibling();
-        }
-
+    /*Adds import for YANG augmented op param info.*/
+    private void addYangAugmentedOpParamInfoImport(List<String> imports) {
+        imports.add(getJavaImportData().getYangAugmentedOpParamInfoImport());
     }
 
     /**
      * Adds imports for ToString and HashCodeMethod.
      *
-     * @param imports import list
+     * @param imports   import list
      * @param operation add or remove
      */
     public void addImportsToStringAndHasCodeMethods(List<String> imports, boolean operation) {
@@ -1686,7 +1682,7 @@
     /**
      * Adds imports for bitset method.
      *
-     * @param imports import list
+     * @param imports   import list
      * @param operation add or remove
      */
     public void addBitsetImport(List<String> imports, boolean operation) {
@@ -1701,34 +1697,18 @@
     /**
      * Adds import for map and hash map.
      *
-     * @param imports import list
+     * @param imports    import list
+     * @param operations true for adding and false for deletion
      */
-    public void addImportsForAugmentableClass(List<String> imports) {
-        imports.add(getJavaImportData().getHashMapImport());
-        imports.add(getJavaImportData().getMapImport());
-        imports.add(getJavaImportData().getYangAugmentedInfoImport());
-    }
-
-    /**
-     * Removes augmented node import info from import list.
-     *
-     * @param imports list of imports
-     * @return import for class
-     */
-    private List<String> removeAugmentedImport(List<String> imports, JavaQualifiedTypeInfo augmentedInfo) {
-        String augmentedNodeImport;
-        if (imports != null && augmentedInfo != null) {
-            augmentedNodeImport = IMPORT + augmentedInfo.getPkgInfo() + PERIOD + getCapitalCase(DEFAULT)
-                    + augmentedInfo.getClassInfo() + PERIOD + augmentedInfo.getClassInfo()
-                    + BUILDER + SEMI_COLAN + NEW_LINE;
-            imports.remove(augmentedNodeImport);
-            augmentedNodeImport = IMPORT + augmentedInfo.getPkgInfo() + PERIOD
-                    + augmentedInfo.getClassInfo() + PERIOD + augmentedInfo.getClassInfo()
-                    + BUILDER + SEMI_COLAN + NEW_LINE;
-            imports.remove(augmentedNodeImport);
-            imports.remove(getJavaImportData().getYangAugmentedInfoImport());
+    public void addImportsForAugmentableClass(List<String> imports, boolean operations) {
+        if (operations) {
+            imports.add(getJavaImportData().getHashMapImport());
+            imports.add(getJavaImportData().getMapImport());
+            imports.add(getJavaImportData().getYangAugmentedInfoImport());
+        } else {
+            imports.remove(getJavaImportData().getHashMapImport());
+            imports.remove(getJavaImportData().getMapImport());
         }
-        return imports;
     }
 
     /**
@@ -1747,6 +1727,23 @@
     }
 
     /**
+     * Removes case import info from import list.
+     *
+     * @param imports list of imports
+     * @return import for class
+     */
+    private void removeAugmentedInfoImport(List<String> imports) {
+        imports.remove(getJavaImportData().getYangAugmentedInfoImport());
+
+        for (JavaQualifiedTypeInfo type : getJavaImportData().getImportSet()) {
+            if (type.getClassInfo().equals(YANG_AUGMENTED_INFO)) {
+                getJavaImportData().getImportSet().remove(type);
+                getJavaExtendsListHolder().getExtendsList().remove(type);
+            }
+        }
+    }
+
+    /**
      * Removes all temporary file handles.
      *
      * @param isErrorOccurred when translator fails to generate java files we need to close all open file handles
@@ -1827,7 +1824,7 @@
     /**
      * Sets the java file handle for op param class file.
      *
-     * @param opParamClassJavaFileHandle  java file handle
+     * @param opParamClassJavaFileHandle java file handle
      */
     public void setOpParamClassJavaFileHandle(File opParamClassJavaFileHandle) {
         this.opParamClassJavaFileHandle = opParamClassJavaFileHandle;