package jdepend.util.analyzer.element; import java.util.ArrayList; import java.util.List; import jdepend.model.JavaClassUnit; import jdepend.model.result.AnalysisResult; import jdepend.util.analyzer.framework.AbstractAnalyzer; import jdepend.util.analyzer.framework.AnalyzerException; public final class RepeatClassAnalyzer extends AbstractAnalyzer { private static final long serialVersionUID = 5472258042892488645L; public RepeatClassAnalyzer() { super("重复类识别", Attention, "识别不同jar包中是否存在同包名同类名的类(jar包冲突)"); } @Override protected void doExecute(AnalysisResult result) throws AnalyzerException { List<JavaClassUnit> repeatClasses = new ArrayList<JavaClassUnit>(); boolean firstRecord; boolean needCheck; for (JavaClassUnit javaClass : result.getClasses()) { // 检查是否已经检测过(被检查时已经收集到repeatClasses中,不必再检查) needCheck = true; L: for (JavaClassUnit repeatClass : repeatClasses) { if (repeatClass.equals(javaClass)) { needCheck = false; break L; } } if (needCheck) { firstRecord = true; for (JavaClassUnit javaClass1 : result.getClasses()) { if (this.repeat(javaClass, javaClass1)) { if (firstRecord) { repeatClasses.add(javaClass); firstRecord = false; } repeatClasses.add(javaClass1); } } } } for (JavaClassUnit javaClass : repeatClasses) { this.printTable("类名", javaClass.getName()); this.printTable("位置", javaClass.getJavaClass().getPlace()); } } private boolean repeat(JavaClassUnit javaClass, JavaClassUnit javaClass1) { if (javaClass.getName().equals(javaClass1.getName())) { if (javaClass.getJavaClass().getPlace() == null && javaClass1.getJavaClass().getPlace() != null) { return true; } else if (javaClass.getJavaClass().getPlace() != null && javaClass1.getJavaClass().getPlace() == null) { return true; } else if (javaClass.getJavaClass().getPlace() == null && javaClass1.getJavaClass().getPlace() == null) { return false; } else if (!javaClass.getJavaClass().getPlace().equals(javaClass1.getJavaClass().getPlace())) { return true; } else { return false; } } else { return false; } } @Override public String getExplain() { StringBuilder explain = new StringBuilder(); explain.append("识别不同jar包中是否存在同包名同类名的类(jar包冲突)。<br>"); return explain.toString(); } }