[ONOS-5232] bits enum class generation modifications and code refactoring.

Change-Id: I67fb31c586802e9cf682aa6e707475ad8fdc096f
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/StringGenerator.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/StringGenerator.java
index 9dfbf80..dfe2826 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/StringGenerator.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/StringGenerator.java
@@ -16,32 +16,30 @@
 
 package org.onosproject.yangutils.translator.tojava.utils;
 
+import org.onosproject.yangutils.datamodel.YangAugment;
+import org.onosproject.yangutils.datamodel.YangChoice;
 import org.onosproject.yangutils.datamodel.YangCompilerAnnotation;
+import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangType;
 import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
+import org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfoTranslator;
+import org.onosproject.yangutils.utils.io.YangPluginConfig;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 
-import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.BOOLEAN;
-import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.DECIMAL64;
-import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.EMPTY;
-import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.INT16;
-import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.INT32;
-import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.INT64;
-import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.INT8;
-import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.UINT16;
-import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.UINT32;
-import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.UINT64;
-import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.UINT8;
 import static org.onosproject.yangutils.translator.tojava.utils.BracketType.OPEN_CLOSE_BRACKET;
 import static org.onosproject.yangutils.translator.tojava.utils.BracketType.OPEN_CLOSE_BRACKET_WITH_VALUE;
 import static org.onosproject.yangutils.translator.tojava.utils.BracketType.OPEN_CLOSE_BRACKET_WITH_VALUE_AND_RETURN_TYPE;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodClassTypes.CLASS_TYPE;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getIfConditionForAddToListMethod;
+import static org.onosproject.yangutils.translator.tojava.utils.SubtreeFilteringMethodsGenerator.getQualifiedInfo;
 import static org.onosproject.yangutils.utils.UtilConstants.ADD_STRING;
 import static org.onosproject.yangutils.utils.UtilConstants.AND;
 import static org.onosproject.yangutils.utils.UtilConstants.APPEND;
+import static org.onosproject.yangutils.utils.UtilConstants.APP_INSTANCE;
 import static org.onosproject.yangutils.utils.UtilConstants.AT;
 import static org.onosproject.yangutils.utils.UtilConstants.BIG_DECIMAL;
 import static org.onosproject.yangutils.utils.UtilConstants.BIG_INTEGER;
@@ -68,6 +66,7 @@
 import static org.onosproject.yangutils.utils.UtilConstants.ELSE;
 import static org.onosproject.yangutils.utils.UtilConstants.EMPTY_STRING;
 import static org.onosproject.yangutils.utils.UtilConstants.EQUAL;
+import static org.onosproject.yangutils.utils.UtilConstants.EQUALS_STRING;
 import static org.onosproject.yangutils.utils.UtilConstants.EXCEPTION;
 import static org.onosproject.yangutils.utils.UtilConstants.EXCEPTION_VAR;
 import static org.onosproject.yangutils.utils.UtilConstants.EXTEND;
@@ -85,6 +84,7 @@
 import static org.onosproject.yangutils.utils.UtilConstants.INTEGER_WRAPPER;
 import static org.onosproject.yangutils.utils.UtilConstants.INT_MAX_RANGE;
 import static org.onosproject.yangutils.utils.UtilConstants.INT_MIN_RANGE;
+import static org.onosproject.yangutils.utils.UtilConstants.LEAF_IDENTIFIER;
 import static org.onosproject.yangutils.utils.UtilConstants.LIST;
 import static org.onosproject.yangutils.utils.UtilConstants.LONG;
 import static org.onosproject.yangutils.utils.UtilConstants.LONG_MAX_RANGE;
@@ -212,8 +212,8 @@
     static String getNewInstance(String returnType, String varName,
                                  String space, String value) {
         return space + returnType + SPACE + varName + SPACE + EQUAL + SPACE +
-                NEW + SPACE + returnType + brackets(
-                OPEN_CLOSE_BRACKET_WITH_VALUE, value, null) + signatureClose();
+                NEW + SPACE + returnType + getOpenCloseParaWithValue(value) +
+                signatureClose();
     }
 
     /**
@@ -258,14 +258,16 @@
                 return TWENTY_SPACE_INDENTATION + CLOSE_CURLY_BRACKET +
                         NEW_LINE;
             case TWENTY_EIGHT_SPACE:
-                return FOUR_SPACE_INDENTATION + CLOSE_CURLY_BRACKET +
-                        NEW_LINE;
+                return TWENTY_SPACE_INDENTATION + EIGHT_SPACE_INDENTATION +
+                        CLOSE_CURLY_BRACKET + NEW_LINE;
             case TWENTY_FOUR_SPACE:
+                return TWENTY_SPACE_INDENTATION + FOUR_SPACE_INDENTATION +
+                        CLOSE_CURLY_BRACKET + NEW_LINE;
+            case FOUR_SPACE:
                 return FOUR_SPACE_INDENTATION + CLOSE_CURLY_BRACKET +
                         NEW_LINE;
             default:
-                return FOUR_SPACE_INDENTATION + CLOSE_CURLY_BRACKET +
-                        NEW_LINE;
+                return CLOSE_CURLY_BRACKET + NEW_LINE;
         }
     }
 
@@ -306,9 +308,8 @@
                 return builder.toString();
             case BUILD:
                 return getReturnString(
-                        NEW + SPACE + paraName + brackets(
-                                OPEN_CLOSE_BRACKET_WITH_VALUE, THIS, null) +
-                                signatureClose(), space);
+                        NEW + SPACE + paraName + getOpenCloseParaWithValue(
+                                THIS) + signatureClose(), space);
             case CONSTRUCTOR:
                 return space + THIS + PERIOD + paraName + SPACE +
                         EQUAL + SPACE + BUILDER_LOWER_CASE + OBJECT + PERIOD +
@@ -321,8 +322,7 @@
                 return space + getIfConditionForAddToListMethod(paraName) +
                         space + paraName +
                         brackets(OPEN_CLOSE_BRACKET, null, null) + PERIOD +
-                        ADD_STRING +
-                        brackets(OPEN_CLOSE_BRACKET_WITH_VALUE, VALUE, null) +
+                        ADD_STRING + getOpenCloseParaWithValue(VALUE) +
                         signatureClose() + getReturnString(
                         THIS + signatureClose(), space);
             case AUGMENTED_MAP_ADD:
@@ -332,10 +332,8 @@
                         CLOSE_PARENTHESIS + signatureClose();
             case AUGMENTED_MAP_GET_VALUE:
                 return getReturnString(
-                        YANG_AUGMENTED_INFO_MAP + PERIOD + GET +
-                                brackets(OPEN_CLOSE_BRACKET_WITH_VALUE, CLASS +
-                                        OBJECT_STRING, null) + signatureClose(),
-                        space);
+                        YANG_AUGMENTED_INFO_MAP + PERIOD + GET + getOpenCloseParaWithValue(
+                                CLASS + OBJECT_STRING) + signatureClose(), space);
             case AUGMENTED_MAP_GETTER:
                 return getReturnString(YANG_AUGMENTED_INFO_MAP +
                                                signatureClose(), space);
@@ -351,9 +349,8 @@
                 return builder.toString();
             case OF_METHOD:
                 return getReturnString(
-                        NEW + SPACE + paraName + brackets(
-                                OPEN_CLOSE_BRACKET_WITH_VALUE, VALUE, null)
-                                + signatureClose(), space);
+                        NEW + SPACE + paraName + getOpenCloseParaWithValue(
+                                VALUE) + signatureClose(), space);
             case TO_STRING:
                 return getToStringMethodsAddString(space, paraName) + paraName +
                         CLOSE_PARENTHESIS;
@@ -384,6 +381,17 @@
         return SEMI_COLON + NEW_LINE;
     }
 
+
+    /**
+     * Returns value assignment.
+     *
+     * @return value assignment
+     */
+    static String valueAssign(String param, String value, String indentation) {
+        return indentation + param + SPACE + EQUAL + SPACE + value +
+                signatureClose();
+    }
+
     /**
      * Returns method signature close for method class type.
      *
@@ -801,8 +809,7 @@
      */
     static String getReturnOfSubString() {
         return getReturnString(OF, TWELVE_SPACE_INDENTATION) +
-                brackets(OPEN_CLOSE_BRACKET_WITH_VALUE, TMP_VAL, null) +
-                signatureClose();
+                getOpenCloseParaWithValue(TMP_VAL) + signatureClose();
     }
 
     /**
@@ -861,32 +868,11 @@
      * @return if condition's signature
      */
     static String getIfConditionBegin(String indentation, String condition) {
-        return indentation + IF + SPACE + brackets(
-                OPEN_CLOSE_BRACKET_WITH_VALUE, condition, EMPTY_STRING) +
+        return indentation + IF + SPACE + getOpenCloseParaWithValue(condition) +
                 methodSignatureClose(CLASS_TYPE);
     }
 
     /**
-     * Returns whether the data type is of primitive data type.
-     *
-     * @param dataType data type to be checked
-     * @return true, if data type can have primitive data type, false otherwise
-     */
-    static boolean isPrimitiveDataType(YangDataTypes dataType) {
-        return dataType == INT8 ||
-                dataType == INT16 ||
-                dataType == INT32 ||
-                dataType == INT64 ||
-                dataType == UINT8 ||
-                dataType == UINT16 ||
-                dataType == UINT32 ||
-                dataType == UINT64 ||
-                dataType == DECIMAL64 ||
-                dataType == BOOLEAN ||
-                dataType == EMPTY;
-    }
-
-    /**
      * Returns list string.
      *
      * @return list string
@@ -907,12 +893,16 @@
     /**
      * Returns value leaf flag setter.
      *
-     * @param name name of leaf
+     * @param name        name of leaf
+     * @param flag        flag to set values
+     * @param indentation indentation
+     * @param prefix      prefix of method
      * @return value leaf flag setter
      */
-    static String getValueLeafSetString(String name) {
-        return "        valueLeafFlags.set(LeafIdentifier." +
-                name.toUpperCase() + ".getLeafIndex());\n";
+    static String getLeafFlagSetString(String name, String flag, String indentation, String prefix) {
+        return indentation + flag + PERIOD + prefix +
+                getOpenCloseParaWithValue(LEAF_IDENTIFIER + PERIOD + name
+                        .toUpperCase() + ".getLeafIndex()");
     }
 
     /*Provides string to return for type.*/
@@ -1115,7 +1105,7 @@
         builder.append(STRING_BUILDER).append(SPACE).append(STRING_BUILDER_VAR)
                 .append(SPACE).append(EQUAL).append(SPACE).append(NEW)
                 .append(SPACE).append(STRING_BUILDER).append(
-                brackets(OPEN_CLOSE_BRACKET_WITH_VALUE, getQuotedString(init), null))
+                getOpenCloseParaWithValue(getQuotedString(init)))
                 .append(signatureClose());
         return builder.toString();
     }
@@ -1149,8 +1139,8 @@
      * @return pattern quote string
      */
     static String getPatternQuoteString(String type) {
-        return PATTERN + PERIOD + QUOTE_STRING + brackets(
-                OPEN_CLOSE_BRACKET_WITH_VALUE, getQuotedString(type), null);
+        return PATTERN + PERIOD + QUOTE_STRING + getOpenCloseParaWithValue(
+                getQuotedString(type));
     }
 
     /**
@@ -1190,8 +1180,8 @@
      * @return get string
      */
     static String getSetValueParaCondition(int count) {
-        return SET_VALUE_PARA + PERIOD + GET + brackets(OPEN_CLOSE_BRACKET_WITH_VALUE,
-                                                        count + EMPTY_STRING, null);
+        return SET_VALUE_PARA + PERIOD + GET + getOpenCloseParaWithValue(
+                count + EMPTY_STRING);
     }
 
     /**
@@ -1205,8 +1195,8 @@
         StringBuilder attr = new StringBuilder(EIGHT_SPACE_INDENTATION);
         String[] array = {NEW_LINE};
         attr.append(MORE_OBJ_ATTR).append(GOOGLE_MORE_OBJECT_METHOD_STATIC_STRING)
-                .append(brackets(OPEN_CLOSE_BRACKET_WITH_VALUE, cls, null))
-                .append(NEW_LINE).append(FOUR_SPACE_INDENTATION).append(trimAtLast(
+                .append(getOpenCloseParaWithValue(cls)).append(NEW_LINE)
+                .append(FOUR_SPACE_INDENTATION).append(trimAtLast(
                 getOmitNullValueString(), array)).append(signatureClose());
         return attr.toString();
     }
@@ -1221,4 +1211,101 @@
         return name + PERIOD +
                 TO_STRING_METHOD + OPEN_CLOSE_BRACKET_STRING;
     }
+
+    /**
+     * Returns value in brackets.
+     *
+     * @param name value
+     * @return value in brackets
+     */
+    static String getOpenCloseParaWithValue(String name) {
+        return brackets(OPEN_CLOSE_BRACKET_WITH_VALUE, name, null);
+    }
+
+    /**
+     * Returns equals comparision.
+     *
+     * @param para1 param
+     * @param para2 param
+     * @return equals comparision
+     */
+    static String getTwoParaEqualsString(String para1, String para2) {
+        return para1 + PERIOD + EQUALS_STRING + getOpenCloseParaWithValue(para2);
+    }
+
+    /**
+     * Returns equal equal condition.
+     *
+     * @param para param
+     * @param val  value
+     * @return equal equal condition
+     */
+    static String getEqualEqualString(String para, String val) {
+        return para + SPACE + EQUAL + EQUAL + SPACE + val;
+    }
+
+    /**
+     * Returns app instance method call.
+     *
+     * @param name attr name
+     * @return app instance method call
+     */
+    static String getAppInstanceAttrString(String name) {
+        return APP_INSTANCE + PERIOD + name + OPEN_CLOSE_BRACKET_STRING;
+    }
+
+    /**
+     * Returns qualified name.
+     *
+     * @param pkg package
+     * @param cls class info
+     * @return qualified name
+     */
+    static String getQualifiedString(String pkg, String cls) {
+        return pkg + PERIOD + cls;
+    }
+
+    /**
+     * Returns import list for node list.
+     *
+     * @param nodes  node list
+     * @param config plugin config
+     * @return import list
+     */
+    public static List<JavaQualifiedTypeInfoTranslator> getNodesImports(List<YangNode> nodes,
+                                                                        YangPluginConfig config) {
+        List<JavaQualifiedTypeInfoTranslator> imports = new ArrayList<>();
+        for (YangNode node : nodes) {
+            JavaQualifiedTypeInfoTranslator qInfo = getQualifiedInfo(node,
+                                                                     config);
+            imports.add(qInfo);
+        }
+        return imports;
+    }
+
+    /**
+     * Returns list of child node for choice.
+     *
+     * @param choice choice node
+     * @return list of child nodes
+     */
+    public static List<YangNode> getChoiceChildNodes(YangChoice choice) {
+        List<YangNode> childs = new ArrayList<>();
+        YangNode child = choice.getChild();
+        while (child != null) {
+            childs.add(child);
+            child = child.getNextSibling();
+        }
+
+        List<YangAugment> augments = choice.getAugmentedInfoList();
+        YangNode augmentCase;
+        for (YangAugment augment : augments) {
+            augmentCase = augment.getChild();
+            while (augmentCase != null) {
+                childs.add(augmentCase);
+                augmentCase = augmentCase.getNextSibling();
+            }
+        }
+        return childs;
+    }
 }