[ONOS-5539] Process sub tree defect fix

Change-Id: I6e06a8ca430a86cc538543b161bbbc56dc9cade6
diff --git a/generator/src/main/java/org/onosproject/yangutils/linker/impl/YangLinkerUtils.java b/generator/src/main/java/org/onosproject/yangutils/linker/impl/YangLinkerUtils.java
index aa55b96..3c1fed0 100644
--- a/generator/src/main/java/org/onosproject/yangutils/linker/impl/YangLinkerUtils.java
+++ b/generator/src/main/java/org/onosproject/yangutils/linker/impl/YangLinkerUtils.java
@@ -49,7 +49,9 @@
 
 import java.util.ArrayList;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.regex.Pattern;
 
@@ -201,13 +203,19 @@
             augment.setChild(null);
 
             for (YangNode node : childNodes) {
-                YangCase javaCase = getYangCaseNode(JAVA_GENERATION);
-                javaCase.setName(node.getName());
-                augment.addChild(javaCase);
-                node.setParent(javaCase);
+                Map<YangNode, List<YangNode>> map = new LinkedHashMap<>();
                 node.setNextSibling(null);
                 node.setPreviousSibling(null);
+                node.setParent(null);
+                YangCase javaCase = getYangCaseNode(JAVA_GENERATION);
+                javaCase.setName(node.getName());
+                //Break the tree to from a new tree.
+                traverseAndBreak(node, map);
+                augment.addChild(javaCase);
+                node.setParent(javaCase);
                 javaCase.addChild(node);
+                //Connect each node to its correct parent again.
+                connectTree(map);
             }
             if (augment.getListOfLeaf() != null) {
                 for (YangLeaf leaf : augment.getListOfLeaf()) {
@@ -237,6 +245,63 @@
         }
     }
 
+    private static void connectTree(Map<YangNode, List<YangNode>> map)
+            throws DataModelException {
+        ArrayList<YangNode> keys = new ArrayList<>(map.keySet());
+        int size = keys.size();
+        for (int i = size - 1; i >= 0; i--) {
+            YangNode curNode = keys.get(i);
+            List<YangNode> nodes = map.get(curNode);
+            if (nodes != null) {
+                for (YangNode node : nodes) {
+                    curNode.addChild(node);
+                }
+            }
+        }
+        map.clear();
+    }
+
+    private static void processHierarchyChild(YangNode node,
+                                              Map<YangNode, List<YangNode>> map) {
+        YangNode child = node.getChild();
+        if (child != null) {
+            List<YangNode> nodes = new ArrayList<>();
+            while (child != null) {
+                nodes.add(child);
+                child.setParent(null);
+                child = child.getNextSibling();
+                if (child != null) {
+                    child.getPreviousSibling().setNextSibling(null);
+                    child.setPreviousSibling(null);
+                }
+            }
+            map.put(node, nodes);
+        }
+        node.setChild(null);
+    }
+
+    private static void traverseAndBreak(YangNode rootNode,
+                                         Map<YangNode, List<YangNode>> map) {
+
+        YangNode curNode = rootNode;
+        TraversalType curTraversal = ROOT;
+        while (curNode != null) {
+            if (curTraversal != PARENT && curNode.getChild() != null) {
+                curTraversal = CHILD;
+                curNode = curNode.getChild();
+            } else if (curNode.getNextSibling() != null) {
+                curTraversal = SIBILING;
+                curNode = curNode.getNextSibling();
+            } else {
+                curTraversal = PARENT;
+                curNode = curNode.getParent();
+                if (curNode != null) {
+                    processHierarchyChild(curNode, map);
+                }
+            }
+        }
+    }
+
     /**
      * Returns error messages.
      *
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java
index 00a7baf..7f6eb84 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java
@@ -20,12 +20,12 @@
 import org.onosproject.yangutils.datamodel.YangAugmentableNode;
 import org.onosproject.yangutils.datamodel.YangCase;
 import org.onosproject.yangutils.datamodel.YangChoice;
-import org.onosproject.yangutils.datamodel.YangGrouping;
 import org.onosproject.yangutils.datamodel.YangLeaf;
 import org.onosproject.yangutils.datamodel.YangLeafList;
 import org.onosproject.yangutils.datamodel.YangLeavesHolder;
 import org.onosproject.yangutils.datamodel.YangList;
 import org.onosproject.yangutils.datamodel.YangNode;
+import org.onosproject.yangutils.datamodel.YangSchemaNode;
 import org.onosproject.yangutils.datamodel.YangType;
 import org.onosproject.yangutils.datamodel.javadatamodel.JavaFileInfo;
 import org.onosproject.yangutils.datamodel.javadatamodel.JavaQualifiedTypeInfo;
@@ -114,8 +114,10 @@
 import static org.onosproject.yangutils.utils.UtilConstants.EMPTY_STRING;
 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 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.METHOD;
 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;
@@ -123,6 +125,7 @@
 import static org.onosproject.yangutils.utils.UtilConstants.PERIOD;
 import static org.onosproject.yangutils.utils.UtilConstants.PRIVATE;
 import static org.onosproject.yangutils.utils.UtilConstants.PROTECTED;
+import static org.onosproject.yangutils.utils.UtilConstants.REFLECT_IMPORTS;
 import static org.onosproject.yangutils.utils.UtilConstants.SELECT_LEAF;
 import static org.onosproject.yangutils.utils.UtilConstants.SERVICE;
 import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
@@ -134,6 +137,7 @@
 import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.readAppendFile;
 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.ADD_TO_LIST;
 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.GETTER_METHOD;
+import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.SETTER_METHOD;
 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.getJavaDoc;
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getAbsolutePackagePath;
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCamelCase;
@@ -606,10 +610,20 @@
         TempJavaBeanFragmentFiles tempFiles =
                 getBeanFiles((JavaCodeGeneratorInfo) parent);
         tempFiles.setAttrNode(curNode);
-
-        JavaAttributeInfo attr =
-                getCurNodeAsAttributeInTarget(curNode, parent, isList,
-                                              tempFiles);
+        if (curNode instanceof YangChoice) {
+            JavaQualifiedTypeInfoTranslator info = new
+                    JavaQualifiedTypeInfoTranslator();
+            info.setClassInfo(INVOCATION_TARGET_EXCEPTION);
+            info.setPkgInfo(REFLECT_IMPORTS);
+            tempFiles.addToSubTreeImports(info);
+            info = new
+                    JavaQualifiedTypeInfoTranslator();
+            info.setClassInfo(METHOD);
+            info.setPkgInfo(REFLECT_IMPORTS);
+            tempFiles.addToSubTreeImports(info);
+        }
+        JavaAttributeInfo attr = getCurNodeAsAttributeInTarget(
+                curNode, parent, isList, tempFiles);
         tempFiles.addJavaSnippetInfoToApplicableTempFiles(attr, config);
     }
 
@@ -763,16 +777,10 @@
                 container.getDataType(),
                 tempFiles.getIsQualifiedAccessOrAddToImportList(
                         container.getJavaQualifiedInfo()), listAttribute);
-        boolean isInGrouping;
-        if (container.isLeafList()) {
-            isInGrouping = !(((YangLeafList) container).getContainedIn()
-                    instanceof YangGrouping);
-        } else {
-            isInGrouping = !(((YangLeaf) container).getContainedIn()
-                    instanceof YangGrouping);
-        }
-        if (container.getDataType().getDataType() == YangDataTypes.BITS &&
-                isInGrouping) {
+        boolean condition =
+                ((YangSchemaNode) container).getReferredSchema() == null &&
+                        container.getDataType().getDataType() == YangDataTypes.BITS;
+        if (condition) {
             addBitsHandler(attr, container.getDataType(), tempFiles);
         }
         return attr;
@@ -1094,7 +1102,12 @@
             throws IOException {
         String setter = getSetterForClass(attr, getGeneratedJavaClassName(),
                                           getGeneratedJavaFiles());
-        appendToFile(setterImplTempFileHandle, getOverRideString() + setter);
+        String javadoc = getOverRideString();
+        if (attr.getAttributeName().equals(SUBTREE_FILTERED)) {
+            javadoc = getJavaDoc(SETTER_METHOD, attr.getAttributeName(),
+                                 false, null);
+        }
+        appendToFile(setterImplTempFileHandle, javadoc + setter);
     }
 
     /**
@@ -1106,9 +1119,13 @@
     protected void addGetterImpl(JavaAttributeInfo attr)
             throws IOException {
         String getter = getGetterForClass(attr, getGeneratedJavaFiles());
+        String javadoc = getOverRideString();
+        if (attr.getAttributeName().equals(SUBTREE_FILTERED)) {
+            javadoc = getJavaDoc(GETTER_METHOD, attr.getAttributeName(),
+                                 false, null);
+        }
         if (javaFlagSet(BUILDER_CLASS_MASK)) {
-            appendToFile(getterImplTempFileHandle, getOverRideString() +
-                    getter);
+            appendToFile(getterImplTempFileHandle, javadoc + getter);
         } else {
             String appDataStructure = null;
             if (attr.getCompilerAnnotation() != null) {
@@ -1531,8 +1548,8 @@
                 new JavaQualifiedTypeInfoTranslator();
         typeInfo.setClassInfo(BIT_SET);
         typeInfo.setPkgInfo(JAVA_UTIL_PKG);
-        this.getJavaImportData().addImportInfo(typeInfo, info.getJavaName(),
-                                               info.getPackage());
+        getJavaImportData().addImportInfo(typeInfo, info.getJavaName(),
+                                          info.getPackage());
         JavaAttributeInfo attributeInfo =
                 getAttributeInfoForTheData(typeInfo, VALUE_LEAF, null, false, false);
         addJavaSnippetInfoToApplicableTempFiles(attributeInfo, config);
@@ -1617,10 +1634,12 @@
         if (tempFlagSet(ATTRIBUTES_MASK)) {
             addAttribute(newAttrInfo);
         }
-        if (tempFlagSet(GETTER_FOR_INTERFACE_MASK)) {
+        if (tempFlagSet(GETTER_FOR_INTERFACE_MASK) &&
+                !attrName.equals(SUBTREE_FILTERED)) {
             addGetterForInterface(newAttrInfo);
         }
-        if (tempFlagSet(SETTER_FOR_INTERFACE_MASK) && required) {
+        if (tempFlagSet(SETTER_FOR_INTERFACE_MASK) && required &&
+                !attrName.equals(SUBTREE_FILTERED)) {
             addSetterForInterface(newAttrInfo);
         }
         if (tempFlagSet(SETTER_FOR_CLASS_MASK) && required) {
@@ -1826,13 +1845,10 @@
 
     //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 = getJavaImportData()
-                    .getImportForToBitSet();
-            if (!holder.getListOfLeaf().isEmpty() &&
-                    !imports.contains(impt)) {
-                imports.add(impt);
+        if (curNode.isOpTypeReq()) {
+            String impt = getJavaImportData().getImportForToBitSet();
+            if (!imports.contains(impt)) {
+                imports.add(getJavaImportData().getImportForToBitSet());
             }
         }
     }
@@ -1890,7 +1906,9 @@
      * @param imports list of imports
      */
     private void addInvocationExceptionImport(List<String> imports) {
-        imports.add(INVOCATION_TARGET_EXCEPTION_IMPORT);
+        if (!imports.contains(INVOCATION_TARGET_EXCEPTION_IMPORT)) {
+            imports.add(INVOCATION_TARGET_EXCEPTION_IMPORT);
+        }
     }
 
     /**
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/YangJavaModelUtils.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/YangJavaModelUtils.java
index 51aec14..8514291 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/YangJavaModelUtils.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/YangJavaModelUtils.java
@@ -233,18 +233,15 @@
 
         TempJavaCodeFragmentFiles translator =
                 info.getTempJavaCodeFragmentFiles();
-
+        TempJavaBeanFragmentFiles bean = getBeanFiles(info);
         if (info instanceof RpcNotificationContainer) {
-            getBeanFiles(info).setRootNode(true);
+            bean.setRootNode(true);
             /*
              * event classes code generation.
              */
             updateNotificationNodeInfo(info, config);
         }
         if (info instanceof YangLeavesHolder) {
-            if (info instanceof YangAugment) {
-                getBeanFiles(info).addIsSubTreeFilteredFlag(config);
-            }
 
             YangLeavesHolder holder = (YangLeavesHolder) info;
             boolean isLeafPresent = holder.getListOfLeaf() != null && !holder
@@ -261,20 +258,21 @@
              * Output
              */
             if (isLeafPresent || isLeafListPresent) {
-                getBeanFiles(info).addCurNodeLeavesInfoToTempFiles((YangNode) info,
-                                                                   config);
+                bean.addCurNodeLeavesInfoToTempFiles((YangNode) info,
+                                                     config);
             }
             //Add value leaf flag attribute to temp file.
             if (isLeafPresent) {
-                getBeanFiles(info).addValueLeafFlag(config, (YangNode) info);
+                bean.addValueLeafFlag(config, (YangNode) info);
             }
             if (((YangNode) info).isOpTypeReq()) {
                 // Add operation type as an attribute.
-                getBeanFiles(info).addOperationTypeToTempFiles((YangNode) info,
-                                                               config);
+                bean.addOperationTypeToTempFiles((YangNode) info,
+                                                 config);
+                bean.addIsSubTreeFilteredFlag(config);
                 if (isLeafPresent) {
                     //Add select leaf flag attribute to temp file.
-                    getBeanFiles(info).addSelectLeafFlag(config);
+                    bean.addSelectLeafFlag(config);
                 }
             }
         } else if (info instanceof YangTypeHolder) {
@@ -433,21 +431,18 @@
         }
 
         generateCodeOfNode(info, config);
-        TempJavaCodeFragmentFiles tempFiles =
-                info.getTempJavaCodeFragmentFiles();
+        TempJavaBeanFragmentFiles tempFiles = getBeanFiles(info);
         if (!(info instanceof YangChoice)) {
-            getBeanFiles(info).addYangAugmentedMap(config);
+            tempFiles.addYangAugmentedMap(config);
         }
         if (info instanceof YangCase) {
             YangNode parent = ((YangCase) info).getParent();
             JavaQualifiedTypeInfoTranslator typeInfo =
                     getQualifierInfoForCasesParent(parent, config);
-            getBeanFiles(info).getJavaExtendsListHolder()
-                    .addToExtendsList(typeInfo, (YangNode) info,
-                                      tempFiles.getBeanTempFiles());
+            tempFiles.getJavaExtendsListHolder()
+                    .addToExtendsList(typeInfo, (YangNode) info, tempFiles);
 
-            getBeanFiles(info).addParentInfoInCurNodeTempFile((YangNode) info,
-                                                              config);
+            tempFiles.addParentInfoInCurNodeTempFile((YangNode) info, config);
         }
     }
 
@@ -629,7 +624,6 @@
                                          YangPluginConfig config) {
 
         List<String> clsInfo = new ArrayList<>();
-        String add = null;
         while (node.getParent() != null) {
             if (node instanceof YangJavaAugmentTranslator) {
                 YangJavaAugmentTranslator augment =
@@ -658,9 +652,6 @@
                                       subModule.getRevision(),
                                       config.getConflictResolver()));
         }
-        if (add != null) {
-            clsInfo.add(add);
-        }
         clsInfo.add(getCamelCase(node.getName(), config.getConflictResolver()));
 
         int size = clsInfo.size();
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 4f8c94d..7bc490f 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
@@ -17,7 +17,6 @@
 package org.onosproject.yangutils.translator.tojava.utils;
 
 import org.onosproject.yangutils.datamodel.RpcNotificationContainer;
-import org.onosproject.yangutils.datamodel.YangAugment;
 import org.onosproject.yangutils.datamodel.YangAugmentableNode;
 import org.onosproject.yangutils.datamodel.YangChoice;
 import org.onosproject.yangutils.datamodel.YangDerivedInfo;
@@ -38,7 +37,6 @@
 import org.onosproject.yangutils.translator.tojava.TempJavaEventFragmentFiles;
 import org.onosproject.yangutils.translator.tojava.TempJavaServiceFragmentFiles;
 import org.onosproject.yangutils.translator.tojava.TempJavaTypeFragmentFiles;
-import org.onosproject.yangutils.utils.io.YangPluginConfig;
 
 import java.io.File;
 import java.io.IOException;
@@ -93,7 +91,7 @@
 import static org.onosproject.yangutils.translator.tojava.utils.MethodBodyTypes.ENUM_METHOD_INT_VALUE;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodBodyTypes.ENUM_METHOD_STRING_VALUE;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.builderMethod;
-import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.generateBuildMethodInAugmentClass;
+import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.generateBuildMethodForSubTree;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getAddAugmentInfoMethodImpl;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getAddAugmentInfoMethodInterface;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getAugmentsDataMethodForService;
@@ -442,8 +440,8 @@
         methods.add(((TempJavaCodeFragmentFilesContainer) curNode)
                             .getTempJavaCodeFragmentFiles()
                             .addBuildMethodImpl());
-        if (curNode instanceof YangAugment) {
-            methods.add(generateBuildMethodInAugmentClass(className));
+        if (curNode.isOpTypeReq()) {
+            methods.add(generateBuildMethodForSubTree(curNode));
         }
         methods.add(addDefaultConstructor(curNode, PUBLIC, BUILDER));
 
@@ -472,8 +470,6 @@
 
         JavaFileInfoTranslator fileInfo =
                 ((JavaFileInfoContainer) curNode).getJavaFileInfo();
-        YangPluginConfig config = fileInfo.getPluginConfig();
-
         boolean leavesPresent;
         YangLeavesHolder leavesHolder;
         if (curNode instanceof YangLeavesHolder) {
@@ -531,7 +527,7 @@
                 methods.add(getProcessSubtreeFilteringStart(curNode) +
                                     getProcessSubtreeFunctionBody(curNode) +
                                     augmentableSubTreeFiltering +
-                                    getProcessSubTreeFilteringEnd(name, curNode));
+                                    getProcessSubTreeFilteringEnd(name));
 
                 if (curNode instanceof YangLeavesHolder) {
                     if (((YangLeavesHolder) curNode).getListOfLeaf() != null &&
@@ -741,11 +737,9 @@
      *
      * @param curNode current node
      * @param methods list of methods string
-     * @throws IOException a violation in IO rule
      */
     private static void addTypedefToString(YangNode curNode,
-                                           List<String> methods)
-            throws IOException {
+                                           List<String> methods) {
         //To string method.
 
         List<YangType<?>> types = ((YangTypeDef) curNode).getTypeList();
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java
index a93a5cf..b0a7032 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java
@@ -17,6 +17,7 @@
 package org.onosproject.yangutils.translator.tojava.utils;
 
 import org.onosproject.yangutils.datamodel.InvalidOpTypeHolder;
+import org.onosproject.yangutils.datamodel.RpcNotificationContainer;
 import org.onosproject.yangutils.datamodel.YangAtomicPath;
 import org.onosproject.yangutils.datamodel.YangCompilerAnnotation;
 import org.onosproject.yangutils.datamodel.YangEnum;
@@ -1224,7 +1225,8 @@
      * @return enum's constructor
      */
     static String getEnumsConstructor(String className) {
-        StringBuilder builder = new StringBuilder();
+        StringBuilder builder = new StringBuilder(
+                getJavaDoc(TYPE_CONSTRUCTOR, className, false, null));
         String clsName = getSmallCase(className);
         LinkedHashMap<String, String> map = new LinkedHashMap<>();
         map.put(clsName, INT);
@@ -1861,15 +1863,19 @@
     }
 
     /**
-     * Returns build method for augment class.
+     * Returns build method for subtree filtering in class.
      *
-     * @param name class name
-     * @return build method for augment class
+     * @param node YANG node
+     * @return build method for subtree filtering in class
      */
-    static String generateBuildMethodInAugmentClass(String name) {
+    static String generateBuildMethodForSubTree(YangNode node) {
+        String name = getCapitalCase(node.getJavaClassNameOrBuiltInType());
         StringBuilder builder = new StringBuilder(getJavaDoc(BUILD_METHOD,
                                                              name, false, null));
         String def = DEFAULT_CAPS + name;
+        if (node instanceof RpcNotificationContainer) {
+            def = name + OP_PARAM;
+        }
         builder.append(methodSignature(BUILD_FOR_FILTER, null, PUBLIC, null,
                                        name, null, CLASS_TYPE))
                 .append(EIGHT_SPACE_INDENTATION).append(SUBTREE_FILTERED)
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 f680b50..b901b62 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
@@ -302,7 +302,6 @@
                              String paramType, boolean isBuilderSetter, String setterVal) {
         StringBuilder builder = new StringBuilder();
         String body;
-        String cond;
         switch (type) {
             case GETTER:
                 return getReturnString(paraName, space);
@@ -323,7 +322,7 @@
                         NEW + SPACE + paraName + getOpenCloseParaWithValue(
                                 THIS) + signatureClose(), space);
             case CONSTRUCTOR:
-                return space + THIS + PERIOD + paraName + SPACE +
+                return space + paraName + SPACE +
                         EQUAL + SPACE + BUILDER_LOWER_CASE + OBJECT + PERIOD +
                         prefix + methodName +
                         brackets(OPEN_CLOSE_BRACKET, null, null) +
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/SubtreeFilteringMethodsGenerator.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/SubtreeFilteringMethodsGenerator.java
index fb7b732..2a1b28f 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/SubtreeFilteringMethodsGenerator.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/SubtreeFilteringMethodsGenerator.java
@@ -60,16 +60,15 @@
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.methodClose;
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.multiAttrMethodSignature;
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.signatureClose;
-import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.valueAssign;
 import static org.onosproject.yangutils.translator.tojava.utils.TranslatorUtils.getBeanFiles;
 import static org.onosproject.yangutils.utils.UtilConstants.ADD_STRING;
 import static org.onosproject.yangutils.utils.UtilConstants.AND_OPERATION;
 import static org.onosproject.yangutils.utils.UtilConstants.APP_INSTANCE;
+import static org.onosproject.yangutils.utils.UtilConstants.BIT_SET;
 import static org.onosproject.yangutils.utils.UtilConstants.BOOLEAN_DATA_TYPE;
-import static org.onosproject.yangutils.utils.UtilConstants.BOOLEAN_WRAPPER;
 import static org.onosproject.yangutils.utils.UtilConstants.BREAK;
-import static org.onosproject.yangutils.utils.UtilConstants.BUILD;
 import static org.onosproject.yangutils.utils.UtilConstants.BUILDER;
+import static org.onosproject.yangutils.utils.UtilConstants.BUILDER_LOWER_CASE;
 import static org.onosproject.yangutils.utils.UtilConstants.BUILD_FOR_FILTER;
 import static org.onosproject.yangutils.utils.UtilConstants.CLOSE_CURLY_BRACKET;
 import static org.onosproject.yangutils.utils.UtilConstants.CLOSE_PARENTHESIS;
@@ -88,6 +87,7 @@
 import static org.onosproject.yangutils.utils.UtilConstants.IS_ANY_SELECT_OR_CONTAINMENT_NODE_FLAG;
 import static org.onosproject.yangutils.utils.UtilConstants.IS_EMPTY;
 import static org.onosproject.yangutils.utils.UtilConstants.IS_SELECT_ALL_SCHEMA_CHILD_FLAG;
+import static org.onosproject.yangutils.utils.UtilConstants.LEAF_IDENTIFIER;
 import static org.onosproject.yangutils.utils.UtilConstants.NEW_LINE;
 import static org.onosproject.yangutils.utils.UtilConstants.NOT;
 import static org.onosproject.yangutils.utils.UtilConstants.NULL;
@@ -109,9 +109,11 @@
 import static org.onosproject.yangutils.utils.UtilConstants.SELECT_LEAF;
 import static org.onosproject.yangutils.utils.UtilConstants.SELECT_OR_CONTAINMENT_NODE_PARAM;
 import static org.onosproject.yangutils.utils.UtilConstants.SEMI_COLON;
+import static org.onosproject.yangutils.utils.UtilConstants.SET_METHOD_PREFIX;
 import static org.onosproject.yangutils.utils.UtilConstants.SIXTEEN_SPACE_INDENTATION;
 import static org.onosproject.yangutils.utils.UtilConstants.SPACE;
 import static org.onosproject.yangutils.utils.UtilConstants.STF_BUILDER_PARAM;
+import static org.onosproject.yangutils.utils.UtilConstants.SUBTREE_FILTERED;
 import static org.onosproject.yangutils.utils.UtilConstants.SUBTREE_FILTERING_RESULT_BUILDER;
 import static org.onosproject.yangutils.utils.UtilConstants.THIRTY_TWO_SPACE_INDENTATION;
 import static org.onosproject.yangutils.utils.UtilConstants.TO;
@@ -122,6 +124,8 @@
 import static org.onosproject.yangutils.utils.UtilConstants.TWENTY_SPACE_INDENTATION;
 import static org.onosproject.yangutils.utils.UtilConstants.TWO;
 import static org.onosproject.yangutils.utils.UtilConstants.VALUE_LEAF;
+import static org.onosproject.yangutils.utils.UtilConstants.VALUE_LEAF_SET;
+import static org.onosproject.yangutils.utils.UtilConstants.ZERO;
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCamelCase;
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase;
 
@@ -203,11 +207,28 @@
          * isAnySelectOrContainmentNode = true;
          * subTreeFilteringResultBuilder.leaf(appInstance.leaf());
          * }*/
+
+/*        if (isSubTreeFiltered && !appInstance.isLeafValueSet(
+                LeafIdentifier.LEAF2)) {
+            subTreeFilteringResultBuilder.leaf2(leaf2());
+        } else {
+            return false;
+        }*/
+        String condition = SUBTREE_FILTERED + SPACE + AND_OPERATION + SPACE + NOT +
+                APP_INSTANCE + PERIOD + VALUE_LEAF_SET +
+                getOpenCloseParaWithValue(
+                        LEAF_IDENTIFIER + PERIOD + attributeName.toUpperCase());
         return getIfConditionBegin(EIGHT_SPACE_INDENTATION, getLeafFlagSetString(
                 attributeName, VALUE_LEAF, EMPTY_STRING, GET)) +
                 getIfConditionBegin(TWELVE_SPACE_INDENTATION, attrQualifiedType) +
-                getReturnString(FALSE, SIXTEEN_SPACE_INDENTATION) +
-                signatureClose() +
+                getIfConditionBegin(SIXTEEN_SPACE_INDENTATION, condition) +
+                TWENTY_SPACE_INDENTATION + SUBTREE_FILTERING_RESULT_BUILDER +
+                PERIOD + attributeName + getOpenCloseParaWithValue(
+                attributeName + OPEN_CLOSE_BRACKET_STRING) + signatureClose() +
+                SIXTEEN_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + ELSE +
+                OPEN_CURLY_BRACKET + NEW_LINE + getReturnString(
+                FALSE, TWENTY_SPACE_INDENTATION) + signatureClose() +
+                SIXTEEN_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + NEW_LINE +
                 TWELVE_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + ELSE +
                 OPEN_CURLY_BRACKET + NEW_LINE +
                 getSubTreeBuilderCallString(SIXTEEN_SPACE_INDENTATION, attributeName,
@@ -215,8 +236,7 @@
                 getElseIfConditionBegin(EIGHT_SPACE_INDENTATION, getLeafFlagSetString(
                         attributeName, SELECT_LEAF, EMPTY_STRING, GET) + SPACE +
                         OR_OPERATION + SPACE + IS_SELECT_ALL_SCHEMA_CHILD_FLAG) +
-                valueAssign(IS_ANY_SELECT_OR_CONTAINMENT_NODE_FLAG, TRUE,
-                            TWELVE_SPACE_INDENTATION) +
+                getSelectOrContainmentAssignString() +
                 getSubTreeBuilderCallString(TWELVE_SPACE_INDENTATION, attributeName,
                                             EIGHT_SPACE);
     }
@@ -449,15 +469,14 @@
             name = caseName;
         }
 
-        String javadoc = "\n   /**\n" +
-                "     * Checks if the passed " + name +
-                " maps the content match query condition.\n" +
+        String javadoc = "\n    /**\n" +
+                "     * Checks if the passed " + name + " maps the content " +
+                "match query condition.\n" +
                 "     *\n" +
-                "     * @param " + instance + SPACE +
-                instance + SPACE + "being passed to check" +
-                " for" +
-                " content match\n" +
-                "     * @param isSelectAllSchemaChild is select all schema child\n" +
+                "     * @param " + instance + SPACE + instance + SPACE +
+                "being passed to check for content match\n" +
+                "     * @param isSelectAllSchemaChild is select all schema " +
+                "child\n" +
                 "     * @return match result\n" +
                 "     */\n";
         Map<String, String> param = new LinkedHashMap<>();
@@ -471,9 +490,9 @@
         builder.append(getNewInstance(builderNamePrefix + BUILDER,
                                       SUBTREE_FILTERING_RESULT_BUILDER,
                                       EIGHT_SPACE_INDENTATION, EMPTY_STRING));
-        builder.append(getNewInstance(BOOLEAN_WRAPPER,
+        builder.append(getNewInstance(BIT_SET,
                                       IS_ANY_SELECT_OR_CONTAINMENT_NODE_FLAG,
-                                      EIGHT_SPACE_INDENTATION, FALSE));
+                                      EIGHT_SPACE_INDENTATION, EMPTY_STRING));
         if (caseName != null) {
             builder.append(getCaseCastString(javaFileInfo, instance, curNode));
         }
@@ -494,7 +513,7 @@
     private static String getProcessStfMethods(
             String methodName, YangNode curNode, String path, int file)
             throws IOException {
-        StringBuilder builder = new StringBuilder();
+        StringBuilder builder = new StringBuilder(EMPTY_STRING);
         JavaFileInfoTranslator javaFileInfo =
                 ((JavaFileInfoContainer) curNode).getJavaFileInfo();
         String instance = APP_INSTANCE;
@@ -509,8 +528,8 @@
         Map<String, String> param = new LinkedHashMap<>();
         param.put(instance, name);
         param.put(STF_BUILDER_PARAM, builderNamePrefix + BUILDER);
-        param.put(SELECT_OR_CONTAINMENT_NODE_PARAM, BOOLEAN_WRAPPER);
-        param.put(SELECT_ALL_CHILD_SCHEMA_PARAM, BOOLEAN_WRAPPER);
+        param.put(SELECT_OR_CONTAINMENT_NODE_PARAM, BIT_SET);
+        param.put(SELECT_ALL_CHILD_SCHEMA_PARAM, BOOLEAN_DATA_TYPE);
 
         builder.append(multiAttrMethodSignature(methodName, null,
                                                 PRIVATE, BOOLEAN_DATA_TYPE, param, CLASS_TYPE));
@@ -605,11 +624,10 @@
     /**
      * Returns is filter content match close.
      *
-     * @param name    name of class
-     * @param curNode current node
+     * @param name name of class
      * @return is filter content match close
      */
-    static String getProcessSubTreeFilteringEnd(String name, YangNode curNode) {
+    static String getProcessSubTreeFilteringEnd(String name) {
         /* generate code will look like this.
         if (!isSelectAllSchemaChild && !isAnySelectOrContainmentNode) {
             return processSubtreeFiltering(appInstance, true);
@@ -619,19 +637,16 @@
 
         StringBuilder builder = new StringBuilder();
         String cond1 = NOT + IS_SELECT_ALL_SCHEMA_CHILD_FLAG + SPACE + AND_OPERATION +
-                SPACE + NOT + IS_ANY_SELECT_OR_CONTAINMENT_NODE_FLAG;
+                SPACE + NOT + IS_ANY_SELECT_OR_CONTAINMENT_NODE_FLAG +
+                PERIOD + GET + getOpenCloseParaWithValue(ZERO);
         String call = PROCESS_SUBTREE_FILTERING + getOpenCloseParaWithValue(
                 APP_INSTANCE + COMMA + SPACE + TRUE);
         builder.append(getIfConditionBegin(EIGHT_SPACE_INDENTATION, cond1))
                 .append(getReturnString(call, TWELVE_SPACE_INDENTATION))
                 .append(signatureClose()).append(methodClose(EIGHT_SPACE));
-        String build = BUILD;
-        if (curNode instanceof YangAugment) {
-            build = BUILD_FOR_FILTER;
-        }
 
         call = getOpenCloseParaWithValue(name) + SPACE +
-                SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + build +
+                SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + BUILD_FOR_FILTER +
                 OPEN_CLOSE_BRACKET_STRING;
         builder.append(getReturnString(call, EIGHT_SPACE_INDENTATION))
                 .append(signatureClose()).append(methodClose(FOUR_SPACE))
@@ -666,7 +681,8 @@
             cast = name;
         }
 
-        String resultString = cast + PERIOD + PROCESS_SUBTREE_FILTERING + OPEN_PARENTHESIS
+        String resultString = cast + NEW_LINE + TWENTY_EIGHT_SPACE_INDENTATION +
+                PERIOD + PROCESS_SUBTREE_FILTERING + OPEN_PARENTHESIS
                 + APP_INSTANCE + PERIOD + name + OPEN_CLOSE_BRACKET_STRING
                 + COMMA + SPACE + FALSE + CLOSE_PARENTHESIS + SEMI_COLON +
                 NEW_LINE;
@@ -677,18 +693,20 @@
                 .append(getSelectOrContainmentAssignString());
 
         builder.append(getIfConditionBegin(TWELVE_SPACE_INDENTATION,
-                                           getAppInstanceCondition(name)));
+                                           getAppInstanceCondition(name, NOT)));
 
         String assignment = SIXTEEN_SPACE_INDENTATION + clsInfo + SPACE + RESULT +
-                signatureClose();
+                SPACE + EQUAL + SPACE + NULL + signatureClose();
 
         builder.append(assignment)
                 .append(getIfConditionBegin(SIXTEEN_SPACE_INDENTATION,
                                             SELECT_ALL_CHILD));
+/*
+        result = ((DefaultInterfaces)(DefaultInterfaces.builder()
+                .build())).processSubtreeFiltering(appInstance.interfaces(),
+                                                   true);*/
 
-        assignment = TWENTY_SPACE_INDENTATION + RESULT + SPACE + EQUAL + SPACE +
-                getAppInstanceAttrString(name) + signatureClose();
-
+        assignment = getDummyObjectCreation(node, name, clsInfo, type, classCast, false);
         builder.append(assignment).append(SIXTEEN_SPACE_INDENTATION).append(
                 CLOSE_CURLY_BRACKET).append(ELSE).append(OPEN_CURLY_BRACKET)
                 .append(NEW_LINE);
@@ -704,18 +722,20 @@
                 PERIOD + name + getOpenCloseParaWithValue(RESULT) +
                 signatureClose();
         builder.append(assignment).append(methodClose(SIXTEEN_SPACE)).append(
-                methodClose(TWELVE_SPACE)).append(methodClose(EIGHT_SPACE));
+                TWELVE_SPACE_INDENTATION).append(CLOSE_CURLY_BRACKET)
+                .append(getSubTreeFilteredCondition(name)).append(methodClose(EIGHT_SPACE));
         return builder.toString();
     }
 
-    private static String getAppInstanceCondition(String name) {
+    private static String getAppInstanceCondition(String name, String condition) {
         return APP_INSTANCE + PERIOD + name + OPEN_CLOSE_BRACKET_STRING + SPACE +
-                NOT + EQUAL + SPACE + NULL;
+                condition + EQUAL + SPACE + NULL;
     }
 
     private static String getSelectOrContainmentAssignString() {
         return TWELVE_SPACE_INDENTATION + IS_ANY_SELECT_OR_CONTAINMENT_NODE_FLAG +
-                SPACE + EQUAL + SPACE + TRUE + signatureClose();
+                PERIOD + SET_METHOD_PREFIX + getOpenCloseParaWithValue(ZERO) +
+                signatureClose();
     }
 
     /**
@@ -747,8 +767,8 @@
         if (node != null && node instanceof YangChoice) {
             cast = name;
         }
-        String resultString = cast + PERIOD +
-                PROCESS_SUBTREE_FILTERING + OPEN_PARENTHESIS +
+        String resultString = cast + NEW_LINE + TWENTY_EIGHT_SPACE_INDENTATION +
+                PERIOD + PROCESS_SUBTREE_FILTERING + OPEN_PARENTHESIS +
                 name + "2" + COMMA + SPACE + FALSE + CLOSE_PARENTHESIS + SEMI_COLON +
                 NEW_LINE;
         /*
@@ -756,14 +776,38 @@
          */
         builder.append(getIfConditionBegin(EIGHT_SPACE_INDENTATION,
                                            IS_SELECT_ALL_SCHEMA_CHILD_FLAG))
-                .append(getForLoopString(TWELVE_SPACE_INDENTATION, type, name,
+                .append(getIfConditionBegin(TWELVE_SPACE_INDENTATION,
+                                            getAppInstanceCondition(name, NOT)))
+                .append(getForLoopString(SIXTEEN_SPACE_INDENTATION, type, name,
                                          getAppInstanceAttrString(name)));
+        String assignment;
+        if (!isLeafList) {
+            builder.append(TWENTY_SPACE_INDENTATION).append(type).append(SPACE)
+                    .append(RESULT).append(signatureClose());
+            assignment = getDummyObjectCreation(node, name, type, clsInfo,
+                                                classCast, true);
+            builder.append(assignment);
+            assignment = TWENTY_SPACE_INDENTATION +
+                    SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + ADD_STRING +
+                    getCapitalCase(TO) + caps + getOpenCloseParaWithValue(RESULT) +
+                    signatureClose();
+            builder.append(assignment);
+        } else {
+            assignment = TWENTY_SPACE_INDENTATION +
+                    SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + ADD_STRING +
+                    getCapitalCase(TO) + caps + getOpenCloseParaWithValue(name) +
+                    signatureClose();
+            builder.append(assignment);
+        }
+        builder.append(methodClose(SIXTEEN_SPACE))
+                .append(TWELVE_SPACE_INDENTATION).append(CLOSE_CURLY_BRACKET);
 
-        String assignment = SIXTEEN_SPACE_INDENTATION +
-                SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + ADD_STRING +
-                getCapitalCase(TO) + caps + getOpenCloseParaWithValue(name) +
-                signatureClose();
-        builder.append(assignment).append(methodClose(TWELVE_SPACE));
+/*    } else {
+        if (isSubTreeFiltered && leafList2() != null) {
+            subTreeFilteringResultBuilder.addToLeafList2(leafList2());
+        }
+    }*/
+        builder.append(getSubTreeFilteredCondition(name));
 
         String cond = name + OPEN_CLOSE_BRACKET_STRING + SPACE + NOT + EQUAL +
                 SPACE + NULL;
@@ -780,9 +824,9 @@
         builder.append(getIfConditionBegin(TWELVE_SPACE_INDENTATION, cond));
 
         if (isLeafList) {
-            cond = getAppInstanceCondition(name) + SPACE + OR_OPERATION + SPACE +
-                    APP_INSTANCE + PERIOD + name + OPEN_CLOSE_BRACKET_STRING +
-                    PERIOD + IS_EMPTY;
+            cond = getAppInstanceCondition(name, EQUAL) + SPACE + OR_OPERATION +
+                    SPACE + APP_INSTANCE + PERIOD + name +
+                    OPEN_CLOSE_BRACKET_STRING + PERIOD + IS_EMPTY;
             /*
              * If there is no app instance to perform content match
              */
@@ -829,8 +873,8 @@
                     .append(methodClose(SIXTEEN_SPACE)); // for instance iterator
 
         } else {
-            cond = getAppInstanceCondition(name) + SPACE + AND_OPERATION +
-                    SPACE + getAppInstanceAttrString(name) +
+            cond = getAppInstanceCondition(name, NOT) + SPACE + AND_OPERATION +
+                    SPACE + NOT + getAppInstanceAttrString(name) +
                     PERIOD + IS_EMPTY;
             /*if there is any app instance entry*/
             builder.append(getIfConditionBegin(SIXTEEN_SPACE_INDENTATION,
@@ -852,13 +896,14 @@
             assignment = THIRTY_TWO_SPACE_INDENTATION +
                     SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + ADD_STRING +
                     getCapitalCase(TO) + caps + getOpenCloseParaWithValue(
-                    name) + signatureClose();
+                    RESULT) + signatureClose();
             builder.append(assignment).append(methodClose(TWENTY_EIGHT_SPACE))
                     //loop all the app instance(s)
                     .append(methodClose(TWENTY_FOUR_SPACE))
                     //loop all the query condition instance(s)
                     .append(methodClose(TWENTY_SPACE))
-                    .append(methodClose(SIXTEEN_SPACE));
+                    .append(SIXTEEN_SPACE_INDENTATION).append(CLOSE_CURLY_BRACKET)
+                    .append(getSubTreeFilteredCondition(name));
             //if there is any app instance entry
         }
 
@@ -869,7 +914,7 @@
         if (isLeafList) {
             builder.append(getSelectOrContainmentAssignString());
         }
-        cond = getAppInstanceCondition(name) + SPACE + AND_OPERATION +
+        cond = getAppInstanceCondition(name, NOT) + SPACE + AND_OPERATION +
                 SPACE + NOT + getAppInstanceAttrString(name) + PERIOD + IS_EMPTY;
         builder.append(getIfConditionBegin(SIXTEEN_SPACE_INDENTATION, cond))
                 .append(getForLoopString(SIXTEEN_SPACE_INDENTATION, type,
@@ -889,7 +934,7 @@
 
     //Returns method string for op params augmented syntax
     static String getAugmentableSubTreeFiltering() {
-        return "        for (Object augmentInfo : this.yangAugmentedInfoMap()" +
+        return "        for (Object augmentInfo : yangAugmentedInfoMap()" +
                 ".values()) {\n" +
                 "            Object appInstanceInfo = appInstance.yangAugmentedInfo(" +
                 "augmentInfo.getClass());\n" +
@@ -916,6 +961,22 @@
                 "        }\n";
     }
 
+    private static String getSubTreeFilteredCondition(String name) {
+        StringBuilder builder = new StringBuilder();
+        String cond = SUBTREE_FILTERED + SPACE + AND_OPERATION + SPACE + name +
+                OPEN_CLOSE_BRACKET_STRING + SPACE + NOT + EQUAL + SPACE + NULL;
+
+        builder.append(ELSE).append(OPEN_CURLY_BRACKET).append(NEW_LINE)
+                .append(getIfConditionBegin(SIXTEEN_SPACE_INDENTATION, cond))
+                .append(TWENTY_SPACE_INDENTATION)
+                .append(SUBTREE_FILTERING_RESULT_BUILDER).append(PERIOD)
+                .append(name).append(getOpenCloseParaWithValue(name)).append(
+                signatureClose()).append(SIXTEEN_SPACE_INDENTATION).append(
+                CLOSE_CURLY_BRACKET).append(NEW_LINE).append(TWELVE_SPACE_INDENTATION)
+                .append(CLOSE_CURLY_BRACKET).append(NEW_LINE);
+        return builder.toString();
+    }
+
     private static String getNameOfClassForIfCase(YangNode curNode) {
         String name = null;
         JavaFileInfoTranslator parentInfo;
@@ -951,4 +1012,47 @@
         return null;
     }
 
+    private static String getDummyObjectCreation(YangNode node, String name,
+                                                 String clsInfo, String type,
+                                                 String classCast, boolean isList) {
+        String para = getAppInstanceAttrString(name);
+        if (isList) {
+            para = name;
+        }
+        if (node != null && node instanceof YangChoice) {
+            return getChoiceReflectionResult(name, clsInfo);
+        }
+        return TWENTY_SPACE_INDENTATION + RESULT + SPACE + EQUAL + SPACE +
+                getOpenCloseParaWithValue(
+                        classCast + type + PERIOD + BUILDER_LOWER_CASE +
+                                OPEN_CLOSE_BRACKET_STRING + NEW_LINE +
+                                TWENTY_EIGHT_SPACE_INDENTATION + PERIOD +
+                                BUILD_FOR_FILTER + OPEN_CLOSE_BRACKET_STRING) +
+                PERIOD + PROCESS_SUBTREE_FILTERING + getOpenCloseParaWithValue(
+                para + COMMA + SPACE + TRUE) + signatureClose();
+
+    }
+
+    private static String getChoiceReflectionResult(String name, String returnType) {
+        String call = "appInstance." + name + "()";
+        return "                    Class<?>[] classArray = " + call + "" +
+                ".getClass()" +
+                ".getInterfaces();\n" +
+                "                    Class<?> caseClass = classArray[0];\n" +
+                "                    try {\n" +
+                "                        Object obj1 = caseClass.newInstance();\n" +
+                "                        Method method = caseClass.getMethod(\"builder\", caseClass);\n" +
+                "                        Object obj = method.invoke(obj1," +
+                " (Object) null);\n" +
+                "                        method = caseClass.getMethod(\"build\", caseClass);\n" +
+                "                        Object obj2 = method.invoke(obj, " +
+                "(Object) null);\n" +
+                "                        method = caseClass.getMethod(\"processSubtreeFiltering\", caseClass);\n" +
+                "                        result = (" + returnType + ") method.invoke" +
+                "(obj2, " + call + ", true);\n" +
+                "                    } catch (NoSuchMethodException | InstantiationException |\n" +
+                "                            IllegalAccessException | InvocationTargetException e) {\n" +
+                "                        e.printStackTrace();\n" +
+                "                    }\n";
+    }
 }
diff --git a/generator/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java b/generator/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java
index 8266eca..3a1a1f5 100644
--- a/generator/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java
+++ b/generator/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java
@@ -167,11 +167,6 @@
     public static final String JAVA_DOC_BUILD = " * Builds object of ";
 
     /**
-     * JavaDocs's return statement for build method.
-     */
-    public static final String JAVA_DOC_BUILD_RETURN = "object of ";
-
-    /**
      * JavaDocs's statement for builder object.
      */
     public static final String BUILDER_OBJECT = "builder object of ";
@@ -238,11 +233,6 @@
     public static final String COMPARE_TO = "compareTo";
 
     /**
-     * Static attribute for period.
-     */
-    public static final String INVOKE = "invoke";
-
-    /**
      * Static attribute for parse byte.
      */
     public static final String PARSE_BYTE = "parseByte";
@@ -340,11 +330,6 @@
     public static final String SCHEMA_NAME = "schemaName";
 
     /**
-     * Static attribute for schema name value.
-     */
-    public static final String STR_VAL = "stringValue";
-
-    /**
      * Static attribute for validateRange.
      */
     public static final String VALIDATE_RANGE = "validateRange";
@@ -506,11 +491,6 @@
     public static final String SUBJECT = "Subject";
 
     /**
-     * Static attribute for ListenerRegistry.
-     */
-    public static final String LISTENER_REG = "ListenerRegistry";
-
-    /**
      * Static attribute for ListenerService.
      */
     public static final String LISTENER_SERVICE = "ListenerService";
@@ -551,11 +531,6 @@
     public static final String LEAFREF = "leafref";
 
     /**
-     * Static attribute for identityref string.
-     */
-    public static final String IDENTITYREF = "identityref";
-
-    /**
      * Static attribute for output variable of rpc.
      */
     public static final String RPC_INPUT_VAR_NAME = "inputVar";
@@ -576,11 +551,6 @@
     public static final String ADD = "+";
 
     /**
-     * Static attribute for single quote.
-     */
-    public static final String SINGLE_QUOTE = "\'";
-
-    /**
      * Static attribute for quotes.
      */
     public static final String QUOTES = "\"";
@@ -626,11 +596,6 @@
     public static final char CHAR_OF_OPEN_SQUARE_BRACKET = '[';
 
     /**
-     * Static attribute for close square bracket character.
-     */
-    public static final char CHAR_OF_CLOSE_SQUARE_BRACKET = ']';
-
-    /**
      * Static attribute for slash string.
      */
     public static final String SLASH_FOR_STRING = "/";
@@ -656,11 +621,6 @@
     public static final String ADD_STRING = "add";
 
     /**
-     * Static attribute for string replace syntax.
-     */
-    public static final String REPLACE_STRING = "replace";
-
-    /**
      * Static attribute for string trim syntax.
      */
     public static final String TRIM_STRING = "trim";
@@ -735,11 +695,6 @@
     public static final String IF = "if";
 
     /**
-     * Static attribute for else-if.
-     */
-    public static final String ELSE_IF = "else if";
-
-    /**
      * Static attribute for of.
      */
     public static final String OF = "of";
@@ -889,37 +844,11 @@
     public static final String GET_METHOD_PREFIX = "get";
 
     /**
-     * Static attribute for getter method prefix.
-     */
-    public static final String GET_METHOD = "getMethod";
-
-    /**
-     * Static attribute for getter method prefix.
-     */
-    public static final String GET_CLASS = "getClass()";
-
-    /**
      * Static attribute for setter method prefix.
      */
     public static final String SET_METHOD_PREFIX = "set";
 
     /**
-     * Static attribute for get filter leaf flags.
-     */
-    public static final String GET_VALUE_LEAF_FLAGS = "getValueLeafFlags";
-
-    /**
-     * Static attribute for get select filter leaf flags.
-     */
-    public static final String GET_SELECT_LEAF_FLAGS = "getSelectLeafFlags";
-
-
-    /**
-     * Static attribute for getLeafIndex.
-     */
-    public static final String GET_LEAF_INDEX = "getLeafIndex()";
-
-    /**
      * Static attribute for op param.
      */
     public static final String OP_PARAM = "OpParam";
@@ -1066,11 +995,6 @@
             TWENTY_EIGHT_SPACE_INDENTATION + FOUR_SPACE_INDENTATION;
 
     /**
-     * continue.
-     */
-    public static final String CONTINUE = "continue";
-
-    /**
      * Static attribute for generated code path.
      */
     public static final String YANG_GEN_DIR = "src/main/java/";
@@ -1335,11 +1259,6 @@
     public static final String BUILDER_LOWER_CASE = "builder";
 
     /**
-     * Static attribute for manager syntax.
-     */
-    public static final String MANAGER = "Manager";
-
-    /**
      * Static attribute for service syntax.
      */
     public static final String SERVICE = "Service";
@@ -1470,9 +1389,9 @@
     public static final String COLLECTION_IMPORTS = "java.util";
 
     /**
-     * Static attribute for regex.
+     * Static attribute for reflect.
      */
-    public static final String REGEX_IMPORTS = "java.util.regex";
+    public static final String REFLECT_IMPORTS = "java.lang.reflect";
 
     /**
      * Static attribute for map.
@@ -1531,9 +1450,9 @@
     public static final String SET_VALUE_PARA = "setValue";
 
     /**
-     * Static attribute for java utilities import package.
+     * Static attribute for Method.
      */
-    public static final String HELPER = "helper";
+    public static final String METHOD = "Method";
 
     /**
      * Static attribute for bitset.
@@ -1583,7 +1502,7 @@
     public static final String SET = "Set";
 
     /**
-     * Comment to be added for autogenerated impl methods.
+     * Comment to be added for auto generated impl methods.
      */
     public static final String YANG_UTILS_TODO =
             "//TODO: YANG utils generated code";
@@ -1749,18 +1668,6 @@
     public static final String FOR = "for";
 
     /**
-     * Static attribute for YangAugmentedOpParamInfo.
-     */
-    public static final String YANG_AUGMENTED_OP_PARAM_INFO =
-            "YangAugmentedOpParamInfo";
-
-    /**
-     * Static attribute for NoSuchMethodException.
-     */
-    public static final String NO_SUCH_METHOD_EXCEPTION =
-            "NoSuchMethodException";
-
-    /**
      * Static attribute for InvocationTargetException.
      */
     public static final String INVOCATION_TARGET_EXCEPTION =
@@ -1771,11 +1678,6 @@
      */
     public static final String INVOCATION_TARGET_EXCEPTION_IMPORT = "import" +
             " java.lang.reflect.InvocationTargetException;\n";
-    /**
-     * Static attribute for IllegalAccessException.
-     */
-    public static final String ILLEGAL_ACCESS_EXCEPTION =
-            "IllegalAccessException";
 
     /**
      * Static attribute for arrayList.
@@ -1861,21 +1763,11 @@
     public static final String BUILDER_INTERFACE = "builder interface";
 
     /**
-     * Static attribute for binary.
-     */
-    public static final String BINARY = "binary";
-
-    /**
      * Static attribute for bits.
      */
     public static final String BITS = "bits";
 
     /**
-     * Static attribute for bits.
-     */
-    public static final String BITS_CAPS = "Bits";
-
-    /**
      * Static attribute for YANG.
      */
     public static final String YANG = "yang";
@@ -1951,11 +1843,6 @@
     public static final String SELECT_ALL_CHILD_SCHEMA_PARAM =
             "isSelectAllSchemaChild";
 
-    /**
-     * Static param for ResultOfProcessSubTree.
-     */
-    public static final String CHOICE_STF_METHOD_NAME =
-            "ResultOfProcessSubTree";
     //File type extension for java classes.
     public static final String JAVA_FILE_EXTENSION = ".java";