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

org.ow2.bonita.runtime.ActivityManager Maven / Gradle / Ivy

The newest version!
/**
 * Copyright (C) 2011  BonitaSoft S.A.
 * BonitaSoft, 31 rue Gustave Eiffel - 38000 Grenoble
 * 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.runtime;

import java.util.HashSet;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.ow2.bonita.definition.activity.AbstractActivity;
import org.ow2.bonita.facade.APIAccessor;
import org.ow2.bonita.facade.def.InternalActivityDefinition;
import org.ow2.bonita.facade.exception.ActivityNotFoundException;
import org.ow2.bonita.facade.exception.IllegalTaskStateException;
import org.ow2.bonita.facade.impl.StandardAPIAccessorImpl;
import org.ow2.bonita.facade.runtime.ActivityInstance;
import org.ow2.bonita.facade.runtime.ActivityState;
import org.ow2.bonita.facade.runtime.impl.InternalActivityInstance;
import org.ow2.bonita.facade.uuid.ActivityInstanceUUID;
import org.ow2.bonita.runtime.model.Execution;
import org.ow2.bonita.services.Recorder;
import org.ow2.bonita.util.EnvTool;
import org.ow2.bonita.util.ExceptionManager;
import org.ow2.bonita.util.Misc;
import org.ow2.bonita.util.TransientData;

/**
 * @author Elias Ricken de Medeiros
 *
 */
public class ActivityManager {
  
  private static final Logger LOG = Logger.getLogger(ActivityManager.class.getName());
  
  protected static ActivityInstance getActivity(final ActivityInstanceUUID activityUUID) throws ActivityNotFoundException {
    final InternalActivityInstance activityInstance = EnvTool.getJournalQueriers().getActivityInstance(activityUUID);
    if (activityInstance == null) {
      throw new ActivityNotFoundException("bai_RAPII_19", activityUUID);
    }
    return activityInstance;
  }
  
  protected static Execution getExecution(final ActivityInstance activityInstance) throws ActivityNotFoundException {
    return EnvTool.getJournalQueriers().getExecutionOnActivity(activityInstance.getProcessInstanceUUID(), activityInstance.getUUID());
  }
  
  
  
  public static void skip(final ActivityInstanceUUID activityInstanceUUID, Map variablesToUpdate) throws ActivityNotFoundException, IllegalTaskStateException {
    final ActivityInstance activityInstance = getActivity(activityInstanceUUID);
    final Execution internalExecution = getExecution(activityInstance);
    skip(internalExecution, activityInstance, variablesToUpdate);
  }
  
  protected static void skip(final Execution internalExecution, final ActivityInstance activityInstance, Map variablesToUpdate) throws IllegalTaskStateException {
    if (LOG.isLoggable(Level.FINE)) {
      LOG.fine("Checking compatible state of " + activityInstance);
    }
    final ActivityInstanceUUID activityInstanceUUID = activityInstance.getUUID();
    final ActivityState state = activityInstance.getState();
    if (!state.equals(ActivityState.READY) && !state.equals(ActivityState.FAILED)) {
      final Set expectedStates = new HashSet();
      expectedStates.add(ActivityState.READY);
      expectedStates.add(ActivityState.FAILED);
      
      String message = ExceptionManager.getInstance().getFullMessage("bai_RAPII_13");
      throw new IllegalTaskStateException("bai_RAPII_13", message,
          activityInstanceUUID, expectedStates, state);
    }
    if (variablesToUpdate != null && !variablesToUpdate.isEmpty()) {
      try {
        for (Entry entry : variablesToUpdate.entrySet()) {
          APIAccessor accessor = new StandardAPIAccessorImpl();
          accessor.getRuntimeAPI().setVariable(activityInstanceUUID, entry.getKey(), entry.getValue());
        }
      } catch (Exception e) {
        if (LOG.isLoggable(Level.SEVERE)) {
          LOG.severe("Error while setting the variable on skip task : "
              + activityInstance.getActivityName() + ". Exception: "
              + Misc.getStackTraceFrom(e));
        }
      }
    }

    final String currentUserId = EnvTool.getUserId();
    String activityName = activityInstance.getActivityName();
    if (LOG.isLoggable(Level.FINE)) {
      LOG.fine("Skiping activity : " + activityInstanceUUID + " on activity " + activityName);
    }

    final Recorder recorder = EnvTool.getRecorder();
    recorder.recordActivitySkipped(activityInstance, currentUserId);
    TransientData.removeTransientData(activityInstanceUUID);

    Set activities = EnvTool.getJournalQueriers().getActivityInstances(activityInstance.getProcessInstanceUUID(), activityName);
    // in case of a multi-instantiation
    if (activities.size() > 1) {
      for (InternalActivityInstance currentActivity : activities) {         
        if ((ActivityState.READY.equals(currentActivity.getState()) || ActivityState.FAILED.equals(currentActivity.getState()))
            && !activityInstanceUUID.equals(currentActivity.getUUID())) {
          recorder.recordActivitySkipped(currentActivity, currentUserId);
          TransientData.removeTransientData(activityInstanceUUID);
        }
      }       
    }
    
    InternalActivityDefinition activityDef = internalExecution.getNode();       
    AbstractActivity abstractActivity = (AbstractActivity) activityDef.getBehaviour();
    
    if (!ActivityState.ABORTED.equals(internalExecution.getActivityInstance().getState())) {
      abstractActivity.signal(internalExecution, AbstractActivity.BODY_SKIPPED, null);
      if (LOG.isLoggable(Level.FINE)) {
        LOG.fine("Skipped: " + activityInstance);
      }
    }
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy