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

一、导入附件中的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;
}

你可能感兴趣的:(工作)