package jdepend.knowledge.pattern.impl1;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import jdepend.framework.util.ThreadPool;
import jdepend.knowledge.pattern.AbstractPatternIdentifyerMgr;
import jdepend.knowledge.pattern.PatternInfo;
import jdepend.model.JavaClassUnit;
import jdepend.model.result.AnalysisResult;
public final class PatternIdentifyerMgrImpl extends AbstractPatternIdentifyerMgr {
private Map<String, PatternIdentifyer> identifyers;
public PatternIdentifyerMgrImpl() {
this.init();
}
protected Map<String, Collection<PatternInfo>> doIdentify(AnalysisResult result) {
final Collection<JavaClassUnit> javaClasses = result.getClasses();
final Map<String, Collection<PatternInfo>> rtn = new HashMap<String, Collection<PatternInfo>>();
ExecutorService pool = ThreadPool.getPool();
for (final String identifyerName : identifyers.keySet()) {
final PatternIdentifyer identifyer = identifyers.get(identifyerName);
if (identifyer instanceof AbstractPatternIdentifyer) {
((AbstractPatternIdentifyer) identifyer).setResult(result);
}
pool.execute(new Runnable() {
@Override
public void run() {
Collection<PatternInfo> items = identifyer.identify(javaClasses);
synchronized (rtn) {
if (items != null && items.size() > 0) {
rtn.put(identifyerName, items);
} else {
rtn.put(identifyerName, null);
}
}
}
});
}
ThreadPool.awaitTermination(pool);
return rtn;
}
private void init() {
identifyers = new LinkedHashMap<String, PatternIdentifyer>();
identifyers.put("单例模式", new SingletonIdentifyer());
identifyers.put("工厂模式", new FactoryMethodIdentifyer());
identifyers.put("克隆模式", new PrototypeIdentifyer());
identifyers.put("构建模式", new BuilderIdentifyer());
identifyers.put("适配器Class模式", new AdapterClassIdentifyer());
identifyers.put("组合模式", new CompositeIdentifyer());
identifyers.put("装饰模式", new DecoratorIdentifyer());
identifyers.put("门面模式", new FacadeIdentifyer());
identifyers.put("享元模式", new FlyweightIdentifyer());
identifyers.put("代理模式", new ProxyIdentifyer());
identifyers.put("模板方法", new TemplateMethodIdentifyer());
identifyers.put("策略模式", new StrategyIdentifyer());
identifyers.put("状态模式", new StateIdentifyer());
identifyers.put("观察者模式", new ObserverIdentifyer());
}
private Map<String, PatternIdentifyer> getIdentifyers() {
return identifyers;
}
public String getExplain() {
StringBuilder explain = new StringBuilder();
explain.append("<strong>设计模式识别器</strong>是通过分析每种设计模式的特征,通过特征比对识别代码中使用设计模式的地方。<br><br>");
Map<String, PatternIdentifyer> identifyers = this.getIdentifyers();
for (String identifyerName : identifyers.keySet()) {
explain.append(identifyers.get(identifyerName).getExplain());
}
return explain.toString();
}
}