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

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

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

import java.io.InputStream;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

import com.alogic.metrics.stream.MetricsReportable;
import com.anysoft.util.Configurable;
import com.anysoft.util.Factory;
import com.anysoft.util.IOTools;
import com.anysoft.util.Properties;
import com.anysoft.util.Reportable;
import com.anysoft.util.Settings;
import com.anysoft.util.XMLConfigurable;
import com.anysoft.util.XmlTools;
import com.anysoft.util.resource.ResourceFactory;
import com.logicbus.models.catalog.Path;
import com.logicbus.models.servant.ServiceDescription;

/**
 * 访问控制器
 * 
 * 

* 访问控制器用于控制客户端对服务器访问的权限,定义了anyLogicBus调度框架访问控制的基本行为。调度框架对AccessController的调用如下:
* 1. 首先,调度框架会调用{@link #createSessionId(Path, ServiceDescription, Context) createSessionId()}函数创建会话ID;
* 2. 在调用服务之前,调度框架会调用访问控制器的{@link #accessStart(String,Path, ServiceDescription, Context)};
* 3. 在完成服务之后,会调用访问控制器的{@link #accessEnd(String,Path, ServiceDescription, Context)}.
* *

* 访问控制器在{@link #accessStart(String, Path,ServiceDescription, Context)}中通过返回值和框架约定权限控制方式,如果返回值小于0,则表明 * 本次无权访问;如果返回值大于1,则表明本次访问为高优先级访问;其他则表明本次访问为低优先级访问。
* * @author duanyy * * @version 1.0.1 [20140402 duanyy]
* - 增加{@link #createSessionId(Path, ServiceDescription, Context) createSessionId}函数以避免多次计算SessionId
* * @version 1.2.8.2 [20141015 duanyy]
* - 扩展Reportable,MetricsReportable
* * @version 1.6.4.35 [20160315 duanyy]
* - 实现XMLConfigurable和Configurable接口
* * @version 1.6.5.5 [20160515 duanyy]
* - 增加reload接口
* * @version 1.6.7.4 [20170118 duanyy]
* - 淘汰com.anysoft.metrics包 ,改用新的指标框架
* * @version 1.6.7.9 [20170201 duanyy]
* - 采用SLF4j日志框架输出日志
* * @version 1.6.10.12 [20171211 duanyy]
* - 支持混合模式
*/ public interface AccessController extends Reportable,MetricsReportable,XMLConfigurable,Configurable{ /** * 重新装入配置 * @param id 指定对象 */ public void reload(String id); /** * 针对当前会话创建会话ID * @param serviceId 本次访问的服务ID * @param servant 本次访问服务的描述 * @param ctx 本次方位的上下文信息 * @return 会话 */ public String createSessionId(Path serviceId,ServiceDescription servant,Context ctx); /** * 开始访问 * *

* 在调用服务之前调用 * * @param sessionId 会话ID * @param serviceId 本次访问的服务ID * @param servant 本次访问服务的描述 * @param ctx 本次访问的上下文 * @return 访问优先级 <0表明无权访问;>1表明为高优先级访问;其他为低优先级访问 */ public int accessStart(String sessionId,Path serviceId,ServiceDescription servant,Context ctx); /** * 结束访问 * * @param sessionId 会话 * @param serviceId 本次访问的服务ID * @param servant 本次访问服务的描述 * @param ctx 本次访问的上下文 * @return 无用处,仅仅追求对称美 */ public int accessEnd(String sessionId,Path serviceId,ServiceDescription servant,Context ctx); /** * 获取分组列表 * @return 分组列表 */ public String [] getGroupList(); /** * 获取指定的分组 * @param id 分组id * @return 分组 */ public AccessController getGroup(String id); /** * AccessController的工厂类 * @author duanyy * */ public static class TheFactory extends Factory{ /** * 缺省配置文件 */ public static final String DEFAULT = "java:///com/logicbus/backend/ac.default.xml#com.logicbus.backend.AccessController"; /** * a logger of log4j */ protected static final Logger LOG = LoggerFactory.getLogger(AccessController.class); /** * 根据module映射类名 */ @Override public String getClassName(String module){ if (module.indexOf(".") < 0){ return "com.logicbus.backend." + module; } return module; } public static AccessController get(){ return get(Settings.get()); } public static AccessController get(Properties props){ String master = props.GetValue("acm.master",DEFAULT); String secondary = props.GetValue("acm.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 getAccessController(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 AccessController getAccessController(Element e,Properties p){ TheFactory factory = new TheFactory(); return factory.newInstance(e, p); } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy