package jdepend.util.analyzer.element; import java.util.Collection; import java.util.HashSet; import jdepend.framework.exception.JDependException; import jdepend.metadata.Attribute; import jdepend.metadata.JavaClass; 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 IdentifyDomainService extends AbstractAnalyzer { private static final long serialVersionUID = -8083874482518842003L; private String serviceClassName; private transient Collection<String> serviceNames; public IdentifyDomainService() { super("识别DomainService", Analyzer.Attention, "识别DomainService"); } @Override protected void doExecute(AnalysisResult result) throws AnalyzerException { int count; boolean domain; for (JavaClassUnit javaClass : result.getClasses()) { if (isService(javaClass.getJavaClass())) { domain = true; count = 0; L: for (Attribute attribute : javaClass.getJavaClass().getAttributes()) { for (JavaClass type : attribute.getTypeClasses()) { if (isService(type)) { JavaClassUnit typeUnit = result.getTheClass(type.getId()); if (!typeUnit.containedComponent() || !javaClass.getComponent().equals(typeUnit.getComponent())) { domain = false; break L; } else { count++; if (count > 1) { domain = false; break L; } } } } } if (domain) { this.printTable("Service名", javaClass.getName()); } } } } @Override public void init() throws AnalyzerException { serviceNames = new HashSet<String>(); serviceNames.add("BO"); serviceNames.add("BOImpl"); serviceNames.add("Service"); serviceNames.add("ServiceImpl"); serviceNames.add("Facade"); serviceNames.add("FacadeImpl"); serviceNames.add("Stub"); serviceNames.add("StubImpl"); if (serviceClassName != null) { for (String name : this.serviceClassName.split(",")) { if (name != null && name.length() > 0) { serviceNames.add(name); } } } } private boolean isService(JavaClass javaClass) { for (String serviceName : serviceNames) { if (javaClass.getName().endsWith(serviceName)) { return true; } } return false; } public String getServiceClassName() { return serviceClassName; } public void setServiceClassName(String serviceClassName) { this.serviceClassName = serviceClassName; } @Override public String getExplain() { StringBuilder explain = new StringBuilder(); explain.append("识别具有原子性质的Service,规则:<br>"); explain.append("1、该类名以Facade、Service、BO、Stub結尾。<br>"); explain.append("2、该类没有注入了其他组件的Facade或Service。<br>"); explain.append("3、该类仅注入了本组件零个或一个其他Service。<br>"); return explain.toString(); } }