All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.logicbus.backend.ServantFactory Maven / Gradle / Ivy

There is a newer version: 1.6.17
Show newest version
package com.logicbus.backend;

import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

import com.alogic.load.Scanner;
import com.logicbus.models.servant.ServiceDescription;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

import com.anysoft.util.Configurable;
import com.anysoft.util.Factory;
import com.anysoft.util.IOTools;
import com.anysoft.util.JsonTools;
import com.anysoft.util.Properties;
import com.anysoft.util.PropertiesConstants;
import com.anysoft.util.Reportable;
import com.anysoft.util.Settings;
import com.anysoft.util.XMLConfigurable;
import com.anysoft.util.XmlElementProperties;
import com.anysoft.util.XmlTools;
import com.anysoft.util.resource.ResourceFactory;
import com.logicbus.models.catalog.Path;
import com.logicbus.models.servant.ServantManager;
import com.logicbus.models.servant.ServiceDescriptionWatcher;


/**
 * 服务员工厂
 * @author duanyy
 * @version 1.2.0 [20140607 duanyy]修正无法reload的bug
 * @version 1.2.2 [20140617 duanyy]
 * - 改进同步模型 
* * @version 1.2.6 [20140807 duanyy] * - 修改为interface
* * @version 1.6.7.20
* - 改造为通过XML配置文件进行配置
* - 改造ServantManager模型,增加服务配置监控机制
* * @version 1.6.12.29 [20190409]
* - 优化底层的错误代码的处理;
* * @version 1.6.14.12 [20210617 duanyy]
* - 支持自己的AccessController和Normalizer
*/ public interface ServantFactory extends ServiceDescriptionWatcher,AutoCloseable, XMLConfigurable,Configurable,Reportable{ /** * 获得服务资源池列表 * @return 服务资源池列表 */ public ServantPool [] getPools(); /** * 重新装入指定服务的资源池 * @param _id 服务id * @return 服务资源池 */ public ServantPool reloadPool(Path _id); /** * 获取指定服务的的服务资源池 * @param _id 服务Id * @return 服务资源池 */ public ServantPool getPool(Path _id); public Servant getExceptionHandler(); /** * 获取服务注册表 * @return 服务注册表 */ public ServantRegistry getServantRegistry(); public Normalizer getNormalizer(Normalizer dft); public AccessController getAccessController(AccessController dft); /** * 虚基类 * @author duanyy * */ public static abstract class Abstract implements ServantFactory{ /** * a slf4j logger */ protected static final Logger logger = LoggerFactory.getLogger(ServantFactory.class); /** * 服务注册表 */ protected ServantRegistry servantRegistry = null; protected Servant exceptionHandler = null; @Override public void configure(Element e, Properties p) { Properties props = new XmlElementProperties(e,p); configure(props); Element registry = XmlTools.getFirstElementByPath(e, "registry"); if (registry != null){ try{ Factory f = new Factory(); servantRegistry = f.newInstance(registry, props, "module", ServantManager.class.getName()); servantRegistry.addWatcher(this); }catch (Exception ex){ logger.error("Can not create servent registry,Using default.",ex); } } if (servantRegistry == null){ servantRegistry = new ServantManager(); servantRegistry.addWatcher(this); servantRegistry.configure(e, p); } logger.info("Using servant registry:" + servantRegistry.getClass().getName()); String eHandler = PropertiesConstants.getString(props, "exceptionHandler", "/core/util/Helloworld"); if (StringUtils.isNotEmpty(eHandler)){ ServantPool pool = this.getPool(new Path(eHandler)); exceptionHandler = pool != null?pool.getExceptionHandler():null; } } @Override public Servant getExceptionHandler(){ return exceptionHandler; } @Override public void report(Element xml) { if (xml != null){ xml.setAttribute("module", getClass().getName()); if (servantRegistry != null){ Document doc = xml.getOwnerDocument(); Element registry = doc.createElement("registry"); servantRegistry.report(registry); } } } @Override public void report(Map json) { if (json != null){ JsonTools.setString(json,"module",getClass().getName()); if (servantRegistry != null){ Map map = new HashMap(); servantRegistry.report(map); json.put("registry", map); } } } @Override public ServantRegistry getServantRegistry() { return servantRegistry; } @Override public void close(){ IOTools.close(servantRegistry); } @Override public Normalizer getNormalizer(Normalizer dft) { return servantRegistry.getNormalizer(dft); } @Override public AccessController getAccessController(AccessController dft) { return servantRegistry.getAccessController(dft); } } public static class TheFactory extends Factory{ /** * 缺省配置文件 */ public static final String DEFAULT = "java:///com/logicbus/backend/servantfactory.default.xml#com.logicbus.backend.ServantFactory"; /** * a logger of log4j */ protected static final Logger LOG = LoggerFactory.getLogger(ServantFactory.class); public static ServantFactory get(){ return get(Settings.get()); } public static ServantFactory get(Properties props){ String master = props.GetValue("servant.factory.master",DEFAULT); String secondary = props.GetValue("servant.factory.secondary",DEFAULT); ResourceFactory rf = Settings.getResourceFactory(); InputStream in = null; try { in = rf.load(master,secondary, null); Document doc = XmlTools.loadFromInputStream(in); if (doc != null){ return getServantFactory(doc.getDocumentElement(),props); } }catch (Exception ex){ LOG.error("Error occurs when load xml file,source=" + master, ex); }finally { IOTools.closeStream(in); } return null; } public static ServantFactory getServantFactory(Element e,Properties p){ TheFactory factory = new TheFactory(); return factory.newInstance(e, p); } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy