[ONOS-4351][ONOS-4524] Augment linking and defect fixed.

Change-Id: I7c8e8c90579eea4631e014c4906a543a3c249427
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGeneratorUtils.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGeneratorUtils.java
index 4f363d8..6ebc453 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGeneratorUtils.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGeneratorUtils.java
@@ -20,8 +20,10 @@
 import java.io.IOException;
 import java.util.List;
 
+import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
+import org.onosproject.yangutils.translator.tojava.JavaFileInfoContainer;
 import org.onosproject.yangutils.translator.tojava.TempJavaBeanFragmentFiles;
 import org.onosproject.yangutils.translator.tojava.TempJavaEnumerationFragmentFiles;
 import org.onosproject.yangutils.translator.tojava.TempJavaFragmentFiles;
@@ -55,7 +57,7 @@
 import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.SETTER_FOR_CLASS_MASK;
 import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.SETTER_FOR_INTERFACE_MASK;
 import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.TO_STRING_IMPL_MASK;
-import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.getJavaClassDefStart;
+import static org.onosproject.yangutils.translator.tojava.utils.ClassDefinitionGenerator.generateClassDefinition;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getJavaPackageFromPackagePath;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getSmallCase;
 import static org.onosproject.yangutils.utils.UtilConstants.FOUR_SPACE_INDENTATION;
@@ -226,6 +228,27 @@
     }
 
     /**
+     * Initiates generation of file based on generated file type.
+     *
+     * @param file generated file
+     * @param type generated file type
+     * @param imports imports for the file
+     * @param curNode current YANG node
+     * @param className class name
+     * @throws IOException when fails to generate a file
+     */
+    public static void initiateJavaFileGeneration(File file, int type, List<String> imports,
+            YangNode curNode, String className) throws IOException {
+
+        try {
+            file.createNewFile();
+            appendContents(file, type, imports, curNode, className);
+        } catch (IOException e) {
+            throw new IOException("Failed to create " + file.getName() + " class file.");
+        }
+    }
+
+    /**
      * Appends all the contents into a generated java file.
      *
      * @param file generated file
@@ -235,40 +258,76 @@
      * @param importsList list of java imports.
      * @throws IOException when fails to append contents
      */
-    private static void appendContents(File file, String fileName, int type, List<String> importsList,
-            String pkg)
+    private static void appendContents(File file, int type, List<String> importsList, YangNode curNode,
+            String className) throws IOException {
+
+        JavaFileInfo javaFileInfo = ((JavaFileInfoContainer) curNode).getJavaFileInfo();
+
+        String path = javaFileInfo.getBaseCodeGenPath() + javaFileInfo.getPackageFilePath();
+        String pkgString = parsePackageString(path, importsList);
+
+        switch (type) {
+        case INTERFACE_MASK:
+            appendHeaderContents(file, pkgString, importsList);
+            write(file, type, INTERFACE, curNode, className);
+            break;
+        case GENERATE_SERVICE_AND_MANAGER:
+            appendHeaderContents(file, pkgString, importsList);
+            write(file, type, RPC_INTERFACE, curNode, className);
+            break;
+        case GENERATE_EVENT_CLASS:
+            appendHeaderContents(file, pkgString, importsList);
+            write(file, type, EVENT, curNode, className);
+            break;
+        default:
+            break;
+        }
+    }
+
+    /**
+     * Appends all the contents into a generated java file.
+     *
+     * @param file generated file
+     * @param fileName generated file name
+     * @param type generated file type
+     * @param pkg generated file package
+     * @param importsList list of java imports.
+     * @throws IOException when fails to append contents
+     */
+    private static void appendContents(File file, String fileName, int type, List<String> importsList, String pkg)
             throws IOException {
 
         String pkgString = parsePackageString(pkg, importsList);
 
-        if ((type & IMPL_CLASS_MASK) != 0) {
+        switch (type) {
+        case IMPL_CLASS_MASK:
             write(file, fileName, type, IMPL_CLASS);
-        } else if ((type & BUILDER_INTERFACE_MASK) != 0) {
+            break;
+        case BUILDER_INTERFACE_MASK:
             write(file, fileName, type, BUILDER_INTERFACE);
-        } else if ((type & GENERATE_TYPEDEF_CLASS) != 0) {
+            break;
+        case GENERATE_TYPEDEF_CLASS:
             appendHeaderContents(file, pkgString, importsList);
             write(file, fileName, type, IMPL_CLASS);
-        } else if ((type & INTERFACE_MASK) != 0) {
-            appendHeaderContents(file, pkgString, importsList);
-            write(file, fileName, type, INTERFACE);
-        } else if ((type & BUILDER_CLASS_MASK) != 0) {
+            break;
+        case BUILDER_CLASS_MASK:
             appendHeaderContents(file, pkgString, importsList);
             write(file, fileName, type, BUILDER_CLASS);
-        } else if ((type & GENERATE_UNION_CLASS) != 0) {
+            break;
+        case GENERATE_UNION_CLASS:
             appendHeaderContents(file, pkgString, importsList);
             write(file, fileName, type, IMPL_CLASS);
-        } else if ((type & GENERATE_ENUM_CLASS) != 0) {
+            break;
+        case GENERATE_ENUM_CLASS:
             appendHeaderContents(file, pkgString, importsList);
             write(file, fileName, type, ENUM_CLASS);
-        } else if ((type & GENERATE_SERVICE_AND_MANAGER) != 0) {
-            appendHeaderContents(file, pkgString, importsList);
-            write(file, fileName, type, RPC_INTERFACE);
-        } else if ((type & GENERATE_EVENT_CLASS) != 0) {
-            appendHeaderContents(file, pkgString, importsList);
-            write(file, fileName, type, EVENT);
-        } else if ((type & GENERATE_EVENT_LISTENER_INTERFACE) != 0) {
+            break;
+        case GENERATE_EVENT_LISTENER_INTERFACE:
             appendHeaderContents(file, pkgString, importsList);
             write(file, fileName, type, EVENT_LISTENER);
+            break;
+        default:
+            break;
         }
     }
 
@@ -333,8 +392,9 @@
      * @param javaDocType java doc type
      * @throws IOException when fails to write into a file
      */
-    private static void write(File file, String fileName, int genType, JavaDocType javaDocType)
+    private static void write(File file, int genType, JavaDocType javaDocType, YangNode curNode, String fileName)
             throws IOException {
+
         if ((genType & GENERATE_SERVICE_AND_MANAGER) != 0) {
             if (!fileName.contains(SERVICE)) {
                 insertDataIntoJavaFile(file, getJavaDoc(RPC_MANAGER, fileName + MANAGER, false));
@@ -344,7 +404,22 @@
         } else {
             insertDataIntoJavaFile(file, getJavaDoc(javaDocType, fileName, false));
         }
-        insertDataIntoJavaFile(file, getJavaClassDefStart(genType, fileName));
+        insertDataIntoJavaFile(file, generateClassDefinition(genType, fileName, curNode));
+    }
+
+    /**
+     * Writes data to the specific generated file.
+     *
+     * @param file generated file
+     * @param fileName file name
+     * @param genType generated file type
+     * @param javaDocType java doc type
+     * @throws IOException when fails to write into a file
+     */
+    private static void write(File file, String fileName, int genType, JavaDocType javaDocType)
+            throws IOException {
+        insertDataIntoJavaFile(file, getJavaDoc(javaDocType, fileName, false));
+        insertDataIntoJavaFile(file, generateClassDefinition(genType, fileName));
     }
 
     /**
@@ -354,8 +429,8 @@
      * @return enum's attribute
      */
     public static String getEnumsValueAttribute(String className) {
-        return NEW_LINE + FOUR_SPACE_INDENTATION + PRIVATE + SPACE + INT + SPACE + getSmallCase(className) + SEMI_COLAN
-                + NEW_LINE;
+        return NEW_LINE + FOUR_SPACE_INDENTATION + PRIVATE + SPACE + INT + SPACE + getSmallCase(className)
+                + SEMI_COLAN + NEW_LINE;
     }
 
 }