in core/src/main/java/com/alibaba/smart/framework/engine/service/command/impl/DefaultRepositoryCommandService.java [184:304]
private PvmProcessDefinition buildPvmProcessDefinition(ProcessDefinition processDefinition) {
DefaultPvmProcessDefinition pvmProcessDefinition = new DefaultPvmProcessDefinition();
pvmProcessDefinition.setId(processDefinition.getId());
pvmProcessDefinition.setVersion(processDefinition.getVersion());
pvmProcessDefinition.setModel(processDefinition);
List<BaseElement> elements = processDefinition.getBaseElementList();
if (null != elements && !elements.isEmpty()) {
Map<String, PvmTransition> pvmTransitionMap = MapUtil.newLinkedHashMap();
Map<String, PvmActivity> pvmActivityMap = MapUtil.newLinkedHashMap();
for (BaseElement element : elements) {
if (element instanceof Transition) {
Transition transition = (Transition) element;
DefaultPvmTransition pvmTransition = new DefaultPvmTransition();
pvmTransition.setModel(transition);
String id = pvmTransition.getModel().getId();
PvmTransition oldValue = pvmTransitionMap.put(id, pvmTransition);
if(null != oldValue){
throw new EngineException("duplicated id found for "+id);
}
} else if (element instanceof Activity) {
Activity activity = (Activity) element;
DefaultPvmActivity pvmActivity = new DefaultPvmActivity();
pvmActivity.setModel(activity);
String id = pvmActivity.getModel().getId();
PvmActivity oldValue = pvmActivityMap.put(id, pvmActivity);
if(null != oldValue){
throw new EngineException("duplicated id found for "+id);
}
if (pvmActivity.getModel().isStartActivity()) {
pvmProcessDefinition.setStartActivity(pvmActivity);
}
}
}
// Process Transition Flow
for (Map.Entry<String, PvmTransition> pvmTransitionEntry : pvmTransitionMap.entrySet()) {
DefaultPvmTransition pvmTransition = (DefaultPvmTransition) pvmTransitionEntry.getValue();
String sourceRef = pvmTransition.getModel().getSourceRef();
String targetRef = pvmTransition.getModel().getTargetRef();
DefaultPvmActivity sourcePvmActivity = (DefaultPvmActivity) pvmActivityMap.get(sourceRef);
DefaultPvmActivity targetPvmActivity = (DefaultPvmActivity) pvmActivityMap.get(targetRef);
if(null == sourcePvmActivity){
throw new EngineException("No source activity found for id "+sourceRef );
}
if(null == targetPvmActivity){
throw new EngineException("No target activity found for id "+targetRef );
}
pvmTransition.setSource(sourcePvmActivity);
pvmTransition.setTarget(targetPvmActivity);
sourcePvmActivity.addOutcomeTransition(pvmTransition.getModel().getId(), pvmTransition);
targetPvmActivity.addIncomeTransition(pvmTransition.getModel().getId(), pvmTransition);
}
for (Map.Entry<String, PvmTransition> pvmTransitionEntry : pvmTransitionMap.entrySet()) {
PvmTransition pvmTransition = pvmTransitionEntry.getValue();
TransitionBehavior transitionBehavior = annotationScanner.getExtensionPoint(ExtensionConstant.ACTIVITY_BEHAVIOR,TransitionBehavior.class);
pvmTransition.setBehavior(transitionBehavior);
}
for (Map.Entry<String, PvmActivity> pvmActivityEntry : pvmActivityMap.entrySet()) {
PvmActivity pvmActivity = pvmActivityEntry.getValue();
Activity activity=pvmActivity.getModel();
AbstractActivityBehavior activityBehavior = (AbstractActivityBehavior) annotationScanner.getObject(ExtensionConstant.ACTIVITY_BEHAVIOR,activity.getClass());
if(null == activityBehavior){
throw new EngineException("ActivityBehavior should be coded for activity:"+activity.getClass());
}
pvmActivity.setBehavior(activityBehavior);
activityBehavior.setProcessInstanceFactory(annotationScanner.getExtensionPoint(ExtensionConstant.COMMON,ProcessInstanceFactory.class));
activityBehavior.setExecutionInstanceFactory(annotationScanner.getExtensionPoint(ExtensionConstant.COMMON,ExecutionInstanceFactory.class));
activityBehavior.setActivityInstanceFactory(annotationScanner.getExtensionPoint(ExtensionConstant.COMMON,ActivityInstanceFactory.class));
activityBehavior.setTaskInstanceFactory(annotationScanner.getExtensionPoint(ExtensionConstant.COMMON,TaskInstanceFactory.class));
activityBehavior.setProcessEngineConfiguration( processEngineConfiguration);
activityBehavior.setExecutionInstanceStorage(annotationScanner.getExtensionPoint(ExtensionConstant.COMMON,ExecutionInstanceStorage.class));
activityBehavior.setVariableInstanceStorage(annotationScanner.getExtensionPoint(ExtensionConstant.COMMON, VariableInstanceStorage.class));
}
pvmProcessDefinition.setActivities(pvmActivityMap);
pvmProcessDefinition.setTransitions(pvmTransitionMap);
}
return pvmProcessDefinition;
}