[ONOS-5413]From string and to string method generation for YTB to handle in yms

Change-Id: Ib066598ca40ff642113481617369d82a6d94620a
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java
index 237b6bb..ec97d8e 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java
@@ -27,23 +27,26 @@
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangType;
 import org.onosproject.yangutils.datamodel.javadatamodel.JavaQualifiedTypeInfo;
+import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.javamodel.JavaLeafInfoContainer;
 import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaGroupingTranslator;
+import org.onosproject.yangutils.translator.tojava.utils.BitsJavaInfoHandler;
 import org.onosproject.yangutils.translator.tojava.utils.JavaExtendsListHolder;
 import org.onosproject.yangutils.utils.io.YangPluginConfig;
 
 import java.io.File;
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.List;
 
 import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.getParentNodeInGenCode;
 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.DEFAULT_CLASS_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_TYPE_CLASS;
+import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_UNION_CLASS;
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.INTERFACE_MASK;
 import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.ADD_TO_LIST_IMPL_MASK;
 import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.ADD_TO_LIST_INTERFACE_MASK;
@@ -98,6 +101,7 @@
 import static org.onosproject.yangutils.translator.tojava.utils.TranslatorUtils.getBeanFiles;
 import static org.onosproject.yangutils.translator.tojava.utils.TranslatorUtils.getErrorMsg;
 import static org.onosproject.yangutils.utils.UtilConstants.ARRAY_LIST_IMPORT;
+import static org.onosproject.yangutils.utils.UtilConstants.BIT_SET;
 import static org.onosproject.yangutils.utils.UtilConstants.BUILDER;
 import static org.onosproject.yangutils.utils.UtilConstants.CLOSE_CURLY_BRACKET;
 import static org.onosproject.yangutils.utils.UtilConstants.DEFAULT;
@@ -106,6 +110,7 @@
 import static org.onosproject.yangutils.utils.UtilConstants.FOUR_SPACE_INDENTATION;
 import static org.onosproject.yangutils.utils.UtilConstants.INTERFACE;
 import static org.onosproject.yangutils.utils.UtilConstants.INVOCATION_TARGET_EXCEPTION_IMPORT;
+import static org.onosproject.yangutils.utils.UtilConstants.JAVA_UTIL_PKG;
 import static org.onosproject.yangutils.utils.UtilConstants.NEW_LINE;
 import static org.onosproject.yangutils.utils.UtilConstants.OPERATION_TYPE_ATTRIBUTE;
 import static org.onosproject.yangutils.utils.UtilConstants.OPERATION_TYPE_CLASS;
@@ -398,6 +403,11 @@
     private boolean isAttributePresent;
 
     /**
+     * List of bits attributes.
+     */
+    private List<BitsJavaInfoHandler> bitsHandler = new ArrayList<>();
+
+    /**
      * Creates an instance of temp JAVA fragment files.
      */
     TempJavaFragmentFiles() {
@@ -460,13 +470,13 @@
         if (javaFlagSet(GENERATE_TYPE_CLASS)) {
             addGeneratedTempFile(ATTRIBUTES_MASK | GETTER_FOR_CLASS_MASK |
                                          HASH_CODE_IMPL_MASK | EQUALS_IMPL_MASK |
-                                         TO_STRING_IMPL_MASK |
                                          FROM_STRING_IMPL_MASK);
+
+            if (getGeneratedJavaFiles() != GENERATE_UNION_CLASS) {
+                addGeneratedTempFile(TO_STRING_IMPL_MASK);
+            }
         }
-        //Initialize temp files to generate enum class.
-        if (javaFlagSet(GENERATE_ENUM_CLASS)) {
-            addGeneratedTempFile(FROM_STRING_IMPL_MASK);
-        }
+
         //Set temporary file handles
         if (tempFlagSet(ATTRIBUTES_MASK)) {
             attributesTempFileHandle =
@@ -712,12 +722,57 @@
                                     boolean listAttribute) {
         container.setConflictResolveConfig(config.getConflictResolver());
         container.updateJavaQualifiedInfo();
-        return getAttributeInfoForTheData(
+        addImportForLeafInfo(tempFiles, container);
+        JavaAttributeInfo attr = getAttributeInfoForTheData(
                 container.getJavaQualifiedInfo(),
                 container.getJavaName(config.getConflictResolver()),
                 container.getDataType(),
                 tempFiles.getIsQualifiedAccessOrAddToImportList(
                         container.getJavaQualifiedInfo()), listAttribute);
+        if (container.getDataType().getDataType() == YangDataTypes.BITS) {
+            addBitsHandler(attr, container.getDataType(), tempFiles);
+        }
+        return attr;
+    }
+
+    /**
+     * Adds bits handler attribute for bits to string method.
+     *
+     * @param attr      attribute
+     * @param type      type
+     * @param tempFiles temp fragment file
+     */
+    static void addBitsHandler(JavaAttributeInfo attr, YangType type,
+                               TempJavaFragmentFiles tempFiles) {
+        BitsJavaInfoHandler handler
+                = new BitsJavaInfoHandler(attr, type);
+        tempFiles.getBitsHandler().add(handler);
+    }
+
+    /**
+     * Adds attribute types import to leaf info container's parent.
+     *
+     * @param tempFiles temp java file
+     * @param container leaf info container
+     */
+    private static void addImportForLeafInfo(TempJavaFragmentFiles tempFiles,
+                                             JavaLeafInfoContainer container) {
+        String containedInCls = getCapitalCase(tempFiles.getJavaFileInfo()
+                                                       .getJavaName());
+        String containedInPkg = tempFiles.getJavaFileInfo().getPackage();
+        JavaQualifiedTypeInfoTranslator info = new JavaQualifiedTypeInfoTranslator();
+        if (container.getDataType().getDataType() == YangDataTypes.BITS) {
+            //Add bitset import for type and leaf value flags.
+            info = new JavaQualifiedTypeInfoTranslator();
+            info.setClassInfo(BIT_SET);
+            info.setPkgInfo(JAVA_UTIL_PKG);
+            tempFiles.getJavaImportData().addImportInfo(info, containedInCls,
+                                                        containedInPkg);
+        }
+        tempFiles.getJavaImportData().addImportInfo(
+                (JavaQualifiedTypeInfoTranslator) container
+                        .getJavaQualifiedInfo(), containedInCls, containedInPkg);
+
     }
 
     /**
@@ -1112,13 +1167,11 @@
         name.append(getGeneratedJavaClassName());
         if (rootNode && !toAppend.equals(BUILDER)) {
             name.append(OP_PARAM);
-            return getDefaultConstructorString(name.toString(), modifier
-            );
+            return getDefaultConstructorString(name.toString(), modifier);
         }
         if (suffix) {
             name.append(toAppend);
-            return getDefaultConstructorString(name.toString(), modifier
-            );
+            return getDefaultConstructorString(name.toString(), modifier);
         }
         StringBuilder appended = new StringBuilder();
         if (toAppend.equals(DEFAULT)) {
@@ -1172,13 +1225,14 @@
      *
      * @param attr           type attribute info
      * @param fromStringAttr from string attribute info
+     * @param genClassName   generated class name
      * @throws IOException when fails to append to temporary file
      */
     void addFromStringMethod(JavaAttributeInfo attr,
-                             JavaAttributeInfo fromStringAttr)
+                             JavaAttributeInfo fromStringAttr, String genClassName)
             throws IOException {
         appendToFile(fromStringImplTempFileHandle,
-                     getFromStringMethod(attr, fromStringAttr) + NEW_LINE);
+                     getFromStringMethod(attr, fromStringAttr, genClassName) + NEW_LINE);
     }
 
     /**
@@ -1489,7 +1543,8 @@
                                 typeInfo, newAttrInfo.getAttributeName(),
                                 attrType, getIsQualifiedAccessOrAddToImportList(
                                         typeInfo), false);
-                addFromStringMethod(newAttrInfo, fromStringAttributeInfo);
+                addFromStringMethod(newAttrInfo, fromStringAttributeInfo,
+                                    getGeneratedJavaClassName());
             }
         }
     }
@@ -1584,17 +1639,7 @@
                 addArrayListImport(imports);
             }
 
-            boolean leavesPresent;
-            if (curNode instanceof YangLeavesHolder) {
-                YangLeavesHolder leavesHolder = (YangLeavesHolder) curNode;
-                leavesPresent = leavesHolder.getListOfLeaf() != null &&
-                        !leavesHolder.getListOfLeaf().isEmpty() ||
-                        leavesHolder.getListOfLeafList() != null &&
-                                !leavesHolder.getListOfLeafList().isEmpty();
-                if (leavesPresent) {
-                    addBitsetImport(imports);
-                }
-            }
+            addBitsAndBase64Imports(curNode, imports);
             if (curNode instanceof YangAugmentableNode) {
                 addImportsForAugmentableClass(imports, true, false, curNode);
                 addInvocationExceptionImport(imports);
@@ -1637,8 +1682,17 @@
         }
     }
 
-    private void addBitsetImport(List<String> imports) {
-        imports.add(javaImportData.getImportForToBitSet());
+    //Adds import for bitset and base64 list.
+    private void addBitsAndBase64Imports(YangNode curNode, List<String> imports) {
+        if (curNode instanceof YangLeavesHolder) {
+            YangLeavesHolder holder = (YangLeavesHolder) curNode;
+            String impt = this.getJavaImportData()
+                    .getImportForToBitSet();
+            if (!holder.getListOfLeaf().isEmpty() &&
+                    !imports.contains(impt)) {
+                imports.add(impt);
+            }
+        }
     }
 
     /**
@@ -1875,4 +1929,14 @@
     private boolean tempFlagSet(int flag) {
         return (tempFilesFlagSet & flag) != 0;
     }
+
+    /**
+     * Returns list of bits attributes.
+     *
+     * @return list of bits attributes
+     */
+    public List<BitsJavaInfoHandler> getBitsHandler() {
+        return bitsHandler;
+    }
+
 }