`
Tonyguxu
  • 浏览: 278486 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【决策表管理系统】表达式解析

 
阅读更多

由condition expression生成方法体MethodBody

例:

expression1 = service.isInBlacklist(context.getOriginalMOId(),4)

expression2 = (currentTime-lastActiveDate(context))/1000/60/60/24>=%{day}

expression3 = inboundSMS.getAttribute("MODE_CODES")=="QF"

expression4 = results.getResults()== null || results.getResults().isEmpty()

 

 

Step1. 从表达式里获得参数名(ParameterNames)

——正则表达式处理

 

Step2. CompilingContext、ValueExpression、JavaDomainResolver

 

CompilingContext compilingContext = new CompilingContext();
ValueExpression val = new ValueExpression();
compilingContext.setValue(val);
JavaDomainResolver resolver = ctx.getAppContext().createDomainResolver(artifactType);
compilingContext.setResolver(resolver);

CompilingContext

 

ValueExpression

 

JavaDomainResolver

 

Step3. 将表达式里的%{paramName}换成__paramName

 

 

Step4. 将表达式解析(parse)java 代码

 

SimpleNode node = (SimpleNode) ELParser.parse("#{" + expr + "}");
//生成一个树,该node是根节点
String varName = compilingContext.getNextVarName();
val.setVarName(varName);
node.jjtAccept(new JavaDialect(), compilingContext);
//遍历树,每个节点接收visitor,visitor访问该节点;生成代码
StringBuffer code = new StringBuffer();
val.generateJavaCode(compilingContext, code);
//生成代码

   

 

Step5. 添加return语句

 

if(artifactType.equals(Constants.ARTIFACT_TYPE_CONDITION)){
if (val.getType() == Void.class ||val.getType()==void.class) {

} else if (val.getType().isPrimitive()) {
code.append("\nreturn ").append(getWrapper(val)).append(";\n");
} else {
code.append("\nreturn ").append(val.getVarName()).append(";\n");
}
}

 

expression=attrs.getAttribute("NEW2OLD_NEEDED_TX")!=null

&&attrs.getAttribute("NEW2OLD_NEEDED_TX")==true

将该表达式解析后的java代码如下:

boolean bool1 = false;
    Object localObject1 = ((UserAttributes)getData("attrs")).getAttribute("NEW2OLD_NEEDED_TX");
    int i = (localObject1 != null) ? 1 : 0;
    if (i == 0) {
      bool1 = false;
    } else {
      Object localObject2 = ((UserAttributes)getData("attrs")).getAttribute("NEW2OLD_NEEDED_TX");
      boolean bool2 = localObject2.equals(Boolean.valueOf(true));
      if (bool2)
        bool1 = true;
      else {
        bool1 = false;
      }
    }

    return new Boolean(bool1).booleanValue();

 

问题1:上面step4中代码

 

 

SimpleNode node = (SimpleNode) ELParser.parse("#{" + expr + "}");
ELParserVisitor visitor = new JavaDialect();
node.jjtAccept(visitor, compilingContext);

 

 

 

??SimpleNode、ELParser.parser()。。。

 

Node.java如下

 

/* Generated By:JJTree: Do not edit this line. Node.java Version 4.3 */
/* JavaCCOptions:MULTI=true,NODE_USES_PARSER=false,VISITOR=true,TRACK_TOKENS=false,NODE_PREFIX=Ast,NODE_EXTENDS=,NODE_FACTORY=,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
package com.wxxr.el.parser;

/* All AST nodes must implement this interface.  It provides basic
   machinery for constructing the parent and child relationships
   between nodes. */

public
interface Node {

  /** This method is called after the node has been made the current
    node.  It indicates that child nodes can now be added to it. */
  public void jjtOpen();

  /** This method is called after all the child nodes have been
    added. */
  public void jjtClose();

  /** This pair of methods are used to inform the node of its
    parent. */
  public void jjtSetParent(Node n);
  public Node jjtGetParent();

  /** This method tells the node to add its argument to the node's
    list of children.  */
  public void jjtAddChild(Node n, int i);

  /** This method returns a child node.  The children are numbered
     from zero, left to right. */
  public Node jjtGetChild(int i);

  /** Return the number of children the node has. */
  public int jjtGetNumChildren();

  /** Accept the visitor. **/
  public Object jjtAccept(ELParserVisitor visitor, Object data);
}
/* JavaCC - OriginalChecksum=fc35c6181f3c693be7a513484d1166bc (do not edit this line) */




》》》》研究Node、SimpleNode、Visitor、

JJTree Reference Documentation 写道
Visitor Support

JJTree provides some basic support for the visitor design pattern. If the VISITOR option is set to true JJTree will insert an jjtAccept() method into all of the node classes it generates, and also generate a visitor interface that can be implemented and passed to the nodes to accept.

The name of the visitor interface is constructed by appending Visitor to the name of the parser. The interface is regenerated every time that JJTree is run, so that it accurately represents the set of nodes used by the parser. This will cause compile time errors if the implementation class has not been updated for the new nodes. This is a feature.

 

访问者模式(Visitor design pattern)的应用

抽象节点角色:Node(提供accept(visitor)方法)

具体节点角色:SimpleNode(部分方法提供默认实现)、AstAnd等(具体节点)

抽象访问者角色:ELParserVisitor(提供visit(node)方法)

具体访问者角色:JavaDialect

 

 

??ValueExpresion里的javaStatement从哪儿来??

 ??ELParser.parse("#{" + expr + "}")生成的Node是什么类型??
JavaDialect里
public Object visit(SimpleNode node, Object data) {
      return null;
}


visitor(访问者)visit(访问)node(节点),
node(节点)accept(接收)visitor(访问者)
visitor(访问者)里为每个node(节点)都准备一个visit(访问)操作


com.wxxr.common.descion.table.spi.IRuleApplication
子类:ZjhzApplication,MockRuleApplication

com.wxxr.common.descion.table.spi.IAppCompileContext
--Dependency[] getDependencies()获取某个应用(如ZjhzApplication)所依赖的jar文件的URL

com.wxxr.common.descion.table.spi.AbstractAppCompileContext
在ZjhzApplication中有具体子类

com.wxxr.common.descion.table.IRuleCompileContext
在DesicionTableRegistryImpl中有具体子类

 

 

 

 

注:以getNextVarName(获得下一个变量名)为例,体会JDK6RuleCompiler中如何通过CompilingContext获得值?

在CompilingContext中持有JavaDomainResolver引用。

 

  • 大小: 5.5 KB
  • 大小: 22.3 KB
  • 大小: 6.8 KB
分享到:
评论

相关推荐

    C#仓库管理系统源码.zip

    《C#仓库管理系统源码深度解析》 C#仓库管理系统源码是一套基于C#编程语言实现的软件系统,主要用于企业或机构内部的仓储管理,实现了对库存商品的入库、出库、盘点、调拨等一系列操作的信息化管理。在本文中,我们...

    Decision Tables for Java (dt4j):Java中基于优秀决策表的规则引擎实现-开源

    决策表(Decision Table)是一种用于表示多种条件和对应结果的工具,它在业务规则管理系统中被广泛使用。它通过清晰地列出所有可能的条件组合及其相应的行动,使得复杂的逻辑易于理解和维护。在Java开发中,决策表...

    管理系统系列--207.JSP+SQL物流管理系统206.JSP+SQL物流快递管理系统.zip

    "管理系统系列--207.JSP+SQL物流管理系统206.JSP+SQL物流快递管理系统.zip" 这个标题表明我们正在处理一个关于物流管理系统的压缩包,该系统由JSP(JavaServer Pages)开发,并使用SQL(Structured Query Language)...

    JAVA图书馆书库管理系统设计(论文+源代码)

    《JAVA图书馆书库管理系统设计》是一份深入探讨如何利用JAVA技术构建高效、便捷的图书管理系统的专业论文。本文将从系统需求分析、设计思路、主要功能模块实现、数据库设计以及源代码解读等角度,全面解析这个项目的...

    c#人事管理系统设计与实现(论文+源代码+答辩PPT).zip

    《C#人事管理系统设计与实现》是一套完整的项目开发实例,涵盖了从理论研究到实际编码的全过程。这个系统主要基于C#编程语言,利用.NET框架进行构建,旨在为企事业单位提供一个高效、便捷的人事信息管理平台。在本文...

    jsp教务管理系统源码

    **JSP教务管理系统源码详解** 教务管理系统是高校或教育机构常用的一款软件系统,用于高效、便捷地管理教学活动。本系统采用Java Server Pages(JSP)技术开发,结合了Servlet、JavaBean和数据库等核心元素,实现了...

    基于ssm框架的客户关系管理系统

    【基于SSM框架的客户关系管理系统】是一种采用Spring、SpringMVC和MyBatis三大核心组件构建的企业级应用。SSM框架是Java开发中的常见选择,尤其在搭建Web应用程序时,它提供了强大的功能和灵活性。 **Spring框架**...

    jsp企业人事管理系统.zip

    本文将围绕"jsp企业人事管理系统"这一主题,深入解析其背后的Java JSP技术及系统实现。 一、Java JSP基础 Java JSP(JavaServer Pages)是一种动态网页技术,由Sun Microsystems公司推出,旨在简化Java Web应用的...

    1_合同管理_合同管理系统_jsp.zip

    "1_合同管理_合同管理系统_jsp.zip" 这个标题暗示了我们正在处理一个关于合同管理的软件系统,该系统是基于Java Server Pages (JSP) 技术构建的。JSP是一种动态网页开发技术,允许开发者在服务器端生成HTML、XML或...

    基于ASP.NET的企业督察督办管理系统源码.zip

    综上所述,"基于ASP.NET的企业督察督办管理系统源码.zip"是一个集成了ASP.NET Web Forms、C#语言和数据库管理的项目,主要用于企业内部的任务跟踪和管理。开发者可以通过源码学习到如何在ASP.NET环境中构建复杂的Web...

    JSP+SQL SERVER记者站考勤管理系统毕业设计毕业论文

    《JSP+SQL SERVER记者站考勤管理系统毕业设计毕业论文》是针对新闻机构或媒体组织的记者站设计的一款考勤管理系统的毕业设计项目。本文将深入解析该项目的技术选型、系统架构、主要功能以及实现原理。 一、技术选型...

    基于struts+hibernate的采购管理系统源码.zip

    《基于Struts+Hibernate的采购管理系统源码解析》 在当今信息技术日新月异的时代,企业信息化管理成为了提升效率、优化流程的关键。本系统——基于Struts+Hibernate的采购管理系统,是一个典型的企业级Java Web应用...

    【Java web】科研成果申报管理系统源码.zip

    【Java Web科研成果申报管理系统源码解析】 Java Web是一种基于Java技术构建的Web应用程序开发框架,用于构建动态、交互式的互联网应用。这个科研成果申报管理系统源码是Java Web技术的具体应用实例,它提供了管理...

    基于Oracle PL_SQL的生产绩效指标管理系统的设计与实现.pdf

    文章中提到了基于Java程序计算的方法,如使用JEP(Java Expression Parser),它可以解析和计算数学表达式,支持自定义变量、常量和函数,提供数值和逻辑计算功能。这种方式允许用户动态管理指标计算公式,确保系统...

    管理系统中的计算机应用应用题).pdf

    【管理系统中的计算机应用】 在管理系统中,计算机应用广泛且至关重要,涉及到系统开发、报表设计以及数据处理等多个方面。以下是对给定内容的详细解析: 1. **系统开发人员的角色分配**: - 系统分析师:负责...

    CD销售管理系统JSP+SQL(源代码+论文+英文文献).zip

    《CD销售管理系统JSP+SQL实现详解》 在IT领域,开发一个销售管理系统是常见的实践,尤其是对于音像制品如CD的销售管理。本系统基于JSP(JavaServer Pages)和SQL(Structured Query Language),提供了全面的管理和...

    [计算机项目]基于jsp的学生成绩管理系统设计与实现(源代码+项目报告).zip

    6. **报表生成**:生成各类报表,如个人成绩表、班级成绩分布图等,供教学管理和决策使用。 7. **安全与备份**:系统应具备数据加密、备份和恢复功能,确保数据的安全性。 8. **界面设计**:友好的用户界面,易于...

    jsp+sql智能交通道路管理系统(论文+任务书+外文翻译+开题报告+文献综述).zip

    标题"jsp+sql智能交通道路管理系统(论文+任务书+外文翻译+开题报告+文献综述)"表明这是一个基于JSP(JavaServer Pages)技术和SQL数据库开发的智能交通道路管理系统。这个系统可能包含了学术研究的多个阶段成果,...

    java医药管理系统设计(源代码+LW).zip

    Java医药管理系统设计是一个涵盖多个IT知识点的综合项目,主要基于Java编程语言,结合数据库管理和Web应用服务器技术。这个系统的设计和实现旨在为医药行业的信息管理提供一个高效、可靠的平台。以下将详细介绍其中...

Global site tag (gtag.js) - Google Analytics