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.JavaClass;
import jdepend.model.JavaClassUnit;
public final class CompositeIdentifyer extends AbstractPatternIdentifyer {
@Override
public String getExplain() {
StringBuilder explain = new StringBuilder();
explain.append(" <strong>组合模式</strong><br>");
explain.append(" 1、存在父类(可能不止一层);2、属性有父类类型,并且是集合类型;3、父类还有其他子类。<br><br>");
return explain.toString();
}
@Override
public Collection<PatternInfo> identify(Collection<JavaClassUnit> javaClasses) {
Collection<JavaClass> superClasses;
Attribute compositeAttribute;
Collection<PatternInfo> rtn = new ArrayList<PatternInfo>();
for (JavaClassUnit javaClass : javaClasses) {
// 计算存在父类的JavaClasses
superClasses = javaClass.getJavaClass().getSupers();
if (superClasses != null && superClasses.size() > 0) {
compositeAttribute = null;
// 搜索属性
for (Attribute attribute : javaClass.getJavaClass().getAttributes()) {
if (attribute.existCollectionType()) {
for (JavaClass superClass : superClasses) {
if (attribute.getTypes().contains(superClass.getName())) {
compositeAttribute = attribute;
}
}
}
}
// 搜索其他子类
if (compositeAttribute != null) {
L: for (JavaClass superClass : superClasses) {
if (!superClass.getSubClasses().contains(javaClass)) {
rtn.add(new PatternInfo(javaClass.getJavaClass(), javaClass.getName() + "[" + compositeAttribute.getName()
+ "]"));
break L;
}
}
}
}
}
return rtn;
}
}