Apache OFbiz MiniLang 源码解读
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Apache OFbiz MiniLang 源码解读,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含9949字,纯文字阅读大概需要15分钟。
内容图文
![Apache OFbiz MiniLang 源码解读](/upload/InfoBanner/zyjiaocheng/1138/e52275cb569041009b637504306ecc5c.jpg)
MiniLang所有元素的父类——MiniLangElement
MiniLang 是基于XML的“描述型语言”。所有的元素,包括节点、属性都继承自该类。它包含三个属性:
- lineNumber:表示解析MiniLang的源码(通常是Java)所处的行号,主要是为了便于日志记录
- tagName:当前元素的tag名称,主要用于日志记录
- simpleMethod:simpleMethod是一个大的“传输对象”,里面实现了MiniLang支持的所有执行方式,其作用类似于serviceengine中的serviceDispatcher。
对应于服务引擎的实现——SimpleServiceEngine
BeanScript的引擎实现——SimpleMethodBsfEngine
- declareBean
- undeclareBean
MiniLang真正的执行者——SimpleMethod
验证检查器——MiniLangValidate
MiniLang的帮助类——MiniLangUtil
字段验证及转换器——SimpleMapProcessor
操作描述的基类——SimpleMapOperation
- element:一个xml元素
- simpleMapProcess:SimpleMapProcess类的实例
字符串参数综合处理器——SimpleMapProcess
提供比较操作的基类——BaseCompare
- operator: 比较操作符
- type: 比较的对象类型
- format:格式
- doRealCompare是真正用于比较的静态方法,它依赖于ofbiz的其他实现,返回bool值的比较结果
- doCompare调用doRealCompare获得比较结果,如果结果为false,则调用SimpleMapOperation的addMessage方法,添加失败信息
- exec:空实现,这是符合语义的,因为这只是个compareoperation
值比较器——Compare
字段比较器——CompareField
public Compare(Element element, SimpleMapProcess simpleMapProcess) { super(element, simpleMapProcess); this.value = element.getAttribute("value"); } @Override public void exec(Map<String, Object> inMap, Map<String, Object> results, List<Object> messages, Locale locale, ClassLoader loader) { Object fieldValue = inMap.get(fieldName); doCompare(fieldValue, value, messages, locale, loader, true); }
CompareField:
public CompareField(Element element, SimpleMapProcess simpleMapProcess) { super(element, simpleMapProcess); this.compareName = element.getAttribute("field"); } @Override public void exec(Map<String, Object> inMap, Map<String, Object> results, List<Object> messages, Locale locale, ClassLoader loader) { Object compareValue = inMap.get(compareName); Object fieldValue = inMap.get(fieldName); doCompare(fieldValue, compareValue, messages, locale, loader, false); }
MiniLang的拷贝操作——Copy
对字段的非空检测——NotEmpty
<not-empty> <fail-property resource="AccountingUiLabels" property="AccountingCardNumberMissing"/> </not-empty>
MiniLang的类型转换器——Convert
MiniLang的正则表达式验证器——Regexp
MiniLang的验证方法调用器——ValidateMethod
<validate-method method="isAnyCard" class="org.ofbiz.base.util.UtilValidate"> <fail-property resource="AccountingUiLabels" property="AccountingCardNumberIncorrect"/> </validate-method>
在构造方法中,它先去获取该元素的method属性以及class属性。其exec方法,先获得该字段的值,然后将其转换为String类型,获得当前线程的classloader,加载该类,获取该方法(值得一提的,这里只支持静态方法)。因为在用反射调用该方法的时候并没有传入该类的实例。
字符串输入参数生成器——MakeInStringOperation
- PropertyOper:基于Property的生成参数
- InFieldOper:基于输入参数列表(inMap)生成参数
- ConstantOper:追加“字符串常量”生成参数
字符串生成器的容器——MakeInString
真实的Map处理器——MapProcessor
- makeInStrings:对应miniLang中的“make-in-string”子节点
- simpleMapProcess:对应miniLang中的“process”子节点
<simple-map-processor name="newAffilPostalPurpose"> <make-in-string field="contactMechPurposeTypeId"><constant>BILLING_LOCATION</constant></make-in-string> <process field="contactMechId"><copy/><not-empty> <fail-property resource="PartyUiLabels" property="PartyContactMechIdMissing"/></not-empty></process> <process field="contactMechPurposeTypeId"><copy/></process> </simple-map-processor>
没错,其实之前我们一直都在谈跟这两个方面相关的实现类。
元素实体的基类——MethodOperation
- element:当前表示的元素
- simpleMethod:SimpleMethod类的实例
MiniLang中跟Entity相关的实体
- IfNotEmpty:对应miniLang中的if-not-empty节点,用于判断当前字段是否为空。在构造函数中,它会解析出其所有子节点的操作以及如果有else元素节点,则同时解析出else元素下的所有子节点操作。在exec方法中,先判断如果满足不为空的条件,则执行if下的所有操作,否则如果else节点下操作不为空,则执行这些操作
- IfInstanceOf:判断某个对象是否是某个类的实例。而至于处理过程跟IfNotEmpty类似
- CheckPermission:检查权限,在之前的一篇文章中,我们简单谈了一下ofbiz的权限设计,其中有多个层面上的权限检查。由于minilang在ofbiz中可以实现service、eca、seca,因此在其中也必须嵌入对权限的检查语法。在该类中,定义了一个内部实体类:PermissionInfo。它用于从CheckPermission节点,提取出permission,action。并定义有一个hasPermission方法,用于判断用户有无实体操作权限或是否通过了认证授权。在CheckPermission的exec方法中调用hasPermission进行判断。
- Conditional:所有condition实体所继承的接口,该接口包含两个方法
- checkCondition:检查条件,返回Bool值结果
- prettyPrint:打印,主要用于执行Assert命令时,给出完整的错误信息
- ConditionalFactory:一个用于创建条件实体的工厂,需要它的部分原因是:miniLang可以被扩展用于支持额外的条件元素(通过继承该类然后提供自定义的实现)。该类是一个抽象泛型类,在静态构造器中,它获取配置过的所有的ConditionalFactory并加以缓存。该类包含一个静态方法,以及两个抽象方法:
- makeConditional:从缓存中获取一个factory并创建某个condition的实例
- createCondition:有待所有condition实现的创建方法
- getName:有待所有condition实现的返回其名称的方法
- 因此下面的每个condition实现类,都会创建一个静态内部工厂类并继承ConditionalFactory以及之前提到过的Factory(MethodOperation语义相关)。
- Compare:一个抽象类(也可以理解为帮助类),提供各种条件比较。包含了一个doCompare方法,由多个内部静态类实现。
- CombinedCondition:该类是一个抽象类,它用于实现由and/or/not/xor连接的多个条件的判断。它并没有继承MethodOperation(没有实现之前的exec方法,因此它也不是一个简单的operation),而是继承自MiniLangElement,但同时实现了Conditional接口(总得来看,Conditional提供比MethodOperation更窄的“接口”,但Conditional只负责条件相关的比较操作)。它拥有一个subConditions集合,该集合在构造方法中被初始化同时存放当前节点的子节点对应的condition。该类并没有对具体的逻辑操作符进行区分实现,但对ConditionalFactory的实现却给出了基于不同逻辑操作符的实现(多个不同的静态内部类)。在每个不同的factory中,会根据自身的语义实例化CombinedCondition。
- MasterIf/ElseIf:这两个类用于联合实现if/ else if / else的条件判断逻辑。
跟方法相关的参数基类——MethodObject
- 获得对象的值:getObject
- 获得类型的Class对象:getTypeClass
- 获得类型名称的字符串表示:getTypeName
- FieldObject:抽象类通用参数类型
- StringObject:抽象了字符串的类型表示
字段的通用对象表示——FieldObject
字符串的表示类——StringObject
- 当前XML元素的文本值,位于xml的开/闭标签之间的值
- 当前XML元素的“value”属性的值
消息元素的表示类——MessageElement
方法调用的上下文对象——MethodContext
- delegator:Delegator的实例,用于代理ofbiz中所有的数据访问
- dispatcher:LocalDispatcher的实例,用于代理ofbiz中所有的服务访问
- request:HttpServletRequest的实例,表示客户端的请求对象
- response:HttpServletResponse的实例,表示对客户端个请求的响应对象
- userLogin:GenericValue的实例,封装了用户身份认证
原文:http://blog.csdn.net/yanghua_kobe/article/details/39059509
内容总结
以上是互联网集市为您收集整理的Apache OFbiz MiniLang 源码解读全部内容,希望文章能够帮你解决Apache OFbiz MiniLang 源码解读所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。