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");
}
});
}