[ONOS-5539] Process sub tree defect fix

Change-Id: I6e06a8ca430a86cc538543b161bbbc56dc9cade6
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);
+        }
     }
 
     /**