package jdepend.knowledge.pattern.impl1;
import java.util.ArrayList;
import java.util.Collection;
import jdepend.knowledge.pattern.PatternInfo;
import jdepend.metadata.Attribute;
import jdepend.metadata.InvokeItem;
import jdepend.metadata.JavaClass;
import jdepend.metadata.Method;
import jdepend.model.JavaClassUnit;
public final class BuilderIdentifyer extends AbstractPatternIdentifyer {
@Override
public Collection<PatternInfo> identify(Collection<JavaClassUnit> javaClasses) {
Collection<PatternInfo> rtn = new ArrayList<PatternInfo>();
for (JavaClassUnit javaClass : javaClasses) {
L: for (Attribute attribute : javaClass.getJavaClass().getAttributes()) {
for (JavaClass builder : attribute.getTypeClasses()) {
// 识别builder接口
if (!builder.equals(javaClass) && builder.isAbstract() && builder.getSubClasses().size() > 1) {
for (Method method : javaClass.getJavaClass().getSelfMethods()) {
// 识别builderMethod
if (method.getReturnTypes().size() == 1 && method.getReturnClassTypes().size() == 1) {
JavaClass productType = method.getReturnClassTypes().iterator().next();
for (InvokeItem invokeItem : method.getInvokeItems()) {
Method invokeMethod = invokeItem.getCallee();
if (invokeMethod.getJavaClass().equals(builder)
&& invokeMethod.getReturnTypes().size() == 1
&& invokeMethod.getReturnClassTypes().size() == 1) {
if (invokeMethod.getReturnClassTypes().iterator().next().equals(productType)) {
rtn.add(new PatternInfo(javaClass.getJavaClass(), attribute.getName() + "."
+ invokeItem.getCallee().getName()));
break L;
}
}
}
}
}
}
}
}
}
return rtn;
}
@Override
public String getExplain() {
StringBuilder explain = new StringBuilder();
explain.append(" <strong>构建模式</strong><br>");
explain
.append(" 1、存在Builder接口(作为属性);2、存在一个以上实现;3、类方法中调用了Builder的方法;5、两个方法返回相同的数据类型。<br><br>");
return explain.toString();
}
}