package com.geccocrawler.gecco.downloader;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.reflections.Reflections;
/**
* 下载器工厂类
*
* @author huchengyi
*
*/
public abstract class DownloaderFactory {
public static final String DEFAULT_DWONLODER = "httpClientDownloader";
private Map<String, Downloader> downloaders;
public DownloaderFactory(Reflections reflections) {
this.downloaders = new HashMap<String, Downloader>();
Set<Class<?>> classes = reflections.getTypesAnnotatedWith(com.geccocrawler.gecco.annotation.Downloader.class);
for(Class<?> downloaderClass : classes) {
com.geccocrawler.gecco.annotation.Downloader downloader = (com.geccocrawler.gecco.annotation.Downloader)downloaderClass.getAnnotation(com.geccocrawler.gecco.annotation.Downloader.class);
try {
Object o = createDownloader(downloaderClass);
if(o instanceof Downloader) {
Downloader downloaderInstance = (Downloader)o;
String name = downloader.value();
downloaders.put(name, downloaderInstance);
}
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
public Downloader getDownloader(String name) {
Downloader downloader = downloaders.get(name);
if(downloader == null) {
return defaultDownloader();
}
return downloader;
}
public Downloader defaultDownloader() {
return downloaders.get(DEFAULT_DWONLODER);
}
protected abstract Object createDownloader(Class<?> downloaderClass) throws Exception;
public void closeAll() {
for(Downloader downloader : downloaders.values()) {
downloader.shutdown();
}
}
}