/* * <p> * 版权: ©2011 * </p> */ package org.young.isocket.service; import java.util.Map; import javax.xml.stream.XMLStreamReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.young.isocket.exception.ConfigException; import org.young.isocket.parse.AbstractXmlConfigParser; /** * <p> * 服务工厂类 * </p> * * @see * @author yangjun2 * @email yangjun1120@gmail.com * */ public class ServiceFactory extends AbstractXmlConfigParser<IService> { private static final Logger logger = LoggerFactory.getLogger(ServiceFactory.class); private final static ServiceFactory sf = new ServiceFactory(); private final static String SERVICE_CONFIG = "services.xml"; private final static String TAG_SERVICE = "service"; private final static String ATTRIBUTE_ID = "id"; private final static String ATTRIBUTE_CLASS = "class"; private final static String ATTRIBUTE_DESC = "desc"; private Map<String, IService> serviceMap; private ServiceFactory() { this.serviceMap = initServices(); } public static ServiceFactory getInstance() { return sf; } public Map<String, IService> initServices() { return super.parse(SERVICE_CONFIG); } @Override protected void doStartElement(XMLStreamReader r, Map<String, IService> m) { if (r.getLocalName().equals(TAG_SERVICE)) { String id = r.getAttributeValue(null, ATTRIBUTE_ID); String className = r.getAttributeValue(null, ATTRIBUTE_CLASS); String desc = r.getAttributeValue(null, ATTRIBUTE_DESC); Class<?> claz = null; try { claz = Class.forName(className); } catch (ClassNotFoundException e) { throw new ConfigException(e.getMessage(), e); } IService service = null; try { service = (IService) claz.newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { throw new ConfigException(e.getMessage(), e); } if (logger.isDebugEnabled()) { logger.debug( new StringBuffer().append("loaded service,id:{}").append(",classname:{}").append(",desc:{}") .toString(), new Object[] { id, className, desc }); } m.put(id, service); } } @Override protected void doEndElement(XMLStreamReader r, Map<String, IService> m) { super.dummy(); } public IService getService(String servceId) { IService service = serviceMap.get(servceId); if (service == null) throw new NullPointerException("no service match id:" + servceId); return service; } public boolean isExist(String serviceId) { return serviceMap.containsKey(serviceId); } }