package jdepend.model.component; import java.util.ArrayList; import java.util.Collection; import java.util.List; import jdepend.metadata.JavaClass; import jdepend.metadata.JavaPackage; import jdepend.metadata.tree.JavaPackageNode; import jdepend.metadata.tree.JavaPackageTreeCreator; import jdepend.model.Component; import jdepend.model.ComponentException; import jdepend.model.JavaClassUnit; import jdepend.model.component.judge.ComponentJudge; import jdepend.model.component.judge.ComponentJudgeFactory; /** * 按规则识别组件 * * @author ibmuser * */ public final class AptitudeComponent extends Component { /** * */ private static final long serialVersionUID = -8034734675779292126L; private List<ComponentJudge> judges = new ArrayList<ComponentJudge>(); public AptitudeComponent() { super(); } public AptitudeComponent(String name) { super(name); } @Override public void init(String group, String command, String info) throws ComponentException { this.initJudges(group, command); } @Override protected List<Component> doList(Collection<JavaPackage> javaPackages) throws ComponentException { // 清空临时计算结果 List<Component> components = new ArrayList<Component>(); // 构造JavaPackageTree JavaPackageNode root = (new JavaPackageTreeCreator()).createTree(javaPackages); // 创建组件 if (this.isComponent(root)) { components.add(this.createComponent(root.getPath(), javaPackages)); } else { this.createComponent(root, javaPackages, components); } return components; } private void createComponent(JavaPackageNode node, Collection<JavaPackage> javaPackages, List<Component> components) throws ComponentException { for (JavaPackageNode child : node.getChildren()) { if (this.isComponent(child)) { components.add(this.createComponent(child.getPath(), javaPackages)); } else { createComponent(child, javaPackages, components); } } } private Component createComponent(String name, Collection<JavaPackage> javaPackages) { AptitudeComponent component = new AptitudeComponent(name); for (JavaPackage javaPackage : javaPackages) { if (javaPackage.getName().startsWith(name)) { for (JavaClass javaClass : javaPackage.getClasses()) { component.addJavaClass(new JavaClassUnit(javaClass)); } } } return component; } private boolean isComponent(JavaPackageNode node) throws ComponentException { for (ComponentJudge judge : this.judges) { if (judge.isComponent(node)) { return true; } } return false; } private void initJudges(String group, String command) throws ComponentException { if (group == null || command == null) { throw new ComponentException("执行环境中没有RunningCommand信息。"); } this.judges = (new ComponentJudgeFactory(group, command)).getJudges(); } public void addJudge(ComponentJudge judge) { if (!this.judges.contains(judge)) { this.judges.add(judge); } } }