`
Kevin12
  • 浏览: 234832 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

jbpm4条件节点表达式的解析

阅读更多
说明:最近做jbpm4流程项目时,在条件节点中用到表达式了,流程执行到条件节点时,根据条件节点去判断下一步要走哪一个节点,条件中的表达式就需要解析了。
首先说一下流程执行的过程:在条件节点执行之前,会将界面中用来和表达式中比较的值存放到流程变量中(也就是说这个值就代表条件节点表达式中的变量)。在执行到条件节点时候,会根据调节节点中的表达式先解析出变量,再根据变量名称和流程id获取到之前存放到流程变量中的值,根据变量和值通过IK-Expression提供的解析方法解析出结果。

注意:要运用IK-Expression必须引入架包IKExpression2.0.jar。

代码如下:
package com.sense.workflow.util;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
import org.jbpm.api.ExecutionService;
import org.wltea.expression.ExpressionEvaluator;
import org.wltea.expression.datameta.Variable;
import com.sense.workflow.core.WorkFlowTemplate;

public class ConditionExpressionUtil {
	/***************************IK Expression 表达式解析*****************************************/
	/**
	 * Description: 解析jbpm4条件节点中的表达式
	 * @param expression 表达式
	 * @param template 流程目标
	 * @param executionId 流程eid
	 * @return List<变量>
	 */
	public static Boolean evaluate3(String expression,WorkFlowTemplate template,String executionId){
		ExecutionService es = template.getExecutionService();
		//将变量放到流程变量表中(这里只用来测试)
//		Map<String,Object> var= new HashMap<String, Object>();
//		var.put("aa", 20);
//		var.put("bb", "true");
//		es.setVariables(executionId, var);
		expression = expression.replaceAll(" ", "");//将表达式中所有空格去掉
		//从表达式中获取变量名称
		List<String> varList = expressionAnalysis(expression);
		List<Variable> variables = new ArrayList<Variable>();
		for (String str : varList) {
			System.out.println(str);
			Object value=template.getExecutionService().getVariable(executionId, str);
			variables.add(Variable.createVariable(str, value));
		}
		//解析表达式
		Object b = ExpressionEvaluator.evaluate(expression, variables);
		return Boolean.valueOf(b.toString());
	}
	/**
	 * Description: 将公式中的参数提取出来
	 * @param expression 公式
	 * @return List<变量>
	 */
	public static List<String> expressionAnalysis(String expression){
		String[] variableArrayTemp= new String[100];
		List<String> variableArray= new ArrayList<String>();
		//先将表达式中的符号用逗号替换
		expression=expression.replaceAll("[+]", ",");
		expression=expression.replaceAll("[-]", ",");
		expression=expression.replaceAll("[*]", ",");
		expression=expression.replaceAll("[/]", ",");
		expression=expression.replaceAll("[(]", ",");
		expression=expression.replaceAll("[)]", ",");
		expression=expression.replaceAll("[>]", ",");
		expression=expression.replaceAll("[<]", ",");
		expression=expression.replaceAll("[==]", ",");
		expression=expression.replaceAll("[=]", ",");
		expression=expression.replaceAll("[!]", ",");
		expression=expression.replaceAll("[|]", ",");
		expression=expression.replaceAll("[&]", ",");
		expression=expression.replaceAll("[\"]", ",");
		
		variableArrayTemp= expression.split(",");//以逗号分割
		for (int i = 0; i < variableArrayTemp.length; i++) {
			//保存以字母开头,并且不等于true和false的
			String temp = variableArrayTemp[i];
			if(startsWithLetter(temp)){
				if(!"true".equals(temp)&&!"false".equals(temp)){
					variableArray.add(temp);
				}
			}
		}
		//去除变量相等的
		Set<String[]> vars = new HashSet<String[]>();
		for(Iterator<String> iter = variableArray.iterator();iter.hasNext();){
			String temp = iter.next();
			boolean b = false;
			for(String[] s:vars){
				if(s[0].equals(temp)){
					b = true;
					break;
				}
			}
			if(b){
				iter.remove();
			}else{
				vars.add(new String[]{temp});
			}
		}
		return variableArray;
	}
	/**
	 * Description: 是否以字母打头
	 * @param s
	 * @return
	 */
	private static boolean startsWithLetter(String s) {
	    return Pattern.compile("^[A-Za-z]").matcher(s).find();
	}
	
	public static void main(String[] args) {
//		String expression="  tk  ==  \"abc\"  &&  kt  ==  \"abc\"  || tt  != \"abc\" ";
//		boolean b=evaluate2(expression, null, null);
//		System.out.println(b);
//		(aa<-40||aa>40)||  bb=="true"
		List<String> varList = expressionAnalysis("");
		for (String string : varList) {
			System.out.println(string);
		}
	}
}


1
0
分享到:
评论

相关推荐

    jbpm3.2开发总结.pdf

    在jbpm3.2中,流程的每个状态(节点)之间的流转,可以通过定义条件表达式或者采用事件触发的方式,比如在任务完成后触发下一个状态的转换。 jbpm3.2中定义了几个核心的类和接口,例如ActionHandler,这是一个接口...

    jbpm开发入门指南

    - **流程引擎**:jbpm的核心是流程引擎,它负责解析流程定义,调度任务,处理流程状态的变迁。 - **持久化机制**:jbpm使用Hibernate作为默认的持久化框架,保证流程实例和历史数据的存储。 - **规则引擎**:jbpm...

    jbpm数据结构及其数据库表的详细字段

    本文将深入解析JBPM的数据结构,特别是涉及到的数据库表及其详细字段,以及JBPM如何生成ID。 1. **JBPM_PROCESSDEFINITION** 表: - ID_:此字段是流程模版的唯一标识,用于区分不同的流程定义。 - NAME_:存储...

    jBPM教学视频(09流程图跟踪.zip)

    - 视频教程:"jBPM 4视频教程09.pdf"可能包含了详细的步骤解析和示例代码,而"09.swf"可能是演示流程跟踪的动画。 通过这些知识点的学习,你将能够熟练地运用jBPM设计、部署和管理业务流程,并对流程执行进行有效...

    jbpm4.4 在线设计流程图 ext + raphael

    此外,流程图中的连接线表示任务间的顺序关系,可以设置条件表达式来实现条件分支。 流程图设计完成后,jbpm4.4支持导出为XML文件。这个XML文件包含了流程的所有元数据,包括节点位置、连接关系以及流程逻辑。XML...

    JBPM数据库表3.3.1.doc

    本文将详细解析JBPM数据库表结构,主要关注与流程配置相关的三张核心表格:JBPM_PROCESSDEFINITION、JBPM_NODE、以及JBPM_TRANSITION。 **1. JBPM_PROCESSDEFINITION 表** JBPM_PROCESSDEFINITION是存储流程模板...

    JBPM工作流开发指南

    根据提供的文件信息,本文将基于“JBPM工作流开发指南”的标题、描述及部分文本内容进行深入解析,并尝试构建相关的IT知识点。 ### JBPM工作流开发指南 #### 一、JBPM简介 JBPM(JBoss Business Process ...

    jbpm3.1数据模型字段说明

    - `isterminationimplicit_`:布尔值,表示节点终止条件是否默认为隐式,对于理解流程控制流至关重要。 - `startstate_`:外键,指向流程的开始状态,即流程执行的第一个节点。 #### 1.03 JBPM_TRANSITION – ...

    JBPM绑定自定义用户模型实现授权

    4. 在流程实例执行到包含自定义分配逻辑的任务节点时,JBPM会调用你的`AssignmentHandler`来决定实际的Actor。 在上述示例流程中,"复核"和"审批"任务都使用了`ActorsHandel`作为AssignmentHandler,这意味着它们的...

    JBPM数据库表说明.doc

    本文将详细解析JBPM数据库中涉及的主要表及其字段含义。 1. **JBPM_PROCESSDEFINITION** 表 - ID_:流程模版的唯一标识,作为主键。 - NAME_:流程模版的名称,用于识别不同的流程。 - VERSION_:流程模版的版本...

    JBPM数据库分析文档[收集].pdf

    本文将深入解析JBPM数据库分析文档中涉及的主要数据库表,这些表是JBPM系统运行的基础,用于存储流程定义、节点、迁移、动作和事件等信息。 1. **JBPM_PROCESSDEFINITION**: - **ID_**: 此字段作为流程模版的唯一...

    JBPM学习资料step by step

    - **解读:** 此章节深入介绍了JBPM中用于建模的各种构建块,包括流程项目创建、节点类型选择、泳道设计等。 - **重要知识点:** - **流程项目创建:** 如何在Eclipse中创建一个新的JBPM流程项目。 - **节点类型...

    jbpm_Single_cycle.rar_Action!

    例如,一个任务节点可以通过“Sequence Flow”(序列流)连接回自身,并设定相应的条件表达式,只有当条件满足时,流程才会继续循环,否则就结束循环并进行下一步。 jbpm的工作流引擎负责解析bpmn文件,根据定义的...

    JBPM数据库分析文档[定义].pdf

    以下是基于提供的内容对JBPM数据库中关键表格及其字段的详细解析: 1. **JBPM_PROCESSDEFINITION**:这个表存储流程模板的信息。 - **ID_**: 流程模版的唯一标识符。 - **NAME_**: 流程模版的名称。 - **VERSION...

    jbpm-4.4实用教材helloword.txt

    #### 二、JPDL语言解析 JPDL是JBPM中用于定义业务流程的语言。它是一种基于XML的描述语言,可以用来定义流程中的各种元素,如活动(Activity)、决策(Decision)、转换(Transition)等。 - **活动(Activity)**:代表...

    JbpmLearn.zip项目源码示例下载.txt

    6. **表达式**:JBPM支持使用表达式来控制流程的执行逻辑。例如,可以根据某些条件判断来决定流程的分支走向。 7. **异常处理**:在流程定义中,还可以配置异常处理逻辑,以便在发生错误时能够进行适当的处理。 8....

    JPDL3.1规范手册.rar

    6. **过渡(Transition)**:过渡定义了流程中节点间的流转,可以带有条件表达式,只有满足条件时才会触发。 7. **变量(Variable)**:流程中的数据存储,用于传递信息和控制流程状态。 8. **监听器(Listener)*...

Global site tag (gtag.js) - Google Analytics