/**
   * Start-->Activity1(with catch compenstion)-->Activity2(with catch compensation)-->Activity3(with
   * catch compensation)-->End(throw compensation) |-->HandleCompensation1_1
   * |-->HandlerCompensation2_1 |-->HandlerCompensation3_1-->HandlerCompensation3_2
   */
  public WorkflowProcess createWorkflowProcess() {
    WorkflowProcessImpl process = new WorkflowProcessImpl(processName, processDisplayName);

    SubProcess subflow = process.getMainSubProcess();

    // *****************************************/
    // *************** 开始节点          *************/
    // ****************************************/
    StartNodeImpl startNode = new StartNodeImpl(subflow, "Start");

    // *****************************************/
    // *********** Activity1及其异常分支 ********/
    // ****************************************/
    ActivityImpl activity1 = new ActivityImpl(subflow, "Activity1");

    // 异常捕获节点1
    StartNodeImpl catchCompensationNode1 = new StartNodeImpl(subflow, "CatchCompensation1");
    CatchCompensationFeatureImpl catchCompensationDecorator = new CatchCompensationFeatureImpl();
    catchCompensationDecorator.setAttachedToActivity(activity1);
    catchCompensationDecorator.setCompensationCode("ForActivity1");
    catchCompensationNode1.setFeature(catchCompensationDecorator);
    activity1.getAttachedStartNodes().add(catchCompensationNode1);

    ActivityImpl handleCompensationNode1_1 = new ActivityImpl(subflow, "HandleCompensation1_1");

    TransitionImpl transition1_1 =
        new TransitionImpl(subflow, "catchCompensation1_HandleCompensation1_1");
    transition1_1.setFromNode(catchCompensationNode1);
    transition1_1.setToNode(handleCompensationNode1_1);
    catchCompensationNode1.getLeavingTransitions().add(transition1_1);
    handleCompensationNode1_1.getEnteringTransitions().add(transition1_1);

    // *****************************************/
    // *********** Activity2及其异常分支 ********/
    // ****************************************/
    ActivityImpl activity2 = new ActivityImpl(subflow, "Activity2");

    // 异常捕获节点1
    StartNodeImpl catchCompensationNode2 = new StartNodeImpl(subflow, "CatchCompensation2");
    catchCompensationDecorator = new CatchCompensationFeatureImpl();
    catchCompensationDecorator.setAttachedToActivity(activity2);
    catchCompensationDecorator.setCompensationCode("ForActivity2AndActivity3");
    catchCompensationNode2.setFeature(catchCompensationDecorator);
    activity2.getAttachedStartNodes().add(catchCompensationNode2);

    ActivityImpl handleCompensationNode2_1 = new ActivityImpl(subflow, "HandleCompensation2_1");

    TransitionImpl transition2_1 =
        new TransitionImpl(subflow, "catchCompensation2_HandleCompensation2_1");
    transition2_1.setFromNode(catchCompensationNode2);
    transition2_1.setToNode(handleCompensationNode2_1);
    catchCompensationNode2.getLeavingTransitions().add(transition2_1);
    handleCompensationNode2_1.getEnteringTransitions().add(transition2_1);

    // *****************************************/
    // *********** Activity3及其异常分支 ********/
    // ****************************************/
    ActivityImpl activity3 = new ActivityImpl(subflow, "Activity3");

    // 异常捕获节点1
    StartNodeImpl catchCompensationNode3 = new StartNodeImpl(subflow, "CatchCompensation3");
    catchCompensationDecorator = new CatchCompensationFeatureImpl();
    catchCompensationDecorator.setAttachedToActivity(activity3);
    catchCompensationDecorator.setCompensationCode("ForActivity2AndActivity3");
    catchCompensationNode3.setFeature(catchCompensationDecorator);
    activity3.getAttachedStartNodes().add(catchCompensationNode3);

    ActivityImpl handleCompensationNode3_1 = new ActivityImpl(subflow, "HandleCompensation3_1");

    TransitionImpl transition3_1 =
        new TransitionImpl(subflow, "catchCompensation3_HandleCompensation3_1");
    transition3_1.setFromNode(catchCompensationNode3);
    transition3_1.setToNode(handleCompensationNode3_1);
    catchCompensationNode3.getLeavingTransitions().add(transition3_1);
    handleCompensationNode3_1.getEnteringTransitions().add(transition3_1);

    ActivityImpl handleCompensationNode3_2 = new ActivityImpl(subflow, "HandleCompensation3_2");

    TransitionImpl transition3_2 =
        new TransitionImpl(subflow, "catchCompensation3_1_HandleCompensation3_2");
    transition3_2.setFromNode(handleCompensationNode3_1);
    transition3_2.setToNode(handleCompensationNode3_2);
    handleCompensationNode3_1.getLeavingTransitions().add(transition3_2);
    handleCompensationNode3_2.getEnteringTransitions().add(transition3_2);

    // *******************************************/
    // *********** 带有异常装饰器的结束节点 ********/
    // *******************************************/
    EndNodeImpl endNode = new EndNodeImpl(subflow, "End");
    ThrowCompensationFeatureImpl compensationDecorator = new ThrowCompensationFeatureImpl();
    compensationDecorator.addCompensationCode(
        "ForActivity2AndActivity3"); // 只有CompensationCode=‘TheCompensationActivity’的catch
                                     // compensation decorator才会被激发。
    endNode.setFeature(compensationDecorator);

    // ****************************************************/
    // ****链接 activity1,activity2,activity3 **************/
    // ****************************************************/
    TransitionImpl transition_start_activity1 = new TransitionImpl(subflow, "start_activity1");
    transition_start_activity1.setFromNode(startNode);
    transition_start_activity1.setToNode(activity1);
    startNode.getLeavingTransitions().add(transition_start_activity1);
    activity1.getEnteringTransitions().add(transition_start_activity1);

    TransitionImpl transition_activity1_activity2 =
        new TransitionImpl(subflow, "activity1_activity2");
    transition_activity1_activity2.setFromNode(activity1);
    transition_activity1_activity2.setToNode(activity2);
    activity1.getLeavingTransitions().add(transition_activity1_activity2);
    activity2.getEnteringTransitions().add(transition_activity1_activity2);

    TransitionImpl transition_activity2_activity3 =
        new TransitionImpl(subflow, "activity2_activity3");
    transition_activity2_activity3.setFromNode(activity2);
    transition_activity2_activity3.setToNode(activity3);
    activity2.getLeavingTransitions().add(transition_activity2_activity3);
    activity3.getEnteringTransitions().add(transition_activity2_activity3);

    TransitionImpl transition_activiyt3_end = new TransitionImpl(subflow, "activity3_end");
    transition_activiyt3_end.setFromNode(activity3);
    transition_activiyt3_end.setToNode(endNode);
    activity3.getLeavingTransitions().add(transition_activiyt3_end);
    endNode.getEnteringTransitions().add(transition_activiyt3_end);

    // 组装到process中
    subflow.setEntry(startNode);
    subflow.getStartNodes().add(startNode);
    subflow.getStartNodes().add(catchCompensationNode1);
    subflow.getStartNodes().add(catchCompensationNode2);
    subflow.getStartNodes().add(catchCompensationNode3);

    subflow.getActivities().add(activity1);
    subflow.getActivities().add(activity2);
    subflow.getActivities().add(activity3);
    subflow.getActivities().add(handleCompensationNode1_1);
    subflow.getActivities().add(handleCompensationNode2_1);
    subflow.getActivities().add(handleCompensationNode3_1);
    subflow.getActivities().add(handleCompensationNode3_2);
    subflow.getEndNodes().add(endNode);

    subflow.getTransitions().add(transition1_1);
    subflow.getTransitions().add(transition2_1);
    subflow.getTransitions().add(transition3_1);
    subflow.getTransitions().add(transition3_2);

    subflow.getTransitions().add(transition_start_activity1);
    subflow.getTransitions().add(transition_activity1_activity2);
    subflow.getTransitions().add(transition_activity2_activity3);
    subflow.getTransitions().add(transition_activiyt3_end);

    return process;
  }