package jdepend.util.analyzer.element; import java.util.ArrayList; import java.util.Collection; import java.util.List; import jdepend.model.Component; import jdepend.model.JDependUnit; import jdepend.model.JavaClassUnit; import jdepend.model.result.AnalysisResult; import jdepend.util.analyzer.framework.AbstractAnalyzer; import jdepend.util.analyzer.framework.Analyzer; import jdepend.util.analyzer.framework.AnalyzerException; public class IdentifyWillMoveJavaClass extends AbstractAnalyzer { private static final long serialVersionUID = -4694725166948491555L; public IdentifyWillMoveJavaClass() { super("MoveJavaClass分析", Analyzer.Attention, "识别有移动倾向的JavaClass"); } @Override protected void doExecute(AnalysisResult result) throws AnalyzerException { Collection<Component> units = result.getComponents(); List<JavaClassMoveInfo> infos = new ArrayList<JavaClassMoveInfo>(); for (Component unit : units) { for (JavaClassUnit javaClass : unit.getClasses()) { // Class是孤立的,又不是私有的 if (javaClass.isAlone() && !javaClass.isPrivateElement()) { Collection<JDependUnit> targets = new ArrayList<JDependUnit>(); // 收集目标组件 for (JavaClassUnit relationJavaClass : javaClass.getRelationList()) { if (!targets.contains(relationJavaClass.getComponent())) { targets.add(relationJavaClass.getComponent()); } } // 生成建议 if (targets.size() == 1) { JavaClassMoveInfo info = new JavaClassMoveInfo(javaClass, unit.getName(), targets.iterator() .next().getName()); if (!infos.contains(info)) { infos.add(info); } } } } } if (infos.size() > 0) { this.isPrintTab(false); this.print("以下列出的类与源组件中的类没有关系,而与目标组件中的类存在关系:\n"); for (JavaClassMoveInfo info : infos) { this.print(info.toString()); } } } @Override public String getExplain() { return "/culture/关注与反模式/moveJavaClass.htm"; } class JavaClassMoveInfo { public JavaClassUnit javaClass; public String source; public String target; public JavaClassMoveInfo(JavaClassUnit javaClass, String source, String target) { super(); this.javaClass = javaClass; this.source = source; this.target = target; } @Override public String toString() { return "建议将JavaClass[" + javaClass.getName() + "]从[" + source + "]移动到[" + target + "]中\n"; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + getOuterType().hashCode(); result = prime * result + ((javaClass == null) ? 0 : javaClass.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; JavaClassMoveInfo other = (JavaClassMoveInfo) obj; if (!getOuterType().equals(other.getOuterType())) return false; if (javaClass == null) { if (other.javaClass != null) return false; } else if (!javaClass.equals(other.javaClass)) return false; return true; } private IdentifyWillMoveJavaClass getOuterType() { return IdentifyWillMoveJavaClass.this; } } }