[ONOS-4149],[ONOS-3909] YANG list translator impl and bug fixes.

Change-Id: Ia1a94142a3a114815766f661ed850bf9cacde66f
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
new file mode 100644
index 0000000..ad4dd0d
--- /dev/null
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGeneratorUtils.java
@@ -0,0 +1,250 @@
+/*
+ * Copyright 2016 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yangutils.translator.tojava.utils;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+import org.onosproject.yangutils.datamodel.YangNode;
+import org.onosproject.yangutils.translator.tojava.HasTempJavaCodeFragmentFiles;
+import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
+import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles;
+import org.onosproject.yangutils.utils.io.impl.CopyrightHeader;
+import org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType;
+
+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_TYPEDEF_CLASS;
+import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.IMPL_CLASS_MASK;
+import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.INTERFACE_MASK;
+import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.ATTRIBUTES_MASK;
+import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.CONSTRUCTOR_IMPL_MASK;
+import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.EQUALS_IMPL_MASK;
+import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.GETTER_FOR_CLASS_MASK;
+import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.GETTER_FOR_INTERFACE_MASK;
+import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.HASH_CODE_IMPL_MASK;
+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.utils.UtilConstants.NEW_LINE;
+import static org.onosproject.yangutils.utils.UtilConstants.ORG;
+import static org.onosproject.yangutils.utils.UtilConstants.PACKAGE;
+import static org.onosproject.yangutils.utils.UtilConstants.SEMI_COLAN;
+import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
+import static org.onosproject.yangutils.utils.UtilConstants.SPACE;
+import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.getJavaDoc;
+import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.BUILDER_CLASS;
+import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.BUILDER_INTERFACE;
+import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.IMPL_CLASS;
+import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.INTERFACE;
+import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.convertPathToPkg;
+import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.insertDataIntoJavaFile;
+
+/**
+ * Provides utilities for java file generator.
+ */
+public final class JavaFileGeneratorUtils {
+
+    /**
+     * Default constructor.
+     */
+    private JavaFileGeneratorUtils() {
+    }
+
+    /**
+     * Returns a file object for generated file.
+     *
+     * @param fileName file name
+     * @param filePath file package path
+     * @param extension file extension
+     * @param handle cached file handle
+     * @return file object
+     */
+    public static File getFileObject(String filePath, String fileName, String extension, JavaFileInfo handle) {
+
+        return new File(handle.getBaseCodeGenPath() + filePath + SLASH + fileName + extension);
+    }
+
+    /**
+     * Return data stored in temporary files.
+     *
+     * @param generatedTempFiles temporary file types
+     * @param curNode current YANG node
+     * @return data stored in temporary files
+     * @throws IOException when failed to get the data from temporary file handle
+     */
+    public static String getDataFromTempFileHandle(int generatedTempFiles, YangNode curNode) throws IOException {
+
+        TempJavaCodeFragmentFiles tempJavaCodeFragmentFiles = ((HasTempJavaCodeFragmentFiles) curNode)
+                .getTempJavaCodeFragmentFiles();
+
+        if ((generatedTempFiles & ATTRIBUTES_MASK) != 0) {
+            return tempJavaCodeFragmentFiles
+                    .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getAttributesTempFileHandle());
+        } else if ((generatedTempFiles & GETTER_FOR_INTERFACE_MASK) != 0) {
+            return tempJavaCodeFragmentFiles
+                    .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getGetterInterfaceTempFileHandle());
+        } else if ((generatedTempFiles & SETTER_FOR_INTERFACE_MASK) != 0) {
+            return tempJavaCodeFragmentFiles
+                    .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getSetterInterfaceTempFileHandle());
+        } else if ((generatedTempFiles & GETTER_FOR_CLASS_MASK) != 0) {
+            return tempJavaCodeFragmentFiles
+                    .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getGetterImplTempFileHandle());
+        } else if ((generatedTempFiles & SETTER_FOR_CLASS_MASK) != 0) {
+            return tempJavaCodeFragmentFiles
+                    .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getSetterImplTempFileHandle());
+        } else if ((generatedTempFiles & CONSTRUCTOR_IMPL_MASK) != 0) {
+            return tempJavaCodeFragmentFiles
+                    .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getConstructorImplTempFileHandle());
+        } else if ((generatedTempFiles & HASH_CODE_IMPL_MASK) != 0) {
+            return tempJavaCodeFragmentFiles
+                    .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getHashCodeImplTempFileHandle());
+        } else if ((generatedTempFiles & EQUALS_IMPL_MASK) != 0) {
+            return tempJavaCodeFragmentFiles
+                    .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getEqualsImplTempFileHandle());
+        } else if ((generatedTempFiles & TO_STRING_IMPL_MASK) != 0) {
+            return tempJavaCodeFragmentFiles
+                    .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getToStringImplTempFileHandle());
+        }
+        return null;
+    }
+
+    /**
+     * Initiate generation of file based on generated file type.
+     *
+     * @param file generated file
+     * @param className generated file class name
+     * @param type generated file type
+     * @param imports imports for the file
+     * @param pkg generated file package
+     * @throws IOException when fails to generate a file
+     */
+    public static void initiateJavaFileGeneration(File file, String className, int type, List<String> imports,
+            String pkg) throws IOException {
+
+        try {
+            file.createNewFile();
+            appendContents(file, className, type, imports, pkg);
+        } 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
+     * @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) {
+
+            write(file, fileName, type, IMPL_CLASS);
+        } else if ((type & BUILDER_INTERFACE_MASK) != 0) {
+
+            write(file, fileName, type, BUILDER_INTERFACE);
+        } else if ((type & GENERATE_TYPEDEF_CLASS) != 0) {
+            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) {
+
+            appendHeaderContents(file, pkgString, importsList);
+            write(file, fileName, type, BUILDER_CLASS);
+        }
+    }
+
+    /**
+     * Removes base directory path from package and generates package string for file.
+     *
+     * @param javaPkg generated java package
+     * @param importsList list of imports
+     * @return package string
+     */
+    private static String parsePackageString(String javaPkg, List<String> importsList) {
+
+        if (javaPkg.contains(ORG)) {
+            String[] strArray = javaPkg.split(ORG);
+            javaPkg = ORG + convertPathToPkg(strArray[1]);
+        }
+        if (importsList != null) {
+            if (!importsList.isEmpty()) {
+                return PACKAGE + SPACE + javaPkg + SEMI_COLAN + NEW_LINE;
+            } else {
+                return PACKAGE + SPACE + javaPkg + SEMI_COLAN;
+            }
+        } else {
+            return PACKAGE + SPACE + javaPkg + SEMI_COLAN;
+        }
+    }
+
+    /**
+     * Appends other contents to interface, builder and typedef classes.
+     * for example : ONOS copyright, imports and package.
+     * @param file generated file
+     * @param pkg generated package
+     * @param importsList list of imports
+     * @throws IOException when fails to append contents.
+     */
+    private static void appendHeaderContents(File file, String pkg, List<String> importsList) throws IOException {
+
+        insertDataIntoJavaFile(file, CopyrightHeader.getCopyrightHeader());
+        insertDataIntoJavaFile(file, pkg);
+
+        /*
+         * TODO: add the file header using
+         * JavaCodeSnippetGen.getFileHeaderComment
+         */
+
+        if (importsList != null) {
+            insertDataIntoJavaFile(file, NEW_LINE);
+            for (String imports : importsList) {
+                insertDataIntoJavaFile(file, imports);
+            }
+        }
+    }
+
+    /**
+     * Write 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, getJavaClassDefStart(genType, fileName));
+    }
+
+}