package jdepend.metadata.tree; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.List; import jdepend.metadata.JavaClass; import jdepend.metadata.JavaClassRelationItem; public abstract class JavaClassTreesCreator { private Collection<JavaClass> javaClasses = new HashSet<JavaClass>();// 记录扫描过的JavaClass private List<JavaClassTree> trees; JavaClassTreesCreator() { } public List<JavaClassTree> create(Collection<JavaClass> classes) { trees = new ArrayList<JavaClassTree>(); JavaClassTree tree; boolean unite = false;// 合并到其他树上 for (JavaClass javaClass : classes) { javaClasses.add(javaClass); unite = false; for (JavaClassRelationItem relationItem : this.getRelationItem(javaClass)) { if (!javaClasses.contains(this.getDepend(relationItem)) && classes.contains(this.getDepend(relationItem))) { javaClasses.add(this.getDepend(relationItem)); // 判断是否要合并到其它树上 for (JavaClassTree currentTree : trees) { if (currentTree.contains(this.getDepend(relationItem))) { if (currentTree.getJavaClassRoots().contains(this.getDepend(relationItem))) { currentTree.setRoot(this.getCurrent(relationItem), this.getDepend(relationItem)); } else { currentTree.insertNode(this.getCurrent(relationItem), this.getDepend(relationItem)); } unite = true; } } if (unite) break; // 创建新的树 tree = new JavaClassTree(javaClass); rout(tree, classes);// 扫描JavaClass,增加节点 trees.add(tree); } } } // 删除只有一个节点的树 Iterator<JavaClassTree> it = trees.iterator(); JavaClassTree tree1; while (it.hasNext()) { tree1 = it.next(); if (tree1.getDeep() == 1) { it.remove(); } } return trees; } private void rout(JavaClassTree tree, Collection<JavaClass> classes) { JavaClass currentClass = tree.getCurrent(); javaClasses.add(currentClass); for (JavaClassRelationItem relationItem : getRelationItem(currentClass)) {// 广度搜索 if (classes.contains(this.getDepend(relationItem))) { if (!javaClasses.contains(this.getDepend(relationItem))) { javaClasses.add(this.getDepend(relationItem)); tree.addNode(this.getCurrent(relationItem), this.getDepend(relationItem)); rout(tree, classes);// 深度搜索 } else { // 判断是否要合并到其它树上 Iterator<JavaClassTree> it = trees.iterator(); JavaClassTree currentTree; while (it.hasNext()) { currentTree = it.next(); if (currentTree.contains(this.getDepend(relationItem))) { if (currentTree.getJavaClassRoots().contains(this.getDepend(relationItem))) { this.appendTree(it, tree, currentTree, currentClass); } else { this.mergeTree(it, tree, currentTree, currentClass, this.getDepend(relationItem)); } } } } } } } protected void appendTree(Iterator<JavaClassTree> it, JavaClassTree tree, JavaClassTree currentTree, JavaClass currentClass) { tree.appendTree(currentClass, currentTree); it.remove(); } protected void mergeTree(Iterator<JavaClassTree> it, JavaClassTree tree, JavaClassTree currentTree, JavaClass currentClass, JavaClass dependJavaClass) { } /** * 得到指定JavaClassRelationType的关系信息集合 * * @param javaClass * @return */ protected abstract Collection<JavaClassRelationItem> getRelationItem(JavaClass javaClass); /** * 得到JavaClassRelationItem中的对方 * * @param item * @return */ protected abstract JavaClass getDepend(JavaClassRelationItem item); /** * 得到JavaClassRelationItem中的自己 * * @param item * @return */ protected abstract JavaClass getCurrent(JavaClassRelationItem item); }