Package org.huihoo.workflow.impl.monitor

Source Code of org.huihoo.workflow.impl.monitor.EventMonitorThread

//----------------------------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.monitor;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.huihoo.workflow.WorkflowException;
import org.huihoo.workflow.store.SchemaContext;
import org.huihoo.workflow.store.persistent.TransactionException;
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.impl.store.CaseDatabaseImpl;
import com.zosatapo.commons.store.ConnUtils;

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

  public EventMonitorThread()
  {
    theQueue = new EventQueue();
  }

  public EventMonitorThread(String name)
  {
    super(name);
    theQueue = new EventQueue();
  }
 
  public void run()
  {
    while (true)
    {
      try
      {
        MonitorEvent theEvent = theQueue.getNextEvent();
        theEvent.dispatch();
      }
      catch (InterruptedException e)
      {
        log.error("Exception invoking MonitorEvent dispatch operation: ", e);
        break;
      }

    } //~end while(true)

  }

  public void sendEvent(MonitorEvent event)
  {
    theQueue.sendEvent(event);
  }

  //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  public static MonitorEventResult dispatch(
    WorkflowService workflowService,
    WorkflowProcess workflowProcess,
    WorkflowParticipant operator,
    UserTransaction event_userTransaction,
    WorkflowWork workflowWork,
    WorkflowTransition workflowTransition)
  {
    WorkflowActivity joinActivity = workflowTransition.getToWorkflowActivity();
    JoinType joinType = joinActivity.getJoinType();
    if (joinType != null)
    {
      CaseDatabaseImpl caseDatabaseImpl = (CaseDatabaseImpl) workflowService.getCaseDatabase();
      SpiCaseDatabase caseDatabase = caseDatabaseImpl.getWrappedObject();

      UserTransaction userTransaction = null;
      MonitorEventResult eventResult = null;
      try
      {
        userTransaction = caseDatabase.getUserTransaction();

        if (JoinType.JOIN_AND.equals(joinType))
        {
          eventResult =
            dispatch_andJoin(
              workflowService,
              workflowProcess,
              operator,
              event_userTransaction,
              caseDatabase,
              userTransaction,
              workflowWork,
              workflowTransition);
        }

        if (JoinType.JOIN_XOR.equals(joinType))
        {
          eventResult =
            dispatch_xorJoin(
              workflowService,
              workflowProcess,
              operator,
              event_userTransaction,
              caseDatabase,
              userTransaction,
              workflowWork,
              workflowTransition);
        }

        if (JoinType.JOIN_OR.equals(joinType))
        {
          eventResult =
            dispatch_orJoin(
              workflowService,
              workflowProcess,
              operator,
              event_userTransaction,
              caseDatabase,
              userTransaction,
              workflowWork,
              workflowTransition);
        }

        if (JoinType.JOIN_WEIGHT.equals(joinType))
        {
          eventResult =
            dispatch_weightJoin(
              workflowService,
              workflowProcess,
              operator,
              event_userTransaction,
              caseDatabase,
              userTransaction,
              workflowWork,
              workflowTransition);
        }

        userTransaction.commit();
      }
      catch (WorkflowException ex)
      {
        if (userTransaction != null)
        {
          try
          {
            userTransaction.rollback();
          }
          catch (TransactionException e)
          {
            ;
          }
        }

        eventResult = new MonitorEventResult();
        eventResult.setException(ex);
      }
      finally
      {
        if (userTransaction != null)
        {
          try
          {
            userTransaction.release();
          }
          catch (TransactionException e)
          {
            ;
          }
        }
      }

      return eventResult;
    }

    MonitorEventResult eventResult = new MonitorEventResult();
    eventResult.setException(
      new WorkflowException("JoinType " + joinType + " not supported by current realse"));
    return eventResult;
  }

  private static MonitorEventResult dispatch_andJoin(
    WorkflowService workflowService,
    WorkflowProcess workflowProcess,
    WorkflowParticipant operator,
    UserTransaction event_userTransaction,
    SpiCaseDatabase caseDatabase,
    UserTransaction userTransaction,
    WorkflowWork workflowWork,
    WorkflowTransition workflowTransition)
  {
    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();

    WorkflowActivity joinActivity = workflowTransition.getToWorkflowActivity();
    String join_owner_process_id = joinActivity.getWorkflowProcess().getUUID();
    String join_activity_id = joinActivity.getUUID();

    Connection conn = (Connection) userTransaction.getStoreConnection().get();
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    String strSQL = null;

    MonitorEventResult eventResult = new MonitorEventResult();

    try
    {
      //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      int join_monitor_counter = 0;
      int join_activity_batchNo = 0;
      int disp_activity_batchNo = 0;

      //--------------------------------------------------------------------
      // DISP ACTIVITY DISPATCH INFO
      // 1. ȡ�ñ����ɷ��Ĺ������������Ļ�ڵ���Ϣ
      //--------------------------------------------------------------------
      strSQL =
        "SELECT  int_batchNo,int_join_monitor  FROM "+userTransaction.getDatabase().getSchemaContext().getTableName(SchemaContext.SCHEMA_ACTIVITY_DISPATCH)+"  "
          + "WHERE  vc_packageid=? "
          + "AND    vc_processid=? "
          + "AND    vc_caseid=?  "
          + "AND    vc_owner_processid=? "
          + "AND    vc_activityid=? ";

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

      rs = pstmt.executeQuery();
      if (rs.next())
      {
        disp_activity_batchNo = rs.getInt("int_batchNo");
        eventResult.setBatchNo(disp_activity_batchNo);
      }
      else
      {
        eventResult.setBatchNo(disp_activity_batchNo);
      }
      //--------------------------------------------------------------------
      // JOIN ACTIVITY DISPATCH INFO
      // 2.ȡ�ù��������۵Ļ�ڵ���Ϣ
      //--------------------------------------------------------------------
      pstmt.setString(1, packageId);
      pstmt.setString(2, processId);
      pstmt.setString(3, caseId);
      pstmt.setString(4, join_owner_process_id);
      pstmt.setString(5, join_activity_id);

      rs = pstmt.executeQuery();
      if (rs.next())
      {
        join_activity_batchNo = rs.getInt("int_batchNo");
        join_monitor_counter = rs.getInt("int_join_monitor");
      }

      ConnUtils.cleanupNoThrow(pstmt);
      pstmt = null;

      if ((disp_activity_batchNo + 1) < join_activity_batchNo)
      {
        eventResult.first(false);
        eventResult.last(false);

        return eventResult;
      }

      //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
      // 3. ȡ�û�۵Ļ�ڵ㵱ǰ��ɵ�ǰ�̹�������Ϣ
      //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      String join_work_id = null;
      strSQL =
        "SELECT vc_uuid  FROM "
          + caseDatabase.getSchemaContext().getTableName(SchemaContext.SCHEMA_WORK)
          + " "
          + "WHERE  dat_acceptTime IS NULL "
          + "AND    vc_packageid=? "
          + "AND    vc_processid=? "
          + "AND    vc_caseid=?  "
          + "AND    vc_owner_processid=? "
          + "AND    vc_activityid=? ";

      pstmt = conn.prepareStatement(strSQL);
      pstmt.setString(1, packageId);
      pstmt.setString(2, processId);
      pstmt.setString(3, caseId);

      pstmt.setString(4, join_owner_process_id);
      pstmt.setString(5, join_activity_id);

      rs = pstmt.executeQuery();

      if (rs.next())
      {
        eventResult.first(false);
        eventResult.last(false);
        join_work_id = rs.getString("vc_uuid");
      }
      else
      {
        eventResult.first(true);
        eventResult.last(false);
        join_monitor_counter = 0;
      }

      ConnUtils.cleanupNoThrow(pstmt);
      pstmt = null;

      List inTrans = joinActivity.getIncomingTransitions();
      int sizeTrans = inTrans.size();
//      System.err.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
//      System.err.println("joinActivity : "+joinActivity);
//      System.err.println(inTrans);
//      System.err.println("join_monitor_counter : "+join_monitor_counter);
//      System.err.println("join_activity_batchNo : "+join_activity_batchNo);
      if ((join_monitor_counter + 1) >= sizeTrans)
      {
        eventResult.last(true);
      }

      if (join_activity_batchNo == 0)
      {
        strSQL =
          "INSERT INTO  "+userTransaction.getDatabase().getSchemaContext().getTableName(SchemaContext.SCHEMA_ACTIVITY_DISPATCH)+"(vc_packageid,vc_processid,vc_caseid,vc_owner_processid,vc_activityid,int_batchNo,int_join_monitor) "
            + " VALUES(?,?,?,?,?,?,?)";
        pstmt = conn.prepareStatement(strSQL);
        pstmt.setString(1, packageId);
        pstmt.setString(2, processId);
        pstmt.setString(3, caseId);
        pstmt.setString(4, join_owner_process_id);
        pstmt.setString(5, join_activity_id);
        pstmt.setInt(6, join_activity_batchNo + 1);
        pstmt.setInt(7, join_monitor_counter + 1);
        pstmt.execute();

        ConnUtils.cleanupNoThrow(pstmt);
        pstmt = null;
      }
      else
      {
        if (eventResult.first())
        {
          join_activity_batchNo = +1;
        }
        strSQL =
          "UPDATE "+userTransaction.getDatabase().getSchemaContext().getTableName(SchemaContext.SCHEMA_ACTIVITY_DISPATCH)+" "
            + "SET    int_batchNo=?,int_join_monitor=?,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, join_activity_batchNo);
        pstmt.setInt(2, join_monitor_counter + 1);
        pstmt.setString(3, "TRUE");
        pstmt.setString(4, packageId);
        pstmt.setString(5, processId);
        pstmt.setString(6, caseId);
        pstmt.setString(7, join_owner_process_id);
        pstmt.setString(8, join_activity_id);
        ConnUtils.cleanupNoThrow(pstmt);
        pstmt = null;
      }

      if (eventResult.first())
      {
        join_work_id =
          caseDatabase.createWorkflowWork(
            workflowProcess,
            operator,
            userTransaction,
            workflowWork.getWorkflowCase(),
            joinActivity,
            null,
            workflowWork.getDispatchTime());
      }

      eventResult.setJoinWorkID(join_work_id);
    }
    catch (Exception ex)
    {
      ex.printStackTrace();
      eventResult.setException(ex);
    }
    finally
    {
      ConnUtils.cleanupNoThrow(pstmt);
    }

    return eventResult;
  }

  private static MonitorEventResult dispatch_xorJoin(
    WorkflowService workflowService,
    WorkflowProcess workflowProcess,
    WorkflowParticipant operator,
    UserTransaction event_userTransaction,
    SpiCaseDatabase caseDatabase,
    UserTransaction userTransaction,
    WorkflowWork workflowWork,
    WorkflowTransition workflowTransition)
  {
   
    WorkflowCase workflowCase = workflowWork.getWorkflowCase();

    WorkflowActivity dispActivity = workflowTransition.getFromWorkflowActivity();
    String disp_owner_process_id = dispActivity.getWorkflowProcess().getUUID();
    String disp_activity_id = dispActivity.getUUID();

    WorkflowActivity joinActivity = workflowTransition.getToWorkflowActivity();
    String join_owner_process_id = joinActivity.getWorkflowProcess().getUUID();
    String join_activity_id = joinActivity.getUUID();

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

    Connection conn = (Connection) userTransaction.getStoreConnection().get();
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    String strSQL = null;

    MonitorEventResult eventResult = new MonitorEventResult();

    try
    {
      //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      int join_activity_batchNo = 0;
      int disp_activity_batchNo = 0;

      //--------------------------------------------------------------------
      // DISP ACTIVITY DISPATCH INFO
      // 1. ȡ�ñ����ɷ��Ĺ������������Ļ�ڵ���Ϣ
      //--------------------------------------------------------------------
      strSQL =
        "SELECT  int_batchNo  FROM "+userTransaction.getDatabase().getSchemaContext().getTableName(SchemaContext.SCHEMA_ACTIVITY_DISPATCH)+" "
          + "WHERE  vc_packageid=? "
          + "AND    vc_processid=? "
          + "AND    vc_caseid=?  "
          + "AND    vc_owner_processid=? "
          + "AND    vc_activityid=? ";

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

      rs = pstmt.executeQuery();
      if (rs.next())
      {
        disp_activity_batchNo = rs.getInt("int_batchNo");
        eventResult.setBatchNo(disp_activity_batchNo);
      }

      //--------------------------------------------------------------------
      // JOIN ACTIVITY DISPATCH INFO
      // 2.ȡ�ù��������۵Ļ�ڵ���Ϣ
      //--------------------------------------------------------------------
      pstmt.setString(1, packageId);
      pstmt.setString(2, processId);
      pstmt.setString(3, caseId);
      pstmt.setString(4, join_owner_process_id);
      pstmt.setString(5, join_activity_id);

      rs = pstmt.executeQuery();
      if (rs.next())
      {
        join_activity_batchNo = rs.getInt("int_batchNo");
      }

      ConnUtils.cleanupNoThrow(pstmt);
      pstmt = null;

      if ((disp_activity_batchNo + 1) <= join_activity_batchNo)
      {
        eventResult.first(false);
        eventResult.last(false);

        return eventResult;
      }

      //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
      // 3. ȡ�û�۵Ļ�ڵ㵱ǰ��ɵ�ǰ�̹�������Ϣ
      //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 

      if (disp_activity_batchNo == join_activity_batchNo)
      {
        eventResult.first(true);
        eventResult.last(true);
      }
      else
      {
        eventResult.first(false);
        eventResult.last(false);

        return eventResult;
      }

      if (join_activity_batchNo == 0)
      {
        strSQL =
          "INSERT INTO  "+userTransaction.getDatabase().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, join_owner_process_id);
        pstmt.setString(5, join_activity_id);
        pstmt.setInt(6, join_activity_batchNo + 1);
        pstmt.execute();

        ConnUtils.cleanupNoThrow(pstmt);
        pstmt = null;
      }
      else
      {
        if (eventResult.first())
        {
          strSQL =
            "UPDATE "+userTransaction.getDatabase().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, join_activity_batchNo + 1);
          pstmt.setString(2, "TRUE");
          pstmt.setString(3, packageId);
          pstmt.setString(4, processId);
          pstmt.setString(5, caseId);
          pstmt.setString(6, join_owner_process_id);
          pstmt.setString(7, join_activity_id);
          ConnUtils.cleanupNoThrow(pstmt);
          pstmt = null;
        }
      }

      if (eventResult.first())
      {
        String join_work_id = null;
        join_work_id =
          caseDatabase.createWorkflowWork(
            workflowProcess,
            operator,
            userTransaction,
            workflowWork.getWorkflowCase(),
            joinActivity,
            null,
            workflowWork.getDispatchTime());
        eventResult.setJoinWorkID(join_work_id);
      }
    }
    catch (Exception ex)
    {
      eventResult.setException(ex);
    }
    finally
    {
      ConnUtils.cleanupNoThrow(pstmt);
    }

    return eventResult;
  }

  private static MonitorEventResult dispatch_orJoin(
    WorkflowService workflowService,
    WorkflowProcess workflowProcess,
    WorkflowParticipant operator,
    UserTransaction event_userTransaction,//[VIP]
    SpiCaseDatabase caseDatabase,
    UserTransaction userTransaction,
    WorkflowWork workflowWork,
    WorkflowTransition workflowTransition)
  {
 
    WorkflowCase workflowCase = workflowWork.getWorkflowCase();

    WorkflowActivity dispActivity = workflowTransition.getFromWorkflowActivity();
    String disp_owner_process_id = dispActivity.getWorkflowProcess().getUUID();
    String disp_activity_id = dispActivity.getUUID();

    WorkflowActivity joinActivity = workflowTransition.getToWorkflowActivity();
    String join_owner_process_id = joinActivity.getWorkflowProcess().getUUID();
    String join_activity_id = joinActivity.getUUID();

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

    Connection conn = (Connection) userTransaction.getStoreConnection().get();
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    String strSQL = null;

    MonitorEventResult eventResult = new MonitorEventResult();

    try
    {
      //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      int join_monitor_counter = 0;
      int join_activity_batchNo = 0;
      int disp_activity_batchNo = 0;

      //--------------------------------------------------------------------
      // DISP ACTIVITY DISPATCH INFO
      // 1. ȡ�ñ����ɷ��Ĺ������������Ļ�ڵ���Ϣ
      strSQL =
        "SELECT  int_batchNo,int_join_monitor  FROM "+userTransaction.getDatabase().getSchemaContext().getTableName(SchemaContext.SCHEMA_ACTIVITY_DISPATCH)+"  "
          + "WHERE  vc_packageid=? "
          + "AND    vc_processid=? "
          + "AND    vc_caseid=?  "
          + "AND    vc_owner_processid=? "
          + "AND    vc_activityid=? ";

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

      rs = pstmt.executeQuery();
      if (rs.next())
      {
        disp_activity_batchNo = rs.getInt("int_batchNo");
        eventResult.setBatchNo(disp_activity_batchNo);
      }

      //--------------------------------------------------------------------
      // JOIN ACTIVITY DISPATCH INFO
      // 2.ȡ�ù��������۵Ļ�ڵ���Ϣ
      //--------------------------------------------------------------------
      pstmt.setString(1, packageId);
      pstmt.setString(2, processId);
      pstmt.setString(3, caseId);
      pstmt.setString(4, join_owner_process_id);
      pstmt.setString(5, join_activity_id);

      rs = pstmt.executeQuery();
      if (rs.next())
      {
        join_activity_batchNo = rs.getInt("int_batchNo");
        join_monitor_counter = rs.getInt("int_join_monitor");
      }

      ConnUtils.cleanupNoThrow(pstmt);
      pstmt = null;

      if ((disp_activity_batchNo + 1) < join_activity_batchNo)
      {
        eventResult.first(false);
        eventResult.last(false);

        return eventResult;
      }

      //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
      // 3. ȡ�û�۵Ļ�ڵ㵱ǰ��ɵ�ǰ�̹�������Ϣ
      //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      List inTrans = joinActivity.getIncomingTransitions();
      int inTrans_size = inTrans.size();

      int falseTrans_size = 0;
      strSQL =
        "SELECT  int_batchNo  FROM "+userTransaction.getDatabase().getSchemaContext().getTableName(SchemaContext.SCHEMA_ACTIVITY_DISPATCH)+" "
          + "WHERE  vc_disp_flag=? "
          + "AND    vc_packageid=? "
          + "AND    vc_processid=? "
          + "AND    vc_caseid=?  "
          + "AND    vc_owner_processid=? "
          + "AND    vc_activityid=? ";
      pstmt = conn.prepareStatement(strSQL);

      List not_found_inTrans = new ArrayList();

      for (int i = 0; i < inTrans_size; ++i)
      {
        WorkflowTransition flaseTransition = (WorkflowTransition) inTrans.get(i);
        WorkflowActivity falseActivity = flaseTransition.getFromWorkflowActivity();
        String false_owner_process_id = falseActivity.getWorkflowProcess().getUUID();
        String false_activity_id = falseActivity.getUUID();

        pstmt.setString(1, "FALSE");
        pstmt.setString(2, packageId);
        pstmt.setString(3, processId);
        pstmt.setString(4, caseId);
        pstmt.setString(5, false_owner_process_id);
        pstmt.setString(6, false_activity_id);

        rs = pstmt.executeQuery();
        if (rs.next())
        {
          falseTrans_size += 1;
        }
        else
        {
          not_found_inTrans.add(flaseTransition);
        }
      }
      ConnUtils.cleanupNoThrow(pstmt);
      pstmt = null;
     
      //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
      // -----------------Lookup In event_userTransaction  ---------------------------------
      //------------------VIP Code Section By zosatapo----------------------------------------
      //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 
      Connection event_conn = null;
      PreparedStatement event_pstmt = null;
      ResultSet  event_rs=null;
      try
      {
        event_conn = (Connection) event_userTransaction.getStoreConnection().get();
       
        strSQL =
          "SELECT  int_batchNo  FROM "+userTransaction.getDatabase().getSchemaContext().getTableName(SchemaContext.SCHEMA_ACTIVITY_DISPATCH)+" "
            + "WHERE  vc_disp_flag=? "
            + "AND    vc_packageid=? "
            + "AND    vc_processid=? "
            + "AND    vc_caseid=?  "
            + "AND    vc_owner_processid=? "
            + "AND    vc_activityid=? ";
        event_pstmt = event_conn.prepareStatement(strSQL);
             
        int not_found_inTrans_size = not_found_inTrans.size();
        for (int i = 0; i < not_found_inTrans_size; ++i)
        {
          WorkflowTransition flaseTransition = (WorkflowTransition) not_found_inTrans.get(i);
          WorkflowActivity falseActivity = flaseTransition.getFromWorkflowActivity();
          String false_owner_process_id = falseActivity.getWorkflowProcess().getUUID();
          String false_activity_id = falseActivity.getUUID();

          event_pstmt.setString(1, "FALSE");
          event_pstmt.setString(2, packageId);
          event_pstmt.setString(3, processId);
          event_pstmt.setString(4, caseId);
          event_pstmt.setString(5, false_owner_process_id);
          event_pstmt.setString(6, false_activity_id);
          event_rs = event_pstmt.executeQuery();
          if (event_rs.next())
          {
            falseTrans_size += 1;
          }
                 
        }//~end for (int i = 0; i < not_found_inTrans_size; ++i)
        ConnUtils.cleanupNoThrow(event_pstmt);
        event_pstmt = null;
      }
      finally
      {
        ConnUtils.cleanupNoThrow(event_pstmt);
        event_pstmt = null;
      }
      //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 

      int join_monitor_total = inTrans_size - falseTrans_size;
      //*********************************************************************
      if (disp_activity_batchNo == join_activity_batchNo)
      {
        eventResult.first(true);
        eventResult.last(false);
        join_monitor_counter = 0;
      }
      else
      {
        eventResult.first(false);
        eventResult.last(false);
      }

      //if((join_monitor_counter+1) == join_monitor_total)
      if ((join_monitor_counter + 1) >= join_monitor_total)
      {
        eventResult.last(true);
      }

      if (join_activity_batchNo == 0)
      {
        strSQL =
          "INSERT INTO  "+userTransaction.getDatabase().getSchemaContext().getTableName(SchemaContext.SCHEMA_ACTIVITY_DISPATCH)+"(vc_packageid,vc_processid,vc_caseid,vc_owner_processid,vc_activityid,int_batchNo,int_join_monitor) "
            + " VALUES(?,?,?,?,?,?,?)";
        pstmt = conn.prepareStatement(strSQL);
        pstmt.setString(1, packageId);
        pstmt.setString(2, processId);
        pstmt.setString(3, caseId);
        pstmt.setString(4, join_owner_process_id);
        pstmt.setString(5, join_activity_id);
        pstmt.setInt(6, join_activity_batchNo + 1);
        pstmt.setInt(7, join_monitor_counter + 1);
        pstmt.execute();

        ConnUtils.cleanupNoThrow(pstmt);
        pstmt = null;
      }
      else
      {
        if (eventResult.first())
        {
          join_activity_batchNo = +1;
        }
        strSQL =
          "UPDATE "+userTransaction.getDatabase().getSchemaContext().getTableName(SchemaContext.SCHEMA_ACTIVITY_DISPATCH)+" "
            + "SET    int_batchNo=?,int_join_monitor=?,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, join_activity_batchNo);
        pstmt.setInt(2, join_monitor_counter + 1);
        pstmt.setString(3, "TRUE");
        pstmt.setString(4, packageId);
        pstmt.setString(5, processId);
        pstmt.setString(6, caseId);
        pstmt.setString(7, join_owner_process_id);
        pstmt.setString(8, join_activity_id);
        ConnUtils.cleanupNoThrow(pstmt);
        pstmt = null;
      }

      String join_work_id = null;
      if (eventResult.first())
      {
        join_work_id =
          caseDatabase.createWorkflowWork(
            workflowProcess,
            operator,
            userTransaction,
            workflowWork.getWorkflowCase(),
            joinActivity,
            null,
            workflowWork.getDispatchTime());
      }
      else
      {
        strSQL =
          "SELECT vc_uuid  FROM "
            + caseDatabase.getSchemaContext().getTableName(SchemaContext.SCHEMA_WORK)
            + " "
            + "WHERE  dat_acceptTime IS NULL "
            + "AND    vc_packageid=? "
            + "AND    vc_processid=? "
            + "AND    vc_caseid=?  "
            + "AND    vc_owner_processid=? "
            + "AND    vc_activityid=? ";

        pstmt = conn.prepareStatement(strSQL);
        pstmt.setString(1, packageId);
        pstmt.setString(2, processId);
        pstmt.setString(3, caseId);
        pstmt.setString(4, join_owner_process_id);
        pstmt.setString(5, join_activity_id);

        rs = pstmt.executeQuery();

        if (rs.next())
        {
          join_work_id = rs.getString("vc_uuid");
        }
        ConnUtils.cleanupNoThrow(pstmt);
        pstmt = null;
      }

      eventResult.setJoinWorkID(join_work_id);
    }
    catch (Exception ex)
    {
      eventResult.setException(ex);
    }
    finally
    {
      ConnUtils.cleanupNoThrow(pstmt);
    }

    return eventResult;
  }

  private static MonitorEventResult dispatch_weightJoin(
    WorkflowService workflowService,
    WorkflowProcess workflowProcess,
    WorkflowParticipant operator,
    UserTransaction event_userTransaction,
    SpiCaseDatabase caseDatabase,
    UserTransaction userTransaction,
    WorkflowWork workflowWork,
    WorkflowTransition workflowTransition)
  {
    return null;
  }

  private static MonitorEventResult dispatch_instanceAndJoin(
    WorkflowService workflowService,
    WorkflowProcess workflowProcess,
    WorkflowParticipant operator,
    UserTransaction event_userTransaction,
    SpiCaseDatabase caseDatabase,
    UserTransaction userTransaction,
    WorkflowWork workflowWork,
    WorkflowTransition workflowTransition)
  {
    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();

    WorkflowActivity joinActivity = workflowTransition.getToWorkflowActivity();
    String join_owner_process_id = joinActivity.getWorkflowProcess().getUUID();
    String join_activity_id = joinActivity.getUUID();

    Connection conn = (Connection) userTransaction.getStoreConnection().get();
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    String strSQL = null;

    MonitorEventResult eventResult = new MonitorEventResult();

    try
    {
      String join_work_id = null;

      strSQL =
        "SELECT vc_uuid  FROM "
          + caseDatabase.getSchemaContext().getTableName(SchemaContext.SCHEMA_WORK)
          + " "
          + "WHERE  dat_acceptTime IS NULL "
          + "AND    vc_packageid=? "
          + "AND    vc_processid=? "
          + "AND    vc_caseid=?  "
          + "AND    vc_owner_processid=? "
          + "AND    vc_activityid=? ";

      pstmt = conn.prepareStatement(strSQL);
      pstmt.setString(1, packageId);
      pstmt.setString(2, processId);
      pstmt.setString(3, caseId);
      pstmt.setString(4, join_owner_process_id);
      pstmt.setString(5, join_activity_id);

      rs = pstmt.executeQuery();
      if (rs.next())
      {
        eventResult.first(false);
        eventResult.last(false);
        join_work_id = rs.getString("vc_uuid");
      }
      else
      {
        eventResult.first(true);
        eventResult.last(false);
      }
      ConnUtils.cleanupNoThrow(pstmt);
      pstmt = null;

      int join_monitor_counter = 0;
      int join_monitor_total = 0;

      strSQL =
        "SELECT vc_batchNo FROM "
          + caseDatabase.getSchemaContext().getTableName(SchemaContext.SCHEMA_PATH)
          + " "
          + "WHERE  vc_packageid=? "
          + "AND    vc_processid=? "
          + "AND    vc_caseid=?  "
          + "AND    vc_to=? ";
      pstmt = conn.prepareStatement(strSQL);
      pstmt.setString(1, packageId);
      pstmt.setString(2, processId);
      pstmt.setString(3, caseId);
      pstmt.setString(4, workflowWork.getUUID());
      rs = pstmt.executeQuery();

      rs.next();
      String dispBatchNo = rs.getString("vc_batchNo");

      ConnUtils.cleanupNoThrow(pstmt);
      pstmt = null;

      strSQL =
        "SELECT count(*) FROM "
          + caseDatabase.getSchemaContext().getTableName(SchemaContext.SCHEMA_PATH)
          + " "
          + "WHERE  vc_packageid=? "
          + "AND    vc_processid=? "
          + "AND    vc_caseid=?  "
          + "AND    vc_batchNo=? ";
      pstmt = conn.prepareStatement(strSQL);
      pstmt.setString(1, packageId);
      pstmt.setString(2, processId);
      pstmt.setString(3, caseId);
      pstmt.setString(4, dispBatchNo);
      rs = pstmt.executeQuery();

      rs.next();
      join_monitor_total = rs.getInt(1);

      ConnUtils.cleanupNoThrow(pstmt);
      pstmt = null;

      if (eventResult.first())
      {
        join_monitor_counter = 0;
      }
      else
      {
        //destination  instanceAndJoin activity all in-transitions
        //ONLY ==ONE== in-transition
        List inTrans = joinActivity.getIncomingTransitions();
        WorkflowTransition tempTrans = (WorkflowTransition) inTrans.get(0);

        strSQL =
          "SELECT count(*)  FROM "
            + caseDatabase.getSchemaContext().getTableName(SchemaContext.SCHEMA_PATH)
            + " "
            + "WHERE  vc_packageid=? "
            + "AND    vc_processid=? "
            + "AND    vc_caseid=?  "
            + "AND    vc_owner_processid=?  "
            + "AND    vc_transitionid=? "
            + "AND    vc_to=? ";
        pstmt = conn.prepareStatement(strSQL);
        pstmt.setString(1, packageId);
        pstmt.setString(2, processId);
        pstmt.setString(3, caseId);
        pstmt.setString(4, tempTrans.getWorkflowProcess().getUUID());
        pstmt.setString(5, tempTrans.getUUID());
        pstmt.setString(6, join_work_id);
        rs = pstmt.executeQuery();
        join_monitor_counter = rs.getInt(1);
      }

      if ((join_monitor_counter + 1) >= join_monitor_total)
      {
        eventResult.last(true);
      }

      if (eventResult.first())
      {
        join_work_id =
          caseDatabase.createWorkflowWork(
            workflowProcess,
            operator,
            userTransaction,
            workflowWork.getWorkflowCase(),
            joinActivity,
            null,
            workflowWork.getDispatchTime());
      }

      eventResult.setJoinWorkID(join_work_id);
    }
    catch (Exception ex)
    {
      eventResult.setException(ex);
    }
    finally
    {
      ConnUtils.cleanupNoThrow(pstmt);
    }

    return eventResult;
  }

  private static MonitorEventResult dispatch_instanceXorJoin(
    WorkflowService workflowService,
    WorkflowProcess workflowProcess,
    WorkflowParticipant operator,
    UserTransaction event_userTransaction,
    SpiCaseDatabase caseDatabase,
    UserTransaction userTransaction,
    WorkflowWork workflowWork,
    WorkflowTransition workflowTransition)
  {

    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();

    WorkflowActivity joinActivity = workflowTransition.getToWorkflowActivity();
    String join_owner_process_id = joinActivity.getWorkflowProcess().getUUID();
    String join_activity_id = joinActivity.getUUID();

    Connection conn = (Connection) userTransaction.getStoreConnection().get();
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    String strSQL = null;

    MonitorEventResult eventResult = new MonitorEventResult();

    try
    {
      int join_monitor_counter = 0;
      int join_monitor_total = 0;

      strSQL =
        "SELECT vc_batchNo FROM "
          + caseDatabase.getSchemaContext().getTableName(SchemaContext.SCHEMA_PATH)
          + " "
          + "WHERE  vc_packageid=? "
          + "AND    vc_processid=? "
          + "AND    vc_caseid=?  "
          + "AND    vc_to=? ";
      pstmt = conn.prepareStatement(strSQL);
      pstmt.setString(1, packageId);
      pstmt.setString(2, processId);
      pstmt.setString(3, caseId);
      pstmt.setString(4, workflowWork.getUUID());
      rs = pstmt.executeQuery();

      rs.next();
      String dispBatchNo = rs.getString("vc_batchNo");

      ConnUtils.cleanupNoThrow(pstmt);
      pstmt = null;

      strSQL =
        "SELECT vc_to FROM "
          + caseDatabase.getSchemaContext().getTableName(SchemaContext.SCHEMA_PATH)
          + " "
          + "WHERE  vc_packageid=? "
          + "AND    vc_processid=? "
          + "AND    vc_caseid=?  "
          + "AND    vc_batchNo=? ";
      pstmt = conn.prepareStatement(strSQL);
      pstmt.setString(1, packageId);
      pstmt.setString(2, processId);
      pstmt.setString(3, caseId);
      pstmt.setString(4, dispBatchNo);
      rs = pstmt.executeQuery();

      Vector vector_work_id = new Vector();
      while (rs.next())
      {
        vector_work_id.addElement(rs.getString("vc_to"));
      }
      ConnUtils.cleanupNoThrow(pstmt);
      pstmt = null;

      strSQL =
        "SELECT vc_to FROM "
          + caseDatabase.getSchemaContext().getTableName(SchemaContext.SCHEMA_PATH)
          + " "
          + "WHERE  vc_packageid=? "
          + "AND    vc_processid=? "
          + "AND    vc_caseid=?  "
          + "AND    vc_from=? ";
      pstmt = conn.prepareStatement(strSQL);
      int disp_work_total = vector_work_id.size();

      eventResult.first(true);
      eventResult.last(true);

      for (int i = 0; i < disp_work_total; ++i)
      {

        pstmt.setString(1, packageId);
        pstmt.setString(2, processId);
        pstmt.setString(3, caseId);
        pstmt.setString(4, (String) vector_work_id.elementAt(i));
        rs = pstmt.executeQuery();

        if (rs.next())
        {
          eventResult.first(false);
          eventResult.last(false);
          break;
        }

      }

      ConnUtils.cleanupNoThrow(pstmt);
      pstmt = null;

      String join_work_id = null;

      if (eventResult.first())
      {
        join_work_id =
          caseDatabase.createWorkflowWork(
            workflowProcess,
            operator,
            userTransaction,
            workflowWork.getWorkflowCase(),
            joinActivity,
            null,
            workflowWork.getDispatchTime());
      }

      eventResult.setJoinWorkID(join_work_id);
    }
    catch (Exception ex)
    {
      eventResult.setException(ex);
    }
    finally
    {
      ConnUtils.cleanupNoThrow(pstmt);
    }

    return eventResult;
  }

  private static MonitorEventResult dispatch_instanceOrJoin(
    WorkflowService workflowService,
    WorkflowProcess workflowProcess,
    WorkflowParticipant operator,
    UserTransaction event_userTransaction,
    SpiCaseDatabase caseDatabase,
    UserTransaction userTransaction,
    WorkflowWork workflowWork,
    WorkflowTransition workflowTransition)
  {
    return null;
  }

  private static MonitorEventResult dispatch_instanceWeightJoin(
    WorkflowService workflowService,
    WorkflowProcess workflowProcess,
    WorkflowParticipant operator,
    UserTransaction event_userTransaction,
    SpiCaseDatabase caseDatabase,
    UserTransaction userTransaction,
    WorkflowWork workflowWork,
    WorkflowTransition workflowTransition)
  {
    return null;
  }
}
TOP

Related Classes of org.huihoo.workflow.impl.monitor.EventMonitorThread

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.