[ONOS-5482][ONOS-5275] Yms Operation requirement Implementation in onos-yang-tools

Change-Id: I463ed105f85ca65a61ff251e5ca062903d465551
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGenerator.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGenerator.java
index 979df3a..2033d2d 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGenerator.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGenerator.java
@@ -85,16 +85,12 @@
 import static org.onosproject.yangutils.translator.tojava.TempJavaFragmentFiles.getCurNodeAsAttributeInTarget;
 import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.getQualifierInfoForCasesParent;
 import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.isGetSetOfRootNodeRequired;
+import static org.onosproject.yangutils.translator.tojava.utils.BitsJavaInfoHandler.generateBitsFile;
 import static org.onosproject.yangutils.translator.tojava.utils.IndentationType.FOUR_SPACE;
-import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.addAugmentationAttribute;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.getEnumsValueAttribute;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.getEventEnumTypeStart;
-import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.getOperationAttributeForConstructor;
-import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.getOperationAttributes;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.getOperationTypeEnum;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.getSetValueParaForUnionClass;
-import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.getYangAugmentedMapObjectForConstruct;
-import static org.onosproject.yangutils.translator.tojava.utils.BitsJavaInfoHandler.generateBitsFile;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGeneratorUtils.getDataFromTempFileHandle;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGeneratorUtils.initiateJavaFileGeneration;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodBodyTypes.ENUM_METHOD_INT_VALUE;
@@ -120,20 +116,20 @@
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getRangeValidatorMethodForUnion;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getSetterForSelectLeaf;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getSetterString;
+import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getToStringForEnumClass;
+import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getToStringForType;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getToStringMethodClose;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getToStringMethodOpen;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getUnionToStringMethod;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getYangAugmentInfoImpl;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getYangAugmentInfoInterface;
-import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getYangAugmentInfoMapImpl;
-import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getYangAugmentInfoMapInterface;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.isLeafValueSetInterface;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.isSelectLeafSetInterface;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.processSubtreeFilteringInterface;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.setSelectLeafSetInterface;
-import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getGettersForValueAndSelectLeaf;
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getInterfaceLeafIdEnumMethods;
-import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getOperationAttributesGetters;
+import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getIsSelectLeafSet;
+import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getIsValueLeafSet;
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.methodClose;
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.signatureClose;
 import static org.onosproject.yangutils.translator.tojava.utils.SubtreeFilteringMethodsGenerator.getAugmentableSubTreeFiltering;
@@ -169,14 +165,13 @@
 import static org.onosproject.yangutils.utils.UtilConstants.PROTECTED;
 import static org.onosproject.yangutils.utils.UtilConstants.PUBLIC;
 import static org.onosproject.yangutils.utils.UtilConstants.RPC_CLASS;
-import static org.onosproject.yangutils.utils.UtilConstants.SCHEMA_NAME;
 import static org.onosproject.yangutils.utils.UtilConstants.SEMI_COLON;
 import static org.onosproject.yangutils.utils.UtilConstants.SERVICE_METHOD_STRING;
-import static org.onosproject.yangutils.utils.UtilConstants.STRING_DATA_TYPE;
 import static org.onosproject.yangutils.utils.UtilConstants.TYPEDEF_CLASS;
 import static org.onosproject.yangutils.utils.UtilConstants.UNION_CLASS;
 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.GETTER_METHOD;
 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.getJavaDoc;
+import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCamelCase;
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase;
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.insertDataIntoJavaFile;
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.replaceLast;
@@ -234,8 +229,9 @@
                                    className);
 
         // Generate ENUM interface
-        insertDataIntoJavaFile(file, getOperationTypeEnum());
-
+        if (curNode instanceof RpcNotificationContainer) {
+            insertDataIntoJavaFile(file, getOperationTypeEnum());
+        }
         List<String> methods = new ArrayList<>();
         if (attrPresent) {
             // Add getter methods to interface file.
@@ -263,23 +259,25 @@
         if (curNode instanceof YangAugmentableNode &&
                 !(curNode instanceof YangChoice)) {
             methods.add(getYangAugmentInfoInterface());
-            methods.add(getYangAugmentInfoMapInterface());
         }
-
-        if (curNode instanceof YangCase) {
-            YangNode caseParent = curNode.getParent();
-            JavaQualifiedTypeInfo qualifiedTypeInfo =
-                    getQualifierInfoForCasesParent(caseParent,
-                                                   fileInfo.getPluginConfig());
-            methods.add(processSubtreeFilteringInterface(
-                    qualifiedTypeInfo.getClassInfo()));
-        } else {
-            methods.add(processSubtreeFilteringInterface(className));
+        if (curNode.isOpTypeReq()) {
+            if (curNode instanceof YangCase) {
+                YangNode caseParent = curNode.getParent();
+                JavaQualifiedTypeInfo qualifiedTypeInfo =
+                        getQualifierInfoForCasesParent(caseParent,
+                                                       fileInfo.getPluginConfig());
+                methods.add(processSubtreeFilteringInterface(
+                        qualifiedTypeInfo.getClassInfo()));
+            } else {
+                methods.add(processSubtreeFilteringInterface(className));
+            }
         }
 
         if (leavesPresent) {
             methods.add(isLeafValueSetInterface());
-            methods.add(isSelectLeafSetInterface());
+            if (curNode.isOpTypeReq()) {
+                methods.add(isSelectLeafSetInterface());
+            }
         }
         for (String method : methods) {
             insertDataIntoJavaFile(file, method);
@@ -305,7 +303,8 @@
 
         boolean leavesPresent;
         YangLeavesHolder leavesHolder;
-        if (curNode instanceof YangLeavesHolder) {
+        if (curNode instanceof YangLeavesHolder &&
+                curNode.isOpTypeReq()) {
             leavesHolder = (YangLeavesHolder) curNode;
             leavesPresent = leavesPresent(leavesHolder);
         } else {
@@ -347,9 +346,8 @@
 
         if (curNode instanceof YangAugmentableNode &&
                 !(curNode instanceof YangChoice)) {
-            methods.add(getAddAugmentInfoMethodInterface());
+            methods.add(getAddAugmentInfoMethodInterface(className + BUILDER));
             methods.add(getYangAugmentInfoInterface());
-            methods.add(getYangAugmentInfoMapInterface());
         }
 
         if (leavesPresent) {
@@ -395,10 +393,8 @@
         }
 
         String className = getCapitalCase(fileInfo.getJavaName());
-        boolean isRootNode = false;
         String path;
         if (curNode instanceof RpcNotificationContainer) {
-            isRootNode = true;
             path = fileInfo.getPluginConfig().getCodeGenDir() +
                     fileInfo.getPackageFilePath();
         } else {
@@ -409,10 +405,6 @@
         initiateJavaFileGeneration(file, BUILDER_CLASS_MASK, null, curNode,
                                    className);
         List<String> methods = new ArrayList<>();
-
-        if (curNode instanceof YangAugmentableNode) {
-            insertDataIntoJavaFile(file, addAugmentationAttribute());
-        }
         if (attrPresent) {
 
             //Add attribute strings.
@@ -422,10 +414,6 @@
             } catch (IOException e) {
                 throw new IOException(getErrorMsg(className, BUILDER_CLASS));
             }
-
-            if (leavesPresent) {
-                insertDataIntoJavaFile(file, getOperationAttributes());
-            }
             try {
                 //Getter methods.
                 methods.add(getDataFromTempFileHandle(
@@ -441,10 +429,9 @@
                 insertDataIntoJavaFile(file, NEW_LINE);
 
                 //Add operation attribute methods.
-                if (leavesPresent) {
-                    methods.add(getOperationAttributesGetters());
+                if (leavesPresent && curNode.isOpTypeReq()) {
                     insertDataIntoJavaFile(file, NEW_LINE);
-                    methods.add(getSetterForSelectLeaf(className, isRootNode));
+                    methods.add(getSetterForSelectLeaf(className));
                 }
             } catch (IOException e) {
                 throw new IOException(getErrorMsg(className, BUILDER_CLASS));
@@ -454,9 +441,8 @@
         }
 
         if (curNode instanceof YangAugmentableNode) {
-            methods.add(getAddAugmentInfoMethodImpl());
+            methods.add(getAddAugmentInfoMethodImpl(className + BUILDER));
             methods.add(getYangAugmentInfoImpl());
-            methods.add(getYangAugmentInfoMapImpl());
         }
 
         // Add default constructor and build method impl.
@@ -520,64 +506,52 @@
                                    className);
 
         List<String> methods = new ArrayList<>();
-        if (curNode instanceof YangAugmentableNode) {
-            insertDataIntoJavaFile(file, addAugmentationAttribute());
-        }
         if (attrPresent) {
             addDefaultClassAttributeInfo(file, curNode, className,
                                          opParamClassName, path, methods,
-                                         leavesPresent, rootNode);
+                                         rootNode);
         } else {
             insertDataIntoJavaFile(file, NEW_LINE);
         }
 
         if (curNode instanceof YangAugmentableNode) {
             methods.add(getYangAugmentInfoImpl());
-            methods.add(getYangAugmentInfoMapImpl());
         }
         try {
             //Constructor.
-            String constructor =
-                    getConstructorStart(className, rootNode);
-            constructor = constructor +
+            String constructor = getConstructorStart(className, rootNode) +
                     getDataFromTempFileHandle(
-                            CONSTRUCTOR_IMPL_MASK, getBeanFiles(curNode), path);
-
-            if (leavesPresent) {
-                constructor = constructor +
-                        getOperationAttributeForConstructor();
-            }
-            String augmentableSubTreeFiltering = EMPTY_STRING;
-            if (curNode instanceof YangAugmentableNode) {
-                constructor = constructor +
-                        getYangAugmentedMapObjectForConstruct();
-
-                // add is filter content match.
-                augmentableSubTreeFiltering = getAugmentableSubTreeFiltering();
-            }
-            methods.add(constructor + methodClose(FOUR_SPACE));
-
-            methods.add(getProcessSubtreeFilteringStart(curNode, config) +
-                                getProcessSubtreeFunctionBody(curNode) +
-                                augmentableSubTreeFiltering +
-                                getProcessSubTreeFilteringEnd());
-
-            if (curNode instanceof YangLeavesHolder) {
-                if (((YangLeavesHolder) curNode).getListOfLeaf() != null &&
-                        !((YangLeavesHolder) curNode).getListOfLeaf().isEmpty()) {
-                    methods.add(getProcessLeafSubtreeFiltering(curNode, config,
-                                                               path));
+                            CONSTRUCTOR_IMPL_MASK, getBeanFiles(curNode), path)
+                    + methodClose(FOUR_SPACE);
+            methods.add(constructor);
+            if (curNode.isOpTypeReq()) {
+                String augmentableSubTreeFiltering = EMPTY_STRING;
+                if (curNode instanceof YangAugmentableNode) {
+                    // add is filter content match.
+                    augmentableSubTreeFiltering = getAugmentableSubTreeFiltering();
                 }
-                if (((YangLeavesHolder) curNode).getListOfLeafList() != null &&
-                        !((YangLeavesHolder) curNode).getListOfLeafList().isEmpty()) {
-                    methods.add(getProcessLeafListSubtreeFiltering(curNode, config,
+                methods.add(getProcessSubtreeFilteringStart(curNode, config) +
+                                    getProcessSubtreeFunctionBody(curNode) +
+                                    augmentableSubTreeFiltering +
+                                    getProcessSubTreeFilteringEnd());
+
+                if (curNode instanceof YangLeavesHolder) {
+                    if (((YangLeavesHolder) curNode).getListOfLeaf() != null &&
+                            !((YangLeavesHolder) curNode).getListOfLeaf().isEmpty()) {
+                        methods.add(getProcessLeafSubtreeFiltering(curNode, config,
                                                                    path));
+                    }
+                    if (((YangLeavesHolder) curNode).getListOfLeafList() != null &&
+                            !((YangLeavesHolder) curNode).getListOfLeafList().isEmpty()) {
+                        methods.add(getProcessLeafListSubtreeFiltering(curNode, config,
+                                                                       path));
+                    }
                 }
-            }
 
-            if (curNode.getChild() != null) {
-                methods.add(getProcessChildNodeSubtreeFiltering(curNode, config,
-                                                                path));
+                if (curNode.getChild() != null) {
+                    methods.add(getProcessChildNodeSubtreeFiltering(curNode, config,
+                                                                    path));
+                }
             }
         } catch (IOException e) {
             throw new IOException(getErrorMsg(className, IMPL_CLASS));
@@ -587,8 +561,10 @@
 
         methods.add(builderMethod(className));
         if (leavesPresent) {
-            methods.add(getOperationAttributesGetters());
-            methods.add(getGettersForValueAndSelectLeaf());
+            methods.add(getIsValueLeafSet());
+            if (curNode.isOpTypeReq()) {
+                methods.add(getIsSelectLeafSet());
+            }
         }
         // Add methods in impl class.
         for (String method : methods) {
@@ -607,7 +583,6 @@
      * @param opParamClassName op param class name
      * @param path             file path
      * @param methods          list of methods string
-     * @param leavesPresent    flag indicating presence of leaves
      * @param rootNode         flag indicating whether node is root node
      * @throws IOException a violation in IO rule
      */
@@ -615,7 +590,6 @@
                                                      String className,
                                                      String opParamClassName,
                                                      String path, List<String> methods,
-                                                     boolean leavesPresent,
                                                      boolean rootNode)
             throws IOException {
 
@@ -627,11 +601,6 @@
             throw new IOException(getErrorMsg(className, IMPL_CLASS));
         }
 
-        //Add operation attributes
-        if (leavesPresent) {
-            insertDataIntoJavaFile(file, getOperationAttributes());
-        }
-
         try {
             //Getter methods.
             methods.add(getDataFromTempFileHandle(
@@ -786,10 +755,13 @@
                                            List<String> methods, String path)
             throws IOException {
         //To string method.
-        methods.add(getToStringMethodOpen() +
-                            getDataFromTempFileHandle(
-                                    TO_STRING_IMPL_MASK, getTypeFiles(curNode), path) +
-                            getToStringMethodClose());
+
+        List<YangType<?>> types = ((YangTypeDef) curNode).getTypeList();
+        YangType type = types.get(0);
+        String className = ((JavaFileInfoContainer) curNode).getJavaFileInfo()
+                .getJavaName();
+        methods.add(getToStringForType(getCamelCase(type.getDataTypeName(),
+                                                    null), type, getCapitalCase(className)));
         for (BitsJavaInfoHandler handler : getTypeFiles(curNode)
                 .getBitsHandler()) {
             generateBitsFile(handler.getAttr(), handler.getYangType(), curNode);
@@ -904,7 +876,7 @@
 
             //To string method.
             methods.add(getUnionToStringMethod(
-                    ((YangUnion) curNode).getTypeList()));
+                    ((YangUnion) curNode).getTypeList(), getCapitalCase(className)));
 
             for (BitsJavaInfoHandler handler : getTypeFiles(curNode)
                     .getBitsHandler()) {
@@ -1009,8 +981,6 @@
         if (!enumFile.isEnumClass()) {
             imports.add(data.getImportForToBitSet());
             imports.add(data.getImportForPattern());
-            imports.add(data.getImportForToString());
-
         }
 
         initiateJavaFileGeneration(file, getCapitalCase(className),
@@ -1052,16 +1022,13 @@
                                                 null) +
                 getGetter(INT, className, GENERATE_ENUM_CLASS) + NEW_LINE);
 
-        insertDataIntoJavaFile(file, getJavaDoc(GETTER_METHOD, SCHEMA_NAME, false,
-                                                null) +
-                getGetter(STRING_DATA_TYPE, SCHEMA_NAME, GENERATE_ENUM_CLASS) +
-                NEW_LINE);
-
         if (!enumFile.isEnumClass()) {
             insertDataIntoJavaFile(file, getBitSetEnumClassFromString
                     (getCapitalCase(className)));
             insertDataIntoJavaFile(file, getBitSetEnumClassToString(
                     getCapitalCase(className), (YangEnumeration) curNode));
+        } else {
+            insertDataIntoJavaFile(file, getToStringForEnumClass());
         }
 
         insertDataIntoJavaFile(file, CLOSE_CURLY_BRACKET + NEW_LINE);