Skip to content

[Core] Condition Expression

Jinyoung Jang edited this page Sep 21, 2016 · 1 revision

조건 편집기 및 조건식

조건 편집기는 트랜지션 (시퀀스 플로우)의 선을 더블클릭하면 아래와 같이 편집하는 창이 열리고, 열린 창에 입력된 표현식은 다음 클래스의 입력값이 되어 실행시에 조건을 테스트하게 된다.

ExpressionEvaluateCondition.java

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';