-
Notifications
You must be signed in to change notification settings - Fork 10
[Core] Condition Expression
Jinyoung Jang edited this page Sep 21, 2016
·
1 revision
조건 편집기는 트랜지션 (시퀀스 플로우)의 선을 더블클릭하면 아래와 같이 편집하는 창이 열리고, 열린 창에 입력된 표현식은 다음 클래스의 입력값이 되어 실행시에 조건을 테스트하게 된다.
package org.uengine.kernel;
...
public class ExpressionEvaluateCondition extends Condition {
String conditionExpression;
public String getConditionExpression() {
return conditionExpression;
}
public void setConditionExpression(String conditionExpression) {
this.conditionExpression = conditionExpression;
}
public ExpressionEvaluateCondition(){
super();
}
public ExpressionEvaluateCondition(String conditionExpression) {
super();
setConditionExpression(conditionExpression);
}
@Override
public boolean isMet(ProcessInstance instance, String scope) throws Exception {
if(!UEngineUtil.isNotEmpty(getConditionExpression())) return true;
try {
BSFManager manager = new BSFManager();
manager.setClassLoader(this.getClass().getClassLoader());
if (instance != null)
manager.declareBean("instance", instance, ProcessInstance.class);
manager.declareBean("activity", this, Activity.class);
manager.declareBean("definition", instance.getProcessDefinition(), ProcessDefinition.class);
manager.declareBean("util", new ScriptUtil(), ScriptUtil.class);
BSFEngine engine = manager.loadScriptingEngine("javascript");
Object result = engine.eval("my_class.my_generated_method", 0, 0, "function getVal(){\nimportPackage(java.lang); \n return " + getConditionExpression() + "}\n getVal();");
if (result instanceof Boolean) {
return (Boolean) result;
} else {
throw new RuntimeException("Not a boolean return value by the condition expression: " + getConditionExpression() + ". Returned is " + result);
}
}catch(Exception e){
throw new RuntimeException("Exception during evaluate condition expression: " + getConditionExpression(), e);
}
}
@Override
public String toString() {
if(UEngineUtil.isNotEmpty(getConditionExpression())) {
return getConditionExpression();
}else{
return "";
}
}
@ServiceMethod(target = ServiceMethodContext.TARGET_POPUP, callByContent = true, inContextMenu = true)
public ModalWindow edit(@AutowiredFromClient ProcessVariablePanel processVariablePanel){
ModalWindow modalWindow = new ModalWindow(this);
modalWindow.setMetaworksContext(new MetaworksContext());
modalWindow.getMetaworksContext().setWhen(MetaworksContext.WHEN_EDIT);
modalWindow.getMetaworksContext().setHow("full-fledged");
return modalWindow;
}
}
내용과 같이 자바스크립트 (BSF 스크립트) 엔진을 사용하기 때문에 조건식은 자바스크립트를 이용하면 된다. 자바스크립트 내에 사용할 수 있는 변수값으로 instance, activity, definition, util 을 사용할 수 있다.
instance.get("변수1") == 'aaa';