package jdepend.service.avertcheat.abstractClassQualificationConfirmer;
import java.util.Collection;
import java.util.HashSet;
import jdepend.metadata.JavaClass;
import jdepend.model.JavaClassUnit;
import jdepend.model.profile.model.JavaClassUnitProfile;
import jdepend.model.result.AnalysisResult;
import jdepend.model.result.AnalysisRunningContext;
import jdepend.service.avertcheat.framework.JavaClassAvertCheat;
public final class AbstractClassQualificationConfirmer extends JavaClassAvertCheat {
private static int ChildJavaClassCount = 1;
private Collection<String> abstractClassRules;
@Override
protected void init(AnalysisResult result) {
abstractClassRules = new HashSet<String>(result.getRunningContext().getProfileFacade()
.getJavaClassUnitProfile().getAbstractClassRules());
}
@Override
protected void handle(JavaClassUnit javaClass) {
if (this.confirmAbstractQualification(javaClass)) {
javaClass.setAbstractClassQualification(true);
} else {
javaClass.setAbstractClassQualification(false);
}
}
private boolean confirmAbstractQualification(JavaClassUnit javaClassUnit) {
AnalysisResult result = javaClassUnit.getResult();
Collection<JavaClass> subClasses = javaClassUnit.getJavaClass().getSubClasses();
// 子类数量大于指定数量
if (abstractClassRules.contains(JavaClassUnitProfile.AbstractClassRule_ChildCount)
&& subClasses.size() > ChildJavaClassCount) {
return true;
}
// 存在一个子类,又存在父类也具备抽象类计数资格
if (abstractClassRules.contains(JavaClassUnitProfile.AbstractClassRule_SuperAndChild) && subClasses.size() > 0
&& javaClassUnit.getJavaClass().getSupers().size() > 0) {
return true;
}
// 子类不在一个组件中也具备抽象类计数资格
if (abstractClassRules.contains(JavaClassUnitProfile.AbstractClassRule_ChildAtOtherComponent)) {
for (JavaClass subClass : subClasses) {
JavaClassUnit subClassUnit = result.getTheClass(subClass.getId());
if (subClassUnit != null
&& (!subClassUnit.containedComponent() || !subClassUnit.getComponent().equals(
javaClassUnit.getComponent()))) {
return true;
}
}
}
// 子类除实现该接口(或继承了该抽象类)外还实现或继承了其他类
if (abstractClassRules.contains(JavaClassUnitProfile.AbstractClassRule_CooperationUse)) {
for (JavaClass subClass : subClasses) {
if (subClass.getSelfSupers().size() > 1) {
return true;
}
}
}
return false;
}
@Override
public boolean enable(AnalysisRunningContext context) {
return context.getProfileFacade().getJavaClassUnitProfile().isAbstractClassRule();
}
@Override
public String getName() {
return "抽象类计数资格评判器";
}
@Override
public String getTip() {
return "只有子类个数大于一定数值时,本类才具有抽象类计数资格,该判断将对组件的抽象化程度有影响";
}
@Override
public Integer order() {
return 2;
}
}