Package org.huihoo.workflow.impl.store.util

Source Code of org.huihoo.workflow.impl.store.util.JoinActivityController

//----------------------------BEGIN LICENSE----------------------------
/*
* Willow : the Open Source WorkFlow Project
* Distributable under GNU LGPL license by gun.org
*
* Copyright (C) 2004-2010 huihoo.org
* Copyright (C) 2004-2010  ZosaTapo <dertyang@hotmail.com>
*
* ====================================================================
* Project Homepage : http://www.huihoo.org/willow
* Source Forge     : http://sourceforge.net/projects/huihoo
* Mailing list     : willow@lists.sourceforge.net
*/
//----------------------------END  LICENSE-----------------------------
package org.huihoo.workflow.impl.store.util;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.huihoo.willow.core.WorkflowServiceBase;

import org.huihoo.workflow.WorkflowException;
import org.huihoo.workflow.store.SchemaContext;
import org.huihoo.workflow.store.persistent.UserTransaction;
import org.huihoo.workflow.store.spi.SpiCaseDatabase;
import org.huihoo.workflow.usermodel.WorkflowParticipant;
import org.huihoo.workflow.runtime.WorkflowCase;
import org.huihoo.workflow.runtime.WorkflowService;
import org.huihoo.workflow.runtime.WorkflowWork;
import org.huihoo.workflow.xpdl.WorkflowActivity;
import org.huihoo.workflow.xpdl.WorkflowProcess;
import org.huihoo.workflow.xpdl.WorkflowTransition;
import org.huihoo.workflow.xpdl.activity.JoinType;
import org.huihoo.workflow.xpdl.event.WorkflowActivityEvent;

import com.zosatapo.commons.store.ConnUtils;
import org.huihoo.workflow.impl.monitor.EventMonitorThread;
import org.huihoo.workflow.impl.monitor.MonitorEvent;
import org.huihoo.workflow.impl.monitor.MonitorEventResult;

/**
* @author reic
*
* To change the template for this generated type comment go to
* Window - Preferences - Java - Code Generation - Code and Comments
*/
public class JoinActivityController
{
  public static Log log = LogFactory.getLog(JoinActivityController.class);

  public static boolean dispatch_join(
    WorkflowService workflowService,
    WorkflowProcess workflowProcess,
    WorkflowParticipant operator,
    SpiCaseDatabase caseDatabase,
    UserTransaction userTransaction,
    WorkflowWork workflowWork,
    WorkflowTransition workflowTransition,
    String pathDispBatch)
    throws WorkflowException
  {
    log.debug("[dispatch_join] workitem: " + workflowWork.getInfo() + " | transition: " + workflowTransition.getInfo());

    JoinType joinType = workflowTransition.getToWorkflowActivity().getJoinType();
    if (JoinType.JOIN_AND.equals(joinType))
    {
      return dispatch_andJoin(
        workflowService,
        workflowProcess,
        operator,
        caseDatabase,
        userTransaction,
        workflowWork,
        workflowTransition,
        pathDispBatch);
    }
    else if (JoinType.JOIN_XOR.equals(joinType))
    {
      return dispatch_xorJoin(
        workflowService,
        workflowProcess,
        operator,
        caseDatabase,
        userTransaction,
        workflowWork,
        workflowTransition,
        pathDispBatch);
    }
    else if (JoinType.JOIN_OR.equals(joinType))
    {
      return dispatch_orJoin(
        workflowService,
        workflowProcess,
        operator,
        caseDatabase,
        userTransaction,
        workflowWork,
        workflowTransition,
        pathDispBatch);
    }
    else if (JoinType.JOIN_ROUTE.equals(joinType))
    {
      return dispatch_routeJoin(
        workflowService,
        workflowProcess,
        operator,
        caseDatabase,
        userTransaction,
        workflowWork,
        workflowTransition,
        pathDispBatch);
    }
    else if (JoinType.JOIN_INSTANCE_AND.equals(joinType))
    {
      return dispatch_instanceAndJoin(
        workflowService,
        workflowProcess,
        operator,
        caseDatabase,
        userTransaction,
        workflowWork,
        workflowTransition,
        pathDispBatch);
    }
    else if (JoinType.JOIN_INSTANCE_XOR.equals(joinType))
    {
      return dispatch_instanceXorJoin(
        workflowService,
        workflowProcess,
        operator,
        caseDatabase,
        userTransaction,
        workflowWork,
        workflowTransition,
        pathDispBatch);
    }

    throw new WorkflowException("JoinType " + joinType + " not supported by current realse");
  }

  public static boolean dispatch_andJoin(
    WorkflowService workflowService,
    WorkflowProcess workflowProcess,
    WorkflowParticipant operator,
    SpiCaseDatabase caseDatabase,
    UserTransaction userTransaction,
    WorkflowWork workflowWork,
    WorkflowTransition workflowTransition,
    String pathDispBatch)
    throws WorkflowException
  {
    log.debug(
      "[dispatch_andJoin] workitem: " + workflowWork.getInfo() + " | transition: " + workflowTransition.getInfo());

    WorkflowServiceBase context = (WorkflowServiceBase) workflowService;
    EventMonitorThread eventMonitorThread = context.getEventMonitorThread(workflowProcess.getWorkflowPackage());
    MonitorEvent monitorEvent =
      new MonitorEvent(workflowService, workflowProcess, operator, userTransaction, workflowWork, workflowTransition);
    eventMonitorThread.sendEvent(monitorEvent);

    MonitorEventResult eventResult = monitorEvent.getResult();

    if (eventResult.getException() != null)
    {
      throw new WorkflowException(eventResult.getException());
    }

    Connection conn = (Connection) userTransaction.getStoreConnection().get();
    PreparedStatement pstmt = null;
    String strSQL = null;
    WorkflowCase workflowCase = workflowWork.getWorkflowCase();
    WorkflowActivity dispActivity = workflowTransition.getFromWorkflowActivity();
    String disp_owner_process_id = dispActivity.getWorkflowProcess().getUUID();
    String disp_activity_id = dispActivity.getUUID();

    String packageId = workflowProcess.getWorkflowPackage().getUUID();
    String processId = workflowProcess.getUUID();
    String caseId = workflowCase.getUUID();
   
    log.debug("\nandJoin monitorEvent == > "+monitorEvent);
   
    try
    {
      if (eventResult.getBatchNo() == 0)
      {
        strSQL =
          "INSERT INTO  "
            + caseDatabase.getSchemaContext().getTableName(SchemaContext.SCHEMA_ACTIVITY_DISPATCH)
            + "(vc_packageid,vc_processid,vc_caseid,vc_owner_processid,vc_activityid,int_batchNo) "
            + " VALUES(?,?,?,?,?,?)";
        pstmt = conn.prepareStatement(strSQL);
        pstmt.setString(1, packageId);
        pstmt.setString(2, processId);
        pstmt.setString(3, caseId);
        pstmt.setString(4, disp_owner_process_id);
        pstmt.setString(5, disp_activity_id);
        pstmt.setInt(6, eventResult.getBatchNo() + 1);
        pstmt.execute();

        ConnUtils.cleanupNoThrow(pstmt);
        pstmt = null;
      }
      else
      {
        strSQL =
          "UPDATE "
            + caseDatabase.getSchemaContext().getTableName(SchemaContext.SCHEMA_ACTIVITY_DISPATCH)
            + " "
            + "SET    int_batchNo=?,vc_disp_flag=?   "
            + "WHERE  vc_packageid=? "
            + "AND    vc_processid=? "
            + "AND    vc_caseid=?  "
            + "AND    vc_owner_processid=? "
            + "AND    vc_activityid=? ";
        pstmt = conn.prepareStatement(strSQL);
        pstmt.setInt(1, eventResult.getBatchNo() + 1);
        pstmt.setString(2, "TRUE");
        pstmt.setString(3, packageId);
        pstmt.setString(4, processId);
        pstmt.setString(5, caseId);
        pstmt.setString(6, disp_owner_process_id);
        pstmt.setString(7, disp_activity_id);
        ConnUtils.cleanupNoThrow(pstmt);
        pstmt = null;
      }
    }
    catch (SQLException ex)
    {
      throw new WorkflowException(ex);
    }
    finally
    {
      ConnUtils.cleanupNoThrow(pstmt);
      pstmt = null;
    }

    String andJoinWorkId = eventResult.getJoinWorkID();
    if (andJoinWorkId == null)
    {
      //�������ز�һ��,throw InternalError()???
    }
    else
    {
      WorkflowWork andJoinWork =
        caseDatabase.findWorkflowWork(
          workflowProcess,
          operator,
          userTransaction,
          workflowWork.getWorkflowCase(),
          andJoinWorkId);
      caseDatabase.createWorkflowPath(
        workflowProcess,
        operator,
        userTransaction,
        workflowWork.getWorkflowCase(),
        workflowWork,
        andJoinWork,
        pathDispBatch,
        WorkflowActivityEvent.WORK_DISPATCH);

      if (eventResult.last())
      {
        return DispatchController.execute_dispatchIfNecessary(
          workflowService,
          workflowProcess,
          operator,
          caseDatabase,
          userTransaction,
          andJoinWork);
      }
    }
    return true;
  }

  public static boolean dispatch_xorJoin(
    WorkflowService workflowService,
    WorkflowProcess workflowProcess,
    WorkflowParticipant operator,
    SpiCaseDatabase caseDatabase,
    UserTransaction userTransaction,
    WorkflowWork workflowWork,
    WorkflowTransition workflowTransition,
    String pathDispBatch)
    throws WorkflowException
  {
    log.debug(
      "[dispatch_xorJoin] workitem: " + workflowWork.getInfo() + " | transition: " + workflowTransition.getInfo());

    WorkflowServiceBase context = (WorkflowServiceBase) workflowService;
    EventMonitorThread eventMonitorThread = context.getEventMonitorThread(workflowProcess.getWorkflowPackage());
    MonitorEvent monitorEvent =
      new MonitorEvent(workflowService, workflowProcess, operator, userTransaction, workflowWork, workflowTransition);
    eventMonitorThread.sendEvent(monitorEvent);

    MonitorEventResult eventResult = monitorEvent.getResult();

    if (eventResult.getException() != null)
    {
      eventResult.getException().printStackTrace();
      throw new WorkflowException(eventResult.getException());
    }

    Connection conn = (Connection) userTransaction.getStoreConnection().get();
    PreparedStatement pstmt = null;
    String strSQL = null;
    WorkflowCase workflowCase = workflowWork.getWorkflowCase();
    WorkflowActivity dispActivity = workflowTransition.getFromWorkflowActivity();
    String disp_owner_process_id = dispActivity.getWorkflowProcess().getUUID();
    String disp_activity_id = dispActivity.getUUID();

    String packageId = workflowProcess.getWorkflowPackage().getUUID();
    String processId = workflowProcess.getUUID();
    String caseId = workflowCase.getUUID();
   
    log.debug("\nxorJoin monitorEvent == > "+monitorEvent);
   
    try
    {
      if (eventResult.getBatchNo() == 0)
      {
        strSQL =
          "INSERT INTO  "
            + caseDatabase.getSchemaContext().getTableName(SchemaContext.SCHEMA_ACTIVITY_DISPATCH)
            + "(vc_packageid,vc_processid,vc_caseid,vc_owner_processid,vc_activityid,int_batchNo) "
            + " VALUES(?,?,?,?,?,?)";
        pstmt = conn.prepareStatement(strSQL);
        pstmt.setString(1, packageId);
        pstmt.setString(2, processId);
        pstmt.setString(3, caseId);
        pstmt.setString(4, disp_owner_process_id);
        pstmt.setString(5, disp_activity_id);
        pstmt.setInt(6, eventResult.getBatchNo() + 1);
        pstmt.execute();

        ConnUtils.cleanupNoThrow(pstmt);
        pstmt = null;
      }
      else
      {
        strSQL =
          "UPDATE "
            + caseDatabase.getSchemaContext().getTableName(SchemaContext.SCHEMA_ACTIVITY_DISPATCH)
            + " "
            + "SET    int_batchNo=?,vc_disp_flag=?   "
            + "WHERE  vc_packageid=? "
            + "AND    vc_processid=? "
            + "AND    vc_caseid=?  "
            + "AND    vc_owner_processid=? "
            + "AND    vc_activityid=? ";
        pstmt = conn.prepareStatement(strSQL);
        pstmt.setInt(1, eventResult.getBatchNo() + 1);
        pstmt.setString(2, "TRUE");
        pstmt.setString(3, packageId);
        pstmt.setString(4, processId);
        pstmt.setString(5, caseId);
        pstmt.setString(6, disp_owner_process_id);
        pstmt.setString(7, disp_activity_id);
        ConnUtils.cleanupNoThrow(pstmt);
        pstmt = null;
      }
    }
    catch (SQLException ex)
    {
      throw new WorkflowException(ex);
    }
    finally
    {
      ConnUtils.cleanupNoThrow(pstmt);
      pstmt = null;

    }
    if (eventResult.first())
    {
      String xorJoinWorkId = eventResult.getJoinWorkID();
      WorkflowWork xorJoinWork =
        caseDatabase.findWorkflowWork(
          workflowProcess,
          operator,
          userTransaction,
          workflowWork.getWorkflowCase(),
          xorJoinWorkId);
      caseDatabase.createWorkflowPath(
        workflowProcess,
        operator,
        userTransaction,
        workflowWork.getWorkflowCase(),
        workflowWork,
        xorJoinWork,
        pathDispBatch,
        WorkflowActivityEvent.WORK_DISPATCH);

      return DispatchController.execute_dispatchIfNecessary(
        workflowService,
        workflowProcess,
        operator,
        caseDatabase,
        userTransaction,
        xorJoinWork);
    }
    else
    {
      //���Էǵ�һ����ɵ�ǰ������??? FIXME!!!!
    }
    return true;

  }

  public static boolean dispatch_orJoin(
    WorkflowService workflowService,
    WorkflowProcess workflowProcess,
    WorkflowParticipant operator,
    SpiCaseDatabase caseDatabase,
    UserTransaction userTransaction,
    WorkflowWork workflowWork,
    WorkflowTransition workflowTransition,
    String pathDispBatch)
    throws WorkflowException
  {
    log.debug(
      "[dispatch_orJoin] workitem: " + workflowWork.getInfo() + " | transition: " + workflowTransition.getInfo());

    WorkflowServiceBase context = (WorkflowServiceBase) workflowService;
    EventMonitorThread eventMonitorThread = context.getEventMonitorThread(workflowProcess.getWorkflowPackage());
    MonitorEvent monitorEvent =
      new MonitorEvent(workflowService, workflowProcess, operator, userTransaction, workflowWork, workflowTransition);
    eventMonitorThread.sendEvent(monitorEvent);

    MonitorEventResult eventResult = monitorEvent.getResult();

    if (eventResult.getException() != null)
    {
      eventResult.getException().printStackTrace();
      throw new WorkflowException(eventResult.getException());
    }

    Connection conn = (Connection) userTransaction.getStoreConnection().get();
    PreparedStatement pstmt = null;
    String strSQL = null;
    WorkflowCase workflowCase = workflowWork.getWorkflowCase();
    WorkflowActivity dispActivity = workflowTransition.getFromWorkflowActivity();
    String disp_owner_process_id = dispActivity.getWorkflowProcess().getUUID();
    String disp_activity_id = dispActivity.getUUID();

    String packageId = workflowProcess.getWorkflowPackage().getUUID();
    String processId = workflowProcess.getUUID();
    String caseId = workflowCase.getUUID();

    log.debug("\norJoin monitorEvent == > "+monitorEvent);
   
    try
    {
      if (eventResult.getBatchNo() == 0)
      {
        strSQL =
          "INSERT INTO  "
            + caseDatabase.getSchemaContext().getTableName(SchemaContext.SCHEMA_ACTIVITY_DISPATCH)
            + "(vc_packageid,vc_processid,vc_caseid,vc_owner_processid,vc_activityid,int_batchNo) "
            + " VALUES(?,?,?,?,?,?)";
        pstmt = conn.prepareStatement(strSQL);
        pstmt.setString(1, packageId);
        pstmt.setString(2, processId);
        pstmt.setString(3, caseId);
        pstmt.setString(4, disp_owner_process_id);
        pstmt.setString(5, disp_activity_id);
        pstmt.setInt(6, eventResult.getBatchNo() + 1);
        pstmt.execute();

        ConnUtils.cleanupNoThrow(pstmt);
        pstmt = null;
      }
      else
      {
        strSQL =
          "UPDATE "
            + caseDatabase.getSchemaContext().getTableName(SchemaContext.SCHEMA_ACTIVITY_DISPATCH)
            + " "
            + "SET    int_batchNo=?,vc_disp_flag=?   "
            + "WHERE  vc_packageid=? "
            + "AND    vc_processid=? "
            + "AND    vc_caseid=?  "
            + "AND    vc_owner_processid=? "
            + "AND    vc_activityid=? ";
        pstmt = conn.prepareStatement(strSQL);
        pstmt.setInt(1, eventResult.getBatchNo() + 1);
        pstmt.setString(2, "TRUE");
        pstmt.setString(3, packageId);
        pstmt.setString(4, processId);
        pstmt.setString(5, caseId);
        pstmt.setString(6, disp_owner_process_id);
        pstmt.setString(7, disp_activity_id);
        ConnUtils.cleanupNoThrow(pstmt);
        pstmt = null;
      }
    }
    catch (SQLException ex)
    {
      throw new WorkflowException(ex);
    }
    finally
    {
      ConnUtils.cleanupNoThrow(pstmt);
      pstmt = null;

    }
    String orJoinWorkId = eventResult.getJoinWorkID();
    if (orJoinWorkId == null)
    {
      //�������ز�һ��,throw InternalError()???
    }
    else
    {
      WorkflowWork orJoinWork =
        caseDatabase.findWorkflowWork(
          workflowProcess,
          operator,
          userTransaction,
          workflowWork.getWorkflowCase(),
          orJoinWorkId);
      caseDatabase.createWorkflowPath(
        workflowProcess,
        operator,
        userTransaction,
        workflowWork.getWorkflowCase(),
        workflowWork,
        orJoinWork,
        pathDispBatch,
        WorkflowActivityEvent.WORK_DISPATCH);

      if (eventResult.last())
      {
        return DispatchController.execute_dispatchIfNecessary(
          workflowService,
          workflowProcess,
          operator,
          caseDatabase,
          userTransaction,
          orJoinWork);
      }
    }
    return true;
  }

  public static boolean dispatch_routeJoin(
    WorkflowService workflowService,
    WorkflowProcess workflowProcess,
    WorkflowParticipant operator,
    SpiCaseDatabase caseDatabase,
    UserTransaction userTransaction,
    WorkflowWork workflowWork,
    WorkflowTransition workflowTransition,
    String pathDispBatch)
    throws WorkflowException
  {
    log.debug(
      "[dispatch_routeJoin] workitem: " + workflowWork.getInfo() + " | transition: " + workflowTransition.getInfo());

    WorkflowActivity routeActivity = workflowTransition.getToWorkflowActivity();

    String orJoinWorkId = null;
    orJoinWorkId =
      caseDatabase.createWorkflowWork(
        workflowProcess,
        operator,
        userTransaction,
        workflowWork.getWorkflowCase(),
        routeActivity,
        null,
        workflowWork.getDispatchTime());
    WorkflowWork routeJoinWork =
      caseDatabase.findWorkflowWork(
        workflowProcess,
        operator,
        userTransaction,
        workflowWork.getWorkflowCase(),
        orJoinWorkId);
    caseDatabase.createWorkflowPath(
      workflowProcess,
      operator,
      userTransaction,
      workflowWork.getWorkflowCase(),
      workflowWork,
      routeJoinWork,
      pathDispBatch,
      WorkflowActivityEvent.WORK_DISPATCH);

    return DispatchController.execute_dispatchIfNecessary(
      workflowService,
      workflowProcess,
      operator,
      caseDatabase,
      userTransaction,
      routeJoinWork);
  }

  public static boolean dispatch_weightJoin(
    WorkflowService workflowService,
    WorkflowProcess workflowProcess,
    WorkflowParticipant operator,
    SpiCaseDatabase caseDatabase,
    UserTransaction userTransaction,
    WorkflowWork workflowWork,
    WorkflowTransition workflowTransition,
    String pathDispBatch)
    throws WorkflowException
  {
    log.debug(
      "[dispatch_weightJoin] workitem: " + workflowWork.getInfo() + " | transition: " + workflowTransition.getInfo());

    //-------------------------------------------
    // reserved for extenstion,not supported now
    //-------------------------------------------
    return true;
  }

  public static boolean dispatch_instanceAndJoin(
    WorkflowService workflowService,
    WorkflowProcess workflowProcess,
    WorkflowParticipant operator,
    SpiCaseDatabase caseDatabase,
    UserTransaction userTransaction,
    WorkflowWork workflowWork,
    WorkflowTransition workflowTransition,
    String pathDispBatch)
    throws WorkflowException
  {
    log.debug(
      "[dispatch_instanceAndJoin] workitem: "
        + workflowWork.getInfo()
        + " | transition: "
        + workflowTransition.getInfo());

    WorkflowServiceBase context = (WorkflowServiceBase) workflowService;
    EventMonitorThread eventMonitorThread = context.getEventMonitorThread(workflowProcess.getWorkflowPackage());
    MonitorEvent monitorEvent =
      new MonitorEvent(workflowService, workflowProcess, operator, userTransaction, workflowWork, workflowTransition);
    eventMonitorThread.sendEvent(monitorEvent);

    MonitorEventResult eventResult = monitorEvent.getResult();

    if (eventResult.getException() != null)
    {
      throw new WorkflowException(eventResult.getException());
    }

    Connection conn = (Connection) userTransaction.getStoreConnection().get();
    PreparedStatement pstmt = null;
    String strSQL = null;
    WorkflowCase workflowCase = workflowWork.getWorkflowCase();
    WorkflowActivity dispActivity = workflowTransition.getFromWorkflowActivity();
    String disp_owner_process_id = dispActivity.getWorkflowProcess().getUUID();
    String disp_activity_id = dispActivity.getUUID();

    String packageId = workflowProcess.getWorkflowPackage().getUUID();
    String processId = workflowProcess.getUUID();
    String caseId = workflowCase.getUUID();
   
    log.debug("\ninstanceAndJoin monitorEvent == > "+monitorEvent);
   
    try
    {
      if (eventResult.getBatchNo() == 0)
      {
        strSQL =
          "INSERT INTO  "
            + caseDatabase.getSchemaContext().getTableName(SchemaContext.SCHEMA_ACTIVITY_DISPATCH)
            + "(vc_packageid,vc_processid,vc_caseid,vc_owner_processid,vc_activityid,int_batchNo) "
            + " VALUES(?,?,?,?,?,?)";
        pstmt = conn.prepareStatement(strSQL);
        pstmt.setString(1, packageId);
        pstmt.setString(2, processId);
        pstmt.setString(3, caseId);
        pstmt.setString(4, disp_owner_process_id);
        pstmt.setString(5, disp_activity_id);
        pstmt.setInt(6, eventResult.getBatchNo() + 1);
        pstmt.execute();

        ConnUtils.cleanupNoThrow(pstmt);
        pstmt = null;
      }
      else
      {
        strSQL =
          "UPDATE "
            + caseDatabase.getSchemaContext().getTableName(SchemaContext.SCHEMA_ACTIVITY_DISPATCH)
            + " "
            + "SET    int_batchNo=?,vc_disp_flag=?   "
            + "WHERE  vc_packageid=? "
            + "AND    vc_processid=? "
            + "AND    vc_caseid=?  "
            + "AND    vc_owner_processid=? "
            + "AND    vc_activityid=? ";
        pstmt = conn.prepareStatement(strSQL);
        pstmt.setInt(1, eventResult.getBatchNo() + 1);
        pstmt.setString(2, "TRUE");
        pstmt.setString(3, packageId);
        pstmt.setString(4, processId);
        pstmt.setString(5, caseId);
        pstmt.setString(6, disp_owner_process_id);
        pstmt.setString(7, disp_activity_id);
        ConnUtils.cleanupNoThrow(pstmt);
        pstmt = null;
      }
    }
    catch (SQLException ex)
    {
      throw new WorkflowException(ex);
    }
    finally
    {
      ConnUtils.cleanupNoThrow(pstmt);
      pstmt = null;
    }

    String andJoinWorkId = eventResult.getJoinWorkID();
    if (andJoinWorkId == null)
    {
      //�������ز�һ��,throw InternalError()???
    }
    else
    {
      WorkflowWork andJoinWork =
        caseDatabase.findWorkflowWork(
          workflowProcess,
          operator,
          userTransaction,
          workflowWork.getWorkflowCase(),
          andJoinWorkId);
      caseDatabase.createWorkflowPath(
        workflowProcess,
        operator,
        userTransaction,
        workflowWork.getWorkflowCase(),
        workflowWork,
        andJoinWork,
        pathDispBatch,
        WorkflowActivityEvent.WORK_DISPATCH);

      if (eventResult.last())
      {
        return DispatchController.execute_dispatchIfNecessary(
          workflowService,
          workflowProcess,
          operator,
          caseDatabase,
          userTransaction,
          andJoinWork);
      }
    }

    return true;
  }

  public static boolean dispatch_instanceXorJoin(
    WorkflowService workflowService,
    WorkflowProcess workflowProcess,
    WorkflowParticipant operator,
    SpiCaseDatabase caseDatabase,
    UserTransaction userTransaction,
    WorkflowWork workflowWork,
    WorkflowTransition workflowTransition,
    String pathDispBatch)
    throws WorkflowException
  {
    log.debug("[dispatch_instanceXorJoin] workitem: " + workflowWork.getInfo() + " | transition: " + workflowTransition.getInfo());
    WorkflowServiceBase context = (WorkflowServiceBase) workflowService;
    EventMonitorThread eventMonitorThread = context.getEventMonitorThread(workflowProcess.getWorkflowPackage());
    MonitorEvent monitorEvent =
      new MonitorEvent(workflowService, workflowProcess, operator, userTransaction, workflowWork, workflowTransition);
    eventMonitorThread.sendEvent(monitorEvent);

    MonitorEventResult eventResult = monitorEvent.getResult();

    if (eventResult.getException() != null)
    {
      throw new WorkflowException(eventResult.getException());
    }

    WorkflowCase workflowCase = workflowWork.getWorkflowCase();
    WorkflowActivity dispActivity = workflowTransition.getFromWorkflowActivity();
    String disp_owner_process_id = dispActivity.getWorkflowProcess().getUUID();
    String disp_activity_id = dispActivity.getUUID();

    String packageId = workflowProcess.getWorkflowPackage().getUUID();
    String processId = workflowProcess.getUUID();
    String caseId = workflowCase.getUUID();
   
    log.debug("\ninstanceXorJoin monitorEvent == > "+monitorEvent);
   
    if (eventResult.first())
    {
      String xor_work_id = eventResult.getJoinWorkID();
      WorkflowWork xorJoinWork =
        caseDatabase.findWorkflowWork(
          workflowProcess,
          operator,
          userTransaction,
          workflowWork.getWorkflowCase(),
          xor_work_id);

      String batchNo =
        caseDatabase.getCaseIdGenerator().genWorkflowPathBatch(packageId, processId, dispActivity.getUUID(), caseId);
      caseDatabase.createWorkflowPath(
        workflowProcess,
        operator,
        userTransaction,
        workflowWork.getWorkflowCase(),
        workflowWork,
        xorJoinWork,
        batchNo,
        WorkflowActivityEvent.WORK_DISPATCH);

      return DispatchController.execute_dispatchIfNecessary(
        workflowService,
        workflowProcess,
        operator,
        caseDatabase,
        userTransaction,
        xorJoinWork);
    }

    return true;
  }

  public static boolean dispatch_instanceOrJoin(
    WorkflowService workflowService,
    WorkflowProcess workflowProcess,
    WorkflowParticipant operator,
    SpiCaseDatabase caseDatabase,
    UserTransaction userTransaction,
    WorkflowWork workflowWork,
    WorkflowTransition workflowTransition,
    String pathDispBatch)
    throws WorkflowException
  {
    log.debug("[dispatch_instanceWeightJoin] workitem: " + workflowWork.getInfo() + " | transition: " + workflowTransition.getInfo());

    //-------------------------------------------
    // reserved for extenstion,not supported now
    //-------------------------------------------
    return true;
  }
  public static boolean dispatch_instanceWeightJoin(
    WorkflowService workflowService,
    WorkflowProcess workflowProcess,
    WorkflowParticipant operator,
    SpiCaseDatabase caseDatabase,
    UserTransaction userTransaction,
    WorkflowWork workflowWork,
    WorkflowTransition workflowTransition,
    String pathDispBatch)
    throws WorkflowException
  {
    log.debug("[dispatch_instanceWeightJoin] workitem: " + workflowWork.getInfo() + " | transition: " + workflowTransition.getInfo());

    //-------------------------------------------
    // reserved for extenstion,not supported now
    //-------------------------------------------
    return true;
  }
}
TOP

Related Classes of org.huihoo.workflow.impl.store.util.JoinActivityController

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.