package jadx.gui.treemodel; import jadx.api.ResourceFile; import jadx.gui.JadxWrapper; import jadx.gui.treemodel.JResource.JResType; import jadx.gui.utils.Utils; import javax.swing.Icon; import javax.swing.ImageIcon; import java.io.File; import java.util.Collections; import java.util.Enumeration; import java.util.List; import java.util.regex.Pattern; public class JRoot extends JNode { private static final long serialVersionUID = 8888495789773527342L; private static final ImageIcon ROOT_ICON = Utils.openIcon("java_model_obj"); private final JadxWrapper wrapper; private boolean flatPackages = false; public JRoot(JadxWrapper wrapper) { this.wrapper = wrapper; update(); } public final void update() { removeAllChildren(); add(new JSources(this, wrapper)); List<JResource> resList = getHierarchyResources(wrapper.getResources()); for (JResource jRes : resList) { jRes.update(); add(jRes); } } private List<JResource> getHierarchyResources(List<ResourceFile> resources) { if (resources.isEmpty()) { return Collections.emptyList(); } JResource root = new JResource(null, "Resources", JResType.ROOT); String splitPathStr = Pattern.quote(File.separator); for (ResourceFile rf : resources) { String[] parts = new File(rf.getName()).getPath().split(splitPathStr); JResource curRf = root; int count = parts.length; for (int i = 0; i < count; i++) { String name = parts[i]; JResource subRF = getResourceByName(curRf, name); if (subRF == null) { if (i != count - 1) { subRF = new JResource(null, name, JResType.DIR); } else { subRF = new JResource(rf, name, JResType.FILE); } curRf.getFiles().add(subRF); } curRf = subRF; } } return Collections.singletonList(root); } private JResource getResourceByName(JResource rf, String name) { for (JResource sub : rf.getFiles()) { if (sub.getName().equals(name)) { return sub; } } return null; } public JNode searchClassInTree(JNode node) { Enumeration<?> en = this.breadthFirstEnumeration(); while (en.hasMoreElements()) { Object obj = en.nextElement(); if (node.equals(obj)) { return (JNode) obj; } } return null; } public boolean isFlatPackages() { return flatPackages; } public void setFlatPackages(boolean flatPackages) { if (this.flatPackages != flatPackages) { this.flatPackages = flatPackages; update(); } } @Override public Icon getIcon() { return ROOT_ICON; } @Override public JClass getJParent() { return null; } @Override public int getLine() { return 0; } @Override public String makeString() { File file = wrapper.getOpenFile(); return file != null ? file.getName() : "File not open"; } }