[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/SubtreeFilteringMethodsGenerator.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/SubtreeFilteringMethodsGenerator.java
index 952334c..c815027 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
@@ -16,106 +16,113 @@
 
 package org.onosproject.yangutils.translator.tojava.utils;
 
+import org.onosproject.yangutils.datamodel.RpcNotificationContainer;
 import org.onosproject.yangutils.datamodel.YangAugment;
-import org.onosproject.yangutils.datamodel.YangCase;
 import org.onosproject.yangutils.datamodel.YangChoice;
 import org.onosproject.yangutils.datamodel.YangLeafRef;
 import org.onosproject.yangutils.datamodel.YangLeavesHolder;
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangType;
 import org.onosproject.yangutils.translator.tojava.JavaAttributeInfo;
+import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorInfo;
 import org.onosproject.yangutils.translator.tojava.JavaFileInfoContainer;
 import org.onosproject.yangutils.translator.tojava.JavaFileInfoTranslator;
+import org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfoTranslator;
 import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFilesContainer;
 import org.onosproject.yangutils.utils.io.YangPluginConfig;
 
 import java.io.IOException;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
 
 import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.LEAFREF;
 import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.FILTER_CONTENT_MATCH_FOR_LEAF_LIST_MASK;
 import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.FILTER_CONTENT_MATCH_FOR_LEAF_MASK;
 import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.FILTER_CONTENT_MATCH_FOR_NODES_MASK;
+import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.getNodesPackage;
 import static org.onosproject.yangutils.translator.tojava.utils.IndentationType.EIGHT_SPACE;
+import static org.onosproject.yangutils.translator.tojava.utils.IndentationType.FOUR_SPACE;
 import static org.onosproject.yangutils.translator.tojava.utils.IndentationType.SIXTEEN_SPACE;
 import static org.onosproject.yangutils.translator.tojava.utils.IndentationType.TWELVE_SPACE;
 import static org.onosproject.yangutils.translator.tojava.utils.IndentationType.TWENTY_FOUR_SPACE;
 import static org.onosproject.yangutils.translator.tojava.utils.IndentationType.TWENTY_SPACE;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGeneratorUtils.getDataFromTempFileHandle;
+import static org.onosproject.yangutils.translator.tojava.utils.MethodClassTypes.CLASS_TYPE;
+import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getAppInstanceAttrString;
+import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getChoiceChildNodes;
+import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getCollectionIteratorForLoopBegin;
+import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getElseIfConditionBegin;
+import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getEqualEqualString;
+import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getIfConditionBegin;
+import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getLeafFlagSetString;
+import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getOpenCloseParaWithValue;
+import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getReturnString;
+import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getTwoParaEqualsString;
 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.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.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.CATCH;
+import static org.onosproject.yangutils.utils.UtilConstants.BUILD_FOR_FILTER;
+import static org.onosproject.yangutils.utils.UtilConstants.CHOICE_STF_METHOD_NAME;
 import static org.onosproject.yangutils.utils.UtilConstants.CLOSE_CURLY_BRACKET;
 import static org.onosproject.yangutils.utils.UtilConstants.CLOSE_PARENTHESIS;
-import static org.onosproject.yangutils.utils.UtilConstants.COLON;
 import static org.onosproject.yangutils.utils.UtilConstants.COMMA;
-import static org.onosproject.yangutils.utils.UtilConstants.CONTINUE;
+import static org.onosproject.yangutils.utils.UtilConstants.DEFAULT_CAPS;
 import static org.onosproject.yangutils.utils.UtilConstants.EIGHT_SPACE_INDENTATION;
 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_VAR;
 import static org.onosproject.yangutils.utils.UtilConstants.FALSE;
-import static org.onosproject.yangutils.utils.UtilConstants.FOR;
 import static org.onosproject.yangutils.utils.UtilConstants.FOUR_SPACE_INDENTATION;
-import static org.onosproject.yangutils.utils.UtilConstants.GET_CLASS;
-import static org.onosproject.yangutils.utils.UtilConstants.GET_LEAF_INDEX;
-import static org.onosproject.yangutils.utils.UtilConstants.GET_METHOD;
-import static org.onosproject.yangutils.utils.UtilConstants.GET_METHOD_PREFIX;
+import static org.onosproject.yangutils.utils.UtilConstants.GET;
 import static org.onosproject.yangutils.utils.UtilConstants.IF;
-import static org.onosproject.yangutils.utils.UtilConstants.ILLEGAL_ACCESS_EXCEPTION;
-import static org.onosproject.yangutils.utils.UtilConstants.INSTANCE;
-import static org.onosproject.yangutils.utils.UtilConstants.INVOCATION_TARGET_EXCEPTION;
-import static org.onosproject.yangutils.utils.UtilConstants.INVOKE;
+import static org.onosproject.yangutils.utils.UtilConstants.INSTANCE_OF;
 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;
 import static org.onosproject.yangutils.utils.UtilConstants.NEW_LINE;
 import static org.onosproject.yangutils.utils.UtilConstants.NOT;
-import static org.onosproject.yangutils.utils.UtilConstants.NO_SUCH_METHOD_EXCEPTION;
 import static org.onosproject.yangutils.utils.UtilConstants.NULL;
-import static org.onosproject.yangutils.utils.UtilConstants.OBJECT;
-import static org.onosproject.yangutils.utils.UtilConstants.OBJECT_STRING;
 import static org.onosproject.yangutils.utils.UtilConstants.OPEN_CLOSE_BRACKET_STRING;
 import static org.onosproject.yangutils.utils.UtilConstants.OPEN_CURLY_BRACKET;
 import static org.onosproject.yangutils.utils.UtilConstants.OPEN_PARENTHESIS;
+import static org.onosproject.yangutils.utils.UtilConstants.OP_PARAM;
 import static org.onosproject.yangutils.utils.UtilConstants.OR_OPERATION;
 import static org.onosproject.yangutils.utils.UtilConstants.PERIOD;
 import static org.onosproject.yangutils.utils.UtilConstants.PRIVATE;
+import static org.onosproject.yangutils.utils.UtilConstants.PROCESS_CHILD_NODE_STF_PARAM;
 import static org.onosproject.yangutils.utils.UtilConstants.PROCESS_SUBTREE_FILTERING;
 import static org.onosproject.yangutils.utils.UtilConstants.PUBLIC;
-import static org.onosproject.yangutils.utils.UtilConstants.QUOTES;
 import static org.onosproject.yangutils.utils.UtilConstants.RETURN;
+import static org.onosproject.yangutils.utils.UtilConstants.SELECT_ALL_CHILD_SCHEMA_PARAM;
 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.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_FILTERING_RESULT_BUILDER;
 import static org.onosproject.yangutils.utils.UtilConstants.THIRTY_TWO_SPACE_INDENTATION;
-import static org.onosproject.yangutils.utils.UtilConstants.THIS;
 import static org.onosproject.yangutils.utils.UtilConstants.TO;
 import static org.onosproject.yangutils.utils.UtilConstants.TRUE;
-import static org.onosproject.yangutils.utils.UtilConstants.TRY;
 import static org.onosproject.yangutils.utils.UtilConstants.TWELVE_SPACE_INDENTATION;
 import static org.onosproject.yangutils.utils.UtilConstants.TWENTY_EIGHT_SPACE_INDENTATION;
 import static org.onosproject.yangutils.utils.UtilConstants.TWENTY_FOUR_SPACE_INDENTATION;
 import static org.onosproject.yangutils.utils.UtilConstants.TWENTY_SPACE_INDENTATION;
-import static org.onosproject.yangutils.utils.UtilConstants.VALUE;
 import static org.onosproject.yangutils.utils.UtilConstants.VALUE_LEAF;
-import static org.onosproject.yangutils.utils.UtilConstants.YANG_AUGMENTED_INFO;
-import static org.onosproject.yangutils.utils.UtilConstants.YANG_AUGMENTED_INFO_LOWER_CASE;
-import static org.onosproject.yangutils.utils.UtilConstants.YANG_AUGMENTED_INFO_MAP;
-import static org.onosproject.yangutils.utils.UtilConstants.YANG_AUGMENTED_OP_PARAM_INFO;
 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.getSmallCase;
 
 /**
  * Represents generator for subtree filtering methods of generated files
@@ -143,43 +150,45 @@
         String attributeName = javaAttributeInfo.getAttributeName();
         attrQualifiedType = getIfFilterContentMatchMethodImpl(attributeName,
                                                               type);
-        return EIGHT_SPACE_INDENTATION + IF + SPACE + OPEN_PARENTHESIS
-                + VALUE_LEAF +
-                PERIOD + GET_METHOD_PREFIX + OPEN_PARENTHESIS +
-                LEAF_IDENTIFIER + PERIOD + attributeName.toUpperCase() +
-                PERIOD + GET_LEAF_INDEX + CLOSE_PARENTHESIS +
-                CLOSE_PARENTHESIS + SPACE + OPEN_CURLY_BRACKET + NEW_LINE +
-                TWELVE_SPACE_INDENTATION + IF + SPACE + OPEN_PARENTHESIS +
-                attrQualifiedType + CLOSE_PARENTHESIS + SPACE +
-                OPEN_CURLY_BRACKET + NEW_LINE + SIXTEEN_SPACE_INDENTATION +
-                RETURN + SPACE + FALSE + SEMI_COLON + NEW_LINE +
-                TWELVE_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + SPACE +
-                ELSE + SPACE + OPEN_CURLY_BRACKET + NEW_LINE +
-                SIXTEEN_SPACE_INDENTATION +
-                SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + attributeName +
-                OPEN_PARENTHESIS + APP_INSTANCE + PERIOD + attributeName +
-                OPEN_PARENTHESIS + CLOSE_PARENTHESIS +
-                CLOSE_PARENTHESIS + SEMI_COLON + NEW_LINE +
-                TWELVE_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + NEW_LINE +
+        /* if (valueLeafFlags.get(LeafIdentifier.LEAF.getLeafIndex())) {
+         * if (appInstance.leaf() != leaf()) {
+         * return false;
+         * } else {
+         * subTreeFilteringResultBuilder.leaf(appInstance.leaf());
+         * }
+         * } else if (selectLeafFlags.get(LeafIdentifier.LEAF.getLeafIndex()) ||
+         * isSelectAllSchemaChild) {
+         * isAnySelectOrContainmentNode = true;
+         * subTreeFilteringResultBuilder.leaf(appInstance.leaf());
+         * }*/
+        return getIfConditionBegin(EIGHT_SPACE_INDENTATION, getLeafFlagSetString(
+                attributeName, VALUE_LEAF, EMPTY_STRING, GET)) +
+                getIfConditionBegin(TWELVE_SPACE_INDENTATION, attrQualifiedType) +
+                getReturnString(FALSE, SIXTEEN_SPACE_INDENTATION) +
+                signatureClose() +
+                TWELVE_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + SPACE + ELSE +
+                SPACE + OPEN_CURLY_BRACKET + NEW_LINE +
+                getSubTreeBuilderCallString(SIXTEEN_SPACE_INDENTATION, attributeName,
+                                            TWELVE_SPACE) +
                 EIGHT_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + SPACE + ELSE +
-                SPACE + IF + SPACE + OPEN_PARENTHESIS +
-                SELECT_LEAF +
-                PERIOD + GET_METHOD_PREFIX + OPEN_PARENTHESIS +
-                LEAF_IDENTIFIER + PERIOD + attributeName.toUpperCase() +
-                PERIOD + GET_LEAF_INDEX + CLOSE_PARENTHESIS + SPACE +
-                OR_OPERATION + SPACE + IS_SELECT_ALL_SCHEMA_CHILD_FLAG +
-                CLOSE_PARENTHESIS + SPACE + OPEN_CURLY_BRACKET + NEW_LINE +
-                TWELVE_SPACE_INDENTATION +
-                IS_ANY_SELECT_OR_CONTAINMENT_NODE_FLAG + SPACE + EQUAL +
-                SPACE + TRUE + SEMI_COLON + NEW_LINE +
-                TWELVE_SPACE_INDENTATION + SUBTREE_FILTERING_RESULT_BUILDER +
-                PERIOD + attributeName + OPEN_PARENTHESIS + APP_INSTANCE +
-                PERIOD + attributeName + OPEN_CLOSE_BRACKET_STRING +
-                CLOSE_PARENTHESIS + SEMI_COLON + NEW_LINE +
-                EIGHT_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + NEW_LINE;
+                getIfConditionBegin(SPACE, 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) +
+                getSubTreeBuilderCallString(TWELVE_SPACE_INDENTATION, attributeName,
+                                            EIGHT_SPACE);
     }
 
-    private static String getAttrTypeForFilterContentMatchWhenPrimitiveDataType(
+    private static String getSubTreeBuilderCallString(String indent, String
+            name, IndentationType type) {
+        return indent + SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + name +
+                getOpenCloseParaWithValue(APP_INSTANCE + PERIOD + name +
+                                                  OPEN_CLOSE_BRACKET_STRING) +
+                signatureClose() + methodClose(type);
+    }
+
+    private static String getAttrTypeForFcmWhenPrimitiveDataType(
             String attributeName) {
         return/* TODO: Need to check if we can expose the value leaf flag in
          interface.
@@ -194,56 +203,41 @@
                         CLOSE_PARENTHESIS;
     }
 
-    private static String
-    getAttrTypeForFilterContentMatchWhenNonPrimitiveDataTypes(
-            String attributeName) {
-        return APP_INSTANCE + PERIOD + attributeName + OPEN_PARENTHESIS +
-                CLOSE_PARENTHESIS + SPACE + EQUAL + EQUAL + SPACE + NULL +
+    private static String attrTypeForFcmWhenNonPrimitiveDataTypes(String name) {
+        /*
+         * appInstance.name() == null || name().equals(appInstance.name())
+         */
+        return getEqualEqualString(StringGenerator.getAppInstanceAttrString(name), NULL) +
                 SPACE + OR_OPERATION + SPACE + NOT + OPEN_PARENTHESIS +
-                attributeName + OPEN_PARENTHESIS + CLOSE_PARENTHESIS +
-                PERIOD + EQUALS_STRING + OPEN_PARENTHESIS + APP_INSTANCE +
-                PERIOD + attributeName + OPEN_PARENTHESIS +
-                CLOSE_PARENTHESIS + CLOSE_PARENTHESIS + CLOSE_PARENTHESIS;
+                getTwoParaEqualsString(name + OPEN_CLOSE_BRACKET_STRING,
+                                       StringGenerator.getAppInstanceAttrString(name))
+                + CLOSE_PARENTHESIS;
     }
 
     private static String getIfFilterContentMatchMethodImpl(
-            String attributeName,
-            YangType dataType) {
+            String name, YangType dataType) {
         String attrQualifiedType;
-
-        if (StringGenerator.isPrimitiveDataType(dataType.getDataType())) {
-            attrQualifiedType =
-                    getAttrTypeForFilterContentMatchWhenPrimitiveDataType(
-                            attributeName);
+        if (dataType.getDataType().isPrimitiveDataType()) {
+            attrQualifiedType = getAttrTypeForFcmWhenPrimitiveDataType(name);
         } else if (dataType.getDataType() == LEAFREF) {
 
             // When leafref in grouping.
             if (((YangLeafRef) dataType.getDataTypeExtendedInfo())
                     .isInGrouping()) {
-                attrQualifiedType =
-                        getAttrTypeForFilterContentMatchWhenNonPrimitiveDataTypes(
-                                attributeName);
+                attrQualifiedType = attrTypeForFcmWhenNonPrimitiveDataTypes(name);
             } else {
-
                 YangType type = ((YangLeafRef) dataType.getDataTypeExtendedInfo())
                         .getEffectiveDataType();
-
-                if (StringGenerator.isPrimitiveDataType(type.getDataType())) {
-                    attrQualifiedType =
-                            getAttrTypeForFilterContentMatchWhenPrimitiveDataType(
-                                    attributeName);
+                if (type.getDataType().isPrimitiveDataType()) {
+                    attrQualifiedType = getAttrTypeForFcmWhenPrimitiveDataType(name);
                 } else {
-                    attrQualifiedType =
-                            getAttrTypeForFilterContentMatchWhenNonPrimitiveDataTypes(
-                                    attributeName);
+                    attrQualifiedType = attrTypeForFcmWhenNonPrimitiveDataTypes(
+                            name);
                 }
             }
         } else {
-            attrQualifiedType =
-                    getAttrTypeForFilterContentMatchWhenNonPrimitiveDataTypes(
-                            attributeName);
+            attrQualifiedType = attrTypeForFcmWhenNonPrimitiveDataTypes(name);
         }
-
         return attrQualifiedType;
     }
 
@@ -255,7 +249,7 @@
      */
     public static String getSubtreeFilteringForLeafList(
             JavaAttributeInfo javaAttributeInfo) {
-        return getSubtreeFilteringForList(javaAttributeInfo, true);
+        return getSubtreeFilteringForList(javaAttributeInfo, true, null);
     }
 
     /**
@@ -273,63 +267,47 @@
             throws IOException {
         JavaFileInfoTranslator javaFileInfo =
                 ((JavaFileInfoContainer) curNode).getJavaFileInfo();
-        JavaFileInfoTranslator parentInfo;
-
         String instance = APP_INSTANCE;
         String name = getCapitalCase(javaFileInfo.getJavaName());
         String builderNamePrefix = getCapitalCase(javaFileInfo.getJavaName());
-        if (curNode instanceof YangCase) {
-            instance = INSTANCE;
-            YangNode parent = curNode.getParent();
-            if (parent instanceof YangChoice) {
-                parentInfo = ((JavaFileInfoContainer) parent).getJavaFileInfo();
-                name = getCapitalCase(parentInfo.getJavaName());
-            } else if (parent instanceof YangAugment) {
-                parentInfo = ((JavaFileInfoContainer) ((YangAugment) parent)
-                        .getAugmentedNode()).getJavaFileInfo();
-                if (parentInfo != null) {
-                    name = getCapitalCase(parentInfo.getJavaName());
-                } else {
-                    name = getCapitalCase(getCamelCase(
-                            ((YangAugment) parent).getAugmentedNode().getName(),
-                            pluginConfig.getConflictResolver()));
-                }
-            }
-        }
 
-        String processSubtreeFilteringMethod =
-                FOUR_SPACE_INDENTATION + PRIVATE + SPACE + BOOLEAN_DATA_TYPE +
-                        SPACE + "processChildNodesSubTreeFiltering" +
-                        OPEN_PARENTHESIS + name + SPACE + instance + COMMA +
-                        SPACE + builderNamePrefix + BUILDER + SPACE +
-                        "subTreeFilteringResultBuilder" + COMMA + NEW_LINE +
-                        TWELVE_SPACE_INDENTATION + "Boolean " +
-                        "isAnySelectOrContainmentNode, " + "boolean " +
-                        "isSelectAllSchemaChild" + CLOSE_PARENTHESIS +
-                        SPACE + OPEN_CURLY_BRACKET + NEW_LINE;
+        Map<String, String> param = new HashMap<>();
+        param.put(PROCESS_CHILD_NODE_STF_PARAM, BOOLEAN_DATA_TYPE);
+        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);
 
-        if (curNode instanceof YangCase) {
-            String caseName = getCapitalCase(javaFileInfo.getJavaName());
-            processSubtreeFilteringMethod =
-                    processSubtreeFilteringMethod + EIGHT_SPACE_INDENTATION +
-                            caseName + SPACE + APP_INSTANCE + SPACE +
-                            EQUAL + SPACE + OPEN_PARENTHESIS + caseName +
-                            CLOSE_PARENTHESIS + SPACE + instance +
-                            SEMI_COLON + NEW_LINE;
-        }
 
-        processSubtreeFilteringMethod +=
+        String method = FOUR_SPACE_INDENTATION + PRIVATE + SPACE + BOOLEAN_DATA_TYPE +
+                SPACE + PROCESS_CHILD_NODE_STF_PARAM +
+                OPEN_PARENTHESIS + name + SPACE + instance + COMMA +
+                SPACE + builderNamePrefix + BUILDER + SPACE +
+                STF_BUILDER_PARAM + COMMA +
+                " Boolean " +
+                "isAnySelectOrContainmentNode, " + "boolean " +
+                SELECT_ALL_CHILD_SCHEMA_PARAM + CLOSE_PARENTHESIS +
+                SPACE + OPEN_CURLY_BRACKET + NEW_LINE;
+
+        method +=
                 getDataFromTempFileHandle(FILTER_CONTENT_MATCH_FOR_NODES_MASK,
                                           ((TempJavaCodeFragmentFilesContainer) curNode)
                                                   .getTempJavaCodeFragmentFiles()
                                                   .getBeanTempFiles(), path);
 
-        processSubtreeFilteringMethod +=
+        method +=
                 EIGHT_SPACE_INDENTATION + RETURN + SPACE + TRUE + SEMI_COLON +
                         NEW_LINE + FOUR_SPACE_INDENTATION +
                         CLOSE_CURLY_BRACKET + NEW_LINE + NEW_LINE;
+        YangNode child = curNode.getChild();
+        while (child != null) {
+            if (child instanceof YangChoice) {
+                method += getChoiceInstanceForPstMethod(child, name);
+            }
+            child = child.getNextSibling();
+        }
 
-        return processSubtreeFilteringMethod;
+        return method;
     }
 
     /**
@@ -347,51 +325,20 @@
             throws IOException {
         JavaFileInfoTranslator javaFileInfo =
                 ((JavaFileInfoContainer) curNode).getJavaFileInfo();
-        JavaFileInfoTranslator parentInfo;
-
-        String instance = APP_INSTANCE;
         String name = getCapitalCase(javaFileInfo.getJavaName());
         String builderNamePrefix = getCapitalCase(javaFileInfo.getJavaName());
-        if (curNode instanceof YangCase) {
-            instance = INSTANCE;
-            YangNode parent = curNode.getParent();
-            if (parent instanceof YangChoice) {
-                parentInfo = ((JavaFileInfoContainer) parent).getJavaFileInfo();
-                name = getCapitalCase(parentInfo.getJavaName());
-            } else if (parent instanceof YangAugment) {
-                parentInfo = ((JavaFileInfoContainer) ((YangAugment) parent)
-                        .getAugmentedNode()).getJavaFileInfo();
-                if (parentInfo != null) {
-                    name = getCapitalCase(parentInfo.getJavaName());
-                } else {
-                    name = getCapitalCase(getCamelCase(
-                            ((YangAugment) parent).getAugmentedNode().getName(),
-                            pluginConfig.getConflictResolver()));
-                }
-            }
-        }
 
         String processSubtreeFilteringMethod =
                 FOUR_SPACE_INDENTATION + PRIVATE + SPACE + BOOLEAN_DATA_TYPE +
                         SPACE + "processLeafListSubTreeFiltering" +
-                        OPEN_PARENTHESIS + name + SPACE + instance + COMMA +
+                        OPEN_PARENTHESIS + name + SPACE + APP_INSTANCE + COMMA +
                         SPACE + builderNamePrefix + BUILDER + SPACE +
-                        "subTreeFilteringResultBuilder" + COMMA + NEW_LINE +
-                        TWELVE_SPACE_INDENTATION + "Boolean " +
+                        "subTreeFilteringResultBuilder" + COMMA +
+                        " Boolean " +
                         "isAnySelectOrContainmentNode, " + "boolean " +
                         "isSelectAllSchemaChild" + CLOSE_PARENTHESIS +
                         SPACE + OPEN_CURLY_BRACKET + NEW_LINE;
 
-        if (curNode instanceof YangCase) {
-            String caseName = getCapitalCase(javaFileInfo.getJavaName());
-            processSubtreeFilteringMethod =
-                    processSubtreeFilteringMethod + EIGHT_SPACE_INDENTATION +
-                            caseName + SPACE + APP_INSTANCE + SPACE +
-                            EQUAL + SPACE + OPEN_PARENTHESIS + caseName +
-                            CLOSE_PARENTHESIS + SPACE + instance +
-                            SEMI_COLON + NEW_LINE;
-        }
-
         processSubtreeFilteringMethod += getDataFromTempFileHandle(
                 FILTER_CONTENT_MATCH_FOR_LEAF_LIST_MASK,
                 ((TempJavaCodeFragmentFilesContainer) curNode)
@@ -420,51 +367,20 @@
             throws IOException {
         JavaFileInfoTranslator javaFileInfo =
                 ((JavaFileInfoContainer) curNode).getJavaFileInfo();
-        JavaFileInfoTranslator parentInfo;
-
-        String instance = APP_INSTANCE;
         String name = getCapitalCase(javaFileInfo.getJavaName());
         String builderNamePrefix = getCapitalCase(javaFileInfo.getJavaName());
-        if (curNode instanceof YangCase) {
-            instance = INSTANCE;
-            YangNode parent = curNode.getParent();
-            if (parent instanceof YangChoice) {
-                parentInfo = ((JavaFileInfoContainer) parent).getJavaFileInfo();
-                name = getCapitalCase(parentInfo.getJavaName());
-            } else if (parent instanceof YangAugment) {
-                parentInfo = ((JavaFileInfoContainer) ((YangAugment) parent)
-                        .getAugmentedNode()).getJavaFileInfo();
-                if (parentInfo != null) {
-                    name = getCapitalCase(parentInfo.getJavaName());
-                } else {
-                    name = getCapitalCase(getCamelCase(
-                            ((YangAugment) parent).getAugmentedNode().getName(),
-                            pluginConfig.getConflictResolver()));
-                }
-            }
-        }
 
         String processSubtreeFilteringMethod =
                 FOUR_SPACE_INDENTATION + PRIVATE + SPACE + BOOLEAN_DATA_TYPE +
                         SPACE + "processLeafSubtreeFiltering" +
-                        OPEN_PARENTHESIS + name + SPACE + instance + COMMA +
+                        OPEN_PARENTHESIS + name + SPACE + APP_INSTANCE + COMMA +
                         SPACE + builderNamePrefix + BUILDER + SPACE +
-                        "subTreeFilteringResultBuilder" + COMMA + NEW_LINE
-                        + TWELVE_SPACE_INDENTATION + "Boolean " +
+                        "subTreeFilteringResultBuilder" + COMMA +
+                        " Boolean " +
                         "isAnySelectOrContainmentNode, " + "boolean " +
                         "isSelectAllSchemaChild" + CLOSE_PARENTHESIS +
                         SPACE + OPEN_CURLY_BRACKET + NEW_LINE;
 
-        if (curNode instanceof YangCase) {
-            String caseName = getCapitalCase(javaFileInfo.getJavaName());
-            processSubtreeFilteringMethod =
-                    processSubtreeFilteringMethod + EIGHT_SPACE_INDENTATION +
-                            caseName + SPACE + APP_INSTANCE + SPACE +
-                            EQUAL + SPACE + OPEN_PARENTHESIS + caseName +
-                            CLOSE_PARENTHESIS + SPACE + instance +
-                            SEMI_COLON + NEW_LINE;
-        }
-
         processSubtreeFilteringMethod +=
                 getDataFromTempFileHandle(FILTER_CONTENT_MATCH_FOR_LEAF_MASK,
                                           ((TempJavaCodeFragmentFilesContainer) curNode)
@@ -482,40 +398,34 @@
     /**
      * Returns is filter content match for leaf.
      *
-     * @param curNode      current node
-     * @param pluginConfig plugin configurations
+     * @param curNode current node
      * @return is filter content match for leaf
      */
-    static String getProcessSubtreeFilteringStart(YangNode curNode,
-                                                  YangPluginConfig
-                                                          pluginConfig) {
+    static String getProcessSubtreeFilteringStart(YangNode curNode) {
         JavaFileInfoTranslator javaFileInfo =
                 ((JavaFileInfoContainer) curNode).getJavaFileInfo();
-        JavaFileInfoTranslator parentInfo;
-
         String instance = APP_INSTANCE;
         String name = getCapitalCase(javaFileInfo.getJavaName());
         String builderNamePrefix = getCapitalCase(javaFileInfo.getJavaName());
-        if (curNode instanceof YangCase) {
-            instance = INSTANCE;
-            YangNode parent = curNode.getParent();
-            if (parent instanceof YangChoice) {
-                parentInfo = ((JavaFileInfoContainer) parent).getJavaFileInfo();
-                name = getCapitalCase(parentInfo.getJavaName());
-            } else if (parent instanceof YangAugment) {
-                parentInfo = ((JavaFileInfoContainer) ((YangAugment) parent)
-                        .getAugmentedNode()).getJavaFileInfo();
-                if (parentInfo != null) {
-                    name = getCapitalCase(parentInfo.getJavaName());
-                } else {
-                    name = getCapitalCase(getCamelCase(
-                            ((YangAugment) parent).getAugmentedNode().getName(),
-                            pluginConfig.getConflictResolver()));
-                }
-            }
+        if (curNode instanceof RpcNotificationContainer) {
+            name = getCapitalCase(javaFileInfo.getJavaName()) + OP_PARAM;
+        } else {
+            name = DEFAULT_CAPS + name;
         }
+        String javadoc = "   /**\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" +
+                "     * @return match result\n" +
+                "     */\n";
+
         String processSubtreeFilteringMethod =
-                StringGenerator.getOverRideString() + FOUR_SPACE_INDENTATION +
+                javadoc + FOUR_SPACE_INDENTATION +
                         PUBLIC + SPACE + name + SPACE +
                         PROCESS_SUBTREE_FILTERING + OPEN_PARENTHESIS + name +
                         SPACE + instance + COMMA + SPACE + BOOLEAN_DATA_TYPE +
@@ -529,17 +439,6 @@
                         NEW_LINE + EIGHT_SPACE_INDENTATION + "Boolean" + SPACE +
                         IS_ANY_SELECT_OR_CONTAINMENT_NODE_FLAG + SPACE +
                         EQUAL + SPACE + FALSE + SEMI_COLON + NEW_LINE;
-
-        if (curNode instanceof YangCase) {
-            String caseName = getCapitalCase(javaFileInfo.getJavaName());
-            processSubtreeFilteringMethod =
-                    processSubtreeFilteringMethod + EIGHT_SPACE_INDENTATION +
-                            caseName + SPACE + APP_INSTANCE + SPACE +
-                            EQUAL + SPACE + OPEN_PARENTHESIS + caseName +
-                            CLOSE_PARENTHESIS + SPACE + instance +
-                            SEMI_COLON + NEW_LINE;
-        }
-
         return processSubtreeFilteringMethod;
     }
 
@@ -557,11 +456,10 @@
             if (((YangLeavesHolder) curNode).getListOfLeaf() != null
                     &&
                     !((YangLeavesHolder) curNode).getListOfLeaf().isEmpty()) {
-                method += StringGenerator
-                        .getIfConditionBegin(EIGHT_SPACE_INDENTATION, NOT +
+                method +=
+                        getIfConditionBegin(EIGHT_SPACE_INDENTATION, NOT +
                                 "processLeafSubtreeFiltering(appInstance, " +
-                                "subTreeFilteringResultBuilder," + NEW_LINE +
-                                TWELVE_SPACE_INDENTATION +
+                                "subTreeFilteringResultBuilder, " +
                                 "isAnySelectOrContainmentNode, " +
                                 "isSelectAllSchemaChild)");
 
@@ -577,11 +475,10 @@
                     &&
                     !((YangLeavesHolder) curNode).getListOfLeafList()
                             .isEmpty()) {
-                method += StringGenerator
-                        .getIfConditionBegin(EIGHT_SPACE_INDENTATION, NOT +
+                method +=
+                        getIfConditionBegin(EIGHT_SPACE_INDENTATION, NOT +
                                 "processLeafListSubTreeFiltering(appInstance," +
-                                " subTreeFilteringResultBuilder," + NEW_LINE
-                                + TWELVE_SPACE_INDENTATION +
+                                " subTreeFilteringResultBuilder, " +
                                 "isAnySelectOrContainmentNode, " +
                                 "isSelectAllSchemaChild)");
 
@@ -594,11 +491,10 @@
 
         if (curNode.getChild() != null) {
 
-            method += StringGenerator
-                    .getIfConditionBegin(EIGHT_SPACE_INDENTATION, NOT +
+            method +=
+                    getIfConditionBegin(EIGHT_SPACE_INDENTATION, NOT +
                             "processChildNodesSubTreeFiltering(appInstance, " +
-                            "subTreeFilteringResultBuilder," + NEW_LINE +
-                            TWELVE_SPACE_INDENTATION +
+                            "subTreeFilteringResultBuilder, " +
                             "isAnySelectOrContainmentNode, " +
                             "isSelectAllSchemaChild)");
 
@@ -615,29 +511,32 @@
      * Returns is filter content match for node.
      *
      * @param attr attribute info
+     * @param node YANG node
      * @return is filter content match for node
      */
-    public static String getSubtreeFilteringForNode(JavaAttributeInfo attr) {
+    public static String getSubtreeFilteringForNode(JavaAttributeInfo attr,
+                                                    YangNode node) {
         boolean isList = attr.isListAttr();
         if (isList) {
-            return getSubtreeFilteringForList(attr, false);
+            return getSubtreeFilteringForList(attr, false, node);
         } else {
-            return getSubtreeFilteringForChildNode(attr);
+            return getSubtreeFilteringForChildNode(attr, node);
         }
     }
 
     /**
      * Returns is filter content match close.
      *
+     * @param name    name of class
+     * @param curNode current node
      * @return is filter content match close
      */
-    static String getProcessSubTreeFilteringEnd() {
-        String method = StringGenerator
-                .getIfConditionBegin(EIGHT_SPACE_INDENTATION,
-                                     NOT + IS_SELECT_ALL_SCHEMA_CHILD_FLAG +
-                                             SPACE + AND_OPERATION + SPACE +
-                                             NOT +
-                                             IS_ANY_SELECT_OR_CONTAINMENT_NODE_FLAG);
+    static String getProcessSubTreeFilteringEnd(String name, YangNode curNode) {
+        String method = getIfConditionBegin(EIGHT_SPACE_INDENTATION,
+                                            NOT + IS_SELECT_ALL_SCHEMA_CHILD_FLAG +
+                                                    SPACE + AND_OPERATION + SPACE +
+                                                    NOT +
+                                                    IS_ANY_SELECT_OR_CONTAINMENT_NODE_FLAG);
 
         method += TWELVE_SPACE_INDENTATION + RETURN + SPACE +
                 PROCESS_SUBTREE_FILTERING + OPEN_PARENTHESIS + APP_INSTANCE +
@@ -645,9 +544,13 @@
                 NEW_LINE;
 
         method += methodClose(EIGHT_SPACE);
-
-        method += EIGHT_SPACE_INDENTATION + RETURN + SPACE +
-                SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + BUILD +
+        String build = BUILD;
+        if (curNode instanceof YangAugment) {
+            build = BUILD_FOR_FILTER;
+        }
+        method += EIGHT_SPACE_INDENTATION + RETURN + SPACE + getOpenCloseParaWithValue(
+                name) + SPACE +
+                SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + build +
                 OPEN_CLOSE_BRACKET_STRING + SEMI_COLON + NEW_LINE +
                 FOUR_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + NEW_LINE;
 
@@ -658,21 +561,37 @@
      * Returns filter content match for child nodes.
      *
      * @param javaAttributeInfo attribute to be added
+     * @param node              YANG node
      * @return filter content match for child nodes
      */
     private static String getSubtreeFilteringForChildNode(
-            JavaAttributeInfo javaAttributeInfo) {
+            JavaAttributeInfo javaAttributeInfo, YangNode node) {
         String name = javaAttributeInfo.getAttributeName();
-        name = getSmallCase(name);
-        String type = javaAttributeInfo.getImportInfo().getClassInfo();
+        String clsInfo = javaAttributeInfo.getImportInfo()
+                .getClassInfo();
+        String type = DEFAULT_CAPS + javaAttributeInfo.getImportInfo()
+                .getClassInfo();
         if (javaAttributeInfo.isQualifiedName()) {
             type = javaAttributeInfo.getImportInfo().getPkgInfo() + PERIOD +
                     type;
+            clsInfo = javaAttributeInfo.getImportInfo().getPkgInfo() + PERIOD +
+                    clsInfo;
         }
+        String classCast = getOpenCloseParaWithValue(type) + SPACE;
+        String cast = getOpenCloseParaWithValue(classCast + name);
+        String resultString = cast +
+                PERIOD + PROCESS_SUBTREE_FILTERING + OPEN_PARENTHESIS
+                + classCast +
+                APP_INSTANCE + PERIOD + name + OPEN_CLOSE_BRACKET_STRING
+                + COMMA + SPACE + FALSE + CLOSE_PARENTHESIS + SEMI_COLON +
+                NEW_LINE;
 
-        String method = StringGenerator
-                .getIfConditionBegin(EIGHT_SPACE_INDENTATION, name + "()  != " +
-                        "null");
+        if (node != null && node instanceof YangChoice) {
+            resultString = getReturnStringInCaseOfChoice(node);
+        }
+        String method =
+                getIfConditionBegin(EIGHT_SPACE_INDENTATION, name + "() != " +
+                        "null  || isSelectAllSchemaChild");
 
         method += TWELVE_SPACE_INDENTATION +
                 IS_ANY_SELECT_OR_CONTAINMENT_NODE_FLAG + SPACE + EQUAL + SPACE +
@@ -684,11 +603,24 @@
                 + EQUAL + SPACE + NULL + CLOSE_PARENTHESIS + SPACE +
                 OPEN_CURLY_BRACKET + NEW_LINE;
 
-        method += SIXTEEN_SPACE_INDENTATION + type + SPACE + "result = " +
-                name + PERIOD + PROCESS_SUBTREE_FILTERING + OPEN_PARENTHESIS +
-                APP_INSTANCE + PERIOD + name + OPEN_CLOSE_BRACKET_STRING
-                + COMMA + SPACE + FALSE + CLOSE_PARENTHESIS + SEMI_COLON +
-                NEW_LINE;
+        method += SIXTEEN_SPACE_INDENTATION + clsInfo + SPACE + "result" +
+                SEMI_COLON + NEW_LINE;
+
+        method +=
+                getIfConditionBegin(SIXTEEN_SPACE_INDENTATION,
+                                    "isSelectAllSchemaChild");
+
+        method += TWENTY_SPACE_INDENTATION + "result" + SPACE + EQUAL + SPACE +
+                APP_INSTANCE + PERIOD + name + OPEN_PARENTHESIS +
+                CLOSE_PARENTHESIS + SEMI_COLON + NEW_LINE;
+
+        method += SIXTEEN_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + SPACE +
+                ELSE + SPACE +
+                OPEN_CURLY_BRACKET + NEW_LINE;
+
+        method += TWENTY_SPACE_INDENTATION + "result = " + resultString;
+
+        method += SIXTEEN_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + NEW_LINE;
 
         method += SIXTEEN_SPACE_INDENTATION + "if (result != null) {" +
                 NEW_LINE;
@@ -712,32 +644,48 @@
      *
      * @param javaAttributeInfo attribute information
      * @param isLeafList        if for leaf list
+     * @param node              YANG node
      * @return filter content match for list types
      */
     private static String getSubtreeFilteringForList(
-            JavaAttributeInfo javaAttributeInfo, boolean isLeafList) {
+            JavaAttributeInfo javaAttributeInfo, boolean isLeafList,
+            YangNode node) {
         String capitalCaseName =
                 getCapitalCase(javaAttributeInfo.getAttributeName());
         String name = javaAttributeInfo.getAttributeName();
-        String type = javaAttributeInfo.getImportInfo().getClassInfo();
+        String type = javaAttributeInfo.getImportInfo()
+                .getClassInfo();
+        String clsInfo = DEFAULT_CAPS + type;
         if (javaAttributeInfo.isQualifiedName()) {
             type = javaAttributeInfo.getImportInfo().getPkgInfo() + PERIOD +
                     type;
+            clsInfo = javaAttributeInfo.getImportInfo().getPkgInfo() + PERIOD +
+                    clsInfo;
+        }
+
+        String classCast = getOpenCloseParaWithValue(clsInfo) + SPACE;
+        String cast = getOpenCloseParaWithValue(classCast + name);
+        String resultString = cast + PERIOD +
+                PROCESS_SUBTREE_FILTERING + OPEN_PARENTHESIS + classCast +
+                name + "2" + COMMA + SPACE + FALSE + CLOSE_PARENTHESIS + SEMI_COLON +
+                NEW_LINE;
+
+        if (node != null && node instanceof YangChoice) {
+            resultString = getReturnStringInCaseOfChoice(node);
         }
 
         /*
          * If select all schema child
          */
-        String method = StringGenerator
-                .getIfConditionBegin(EIGHT_SPACE_INDENTATION,
-                                     IS_SELECT_ALL_SCHEMA_CHILD_FLAG);
+        String method =
+                getIfConditionBegin(EIGHT_SPACE_INDENTATION,
+                                    IS_SELECT_ALL_SCHEMA_CHILD_FLAG);
 
-        method = method + StringGenerator
-                .getCollectionIteratorForLoopBegin(TWELVE_SPACE_INDENTATION,
-                                                   type + SPACE + name,
-                                                   APP_INSTANCE + PERIOD +
-                                                           name +
-                                                           OPEN_CLOSE_BRACKET_STRING);
+        method = method + getCollectionIteratorForLoopBegin(TWELVE_SPACE_INDENTATION,
+                                                            type + SPACE + name,
+                                                            APP_INSTANCE + PERIOD +
+                                                                    name +
+                                                                    OPEN_CLOSE_BRACKET_STRING);
 
         method = method + SIXTEEN_SPACE_INDENTATION +
                 SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + ADD_STRING +
@@ -747,11 +695,10 @@
         method += methodClose(TWELVE_SPACE); // Close collection Iteration loop
 
         //If need to explicitly participate in query
-        method += StringGenerator
-                .getElseIfConditionBegin(EIGHT_SPACE_INDENTATION,
-                                         name + OPEN_CLOSE_BRACKET_STRING +
-                                                 SPACE + NOT + EQUAL +
-                                                 SPACE + NULL);
+        method += getElseIfConditionBegin(EIGHT_SPACE_INDENTATION,
+                                          name + OPEN_CLOSE_BRACKET_STRING +
+                                                  SPACE + NOT + EQUAL +
+                                                  SPACE + NULL);
 
         if (!isLeafList) {
             method += TWELVE_SPACE_INDENTATION +
@@ -760,24 +707,24 @@
         }
 
         //If there is any parameter in the query condition
-        method += StringGenerator
-                .getIfConditionBegin(TWELVE_SPACE_INDENTATION, NOT + name +
+        method +=
+                getIfConditionBegin(TWELVE_SPACE_INDENTATION, NOT + name +
                         OPEN_CLOSE_BRACKET_STRING + PERIOD + IS_EMPTY);
 
         if (isLeafList) {
             /*
              * If there is no app instance to perform content match
              */
-            method += StringGenerator
-                    .getIfConditionBegin(SIXTEEN_SPACE_INDENTATION,
-                                         APP_INSTANCE + PERIOD + name +
-                                                 OPEN_CLOSE_BRACKET_STRING +
-                                                 SPACE + EQUAL + EQUAL + SPACE +
-                                                 NULL + SPACE + OR_OPERATION
-                                                 + SPACE + APP_INSTANCE +
-                                                 PERIOD + name +
-                                                 OPEN_CLOSE_BRACKET_STRING +
-                                                 PERIOD + IS_EMPTY);
+            method +=
+                    getIfConditionBegin(SIXTEEN_SPACE_INDENTATION,
+                                        APP_INSTANCE + PERIOD + name +
+                                                OPEN_CLOSE_BRACKET_STRING +
+                                                SPACE + EQUAL + EQUAL + SPACE +
+                                                NULL + SPACE + OR_OPERATION
+                                                + SPACE + APP_INSTANCE +
+                                                PERIOD + name +
+                                                OPEN_CLOSE_BRACKET_STRING +
+                                                PERIOD + IS_EMPTY);
 
             method += TWENTY_SPACE_INDENTATION + RETURN + SPACE + FALSE +
                     SEMI_COLON + NEW_LINE;
@@ -785,7 +732,7 @@
             method += methodClose(SIXTEEN_SPACE);
 
             // for instance iterator
-            method += StringGenerator.getCollectionIteratorForLoopBegin(
+            method += getCollectionIteratorForLoopBegin(
                     SIXTEEN_SPACE_INDENTATION, type + SPACE + name,
                     name + OPEN_CLOSE_BRACKET_STRING);
 
@@ -794,20 +741,20 @@
                     NEW_LINE;
 
             // for app instance iterator
-            method += StringGenerator
-                    .getCollectionIteratorForLoopBegin(TWENTY_SPACE_INDENTATION,
-                                                       type + SPACE + name +
-                                                               "2",
-                                                       APP_INSTANCE + PERIOD +
-                                                               name +
-                                                               OPEN_CLOSE_BRACKET_STRING);
+            method +=
+                    getCollectionIteratorForLoopBegin(TWENTY_SPACE_INDENTATION,
+                                                      type + SPACE + name +
+                                                              "2",
+                                                      APP_INSTANCE + PERIOD +
+                                                              name +
+                                                              OPEN_CLOSE_BRACKET_STRING);
 
             //the content match leaf list attribute value matches
-            method += StringGenerator
-                    .getIfConditionBegin(TWENTY_FOUR_SPACE_INDENTATION,
-                                         name + PERIOD + EQUALS_STRING
-                                                 + OPEN_PARENTHESIS + name +
-                                                 "2" + CLOSE_PARENTHESIS);
+            method +=
+                    getIfConditionBegin(TWENTY_FOUR_SPACE_INDENTATION,
+                                        name + PERIOD + EQUALS_STRING
+                                                + OPEN_PARENTHESIS + name +
+                                                "2" + CLOSE_PARENTHESIS);
 
             method += TWENTY_EIGHT_SPACE_INDENTATION + "flag" + SPACE + EQUAL +
                     SPACE + TRUE + SEMI_COLON + NEW_LINE;
@@ -826,8 +773,8 @@
             method += methodClose(TWENTY_SPACE);
 
             //if the content match failed
-            method += StringGenerator
-                    .getIfConditionBegin(TWENTY_SPACE_INDENTATION, "!flag");
+            method +=
+                    getIfConditionBegin(TWENTY_SPACE_INDENTATION, "!flag");
 
             method += TWENTY_FOUR_SPACE_INDENTATION + RETURN + SPACE + FALSE +
                     SEMI_COLON + NEW_LINE;
@@ -839,37 +786,34 @@
         } else {
 
             /*if there is any app instance entry*/
-            method += StringGenerator
-                    .getIfConditionBegin(SIXTEEN_SPACE_INDENTATION,
-                                         APP_INSTANCE + PERIOD + name +
-                                                 OPEN_CLOSE_BRACKET_STRING +
-                                                 SPACE + NOT + EQUAL + SPACE +
-                                                 NULL + SPACE + AND_OPERATION +
-                                                 SPACE + NOT + APP_INSTANCE +
-                                                 PERIOD + name +
-                                                 OPEN_CLOSE_BRACKET_STRING +
-                                                 PERIOD + IS_EMPTY);
+            method +=
+                    getIfConditionBegin(SIXTEEN_SPACE_INDENTATION,
+                                        APP_INSTANCE + PERIOD + name +
+                                                OPEN_CLOSE_BRACKET_STRING +
+                                                SPACE + NOT + EQUAL + SPACE +
+                                                NULL + SPACE + AND_OPERATION +
+                                                SPACE + NOT + APP_INSTANCE +
+                                                PERIOD + name +
+                                                OPEN_CLOSE_BRACKET_STRING +
+                                                PERIOD + IS_EMPTY);
 
             /*
              * loop all the query condition instance(s)
              */
-            method += StringGenerator
-                    .getCollectionIteratorForLoopBegin(TWENTY_SPACE_INDENTATION,
-                                                       type + SPACE + name,
-                                                       name +
-                                                               OPEN_CLOSE_BRACKET_STRING);
+            method +=
+                    getCollectionIteratorForLoopBegin(TWENTY_SPACE_INDENTATION,
+                                                      type + SPACE + name,
+                                                      name +
+                                                              OPEN_CLOSE_BRACKET_STRING);
 
             //loop all the app instance(s)
-            method += StringGenerator.getCollectionIteratorForLoopBegin(
+            method += getCollectionIteratorForLoopBegin(
                     TWENTY_FOUR_SPACE_INDENTATION, type + SPACE + name + "2",
                     APP_INSTANCE + PERIOD + name +
                             OPEN_CLOSE_BRACKET_STRING);
 
             method += TWENTY_EIGHT_SPACE_INDENTATION + type + SPACE +
-                    "result = " + name + PERIOD +
-                    PROCESS_SUBTREE_FILTERING + OPEN_PARENTHESIS + name + "2" +
-                    COMMA + SPACE + FALSE + CLOSE_PARENTHESIS + SEMI_COLON +
-                    NEW_LINE;
+                    "result = " + resultString;
 
             method += TWENTY_EIGHT_SPACE_INDENTATION + "if (result != null) {" +
                     NEW_LINE;
@@ -900,23 +844,23 @@
                     EQUAL + SPACE + TRUE + SEMI_COLON + NEW_LINE;
         }
 
-        method += StringGenerator
-                .getIfConditionBegin(SIXTEEN_SPACE_INDENTATION,
-                                     APP_INSTANCE + PERIOD + name
-                                             + OPEN_CLOSE_BRACKET_STRING +
-                                             SPACE + NOT + EQUAL + SPACE +
-                                             NULL + SPACE + AND_OPERATION +
-                                             SPACE + NOT + APP_INSTANCE +
-                                             PERIOD + name +
-                                             OPEN_CLOSE_BRACKET_STRING +
-                                             PERIOD + IS_EMPTY);
+        method +=
+                getIfConditionBegin(SIXTEEN_SPACE_INDENTATION,
+                                    APP_INSTANCE + PERIOD + name
+                                            + OPEN_CLOSE_BRACKET_STRING +
+                                            SPACE + NOT + EQUAL + SPACE +
+                                            NULL + SPACE + AND_OPERATION +
+                                            SPACE + NOT + APP_INSTANCE +
+                                            PERIOD + name +
+                                            OPEN_CLOSE_BRACKET_STRING +
+                                            PERIOD + IS_EMPTY);
 
-        method = method + StringGenerator
-                .getCollectionIteratorForLoopBegin(TWENTY_SPACE_INDENTATION,
-                                                   type + SPACE + name,
-                                                   APP_INSTANCE + PERIOD +
-                                                           name +
-                                                           OPEN_CLOSE_BRACKET_STRING);
+        method = method +
+                getCollectionIteratorForLoopBegin(TWENTY_SPACE_INDENTATION,
+                                                  type + SPACE + name,
+                                                  APP_INSTANCE + PERIOD +
+                                                          name +
+                                                          OPEN_CLOSE_BRACKET_STRING);
 
         method = method + TWENTY_FOUR_SPACE_INDENTATION +
                 SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + ADD_STRING
@@ -938,55 +882,132 @@
 
     //Returns method string for op params augmented syntax
     static String getAugmentableSubTreeFiltering() {
-        return EIGHT_SPACE_INDENTATION + FOR + SPACE + OPEN_PARENTHESIS +
-                OBJECT_STRING + SPACE + YANG_AUGMENTED_INFO_LOWER_CASE +
-                SPACE + COLON + SPACE + THIS + PERIOD +
-                YANG_AUGMENTED_INFO_MAP +
-                OPEN_PARENTHESIS + CLOSE_PARENTHESIS + PERIOD
-                + VALUE + "s" + OPEN_PARENTHESIS + CLOSE_PARENTHESIS +
-                CLOSE_PARENTHESIS + SPACE + OPEN_CURLY_BRACKET +
-                NEW_LINE + TWELVE_SPACE_INDENTATION + OBJECT_STRING + SPACE +
-                getSmallCase(YANG_AUGMENTED_OP_PARAM_INFO) + SPACE + EQUAL +
-                SPACE + APP_INSTANCE + PERIOD +
-                YANG_AUGMENTED_INFO_LOWER_CASE + OPEN_PARENTHESIS +
-                YANG_AUGMENTED_INFO_LOWER_CASE + PERIOD +
-                GET_CLASS + CLOSE_PARENTHESIS + SEMI_COLON + NEW_LINE +
-                TWELVE_SPACE_INDENTATION + OBJECT + SPACE +
-                PROCESS_SUBTREE_FILTERING + SEMI_COLON
-                + NEW_LINE + TWELVE_SPACE_INDENTATION + TRY + SPACE +
-                OPEN_CURLY_BRACKET + NEW_LINE +
-                SIXTEEN_SPACE_INDENTATION +
-                "Class<?>[] interfaces = " + YANG_AUGMENTED_INFO_LOWER_CASE +
-                ".getClass().getInterfaces();" +
-                NEW_LINE + SIXTEEN_SPACE_INDENTATION +
-                PROCESS_SUBTREE_FILTERING + SPACE + EQUAL + SPACE +
-                YANG_AUGMENTED_INFO_LOWER_CASE + PERIOD + GET_CLASS +
-                NEW_LINE + TWENTY_SPACE_INDENTATION + PERIOD +
-                GET_METHOD + OPEN_PARENTHESIS + QUOTES +
-                PROCESS_SUBTREE_FILTERING + QUOTES + COMMA + SPACE +
-                "interfaces[0]" + CLOSE_PARENTHESIS + PERIOD + INVOKE +
-                OPEN_PARENTHESIS + YANG_AUGMENTED_INFO_LOWER_CASE +
-                COMMA + NEW_LINE + TWENTY_FOUR_SPACE_INDENTATION +
-                getSmallCase(YANG_AUGMENTED_OP_PARAM_INFO) +
-                CLOSE_PARENTHESIS + SEMI_COLON + NEW_LINE +
-                SIXTEEN_SPACE_INDENTATION + IF + SPACE + OPEN_PARENTHESIS +
-                PROCESS_SUBTREE_FILTERING + SPACE + NOT + EQUAL + SPACE +
-                NULL + CLOSE_PARENTHESIS + SPACE + OPEN_CURLY_BRACKET +
-                NEW_LINE + TWENTY_SPACE_INDENTATION +
-                SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + "add" +
-                YANG_AUGMENTED_INFO + OPEN_PARENTHESIS +
-                PROCESS_SUBTREE_FILTERING + COMMA + SPACE +
-                PROCESS_SUBTREE_FILTERING + PERIOD + GET_CLASS +
-                CLOSE_PARENTHESIS + SEMI_COLON + NEW_LINE +
-                SIXTEEN_SPACE_INDENTATION + CLOSE_CURLY_BRACKET +
-                NEW_LINE + TWELVE_SPACE_INDENTATION + CLOSE_CURLY_BRACKET +
-                SPACE + CATCH + SPACE + OPEN_PARENTHESIS +
-                NO_SUCH_METHOD_EXCEPTION + " | " +
-                INVOCATION_TARGET_EXCEPTION + " | " + ILLEGAL_ACCESS_EXCEPTION +
-                SPACE + EXCEPTION_VAR + CLOSE_PARENTHESIS + SPACE +
-                OPEN_CURLY_BRACKET + NEW_LINE + SIXTEEN_SPACE_INDENTATION +
-                CONTINUE + SEMI_COLON + NEW_LINE +
-                TWELVE_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + NEW_LINE +
-                EIGHT_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + NEW_LINE;
+        return "        for (Object augmentInfo : this.yangAugmentedInfoMap()" +
+                ".values()) {\n" +
+                "            Object appInstanceInfo = appInstance.yangAugmentedInfo(" +
+                "augmentInfo.getClass());\n" +
+                "            if (appInstanceInfo == null) {\n" +
+                "                subTreeFilteringResultBuilder.addYangAugmentedInfo(" +
+                "augmentInfo, augmentInfo.getClass());\n" +
+                "            } else {\n" +
+                "                Object processSubtreeFiltering;\n" +
+                "                try {\n" +
+                "                    Class<?> augmentedClass = augmentInfo" +
+                ".getClass();\n" +
+                "                    processSubtreeFiltering = augmentInfo.getClass()" +
+                ".getMethod(\"processSubtreeFiltering\", augmentedClass).invoke(" +
+                "augmentInfo, appInstanceInfo);\n" +
+                "                    if (processSubtreeFiltering != null) {\n" +
+                "                        subTreeFilteringResultBuilder" +
+                ".addYangAugmentedInfo(processSubtreeFiltering, processSubtreeFiltering.getClass());\n" +
+                "                    }\n" +
+                "                } catch (NoSuchMethodException |" +
+                " InvocationTargetException | IllegalAccessException e) {\n" +
+                "                    continue;\n" +
+                "                }\n" +
+                "            }\n" +
+                "        }\n";
     }
+
+    private static String getMethodBodyForChoicePstMethod(
+            YangNode node, YangPluginConfig config, YangNode choiceParent,
+            String choice) {
+        StringBuilder builder = new StringBuilder();
+        JavaCodeGeneratorInfo info = (JavaCodeGeneratorInfo) choiceParent;
+        JavaFileInfoTranslator pInfo = info.getJavaFileInfo();
+
+        JavaQualifiedTypeInfoTranslator qInfo = getQualifiedInfo(node, config);
+
+        String castVar = qInfo.getClassInfo();
+        boolean qualify = info.getTempJavaCodeFragmentFiles().getBeanTempFiles()
+                .getJavaImportData().addImportInfo(qInfo, pInfo.getJavaName(),
+                                                   pInfo.getPackage());
+        if (qualify) {
+            castVar = StringGenerator.getQualifiedString(qInfo.getPkgInfo(),
+                                                         qInfo.getClassInfo());
+        }
+        String classCast = getOpenCloseParaWithValue(castVar) + SPACE;
+        String cast = getOpenCloseParaWithValue(classCast + choice);
+        String retString = cast + PERIOD + PROCESS_SUBTREE_FILTERING +
+                getOpenCloseParaWithValue(classCast + getAppInstanceAttrString
+                        (choice) + COMMA + SPACE + FALSE);
+        String cond = choice + INSTANCE_OF + castVar;
+        builder.append(getIfConditionBegin(EIGHT_SPACE_INDENTATION, cond))
+                .append(getReturnString(retString, TWELVE_SPACE_INDENTATION))
+                .append(signatureClose()).append(methodClose(EIGHT_SPACE));
+        return builder.toString();
+    }
+
+    /**
+     * Returns choice instance for PST method.
+     *
+     * @param choice    choice node
+     * @param className class name
+     * @return choice instance for pst method
+     */
+    private static String getChoiceInstanceForPstMethod(YangNode choice,
+                                                        String className) {
+        /*
+         * private Choice1 getChoice1ResultOfProcessSubTree(Choice1 choice1, Test appInstance) {
+         *     if (choice1 instanceof DefaultCase1) {
+         *         return ((DefaultCase1) choice1).processSubtreeFiltering(
+         *          appInstance.choice1(), false);
+         * }
+         * return null;
+         * }
+         */
+
+        JavaFileInfoTranslator info = ((JavaFileInfoContainer) choice).getJavaFileInfo();
+        String name = info.getJavaName();
+        String caps = getCapitalCase(name);
+        StringBuilder builder = new StringBuilder();
+        String methodName = caps + CHOICE_STF_METHOD_NAME;
+        Map<String, String> param = new LinkedHashMap<>();
+        param.put(name, caps);
+        param.put(APP_INSTANCE, className);
+
+        builder.append(multiAttrMethodSignature(methodName, GET, PRIVATE, caps,
+                                                param, CLASS_TYPE));
+
+        for (YangNode cases : getChoiceChildNodes((YangChoice) choice)) {
+            builder.append(getMethodBodyForChoicePstMethod(cases, info.getPluginConfig(),
+                                                           choice.getParent(), name));
+        }
+        builder.append(getReturnString(NULL, FOUR_SPACE_INDENTATION))
+                .append(signatureClose()).append(methodClose(FOUR_SPACE));
+        return builder.toString();
+    }
+
+    private static String getReturnStringInCaseOfChoice(YangNode choice) {
+        JavaFileInfoTranslator info = ((JavaFileInfoContainer) choice)
+                .getJavaFileInfo();
+        String name = info.getJavaName();
+        String caps = getCapitalCase(name);
+        String methodName = caps + CHOICE_STF_METHOD_NAME;
+        return GET + methodName + getOpenCloseParaWithValue(
+                name + COMMA + SPACE + APP_INSTANCE) + signatureClose();
+    }
+
+    static JavaQualifiedTypeInfoTranslator getQualifiedInfo(
+            YangNode node, YangPluginConfig config) {
+        JavaFileInfoTranslator fileInfo = ((JavaCodeGeneratorInfo) node)
+                .getJavaFileInfo();
+        String name = fileInfo.getJavaName();
+        String pkg = fileInfo.getPackage();
+        if (config == null) {
+            config = new YangPluginConfig();
+        }
+        if (name == null) {
+            name = getCamelCase(node.getName(), config.getConflictResolver());
+            pkg = getNodesPackage(node, config);
+        }
+
+        name = DEFAULT_CAPS + getCapitalCase(name);
+        JavaQualifiedTypeInfoTranslator qInfo = new
+                JavaQualifiedTypeInfoTranslator();
+        qInfo.setClassInfo(name);
+        qInfo.setPkgInfo(pkg);
+        return qInfo;
+    }
+
 }