package jdepend.knowledge.pattern.impl2;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import jdepend.knowledge.pattern.AbstractPatternIdentifyerMgr;
import jdepend.knowledge.pattern.PatternInfo;
import jdepend.knowledge.pattern.impl2.feature.AdapterClassFeature;
import jdepend.knowledge.pattern.impl2.feature.BuilderFeature;
import jdepend.knowledge.pattern.impl2.feature.DecoratorFeature;
import jdepend.knowledge.pattern.impl2.feature.FacadeFeature;
import jdepend.knowledge.pattern.impl2.feature.FactoryMethodFeature;
import jdepend.knowledge.pattern.impl2.feature.FlyweightFeature;
import jdepend.knowledge.pattern.impl2.feature.ObserverFeature;
import jdepend.knowledge.pattern.impl2.feature.PrototypeFeature;
import jdepend.knowledge.pattern.impl2.feature.ProxyFeature;
import jdepend.knowledge.pattern.impl2.feature.SingletonFeature;
import jdepend.knowledge.pattern.impl2.feature.StateFeature;
import jdepend.knowledge.pattern.impl2.feature.StrategyFeature;
import jdepend.knowledge.pattern.impl2.feature.TemplateMethodFeature;
import jdepend.knowledge.pattern.impl2.feature.leaf.AbstractAttributeFeature;
import jdepend.knowledge.pattern.impl2.feature.leaf.AbstractAttributeHaveSubClassesFeature;
import jdepend.knowledge.pattern.impl2.feature.leaf.AbstractAttributeIsSelfSuperFeature;
import jdepend.knowledge.pattern.impl2.feature.leaf.AbstractClassFeature;
import jdepend.knowledge.pattern.impl2.feature.leaf.AbstractMethodFeature;
import jdepend.knowledge.pattern.impl2.feature.leaf.CollectionAttributeFeature;
import jdepend.knowledge.pattern.impl2.feature.leaf.CollectionAttributeHaveSubClassesFeature;
import jdepend.knowledge.pattern.impl2.feature.leaf.CollectionAttributeIsSelfSuperFeature;
import jdepend.knowledge.pattern.impl2.feature.leaf.ConstructorArgIsSuperFeature;
import jdepend.knowledge.pattern.impl2.feature.leaf.HaveSuperFeature;
import jdepend.knowledge.pattern.impl2.feature.leaf.NotEnumTypeFeature;
import jdepend.knowledge.pattern.impl2.feature.leaf.OverrideMethodFeature;
import jdepend.knowledge.pattern.impl2.feature.leaf.OverrideMethodReturnIsSuperFeature;
import jdepend.knowledge.pattern.impl2.feature.leaf.PrivateConstructorFeature;
import jdepend.knowledge.pattern.impl2.feature.leaf.SelfHaveStateFeature;
import jdepend.knowledge.pattern.impl2.feature.leaf.StaticAttributeFeature;
import jdepend.knowledge.pattern.impl2.feature.leaf.StaticMethodFeature;
import jdepend.knowledge.pattern.impl2.feature.leaf.SubClassesFeature;
import jdepend.knowledge.pattern.impl2.feature.leaf.SuperHaveOtherSubClassFeature;
import jdepend.metadata.JavaClass;
import jdepend.model.JavaClassUnit;
import jdepend.model.result.AnalysisResult;
public class IdentifyerMgr extends AbstractPatternIdentifyerMgr {
private List<Feature> features = new ArrayList<Feature>();
private List<Identifyer> identifyers = new ArrayList<Identifyer>();
public IdentifyerMgr() {
// 创建识别器
Identifyer singletonIdentifyer = new IdentifyerImpl("单例模式");
identifyers.add(singletonIdentifyer);
Identifyer factoryMethodIdentifyer = new IdentifyerImpl("工厂模式");
identifyers.add(factoryMethodIdentifyer);
Identifyer prototypeIdentifyer = new IdentifyerImpl("克隆模式");
identifyers.add(prototypeIdentifyer);
Identifyer builderIdentifyer = new IdentifyerImpl("构建模式");
identifyers.add(builderIdentifyer);
Identifyer compositeIdentifyer = new IdentifyerImpl("组合模式");
identifyers.add(compositeIdentifyer);
Identifyer adapterClassIdentifyer = new IdentifyerImpl("适配器Class模式");
identifyers.add(adapterClassIdentifyer);
Identifyer decoratorIdentifyer = new IdentifyerImpl("装饰器模式");
identifyers.add(decoratorIdentifyer);
Identifyer facadeIdentifyer = new IdentifyerImpl("门面模式");
identifyers.add(facadeIdentifyer);
Identifyer flyweightIdentifyer = new IdentifyerImpl("享元模式");
identifyers.add(flyweightIdentifyer);
Identifyer proxyIdentifyer = new IdentifyerImpl("代理模式");
identifyers.add(proxyIdentifyer);
Identifyer templateMethodIdentifyer = new IdentifyerImpl("模板方法");
identifyers.add(templateMethodIdentifyer);
Identifyer strategyIdentifyer = new IdentifyerImpl("策略模式");
identifyers.add(strategyIdentifyer);
Identifyer stateIdentifyer = new IdentifyerImpl("状态模式");
identifyers.add(stateIdentifyer);
Identifyer observerIdentifyer = new IdentifyerImpl("观察者模式");
identifyers.add(observerIdentifyer);
// 创建特征集合
Feature feature;
feature = new NotEnumTypeFeature();
// 将识别器注册到特征中
feature.addIdentifyer(singletonIdentifyer);
this.features.add(feature);
feature = new AbstractClassFeature();
// 将识别器注册到特征中
feature.addIdentifyer(templateMethodIdentifyer);
feature.addIdentifyer(strategyIdentifyer);
feature.addIdentifyer(stateIdentifyer);
this.features.add(feature);
feature = new HaveSuperFeature();
// 将识别器注册到特征中
feature.addIdentifyer(compositeIdentifyer);
feature.addIdentifyer(factoryMethodIdentifyer);
feature.addIdentifyer(prototypeIdentifyer);
feature.addIdentifyer(adapterClassIdentifyer);
feature.addIdentifyer(decoratorIdentifyer);
feature.addIdentifyer(proxyIdentifyer);
this.features.add(feature);
feature = new SuperHaveOtherSubClassFeature();
// 将识别器注册到特征中
feature.addIdentifyer(compositeIdentifyer);
feature.addIdentifyer(decoratorIdentifyer);
feature.addIdentifyer(proxyIdentifyer);
this.features.add(feature);
feature = new SubClassesFeature();
// 将识别器注册到特征中
feature.addIdentifyer(templateMethodIdentifyer);
feature.addIdentifyer(strategyIdentifyer);
feature.addIdentifyer(stateIdentifyer);
this.features.add(feature);
feature = new SelfHaveStateFeature();
// 将识别器注册到特征中
feature.addIdentifyer(stateIdentifyer);
this.features.add(feature);
feature = new CollectionAttributeFeature();
// 将识别器注册到特征中
feature.addIdentifyer(compositeIdentifyer);
feature.addIdentifyer(flyweightIdentifyer);
this.features.add(feature);
feature = new CollectionAttributeIsSelfSuperFeature();
// 将识别器注册到特征中
feature.addIdentifyer(compositeIdentifyer);
this.features.add(feature);
feature = new CollectionAttributeHaveSubClassesFeature();
// 将识别器注册到特征中
feature.addIdentifyer(flyweightIdentifyer);
this.features.add(feature);
feature = new StaticAttributeFeature();
// 将识别器注册到特征中
feature.addIdentifyer(singletonIdentifyer);
this.features.add(feature);
feature = new AbstractAttributeFeature();
// 将识别器注册到特征中
feature.addIdentifyer(builderIdentifyer);
feature.addIdentifyer(decoratorIdentifyer);
feature.addIdentifyer(observerIdentifyer);
this.features.add(feature);
feature = new AbstractAttributeHaveSubClassesFeature();
// 将识别器注册到特征中
feature.addIdentifyer(builderIdentifyer);
feature.addIdentifyer(decoratorIdentifyer);
this.features.add(feature);
feature = new AbstractAttributeIsSelfSuperFeature();
// 将识别器注册到特征中
feature.addIdentifyer(decoratorIdentifyer);
this.features.add(feature);
feature = new PrivateConstructorFeature();
// 将识别器注册到特征中
feature.addIdentifyer(singletonIdentifyer);
this.features.add(feature);
feature = new ConstructorArgIsSuperFeature();
// 将识别器注册到特征中
feature.addIdentifyer(decoratorIdentifyer);
this.features.add(feature);
feature = new StaticMethodFeature();
// 将识别器注册到特征中
feature.addIdentifyer(singletonIdentifyer);
this.features.add(feature);
feature = new OverrideMethodFeature();
// 将识别器注册到特征中
feature.addIdentifyer(factoryMethodIdentifyer);
feature.addIdentifyer(prototypeIdentifyer);
feature.addIdentifyer(decoratorIdentifyer);
feature.addIdentifyer(proxyIdentifyer);
this.features.add(feature);
feature = new OverrideMethodReturnIsSuperFeature();
// 将识别器注册到特征中
feature.addIdentifyer(factoryMethodIdentifyer);
feature.addIdentifyer(prototypeIdentifyer);
this.features.add(feature);
feature = new AbstractMethodFeature();
// 将识别器注册到特征中
feature.addIdentifyer(templateMethodIdentifyer);
feature.addIdentifyer(strategyIdentifyer);
feature.addIdentifyer(stateIdentifyer);
this.features.add(feature);
feature = new SingletonFeature();
// 将识别器注册到特征中
feature.addIdentifyer(singletonIdentifyer);
this.features.add(feature);
feature = new FactoryMethodFeature();
// 将识别器注册到特征中
feature.addIdentifyer(factoryMethodIdentifyer);
this.features.add(feature);
feature = new PrototypeFeature();
// 将识别器注册到特征中
feature.addIdentifyer(prototypeIdentifyer);
this.features.add(feature);
feature = new BuilderFeature();
// 将识别器注册到特征中
feature.addIdentifyer(builderIdentifyer);
this.features.add(feature);
feature = new AdapterClassFeature();
// 将识别器注册到特征中
feature.addIdentifyer(adapterClassIdentifyer);
this.features.add(feature);
feature = new DecoratorFeature();
// 将识别器注册到特征中
feature.addIdentifyer(decoratorIdentifyer);
this.features.add(feature);
feature = new FacadeFeature();
// 将识别器注册到特征中
feature.addIdentifyer(facadeIdentifyer);
this.features.add(feature);
feature = new FlyweightFeature();
// 将识别器注册到特征中
feature.addIdentifyer(flyweightIdentifyer);
this.features.add(feature);
feature = new ProxyFeature();
// 将识别器注册到特征中
feature.addIdentifyer(proxyIdentifyer);
this.features.add(feature);
feature = new TemplateMethodFeature();
// 将识别器注册到特征中
feature.addIdentifyer(templateMethodIdentifyer);
this.features.add(feature);
feature = new StrategyFeature();
// 将识别器注册到特征中
feature.addIdentifyer(strategyIdentifyer);
this.features.add(feature);
feature = new StateFeature();
// 将识别器注册到特征中
feature.addIdentifyer(stateIdentifyer);
this.features.add(feature);
feature = new ObserverFeature();
// 将识别器注册到特征中
feature.addIdentifyer(observerIdentifyer);
this.features.add(feature);
}
protected Map<String, Collection<PatternInfo>> doIdentify(AnalysisResult result) {
FeatureCheckContext context;
for (JavaClassUnit javaClass : result.getClasses()) {
context = new FeatureCheckContext(javaClass);
for (Feature feature : this.features) {
feature.check(context);
}
}
Map<String, Collection<PatternInfo>> results = new LinkedHashMap<String, Collection<PatternInfo>>();
Collection<PatternInfo> patternInfos;
for (Identifyer identifyer : this.identifyers) {
patternInfos = new ArrayList<PatternInfo>();
Map<JavaClass, String> resultData = identifyer.getResult();
for (JavaClass javaClass : resultData.keySet()) {
patternInfos.add(new PatternInfo(javaClass, resultData.get(javaClass)));
}
results.put(identifyer.getName(), patternInfos);
}
this.clear();
return results;
}
private void clear() {
for (Identifyer identifyer : this.identifyers) {
identifyer.clear();
}
}
@Override
public String getExplain() {
StringBuilder explain = new StringBuilder();
explain.append("<strong>设计模式识别器</strong>是通过分析每种设计模式的特征,通过特征比对识别代码中使用设计模式的地方。<br><br>");
for (Identifyer Identifyer : identifyers) {
explain.append(Identifyer.getExplain());
}
return explain.toString();
}
}