private PvmProcessDefinition buildPvmProcessDefinition()

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