public PageView getChildrenOfDominatorTree()

in analysis/heap-dump/impl/src/main/java/org/eclipse/jifa/hda/impl/HeapDumpAnalyzerImpl.java [1911:1992]


    public PageView<? extends DominatorTree.Item> getChildrenOfDominatorTree(DominatorTree.Grouping groupBy,
                                                                             String sortBy, boolean ascendingOrder,
                                                                             int parentObjectId,
                                                                             int[] idPathInResultTree, int page,
                                                                             int pageSize) {
        return $(() -> {
            Map<String, Object> args = new HashMap<>();
            IResultTree tree = queryByCommand(context, "dominator_tree -groupBy " + groupBy.name(), args);
            switch (groupBy) {
                case NONE: {
                    Object parent = Helper.fetchObjectInResultTree(tree, idPathInResultTree);
                    return
                            buildDefaultItems(context.snapshot, tree, tree.getChildren(parent), ascendingOrder, sortBy,
                                              null, null, new PagingRequest(page, pageSize), parentObjectId);
                }
                case BY_CLASS: {
                    Object object = Helper.fetchObjectInResultTree(tree, idPathInResultTree);
                    List<?> elements = object == null ? Collections.emptyList() : tree.getChildren(object);
                    return buildClassItems(context.snapshot, tree, elements, ascendingOrder, sortBy, null, null, new PagingRequest(page
                            , pageSize));
                }
                case BY_CLASSLOADER: {
                    Object parent = Helper.fetchObjectInResultTree(tree, idPathInResultTree);
                    List<?> children = tree.getChildren(parent);

                    if (children != null) {
                        return buildClassLoaderItems(context.snapshot, tree, children, ascendingOrder, sortBy, null,
                                                     null, new PagingRequest(page, pageSize));
                    } else {
                        return PageView.empty();
                    }
                }
                case BY_PACKAGE: {
                    Object targetParentNode = new ExoticTreeFinder(tree)
                            .setGetChildrenCallback(node -> {
                                Map<String, ?> subPackages = ReflectionUtil.getFieldValueOrNull(node, "subPackages");
                                if (subPackages != null) {
                                    return new ArrayList<>(subPackages.values());
                                } else {
                                    return null;
                                }
                            })
                            .setPredicate((theTree, theNode) -> {
                                try {
                                    java.lang.reflect.Field
                                            field =
                                            theNode.getClass().getSuperclass().getSuperclass().getDeclaredField("label");
                                    field.setAccessible(true);
                                    String labelName = (String) field.get(theNode);
                                    return labelName.hashCode();
                                } catch (Throwable e) {
                                    e.printStackTrace();
                                }
                                return null;
                            })
                            .findTargetParentNode(parentObjectId);
                    if (targetParentNode != null) {
                        Map<String, ?> packageMap = ReflectionUtil.getFieldValueOrNull(targetParentNode, "subPackages");
                        List<?> elems = new ArrayList<>();
                        if (packageMap != null) {
                            if (packageMap.size() == 0) {
                                elems = ReflectionUtil.getFieldValueOrNull(targetParentNode, "classes");
                            } else {
                                elems = new ArrayList<>(packageMap.values());
                            }
                        }
                        if (elems != null) {
                            return
                                    buildPackageItems(context.snapshot, tree, elems, ascendingOrder, sortBy, null, null,
                                                      new PagingRequest(page, pageSize));
                        } else {
                            return PageView.empty();
                        }
                    } else {
                        return PageView.empty();
                    }
                }
                default:
                    throw new AnalysisException("Should not reach here");
            }
        });
    }