/**
* Copyright 1996-2014 FoxBPM ORG.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* @author kenshin
* @author ych
*/
package org.foxbpm.engine.scriptlanguage;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.foxbpm.engine.datavariable.VariableQuery;
import org.foxbpm.engine.exception.FoxBPMException;
import org.foxbpm.engine.impl.Context;
import org.foxbpm.engine.impl.datavariable.VariableQueryImpl;
import org.foxbpm.engine.impl.entity.ProcessDefinitionEntity;
import org.foxbpm.engine.impl.entity.ProcessInstanceEntity;
import org.foxbpm.engine.impl.entity.VariableInstanceEntity;
import org.foxbpm.engine.impl.expression.ExpressionMgmt;
import org.foxbpm.engine.impl.mgmt.DataVariableMgmtInstance;
import org.foxbpm.kernel.runtime.FlowNodeExecutionContext;
import org.foxbpm.model.DataVariableDefinition;
public abstract class AbstractScriptLanguageMgmt {
private static String __REGEX_SIGNS = "\\$\\{[^}{]+\\}";
/**
* 执行表达式
*
* @param scriptText
* 表达式文本
* @return
*/
public abstract Object execute(String scriptText);
/**
* 执行表达式,对于没有流程上下文环境的时候,执行表达式的时候需要传入流程定义。
*
* @param scriptText
* 表达式文本
* @param processDefinition
* 流程定义
* @return
*/
public abstract Object execute(String scriptText, ProcessDefinitionEntity processDefinition);
/**
* 向表达式环境中放入变量
*
* @param variableName
* 变量名称
* @param variableObj
* 变量值
*/
public abstract void setVariable(String variableName, Object variableObj);
/**
* 向表达式环境中放入变量,这个变量将是流程变量${var}
*
* @param variableName
* 变量名称
* @param variableObj
* 变量值
* @param executionContext
* 流程上下文
*/
public abstract void setVariable(String variableName, Object variableObj, FlowNodeExecutionContext executionContext);
/**
* 获取变量值
*
* @param variableName
* 变量名称
* @return
*/
public abstract Object getVariable(String variableName);
/**
* 执行表达式
*
* @param scriptText
* 表达式字符串
* @param executionContext
* 流程上下文
* @return
*/
public abstract Object execute(String scriptText, FlowNodeExecutionContext executionContext);
/**
* 脚本管理器初始化方法
*/
public abstract AbstractScriptLanguageMgmt init();
public abstract void close();
public static List<String> getDataVariableList(String scriptText) {
String inexp = scriptText;
// ${test} afdfs ${test1}erewr ${test3}
String regex = "\\$\\{[^}{]+\\}";
Pattern regexExpType = Pattern.compile(regex);
Matcher mType = regexExpType.matcher(inexp);
String expType = inexp;
List<String> list = new ArrayList<String>();
while (mType.find()) {
expType = mType.group();
expType = expType.substring(2, expType.length() - 1);
list.add(expType);
}
return list;
}
public static String getExpressionAll(String inexp) {
String str = null;
String regex = __REGEX_SIGNS;
Pattern regexExpType = Pattern.compile(regex);
Matcher mType = regexExpType.matcher(inexp);
String expType = inexp;
StringBuffer sb = new StringBuffer();
while (mType.find()) {
expType = mType.group();
String dist = expType.substring(2, expType.length() - 1); // StringUtil.getString(getExpressionValue(dataView,expType));
mType.appendReplacement(sb, dist);
}
mType.appendTail(sb);
str = sb.toString();
return str;
}
protected void dataVariableCalculate(String scriptText, FlowNodeExecutionContext executionContext) {
ProcessInstanceEntity processInstance = (ProcessInstanceEntity) executionContext.getProcessInstance();
List<String> dataVariableList = getDataVariableList(scriptText);
if(processInstance == null){
if(!dataVariableList.isEmpty()){
throw new FoxBPMException("没有流程实例上下文,不能解释带变量的表达式:"+scriptText);
}
return;
}
DataVariableMgmtInstance dataVariableMgmtInstance = processInstance.getDataVariableMgmtInstance();
ProcessDefinitionEntity processDefinition = (ProcessDefinitionEntity) processInstance.getProcessDefinition();
for (String expressionId : dataVariableList) {
if (dataVariableMgmtInstance.getDataVariableByExpressionId(expressionId) == null) {
DataVariableDefinition dataVariableDefinition = processDefinition.getDataVariableMgmtDefinition()
.getProcessDataVariableDefinition(expressionId);
if (dataVariableDefinition == null) {
continue;
}
if (dataVariableDefinition.isPersistence()) {
VariableQuery variableQuery = new VariableQueryImpl(Context.getProcessEngineConfiguration().getCommandExecutor());
variableQuery.addVariableKey(expressionId);
variableQuery.processInstanceId(processInstance.getId());
@SuppressWarnings({ "unchecked", "rawtypes" })
List<VariableInstanceEntity> variableInstances = (List) variableQuery.list();
if (variableInstances != null && variableInstances.size() == 1) {
ExpressionMgmt.setVariable(expressionId, variableInstances.get(0).getValueObject());
// 更新
Context.getCommandContext().getVariableManager().update(variableInstances.get(0));
dataVariableMgmtInstance.getDataVariableEntities().add(variableInstances.get(0));
} else {
if (variableInstances != null && variableInstances.size() > 1) {
throw new FoxBPMException("一个流程实例中含有两个相同的key,key(" + expressionId + ") instanceId(" + processInstance.getId()
+ ")");
} else {
VariableInstanceEntity variableInstanceEntity = dataVariableMgmtInstance
.createDataVariableInstance(dataVariableDefinition);
Object defaultValue = variableInstanceEntity.getDefaultExpressionValue(executionContext);
ExpressionMgmt.setVariable(expressionId, defaultValue);
// 插入
Context.getCommandContext().getVariableManager().insert(variableInstanceEntity);
}
}
} else {
Object defaultValue = dataVariableMgmtInstance.createDataVariableInstance(dataVariableDefinition)
.getDefaultExpressionValue(executionContext);
ExpressionMgmt.setVariable(expressionId, defaultValue);
}
}
}
}
}