-
Notifications
You must be signed in to change notification settings - Fork 10
[Core] Process Variable
Jinyoung Jang edited this page Oct 16, 2016
·
1 revision
public boolean shouldAccessValueInSpecializedWay(){
return isGlobal() || isDatabaseSynchronized();
}
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 변수는 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);
}
}
}
...
}