package com.jackson.reservoir; import com.jackson.bean.ContextSrc; import com.jackson.common.control.ProxyController; import com.jackson.db.po.Proxy; import com.jackson.db.po.Url; import com.jackson.db.service.UrlService; import com.jackson.task.parser.IParser; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpRequestBase; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.util.HashMap; /** * Created by Jackson on 2016/11/7. * 解析器都是单例存储的。 */ public class ParserPool { private static Logger logger = LogManager.getLogger(ParserPool.class.getName()); private String defaultParser = "defaultParser"; private HashMap<String,IParser> pool; public ParserPool(){ pool = new HashMap<>(); pool.put("defaultParser",new DefaultParser()); } public IParser getParser(Class<? extends IParser> clzz){ if(clzz==null)return pool.get(defaultParser); IParser iParser = pool.get(clzz.getName()); if(iParser==null){ iParser = newInstance(clzz); if(iParser==null){ logger.error("解析parser错误 parserClassName{}",clzz.getName()); throw new RuntimeException("解析parser错误 parserClassName:"+clzz.getName()); } else pool.put(clzz.getName(),iParser); } logger.debug("获取parser className:{}",clzz.getName()); return iParser; } private IParser newInstance(Class<? extends IParser> clzz){ logger.debug("创建新的parser className:{},当前parser数量为{}",clzz.getName(),pool.size()); IParser iParser = null; try{ iParser = clzz.newInstance(); } catch (IllegalAccessException e) { logger.error(e.toString()); } catch (InstantiationException e) { logger.error(e.toString()); }finally { return iParser; } } /** * 解析器classname为空时返回它 */ private static class DefaultParser implements IParser{ @Override public boolean responseHandle(Proxy proxy, ProxyController proxyController, Url url, UrlService urlService, ContextSrc contextSrc, HttpRequestBase request, CloseableHttpResponse response, String content) { return true; } } }