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

org.ow2.bonita.util.TransientData Maven / Gradle / Ivy

/**
 * Copyright (C) 2010-2012 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.util;

import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.ow2.bonita.facade.def.InternalActivityDefinition;
import org.ow2.bonita.facade.exception.VariableNotFoundException;
import org.ow2.bonita.facade.runtime.ActivityState;
import org.ow2.bonita.facade.runtime.impl.InternalActivityInstance;
import org.ow2.bonita.facade.uuid.ActivityInstanceUUID;

/**
 * @author Elias Ricken de Medeiros
 * 
 */
public final class TransientData {

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

  private static Map> transientData;

  private TransientData() {
  }

  private static Map> getTransientData() {
    if (transientData == null) {
      transientData = new HashMap>();
    }
    return transientData;
  }

  public static void addTransientVariable(final ActivityInstanceUUID activityInstanceUUID, final String variableName,
      final Object variableValue) {
    Misc.checkArgsNotNull(activityInstanceUUID, variableName);
    final Map> data = getTransientData();
    if (!data.containsKey(activityInstanceUUID)) {
      data.put(activityInstanceUUID, new HashMap());
    }
    data.get(activityInstanceUUID).put(variableName, variableValue);
  }

  public static void addTransientVariables(final ActivityInstanceUUID activityInstanceUUID,
      final Map variables) {
    Misc.checkArgsNotNull(activityInstanceUUID);
    if (variables != null) {
      final Map> data = getTransientData();
      if (!data.containsKey(activityInstanceUUID)) {
        data.put(activityInstanceUUID, new HashMap());
      }
      data.get(activityInstanceUUID).putAll(variables);
    }
  }

  public static void removeTransientData(final ActivityInstanceUUID activityInstanceUUID) {
    Misc.checkArgsNotNull(activityInstanceUUID);
    getTransientData().remove(activityInstanceUUID);
  }

  public static Map getActivityTransientVariables(final ActivityInstanceUUID activityInstanceUUID) {
    Misc.checkArgsNotNull(activityInstanceUUID);
    ensureTransientVariablesCreated(activityInstanceUUID);
    Map variables = getTransientData().get(activityInstanceUUID);
    // to avoid original map by doing getActivityTransientVariables(uuid).add, remove
    if (variables != null) {
      variables = new HashMap(variables);
    } else {
      variables = new HashMap();
    }
    return variables;
  }

  public static Object getActivityTransientVariableValue(final ActivityInstanceUUID activityInstanceUUID,
      final String variableName) throws VariableNotFoundException {
    Misc.checkArgsNotNull(activityInstanceUUID, variableName);
    ensureTransientVariablesCreated(activityInstanceUUID);
    final Map variables = getActivityTransientVariables(activityInstanceUUID);
    if (variables == null || !variables.containsKey(variableName)) {
      throw new VariableNotFoundException("bai_QRAPII_12", activityInstanceUUID, variableName);
    }

    return variables.get(variableName);
  }

  public static void updateActivityTransientVariableValue(final ActivityInstanceUUID activityInstanceUUID,
      final String variableName, final Object value) throws VariableNotFoundException {
    Misc.checkArgsNotNull(activityInstanceUUID, variableName);
    ensureTransientVariablesCreated(activityInstanceUUID);
    final Map variables = getTransientData().get(activityInstanceUUID);
    if (variables == null || !variables.containsKey(variableName)) {
      throw new VariableNotFoundException("bai_QRAPII_12", activityInstanceUUID, variableName);
    }
    variables.put(variableName, value);
  }

  private static void ensureTransientVariablesCreated(final ActivityInstanceUUID activityInstanceUUID) {
    final Map> data = getTransientData();
    if (!data.containsKey(activityInstanceUUID)) {
      restoreTransientVariablesIfNecessary(activityInstanceUUID);
    }
  }

  private static void restoreTransientVariablesIfNecessary(final ActivityInstanceUUID activityInstanceUUID) {
    final InternalActivityInstance activityInstance = EnvTool.getJournalQueriers().getActivityInstance(
        activityInstanceUUID);
    if (activityInstance != null && needRestore(activityInstance.getState())) {
      final InternalActivityDefinition activityDefinition = EnvTool.getJournalQueriers().getActivity(
          activityInstance.getActivityDefinitionUUID());
      final Map transientVariables = VariableUtil.createTransientVariables(
          activityDefinition.getDataFields(), activityInstance.getProcessInstanceUUID());
      if (transientVariables != null && !transientVariables.isEmpty()) {
        addTransientVariables(activityInstanceUUID, transientVariables);
        if (LOG.isLoggable(Level.WARNING)) {
          final StringBuilder stb = new StringBuilder("Restoring transient varaibles for activity ");
          stb.append(activityInstanceUUID);
          stb.append(": the system probably was stopped during the variable life cycle. All transient variables for this activity will be restored to their default value.");
          LOG.warning(stb.toString());
        }
      }
    }
  }

  private static boolean needRestore(final ActivityState state) {
    return ActivityState.EXECUTING.equals(state) || ActivityState.READY.equals(state)
        || ActivityState.SUSPENDED.equals(state);
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy