package jdepend.knowledge.pattern.impl2.feature;
import jdepend.knowledge.pattern.impl2.AbstractFeature;
import jdepend.knowledge.pattern.impl2.FeatureCheckContext;
import jdepend.metadata.Attribute;
import jdepend.metadata.InvokeItem;
import jdepend.metadata.JavaClass;
import jdepend.metadata.Method;
public class ObserverFeature extends AbstractFeature {
@Override
protected boolean have(FeatureCheckContext context) {
if (context.getAbstractAttributes() != null) {
boolean attributeHaveSubClass;
for (Attribute attribute : context.getAbstractAttributes()) {
attributeHaveSubClass = false;
if (attribute.isInterface()) {
L: for (JavaClass attributeClass : attribute.getTypeClasses()) {
if (attributeClass.getSubClasses().size() > 0) {
attributeHaveSubClass = true;
break L;
}
}
}
if (attributeHaveSubClass) {
for (Method method : context.getCurrent().getSelfMethods()) {
for (InvokeItem item : method.getInvokeItems()) {
if (item.getCallee().getArgClassTypes().contains(context.getCurrent())
&& attribute.getTypeClasses().contains(item.getCallee().getJavaClass())) {
this.setPatternInfo(method.getName());
return true;
}
}
}
}
}
}
return false;
}
@Override
public String getName() {
return "在方法中调用抽象属性的方法,并将自身作为参数 该抽象属性有实现";
}
}