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

路由表达式相关问题的解决方案

阅读更多
一、导入附件中的jar包(IKExpression1.0.jar)



二、处理表达式简单例子

//根据给定的路由表达式判断是否该路由
public boolean isPassHere(RouteInfo routeInfo, Map<String, Object> dateMap) {
if (routeInfo == null) {
return false;
}
// 如果表达式为空 说明 工作流中 路由条件为:始终为true
if (routeInfo.getCondition().equals("")
|| routeInfo.getCondition() == null) {
return true;
}
// 获取路由表达式,并将表达式转换为 Java支持的表达式
String expression = treatmentExpression(routeInfo.getCondition());
System.out.println(expression);
// 准备表达式中参与的变量
List<Variable> variables = new ArrayList<Variable>();
for (Entry<String, Object> param : dateMap.entrySet()) {
try {
if (isIncludeSubString(expression, param.getKey())) {
Variable variable = new Variable(param.getKey(),
getVariableType(dateMap.get(param.getKey())
.getClass().getSimpleName()), param
.getValue());
variables.add(variable);
}

} catch (BPMException e) {
e.printStackTrace();
}
}
if (variables.size() <= 0) {
return false;
}
Object isOk = ExpressionEvaluator.evaluate(expression, variables);
if (isOk.toString().equals("true")) {
return true;
}
return false;
}

//获取变量的类型
private BaseDataMeta.DataType getVariableType(String strTypt){
if(strTypt.equals("")){
return DataType.DATATYPE_NULL;
}
if(strTypt.equals("String")){
return DataType.DATATYPE_STRING;
}
if(strTypt.equals("Boolean")){
return DataType.DATATYPE_BOOLEAN;
}
if(strTypt.equals("Integer")){
return DataType.DATATYPE_INT;
}
if(strTypt.equals("Long")){
return DataType.DATATYPE_LONG;
}
if(strTypt.equals("Double")){
return DataType.DATATYPE_DOUBLE;
}
if(strTypt.equals("Float")){
return DataType.DATATYPE_FLOAT;
}
if(strTypt.equals("Set")||strTypt.equals("ArrayList")){
return DataType.DATATYPE_COLLECTION;
}

if(strTypt.equals("Date")){
return DataType.DATATYPE_DATE;
}


return null;
}



//判断表达式中是否包含某个变量

private boolean isIncludeSubString(String str, String subString){
        boolean result = false;
        if (str == null || subString == null){
            return false;
        }
        int strLength = str.length();
        int subStrLength = subString.length();
        String tmpStr = null;
        for (int i = 0; i < strLength; i++){
            if (strLength - i < subStrLength){
                return false;
            }
            tmpStr = str.substring(i, subStrLength + i);
            if (tmpStr.endsWith(subString)){
                return true;
            }
        }
        return result;
    }

}



//处理表达式,使其成为Java合法表达式(因为FileNet的表达式是数据库规范)

private String treatmentExpression(String expression){
String qualifiedExpression = expression.replaceAll("and", "&&").replaceAll("or", "||").replaceAll("<>", "!=");
if(! isIncludeSubString(qualifiedExpression,"=")){
return qualifiedExpression;
}

for (int i = 0; i < qualifiedExpression.length(); i++) {
String substr = qualifiedExpression.substring(i, i+1);
if(substr.equals("=")){
String prefix = qualifiedExpression.substring(i-1, i);
String suffix = qualifiedExpression.substring(i+1, i+2);
//如果“=”号前缀没有 ">"、"<"、"=" 并且后缀没有"="连接,那么就证明是一个单独的"="号,我们把等于号改成"=="操作符,因为我们只支持'"=="操作符
if( ! (prefix.equals(">") || prefix.equals("<") || prefix.equals("!") || prefix.equals("=") || suffix.equals("="))){

String p = qualifiedExpression.substring(0, i);
String s = qualifiedExpression.substring(i+1, qualifiedExpression.length());
qualifiedExpression=p+"=="+s;
}
}
}
return qualifiedExpression;
}

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    这是Nodejs的一个基于正则表达式实现的快速URL路由类

    本项目名为“fast-route”,是一个利用正则表达式优化的高效URL路由解决方案。它允许开发者通过简洁的接口定义路由,并且利用正则表达式的强大功能来精确匹配URL路径。 一、正则表达式在路由中的应用 正则表达式...

    Spring攻略(第二版 中文高清版).part2

    1.1.2 解决方案 1 1.1.3 工作原理 3 1.2 配置Spring IoC容器中的Bean 4 1.2.1 问题 4 1.2.2 解决方案 4 1.2.3 工作原理 4 1.3 调用构造程序创建Bean 14 1.3.1 问题 14 1.3.2 解决方案 14 1.3.3 ...

    Spring攻略(第二版 中文高清版).part1

    1.1.2 解决方案 1 1.1.3 工作原理 3 1.2 配置Spring IoC容器中的Bean 4 1.2.1 问题 4 1.2.2 解决方案 4 1.2.3 工作原理 4 1.3 调用构造程序创建Bean 14 1.3.1 问题 14 1.3.2 解决方案 14 1.3.3 ...

    Mule 实现路由分发

    在IT行业中,Mule是一个强大的企业服务总线(ESB)和集成平台,它允许开发者构建和部署可扩展的应用程序和服务。"Mule实现路由分发"这一主题...理解并熟练运用这些知识点,对于构建高效、灵活的集成解决方案至关重要。

    数据结构实验报告_链栈_迷宫问题波兰表达式_huffman树及其编码_数据结构c++_图操作顺序表查找_

    通过构建一个邻接矩阵或邻接表来表示迷宫,然后利用栈或队列进行遍历,可以找到有效的解决方案。 波兰表达式,又称前缀表达式,是一种没有括号的表达式形式,运算符位于其操作数之前。处理波兰表达式时,可以使用栈...

    表达式计算器(MVC版本)

    **文件名称列表解析:** 由于只给出了一个文件名 "SimpleCalculator",我们可以推测这可能是项目的主要源代码文件或者解决方案文件。在.NET开发环境中,这通常会是一个包含整个项目的解决方案文件(.sln)或者主要的...

    锐捷网络RGNOS-路由协议配置指南.pdf

    锐捷网络是专注于网络设备与解决方案的厂商,RGNOS是锐捷网络的操作系统,本配置指南旨在帮助网络管理员了解如何在RGNOS环境下配置和管理路由协议,包括路由协议的无关配置、策略路由配置以及RIP、OSPF和BGP协议的...

    regexparam一个迷你299B工具类可将路由模式转换为RegExp

    但如果你的项目只需要基本的路径匹配功能,它无疑是更为高效的解决方案。 总结来说,`regexparam`是一个小巧且实用的JavaScript工具,适用于处理基础的Web路由模式转换。在资源有限或追求性能优化的项目中,它可以...

    Route快速路由器和调度程序构建在FastRoute之上

    FastRoute是Nikita Popov创建的一个高性能的PHP路由解析库,它为路由解析提供了高效且灵活的解决方案。 FastRoute的工作原理是通过编译路由定义到正则表达式,然后使用这些正则表达式在请求URL上进行匹配。这种方式...

    解决vue-router在同一个路由下切换,取不到变化的路由参数问题

    在描述中提到的解决方案是利用Vue的`watch`选项来监听`$route`对象的变化。`watch`是一个对象,它的键是需要观察的表达式,值是对应的回调函数。在回调函数中,`to`和`from`参数分别代表即将进入的和即将离开的路由...

    vue.js 底部导航栏 一级路由显示 子路由不显示的解决方法

    以下是一个详细的解决方案,针对的是使用Vue.js和MuseUI库构建的Web应用程序。 首先,我们需要了解Vue Router的基本概念。Vue Router是Vue.js官方的路由管理器,它通过`path`和`component`来定义路由,并可以通过`...

    严蔚敏《数据结构(c语言版)习题集》一书中所有算法设计题目的解决方案

    该压缩包文件包含了书中所有算法设计题目的解决方案,对于学习和复习数据结构非常有帮助。 首先,我们要了解数据结构的基本概念。数据结构主要包括数组、链表、栈、队列、树、图等类型。每种数据结构都有其特定的...

    Apache Camel 开发指南.rar

    Apache Camel 是一个强大的开源企业级集成框架,它简化了在Java应用程序之间建立复杂的消息传递流程。...通过深入研究这些文档,开发者可以有效地利用Camel构建高效、可扩展的企业级集成解决方案。

    【ASP.NET编程知识】ASP.NET Core自动生成小写破折号路由的实现方法.docx

    **针对不同版本的 ASP.NET Core 的解决方案** - **ASP.NET Core 2.2 MVC**: 在 `ConfigureServices` 方法中使用上述的 `services.AddRouting` 和 `options.ConstraintMap` 配置。 - **ASP.NET Core 2.2 Web API*...

    Laravel开发-easyrouting

    总的来说,`Laravel开发-easyrouting` 可能是一种提高路由管理效率的解决方案,通过提供额外的便利性和灵活性,让开发者能够更专注于业务逻辑,而不是路由的配置。如果你正在使用或研究Laravel,理解和掌握这类工具...

    代码9.2blog

    【代码9.2blog】是一个包含了多个编程问题解决方案的压缩包,主要针对的是9月1日发布的博客内容。从描述中我们可以看出,这个压缩包涵盖了多个领域的编程挑战,包括但不限于简易火车票售票系统、最佳路径算法、胜负...

Global site tag (gtag.js) - Google Analytics