<?xml version="1.0" encoding="UTF-8"?>

<!-- This describes a process for submitting changed content in a user -->
<!-- sandbox, via an approver, to the staging sandbox. -->

<process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="wcmwf:submit">

    <swimlane name="initiator"/>

    <!--              -->
    <!-- Start Review -->
    <!--              -->

    <start-state name="start">
        <task name="wcmwf:submitReviewTask" swimlane="initiator"/>
        <transition name="" to="initialise"/>
    </start-state>

    <decision name="initialise">
        <event type="node-enter">
            <script>
                <variable name="wcmwf_reviewCycle" access="write"/>
                <expression>
                   wcmwf_reviewCycle = 1;
                </expression>
            </script>
        </event>        
        <transition name="" to="serialorparallel" />
        <transition name="checklinks" to="checklinks">
           <condition>#{wcmwf_validateLinks != null &amp;&amp; wcmwf_validateLinks == true}</condition>
        </transition>
    </decision>
    
    <!--                                -->
    <!-- Validate Links being submitted -->
    <!--                                -->
    
    <decision name="checklinks">
        <event type="node-enter">
            <action class="org.alfresco.repo.avm.wf.AVMSubmitLinkChecker" />
        </event>
        <transition name="brokenlinkspresent" to="verifybrokenlinks" />
        <transition name="nobrokenlinks" to="serialorparallel" >
            <condition>#{wcmwf_brokenLinks == 0}</condition>
        </transition>
    </decision>
    
    <task-node name="verifybrokenlinks">
        <task name="wcmwf:verifyBrokenLinksTask" swimlane="initiator" />
        <transition name="abort" to="end" />
        <transition name="continue" to="serialorparallel" />
    </task-node>

    <!--                                      -->
    <!-- Split into Serial or Parallel Review -->
    <!--                                      -->

    <decision name="serialorparallel">
       <event type="node-enter">
            <script>
               <variable name="wcmwf_reviewerCnt" access="write"/>
               <variable name="wcmwf_approveCnt" access="write"/>
               <variable name="wcmwf_reviewType" access="write"/>
               <expression>
                  wcmwf_reviewerCnt = bpm_assignees.size();
                  wcmwf_approveCnt = 0;
                  wcmwf_reviewType = wcmwf_submitReviewType;
               </expression>
            </script>
       </event>

       <transition name="serial" to="submitserialreview" />
       <transition name="parallel" to="submitparallelreview">
          <condition>#{wcmwf_reviewType == "Parallel"}</condition>
       </transition>
    </decision>   


    <!--               -->
    <!-- Serial Review -->
    <!--               -->

    <decision name="submitserialreview">
       <transition name="endreview" to="endreview" />
       <transition name="review" to="serialreview">
         <condition>#{wcmwf_approveCnt &lt; wcmwf_reviewerCnt}</condition>
       </transition>
    </decision>   

    <task-node name="serialreview">
        <task name="wcmwf:reviewTask">
           <assignment class="org.alfresco.repo.workflow.jbpm.AlfrescoAssignment">
              <actor>#{bpm_assignees.get(wcmwf_approveCnt)}</actor>
           </assignment>
           <event type="task-assign">
              <script>
                 if (wcmwf_reviewCycle > 1)
                    taskInstance.description = taskInstance.description + " (" + wcmwf_reviewCycle + ")";
              </script>
           </event>           
        </task>

        <transition name="approve" to="submitserialreview">
           <script>
              <variable name="wcmwf_approveCnt" access="read, write"/>
              <expression>
                 wcmwf_approveCnt = wcmwf_approveCnt + 1;
              </expression>
           </script>
        </transition>
        <transition name="reject" to="endreview" />
    </task-node>


    <!--                 -->
    <!-- Parallel Review -->
    <!--                 -->

    <node name="submitparallelreview">
        <action class="org.alfresco.repo.workflow.jbpm.ForEachFork">
            <foreach>#{bpm_assignees}</foreach>
            <var>reviewer</var>
        </action>
        <transition name="review" to="parallelreview" />
    </node>

    <task-node name="parallelreview">
        <task name="wcmwf:parallelReviewTask">
           <assignment class="org.alfresco.repo.workflow.jbpm.AlfrescoAssignment">
              <actor>#{reviewer}</actor>
           </assignment>
           <event type="task-assign">
              <script>
                 if (wcmwf_reviewCycle > 1)
                    taskInstance.description = taskInstance.description + " (" + wcmwf_reviewCycle + ")";
              </script>
           </event>           
        </task>
        <transition name="approve" to="joinparallelreview">
            <script>
                <variable name="wcmwf_approveCnt" access="read,write" />
                <expression>
                    wcmwf_approveCnt = wcmwf_approveCnt +1;
                </expression>
            </script>
        </transition>
        <transition name="reject" to="joinparallelreview" />
    </task-node>

    <join name="joinparallelreview">
        <transition to="endreview" />
    </join>


    <!--                -->
    <!-- End the Review -->
    <!--                -->

    <decision name="endreview">
       <transition name="rejected" to="rejected" />
       <transition name="approved" to="onapprove">
           <condition>#{wcmwf_approveCnt == wcmwf_reviewerCnt}</condition>
       </transition>
    </decision>   

    <task-node name="rejected">
        <task name="wcmwf:rejectedTask" swimlane="initiator" >
            <event type="task-assign">
                <script>
                    if (wcmwf_reviewCycle > 1)
                        taskInstance.description = taskInstance.description + " (" + wcmwf_reviewCycle + ")";
                </script>
            </event>
        </task>
        <transition name="abort" to="end" />
        <transition name="resubmit" to="serialorparallel">        <!-- restart review process (next cycle) -->
           <script>
               <variable name="wcmwf_reviewCycle" access="read,write" />
               <expression>
                   wcmwf_reviewCycle = wcmwf_reviewCycle +1;
               </expression>
           </script>
        </transition>
    </task-node>

    <decision name="onapprove">
       <transition name="launchnow" to="submitted" />
       <transition name="launchpending" to="submitpending">
           <condition>#{wcmwf_launchDate != null}</condition>
       </transition>
    </decision>

    <task-node name="submitpending" end-tasks="true">
        <task name="wcmwf:submitpendingTask" swimlane="initiator">
           <event type="task-create">
              <script>
                 taskInstance.dueDate = wcmwf_launchDate;
              </script>
           </event>        
           <timer duedate="#{wcmwf_launchDate}" transition="launch" >
               <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
                   <script>
                      logger.log("WCM Submission " + bpm_workflowDescription + " submitted at " + wcmwf_launchDate + " by " + person.properties.userName);
                   </script>
               </action>
           </timer>
        </task>
        <transition name="cancel" to="submitcancelled" />
        <transition name="launch" to="submitted" />
    </task-node>

    <task-node name="submitcancelled">
        <task name="wcmwf:submitcancelledTask" swimlane="initiator" />
        <transition name="" to="end" />
    </task-node>

    <task-node name="submitted" end-tasks="true">
        <task name="wcmwf:submittedTask" swimlane="initiator">
            <timer duedate="5 seconds" transition="onsubmit">
                <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
                    <script>
                        logger.log("WCM Submit Process: Triggering submit for " + bpm_workflowDescription);
                    </script>
                </action>
            </timer>

	        <event type="task-end">
                <script>
                   <variable name="submitfailed" access="write"/>
                   <expression>submitfailed = false;</expression>
                </script>
	        
	            <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
	                <script>
	                    logger.log("WCM Submit Process: Start submit for " + bpm_workflowDescription + " (by " + person.properties.userName + ")");
	                </script>
	            </action>
	
	            <action class="org.alfresco.repo.avm.wf.AVMSubmitPackageHandler"/>
	            <action class="org.alfresco.repo.avm.wf.AVMDeployHandler"/>
	           
	            <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
	                <script>
                        logger.log("WCM Submit Process: End submit for " + bpm_workflowDescription + " (by " + person.properties.userName + ")");
	                </script>
	            </action>
	        </event>
        </task>
        <transition name="onsubmit" to="checkfailedsubmit">
			<exception-handler>
                <script>
					<variable name="submitfailed" access="write"/>
					<expression>
                        logger.log("WCM Submit Process: Submit failed for " + bpm_workflowDescription + " (by " + person.properties.userName + ")");
						submitfailed = true;
					</expression>
				</script>
			</exception-handler>
        </transition>
    </task-node>

    <decision name="checkfailedsubmit">
        <transition name="failure" to="submitfailed">
           <condition>#{submitfailed == true}</condition>
        </transition>
        <transition name="success" to="end">
           <condition>#{submitfailed == false}</condition>
        </transition>
    </decision>

    <task-node name="submitfailed">
        <task name="wcmwf:submitfailedTask" swimlane="initiator"/>
        <transition name="" to="end"/>
    </task-node>

    <!--                 -->
    <!-- End the Process -->
    <!--                 -->

    <end-state name="end"/>
    
    <event type="process-end">
        <action class="org.alfresco.repo.avm.wf.AVMRemoveAllSrcWebappsHandler"/>
        <action class="org.alfresco.repo.avm.wf.AVMReleaseTestServerHandler"/>
        <action class="org.alfresco.repo.avm.wf.AVMRemoveWFStoreHandler"/>
    </event>

</process-definition>
