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

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

//----------------------------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.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.huihoo.workflow.WorkflowException;
import org.huihoo.workflow.rules.ScriptException;
import org.huihoo.workflow.runtime.WorkflowCase;
import org.huihoo.workflow.runtime.WorkflowCaseContext;
import org.huihoo.workflow.runtime.WorkflowService;
import org.huihoo.workflow.runtime.WorkflowSubWork;
import org.huihoo.workflow.runtime.WorkflowWork;
import org.huihoo.workflow.store.UserDatabase;
import org.huihoo.workflow.store.persistent.UserTransaction;
import org.huihoo.workflow.store.spi.SpiCaseDatabase;
import org.huihoo.workflow.usermodel.WorkflowParticipant;
import org.huihoo.workflow.xpdl.WorkflowActivity;
import org.huihoo.workflow.xpdl.WorkflowPackage;
import org.huihoo.workflow.xpdl.WorkflowProcess;
import org.huihoo.workflow.xpdl.WorkflowTransition;
import org.huihoo.workflow.xpdl.activity.ActivityType;
import org.huihoo.workflow.xpdl.activity.PerformerType;
import org.huihoo.workflow.xpdl.activity.SubFlowImplementation;
import org.huihoo.workflow.xpdl.event.WorkflowActivityEvent;

public class DefaultActivityController
{
  private static Log log = LogFactory.getLog(DefaultActivityController.class);

  public static boolean dispatch_subflow(
    WorkflowService workflowService,
    WorkflowProcess workflowProcess,
    WorkflowParticipant operator,
    SpiCaseDatabase caseDatabase,
    UserTransaction userTransaction,
    WorkflowWork workflowWork,
    WorkflowTransition workflowTransition,
    String pathDispBatch)
    throws WorkflowException, ScriptException
  {

    log.debug(
      "[dispatch_subflow] workitem: " + workflowWork.getInfo() + " | transition: " + workflowTransition.getInfo());

    WorkflowCase workflowCase = workflowWork.getWorkflowCase();
    WorkflowPackage workflowPackage = workflowProcess.getWorkflowPackage();
    WorkflowActivity toActivity = workflowTransition.getToWorkflowActivity();

    //1) create org.huihoo.workflow work for subflow task node
    String parentDispWorkId = null;
    if (workflowWork instanceof WorkflowSubWork)
    {
      //performer is null
      WorkflowSubWork subWork = (WorkflowSubWork) workflowWork;
      parentDispWorkId =
        caseDatabase.createWorkflowSubWork(
          workflowProcess,
          operator,
          userTransaction,
          workflowCase,
          toActivity,
          subWork.getParentWorkflowWork(),
          null,
          subWork.getDispatchTime());
    }
    else
    {
      //performer is null
      parentDispWorkId =
        caseDatabase.createWorkflowWork(
          workflowProcess,
          operator,
          userTransaction,
          workflowCase,
          toActivity,
          null,
          workflowWork.getDispatchTime());
    }

    WorkflowWork parentDispWork =
      caseDatabase.findWorkflowWork(workflowProcess, operator, userTransaction, workflowCase, parentDispWorkId);
    caseDatabase.createWorkflowPath(
      workflowProcess,
      operator,
      userTransaction,
      workflowCase,
      workflowWork,
      parentDispWork,
      pathDispBatch,
      WorkflowActivityEvent.WORK_DISPATCH);

    //only accept ,not dispatch
    DispatchController.accept_core(
      workflowService,
      workflowProcess,
      operator,
      caseDatabase,
      userTransaction,
      parentDispWork);

    //2) create org.huihoo.workflow work for subflow process first task node
    SubFlowImplementation impl = (SubFlowImplementation) toActivity.getImplementation();
    String suPprocessId = impl.getProcessID();
    WorkflowProcess subProcess = workflowPackage.findWorkflowProcess(suPprocessId);
    WorkflowTransition firstTransition =
      (WorkflowTransition) subProcess.getBeginActivity().getOutgoingTransitions().get(0);
    WorkflowActivity firstActivity = firstTransition.getToWorkflowActivity();
    String childDispWorkId =
      caseDatabase.createWorkflowSubWork(
        workflowProcess,
        operator,
        userTransaction,
        workflowCase,
        firstActivity,
        parentDispWork,
        null,
        workflowWork.getDispatchTime());
    WorkflowWork childDispWork =
      caseDatabase.findWorkflowWork(workflowProcess, operator, userTransaction, workflowCase, childDispWorkId);
    caseDatabase.createWorkflowWorkEvent(
      workflowProcess,
      userTransaction,
      parentDispWork,
      operator,
      workflowWork.getDispatchTime(),
      WorkflowActivityEvent.WORK_ENTER_SUBFLOW,
      childDispWorkId);

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

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

    WorkflowCase workflowCase = workflowWork.getWorkflowCase();
    WorkflowSubWork subWork = (WorkflowSubWork) workflowWork;
    WorkflowWork parentWork = subWork.getParentWorkflowWork();

    caseDatabase.createWorkflowWorkEvent(
      workflowProcess,
      userTransaction,
      workflowWork,
      operator,
      workflowWork.getDispatchTime(),
      WorkflowActivityEvent.WORK_LEAVE_SUBFLOW,
      parentWork.getUUID());
    return DispatchController.dispatch_core(
      workflowService,
      workflowProcess,
      operator,
      caseDatabase,
      userTransaction,
      parentWork);
  }

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

    PerformerType performerType = workflowTransition.getToWorkflowActivity().getPerformerType();
    ActivityType activityType = workflowTransition.getToWorkflowActivity().getActivityType();

    if (PerformerType.PERFORMER_AUTOMATION.equals(performerType)
      || !ActivityType.ACTIVITY_BUSINESS.equals(activityType))
    {
      return dispatch_automation(
        workflowService,
        workflowProcess,
        operator,
        caseDatabase,
        userTransaction,
        workflowWork,
        workflowTransition,
        pathDispBatch);
    }
    else
    {
      return dispatch_manual(
        workflowService,
        workflowProcess,
        operator,
        caseDatabase,
        userTransaction,
        workflowWork,
        workflowTransition,
        pathDispBatch);
    }
  }

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

    WorkflowCase workflowCase = workflowWork.getWorkflowCase();
    WorkflowActivity toActivity = workflowTransition.getToWorkflowActivity();
    String autoDispWorkId = null;
    if (workflowWork instanceof WorkflowSubWork)
    {
      //performer is null
      WorkflowSubWork subWork = (WorkflowSubWork) workflowWork;
      autoDispWorkId =
        caseDatabase.createWorkflowSubWork(
          workflowProcess,
          operator,
          userTransaction,
          workflowCase,
          toActivity,
          subWork.getParentWorkflowWork(),
          null,
          subWork.getDispatchTime());
    }
    else
    {
      //performer is null
      autoDispWorkId =
        caseDatabase.createWorkflowWork(
          workflowProcess,
          operator,
          userTransaction,
          workflowCase,
          toActivity,
          null,
          workflowWork.getDispatchTime());
    }

    WorkflowWork autoDispWork =
      caseDatabase.findWorkflowWork(workflowProcess, operator, userTransaction, workflowCase, autoDispWorkId);

    caseDatabase.createWorkflowPath(
      workflowProcess,
      operator,
      userTransaction,
      workflowCase,
      workflowWork,
      autoDispWork,
      pathDispBatch,
      WorkflowActivityEvent.WORK_DISPATCH);

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

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

    WorkflowActivity workflowActivity = workflowTransition.getToWorkflowActivity();
    PerformerType performerType = workflowActivity.getPerformerType();
    WorkflowCase workflowCase = workflowWork.getWorkflowCase();
    WorkflowCaseContext caseContext = workflowCase.getCaseContext();

    UserDatabase userDatabase = workflowService.getUserDatabase();

    List users = caseContext.getPerformersByTransition(workflowTransition);

    if (users == null)
    {
      users = ParticipantSelector.select(workflowService, workflowProcess, workflowWork, workflowTransition);
    }

    log.debug("[dispatch_manual] postUsers: " + users);

    int sizePerformer = users.size();
    WorkflowParticipant performer = null;
    String dispWorkId = null;
    WorkflowWork dispWork = null;

    if (workflowWork instanceof WorkflowSubWork)
    {
      for (int i = 0; i < sizePerformer; ++i)
      {
        performer = (WorkflowParticipant) users.get(i);
        WorkflowSubWork subWork = (WorkflowSubWork) workflowWork;
        dispWorkId =
          caseDatabase.createWorkflowSubWork(
            workflowProcess,
            operator,
            userTransaction,
            workflowCase,
            workflowActivity,
            subWork.getParentWorkflowWork(),
            performer,
            subWork.getDispatchTime());

        dispWork = caseDatabase.findWorkflowWork(workflowProcess, operator, workflowCase, dispWorkId);
        caseDatabase.createWorkflowPath(
          workflowProcess,
          operator,
          userTransaction,
          workflowCase,
          workflowWork,
          dispWork,
          pathDispBatch,
          WorkflowActivityEvent.WORK_DISPATCH);
      }
    }
    else
    {
      for (int i = 0; i < sizePerformer; ++i)
      {
        performer = (WorkflowParticipant) users.get(i);
        dispWorkId =
          caseDatabase.createWorkflowWork(
            workflowProcess,
            operator,
            userTransaction,
            workflowCase,
            workflowActivity,
            performer,
            workflowWork.getDispatchTime());
        dispWork = caseDatabase.findWorkflowWork(workflowProcess, operator, workflowCase, dispWorkId);
        caseDatabase.createWorkflowPath(
          workflowProcess,
          operator,
          userTransaction,
          workflowCase,
          workflowWork,
          dispWork,
          pathDispBatch,
          WorkflowActivityEvent.WORK_DISPATCH);
      }
    }
    return true;
  }
}
TOP

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

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.