YANG Translator optimization
Change-Id: Ie6a6b9d371a4fc5fd973cf56d6f3c7b44a3146ba
diff --git a/src/main/java/org/onosproject/yangutils/translator/tojava/utils/GenerateJavaCodeExitBuilder.java b/src/main/java/org/onosproject/yangutils/translator/tojava/utils/GenerateJavaCodeExitBuilder.java
new file mode 100644
index 0000000..4acb1e3
--- /dev/null
+++ b/src/main/java/org/onosproject/yangutils/translator/tojava/utils/GenerateJavaCodeExitBuilder.java
@@ -0,0 +1,232 @@
+/*
+ * 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.ArrayList;
+import java.util.List;
+
+import org.onosproject.yangutils.datamodel.YangNode;
+import org.onosproject.yangutils.translator.tojava.HasJavaFileInfo;
+import org.onosproject.yangutils.translator.tojava.HasJavaImportData;
+import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
+import org.onosproject.yangutils.translator.tojava.JavaImportData;
+import org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfo;
+import org.onosproject.yangutils.utils.UtilConstants;
+
+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_INTERFACE_WITH_BUILDER;
+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.utils.JavaFileGenerator.appendFileContents;
+import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGenerator.clean;
+import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGenerator.closeFileHandles;
+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.JavaFileGenerator.getFileObject;
+import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGenerator.insert;
+
+/**
+ * Provides generate java code exit.
+ */
+public final class GenerateJavaCodeExitBuilder {
+
+ private static final String JAVA_FILE_EXTENSION = ".java";
+
+ /**
+ * Default constructor.
+ */
+ private GenerateJavaCodeExitBuilder() {
+ }
+
+ /**
+ * Sets import for hash and equals method.
+ *
+ * @return import string for implementing hash and equals
+ */
+ private static String setImportForHashAndEquals() {
+
+ return UtilConstants.IMPORT + UtilConstants.JAVA_UTIL_OBJECTS_IMPORT_PKG + UtilConstants.PERIOD
+ + UtilConstants.JAVA_UTIL_OBJECTS_IMPORT_CLASS;
+ }
+
+ /**
+ * Sets import for to string method.
+ *
+ * @return import string for implementing to string
+ */
+ private static String setImportForToString() {
+
+ return UtilConstants.IMPORT + UtilConstants.GOOGLE_MORE_OBJECT_IMPORT_PKG + UtilConstants.PERIOD
+ + UtilConstants.GOOGLE_MORE_OBJECT_IMPORT_CLASS;
+ }
+
+ /**
+ * Sets import for to list.
+ *
+ * @return import string for list collection
+ */
+ private static String setImportForList() {
+
+ return UtilConstants.IMPORT + UtilConstants.COLLECTION_IMPORTS + UtilConstants.PERIOD
+ + UtilConstants.LIST + UtilConstants.SEMI_COLAN + UtilConstants.NEW_LINE;
+ }
+
+ /**
+ * Construct java code exit.
+ *
+ * @param fileType generated file type
+ * @param curNode current YANG node
+ * @throws IOException when fails to generate java files
+ */
+ public static void generateJavaFile(int fileType, YangNode curNode) throws IOException {
+
+ JavaFileInfo javaFileInfo = ((HasJavaFileInfo) curNode).getJavaFileInfo();
+ String className = JavaIdentifierSyntax.getCaptialCase(javaFileInfo.getJavaName());
+ String pkg = javaFileInfo.getPackageFilePath();
+ List<String> imports = getImports(((HasJavaImportData) curNode).getJavaImportData());
+
+ /**
+ * Start generation of files.
+ */
+ if ((fileType & INTERFACE_MASK) != 0 | (fileType & BUILDER_INTERFACE_MASK) != 0
+ | fileType == GENERATE_INTERFACE_WITH_BUILDER) {
+
+ /**
+ * Create interface file.
+ */
+ String interfaceFileName = className;
+ File interfaceFile = getFileObject(pkg, interfaceFileName, JAVA_FILE_EXTENSION, javaFileInfo);
+ interfaceFile = generateInterfaceFile(interfaceFile, imports, curNode);
+ /**
+ * Create temp builder interface file.
+ */
+ String builderInterfaceFileName = className
+ + UtilConstants.BUILDER + UtilConstants.INTERFACE;
+ File builderInterfaceFile = getFileObject(pkg, builderInterfaceFileName, JAVA_FILE_EXTENSION, javaFileInfo);
+ builderInterfaceFile = generateBuilderInterfaceFile(builderInterfaceFile, curNode);
+ /**
+ * Append builder interface file to interface file and close it.
+ */
+ appendFileContents(builderInterfaceFile, interfaceFile);
+ insert(interfaceFile, JavaCodeSnippetGen.getJavaClassDefClose());
+ /**
+ * Close file handle for interface files.
+ */
+ closeFileHandles(builderInterfaceFile);
+ closeFileHandles(interfaceFile);
+
+ /**
+ * Remove temp files.
+ */
+ clean(builderInterfaceFile);
+ }
+
+ imports.add(setImportForHashAndEquals());
+ imports.add(setImportForToString());
+ java.util.Collections.sort(imports);
+
+ if ((fileType & BUILDER_CLASS_MASK) != 0 | (fileType & IMPL_CLASS_MASK) != 0
+ | fileType == GENERATE_INTERFACE_WITH_BUILDER) {
+
+ /**
+ * Create builder class file.
+ */
+ String builderFileName = className
+ + UtilConstants.BUILDER;
+ File builderFile = getFileObject(pkg, builderFileName, JAVA_FILE_EXTENSION, javaFileInfo);
+ builderFile = generateBuilderClassFile(builderFile, imports, curNode);
+ /**
+ * Create temp impl class file.
+ */
+
+ String implFileName = className + UtilConstants.IMPL;
+ File implTempFile = getFileObject(pkg, implFileName, JAVA_FILE_EXTENSION, javaFileInfo);
+ implTempFile = generateImplClassFile(implTempFile, curNode);
+ /**
+ * Append impl class to builder class and close it.
+ */
+ appendFileContents(implTempFile, builderFile);
+ insert(builderFile, JavaCodeSnippetGen.getJavaClassDefClose());
+
+ /**
+ * Close file handle for classes files.
+ */
+ closeFileHandles(implTempFile);
+ closeFileHandles(builderFile);
+
+ /**
+ * Remove temp files.
+ */
+ clean(implTempFile);
+ }
+
+ /**
+ * if ((fileType & GENERATE_TYPEDEF_CLASS) != 0) {
+ *
+ * /** Create builder class file. //
+ */
+ //String typeDefFileName = className;
+ //File typeDefFile = JavaFileGenerator.getFileObject(path, typeDefFileName, JAVA_FILE_EXTENSION,
+ // ((HasJavaFileInfo) curNode).getJavaFileInfo());
+ //typeDefFile = JavaFileGenerator.generateTypeDefClassFile(typeDefFile, className, imports,
+ // path.replace('/', '.'), attrList, ((HasJavaFileInfo) curNode).getJavaFileInfo());
+ // JavaFileGenerator.insert(typeDefFile, JavaCodeSnippetGen.getJavaClassDefClose());
+
+ // /**
+ // * Close file handle for classes files.
+ // */
+ // JavaFileGenerator.closeFileHandles(typeDefFile);
+ // }
+ //
+ }
+
+ /**
+ * Returns import for class.
+ *
+ * @param javaImportData import data
+ * @return imports for class
+ */
+ private static List<String> getImports(JavaImportData javaImportData) {
+
+ String importString;
+ List<String> imports = new ArrayList<>();
+
+ for (JavaQualifiedTypeInfo importInfo : javaImportData.getImportSet()) {
+ importString = UtilConstants.IMPORT;
+ if (importInfo.getPkgInfo() != "" && importInfo.getClassInfo() != null
+ && importInfo.getPkgInfo() != UtilConstants.JAVA_LANG) {
+ importString = importString + importInfo.getPkgInfo() + ".";
+ importString = importString + importInfo.getClassInfo() + UtilConstants.SEMI_COLAN
+ + UtilConstants.NEW_LINE;
+
+ imports.add(importString);
+ }
+ }
+
+ if (javaImportData.getIfListImported()) {
+ imports.add(setImportForList());
+ }
+
+ java.util.Collections.sort(imports);
+ return imports;
+ }
+}