All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.ow2.bonita.definition.activity.HookExecutorImpl Maven / Gradle / Ivy

/**
 * Copyright (C) 2006  Bull S. A. S.
 * Bull, Rue Jean Jaures, B.P.68, 78340, Les Clayes-sous-Bois
 * This library is free software; you can redistribute it and/or modify it under the terms
 * of the GNU Lesser General Public License as published by the Free Software Foundation
 * version 2.1 of the License.
 * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Lesser General Public License for more details.
 * You should have received a copy of the GNU Lesser General Public License along with this
 * program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
 * Floor, Boston, MA  02110-1301, USA.
 **/
package org.ow2.bonita.definition.activity;

import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.ow2.bonita.definition.Hook;
import org.ow2.bonita.definition.JavaHook;
import org.ow2.bonita.definition.MultiInstantiator;
import org.ow2.bonita.definition.MultiInstantiatorDescriptor;
import org.ow2.bonita.definition.PerformerAssign;
import org.ow2.bonita.definition.RoleMapper;
import org.ow2.bonita.definition.TxHook;
import org.ow2.bonita.facade.exception.BonitaWrapperException;
import org.ow2.bonita.facade.exception.HookInvocationException;
import org.ow2.bonita.facade.runtime.ActivityBody;
import org.ow2.bonita.facade.runtime.ActivityInstance;
import org.ow2.bonita.facade.uuid.ActivityInstanceUUID;
import org.ow2.bonita.facade.uuid.ProcessDefinitionUUID;
import org.ow2.bonita.facade.uuid.ProcessInstanceUUID;
import org.ow2.bonita.runtime.ClassDataLoader;
import org.ow2.bonita.runtime.XpdlExecution;
import org.ow2.bonita.runtime.XpdlInstance;
import org.ow2.bonita.util.AccessorUtil;
import org.ow2.bonita.util.BonitaRuntimeException;
import org.ow2.bonita.util.EngineEnvTool;
import org.ow2.bonita.util.Misc;


public class HookExecutorImpl implements HookExecutor {

  private static final Logger LOG = Logger.getLogger(HookExecutorImpl.class.getName());

  public HookExecutorImpl() { }

  /* (non-Javadoc)
   * @see org.ow2.bonita.definition.activity.HookExecutor#
   * executeHook(org.ow2.bonita.runtime.XpdlExecution, java.lang.String, org.ow2.bonita.definition.JavaHook)
   */
  public void executeHook(final XpdlExecution execution, final String activityId, final JavaHook javaHook) {
    if (javaHook != null) {
      final XpdlInstance instance = execution.getXpdlInstance();
      final ProcessInstanceUUID instanceUUID = instance.getUUID();
      final ActivityInstanceUUID activityInstanceUUID = execution.getCurrentActivityInstanceUUID();
      final ProcessDefinitionUUID processUUID = instance.getProcessDefinitionUUID();
      final boolean inTransaction  = javaHook.isInTransaction();
      try {
        final Object hookInstance = ClassDataLoader.getInstance(Hook.class, instance.getPackageDefinitionUUID(), javaHook);
        if (!inTransaction && hookInstance instanceof TxHook) {
          throw new BonitaRuntimeException("The specified hook eventName declares an 'outside transaction hook' "
            + "but the given class implements " + TxHook.class.getName()  + " instead of " + Hook.class.getName());
        }
        if (LOG.isLoggable(Level.FINE)) {
          LOG.fine("Starting hook (instance=" + instanceUUID + ", process=" + processUUID
              + ", activityId=" + activityId + ") : " + javaHook);
        }
        final ActivityInstance activityInst =
          EngineEnvTool.getJournalQueriers().getActivityInstance(activityInstanceUUID);
        if (hookInstance instanceof Hook) {
          final Hook hook = (Hook) hookInstance;
          hook.execute(AccessorUtil.getQueryAPIAccessor(), activityInst);
        } else if (hookInstance instanceof TxHook) {
          final TxHook txHook = (TxHook) hookInstance;
          txHook.execute(AccessorUtil.getAPIAccessor(), activityInst);
        } else {
          throw new BonitaRuntimeException("Specified class is not a valid hook. It does not implement "
            + Hook.class.getName() + " neither " + TxHook.class.getName());
        }
        if (LOG.isLoggable(Level.FINE)) {
          LOG.fine("Finished hook (instance=" + instanceUUID + ", process=" + processUUID
              + ", activityId=" + activityId + ") : " + javaHook);
        }
      } catch (final Exception e) {
        if (inTransaction) {
          throw new BonitaWrapperException(
              new HookInvocationException(javaHook.toString(), e)
          );
        } else if (LOG.isLoggable(Level.SEVERE)) {
          LOG.severe("Exception caught while executing hook (instance=" + instanceUUID + ", process=" + processUUID
              + ", activityId=" + activityId + ") : " + javaHook + " - Exception : " + Misc.getStackTraceFrom(e));
        }
      }
    }
  }

  /* (non-Javadoc)
   * @see org.ow2.bonita.definition.activity.HookExecutor#
   * executeMultiInstantiator(org.ow2.bonita.runtime.XpdlExecution, java.lang.String, org.ow2.bonita.definition.MultiInstantiator)
   */
  public MultiInstantiatorDescriptor executeMultiInstantiator(
      final XpdlExecution execution,
      final String activityId,
      final MultiInstantiator actInstantiator) throws Exception {
    return actInstantiator.execute(
        AccessorUtil.getQueryAPIAccessor(),
        execution.getXpdlInstance().getUUID(), activityId, execution.getIterationId());
  }

  /* (non-Javadoc)
   * @see org.ow2.bonita.definition.activity.HookExecutor#
   * executePerformerAssign(org.ow2.bonita.definition.PerformerAssign,
   * org.ow2.bonita.facade.runtime.ActivityInstance, java.util.Set)
   */
  public String executePerformerAssign(
      final PerformerAssign performerAssign,
      final ActivityInstance activityInstance,
      final Set candidates) throws Exception {
    return performerAssign.selectUser(AccessorUtil.getQueryAPIAccessor(), activityInstance, candidates);
  }

  /* (non-Javadoc)
   * @see org.ow2.bonita.definition.activity.HookExecutor#
   * executeRoleMapper(org.ow2.bonita.definition.RoleMapper, org.ow2.bonita.facade.uuid.ProcessInstanceUUID, java.lang.String)
   */
  public Set executeRoleMapper(final RoleMapper roleMapper,
      final ProcessInstanceUUID instanceUUID,
      final String roleId) throws Exception {
    return roleMapper.searchMembers(AccessorUtil.getQueryAPIAccessor(), instanceUUID, roleId);
  }
  /* (non-Javadoc)
   * @see org.ow2.bonita.definition.activity.HookExecutor#
   * executeHooks(java.util.List, org.ow2.bonita.runtime.XpdlExecution, java.lang.String, org.ow2.bonita.definition.JavaHook.Type)
   */
  public void executeHooks(final List javaHooks,
      final XpdlExecution execution, final String activityId, final JavaHook.Type type) {
    if (javaHooks != null) {
      for (final JavaHook javaHook : javaHooks) {
        if (javaHook.getType().equals(type)) {
          executeHook(execution, activityId, javaHook);
        }
      }
    }
  }
}






© 2015 - 2025 Weber Informatics LLC | Privacy Policy