Skip to content

[Core] Process Variable

Jinyoung Jang edited this page Oct 16, 2016 · 1 revision

ProcessVariable and ProcessInstance

shouldAccessValueInSpecializedWay flag

public boolean shouldAccessValueInSpecializedWay(){
   return isGlobal() || isDatabaseSynchronized();
}

isGlobal 일때의 동작

Global 변수일때는 Root process instance 에 모든 값을 저장한다.

public class ProcessVariable ... {
	
	public boolean shouldAccessValueInSpecializedWay(ProcessInstance instance){
		return (isGlobal() && !instance.isRoot()) || isDatabaseSynchronized();
	}

	public void set(ProcessInstance instance, String scope, String key, Serializable value) throws Exception{

		if(isGlobal()){
			if(!instance.isRoot()) { //void recursive
				instance.getRootProcessInstance().set(scope, getName(), value);
				return;
			}
		}
		...
	}

	public Serializable get(ProcessInstance instance, String scope, String key) throws Exception{

		if(isGlobal()){
			if(!instance.isRoot()) //void recursive
				return instance.getRootProcessInstance().get(scope, getName());
		}
	...
	}

...
}

Global 변수의 정의 및 저장

Global 변수는 ProcessResource 에 의하여 저장시 /codi/package/global.process 에 별도로 저장된다. 동일 폴더 이하의 다른 모든 프로세스 정의들은 해당 global변수를 선언하지 않아도 기본으로 선언된 것으로 인식된다. 해당 구현은 ProcessResource.java 의 save 와 load 에 재정의 되어 저장될때 global.process 에 ProcessVariable[isGlobal==true] 인 것만 분리 저장했다가 (separateGlobalProcessVariables), 동일 폴더(패키지) 이하의 다른 프로세스 정의가 열리는 load 메서드에서 다시 조합한다(mergeGlobalProcessVariable).


public class ProcessResource extends DefaultResource {

 ...
    @Override
    public void save(Object editingObject) throws Exception {
        ProcessDefinition definition = (ProcessDefinition) editingObject;
        definition.setName(getDisplayName());

        separateGlobalDefinition(definition);


        super.save(editingObject);

        definitionFactory.removeFromCache(getPath().substring(CodiProcessDefinitionFactory.codiProcessDefinitionFolder.length() + 1));
    }

    @Override
    public Object load() throws Exception {
        Object processDef = super.load();

        mergeGlobalDefinition((ProcessDefinition) processDef);

        return processDef;
    }

    private void mergeGlobalDefinition(ProcessDefinition definition) throws Exception {

        if(definition.isGlobal())
            return; // void recursive

        String globalDefinitionPath = getGlobalDefinitionPath();
        if(globalDefinitionPath==null)
            return; // ignore when no global def path;

        ProcessResource globalProcessResource = new ProcessResource();
        globalProcessResource.setPath(globalDefinitionPath);

        MetaworksRemoteService.autowire(globalProcessResource);

        if(resourceManager.getStorage().exists(globalProcessResource)){
            ProcessDefinition globalDef = (ProcessDefinition) globalProcessResource.load();

            List<ProcessVariable> variables = new ArrayList<ProcessVariable>();
            for(ProcessVariable processVariable : globalDef.getProcessVariables()){
                variables.add(processVariable);
            }

            for(ProcessVariable processVariable : definition.getProcessVariables()){
                if(!processVariable.isGlobal())
                    variables.add(processVariable);
            }

            ProcessVariable[] arrVariables = new ProcessVariable[variables.size()];
            arrVariables = variables.toArray(arrVariables);

            definition.setProcessVariables(arrVariables);
        }
    }

    private void separateGlobalDefinition(ProcessDefinition definition) {

        if(definition.isGlobal()) return; //void recursive call

        String globalDefinitionPath = getGlobalDefinitionPath();
        if(globalDefinitionPath==null)
            return; //if there's no global path, ignore it.

        ProcessDefinition globalDefinition = new ProcessDefinition();
        globalDefinition.setGlobal(true);

        //extracts global process variables from the definition
        List<ProcessVariable> globalProcessVariables = new ArrayList<ProcessVariable>();
        List<ProcessVariable> localProcessVariables = new ArrayList<ProcessVariable>();
        if(definition.getProcessVariables()!=null){

            for(ProcessVariable processVariable : definition.getProcessVariables()){
                if(processVariable!=null && processVariable.isGlobal()) {
                    if(!globalProcessVariables.contains(processVariable))
                        globalProcessVariables.add(processVariable);
                }else{
                    localProcessVariables.add(processVariable);
                }
            }

        }

        if(globalProcessVariables!=null && globalProcessVariables.size() > 0){
            ProcessVariable[] arrayGlobalVariables = new ProcessVariable[globalProcessVariables.size()];
            globalDefinition.setProcessVariables(globalProcessVariables.toArray(arrayGlobalVariables));

            ProcessResource globalProcessResource = new ProcessResource();

            globalProcessResource.setPath(globalDefinitionPath);
            try {
                MetaworksRemoteService.autowire(globalProcessResource);
                globalProcessResource.save(globalDefinition);
            } catch (Exception e) {
                throw new RuntimeException("Failed to save global process definition [" + globalProcessResource.getPath() + "]" , e);
            }


        }

    }

...
}

Related Implementations

  1. https://github.com/TheOpenCloudEngine/uengine-bpm/commit/ce6c946826de4affa3bee3b617b0a0facde19b5a?diff=unified

Clone this wiki locally