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

org.ow2.bonita.services.impl.DbThreadEventService 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.services.impl;

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

import org.ow2.bonita.facade.uuid.ActivityDefinitionUUID;
import org.ow2.bonita.facade.uuid.ActivityInstanceUUID;
import org.ow2.bonita.facade.uuid.ProcessInstanceUUID;
import org.ow2.bonita.persistence.EventDbSession;
import org.ow2.bonita.runtime.event.EventAdded;
import org.ow2.bonita.runtime.event.EventConstants;
import org.ow2.bonita.runtime.event.EventCouple;
import org.ow2.bonita.runtime.event.EventInstance;
import org.ow2.bonita.runtime.event.IncomingEventInstance;
import org.ow2.bonita.runtime.event.Job;
import org.ow2.bonita.runtime.event.OutgoingEventInstance;
import org.ow2.bonita.runtime.model.Execution;
import org.ow2.bonita.services.EventService;
import org.ow2.bonita.util.EnvTool;

/**
 * 
 * @author Charles Souillard, Matthieu Chaffotte
 * 
 */
public class DbThreadEventService implements EventService {

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

  private String persistenceServiceName;

  protected DbThreadEventService() {
  }

  public DbThreadEventService(final String persistenceServiceName) {
    super();
    this.persistenceServiceName = persistenceServiceName;
  }

  protected EventDbSession getDbSession() {
    return EnvTool.getEventServiceDbSession(persistenceServiceName);
  }

  private void refreshMatchers() {
    EnvTool.getEventExecutor().refreshMatchers();
  }

  private void refreshExpressionMessageMatcher() {
    EnvTool.getEventExecutor().refreshExpressionMessageEventMatcher();
  }

  private void refreshMessageMatcher() {
    EnvTool.getEventExecutor().refreshEventMatcher();
  }

  @Override
  @SuppressWarnings("deprecation")
  public void enableEventsInFailureIncomingEvents(final ActivityInstanceUUID activityUUID) {
    final Execution execution = EnvTool.getJournal().getExecutionOnActivity(activityUUID.getProcessInstanceUUID(),
        activityUUID);
    final List jobs = getDbSession().getJobsOfExecution(execution.getEventUUID());
    final int retries = EnvTool.getEventExecutor().getRetries();
    for (final Job job : jobs) {
      if (job.getRetries() == 0) {
        job.setRetries(retries);
      }
    }
    refreshJobExecutor();
  }

  @Override
  public void enablePermanentEventsInFailure(final ActivityDefinitionUUID activityUUID) {
    final Job job = getDbSession().getJob(activityUUID);
    final int retries = EnvTool.getEventExecutor().getRetries();
    if (job.getRetries() == 0) {
      job.setRetries(retries);
    }
    refreshJobExecutor();
  }

  @Override
  public void fire(final OutgoingEventInstance outgoingEventInstance) {
    getDbSession().save(outgoingEventInstance);
    if (LOG.isLoggable(Level.FINE)) {
      LOG.fine("Firing event outgoing event: " + outgoingEventInstance + "...");
    }
    refreshMatchers();
  }

  @Override
  public void subscribe(final IncomingEventInstance incomingEventInstance) {
    final long originalEnableTime = incomingEventInstance.getEnableTime();
    incomingEventInstance.setEnableTime(Long.MAX_VALUE);
    getDbSession().save(incomingEventInstance);
    EnvTool.getTransaction().registerSynchronization(
        new EventAdded(getDbSession(), incomingEventInstance.getId(), originalEnableTime));
    if (LOG.isLoggable(Level.FINE)) {
      LOG.fine("Firing event incoming event: " + incomingEventInstance + "...");
    }
    if (incomingEventInstance.getExpression() != null) {
      refreshExpressionMessageMatcher();
    } else {
      refreshMessageMatcher();
    }
  }

  @Override
  public Set getIncomingEvents() {
    final Set incomings = getDbSession().getIncomingEvents();
    if (incomings == null) {
      return Collections.emptySet();
    }
    return incomings;
  }

  @Override
  public Set getOutgoingEvents() {
    final Set outgoings = getDbSession().getOutgoingEvents();
    if (outgoings == null) {
      return Collections.emptySet();
    }
    return outgoings;
  }

  @Override
  public Set getOutgoingEvents(final String eventName, final String toProcessName,
      final String toActivityName, final ActivityInstanceUUID activityUUID) {
    final Set outgoings = getDbSession().getOutgoingEvents(eventName, toProcessName,
        toActivityName, activityUUID);
    if (outgoings == null) {
      return Collections.emptySet();
    }
    return outgoings;
  }

  @Override
  public Set getIncomingEvents(final String eventName, final String toProcessName,
      final String toActivityName, final ActivityInstanceUUID activityUUID) {
    final Set incomings = getDbSession().getIncomingEvents(eventName, toProcessName,
        toActivityName, activityUUID);
    if (incomings == null) {
      return Collections.emptySet();
    }
    return incomings;
  }

  @Override
  public Set getOutgoingEvents(final ProcessInstanceUUID instanceUUID) {
    final Set outgoings = getDbSession().getOutgoingEvents(instanceUUID);
    if (outgoings == null) {
      return Collections.emptySet();
    }
    return outgoings;
  }

  @Override
  public Set getIncomingEvents(final ProcessInstanceUUID instanceUUID) {
    final Set incomings = getDbSession().getIncomingEvents(instanceUUID);
    if (incomings == null) {
      return Collections.emptySet();
    }
    return incomings;
  }

  public Set getIncomingEvents(final ActivityDefinitionUUID activityUUID) {
    final Set incomings = getDbSession().getIncomingEvents(activityUUID);
    if (incomings == null) {
      return Collections.emptySet();
    }
    return incomings;
  }

  @Override
  public Set getIncomingEvents(final ActivityInstanceUUID activityUUID) {
    final Set incomings = getDbSession().getIncomingEvents(activityUUID);
    if (incomings == null) {
      return Collections.emptySet();
    }
    return incomings;
  }

  @Override
  public Set getBoundaryIncomingEvents(final ActivityInstanceUUID activityUUID) {
    final Set incomings = getDbSession().getBoundaryIncomingEvents(activityUUID);
    if (incomings == null) {
      return Collections.emptySet();
    }
    return incomings;
  }

  @Override
  public Set getBoundaryOutgoingEvents(final ActivityInstanceUUID activityUUID) {
    final Set outgoings = getDbSession().getBoundaryOutgoingEvents(activityUUID);
    if (outgoings == null) {
      return Collections.emptySet();
    }
    return outgoings;
  }

  @Override
  public IncomingEventInstance getIncomingEvent(final long incomingId) {
    return getDbSession().getIncomingEvent(incomingId);
  }

  @Override
  public OutgoingEventInstance getOutgoingEvent(final long outgoingId) {
    return getDbSession().getOutgoingEvent(outgoingId);
  }

  @Override
  public IncomingEventInstance getIncomingEvent(final ProcessInstanceUUID instanceUUID, final String name) {
    return getDbSession().getIncomingEvent(instanceUUID, name);
  }

  public void removeFiredEvent(final OutgoingEventInstance outgoing) {
    getDbSession().deleteIncompatibleEvents(outgoing);
    getDbSession().delete(outgoing);
    if (LOG.isLoggable(Level.FINE)) {
      LOG.fine("Removing outgoing event: " + outgoing + "...");
    }
  }

  @Override
  public Set getOverdueEvents() {
    return getDbSession().getOverdueEvents();
  }

  @Override
  public Set getSignalIncomingEvents(final String signal) {
    return getDbSession().getSignalIncomingEvents(signal);
  }

  public void removeSubscription(final IncomingEventInstance incoming) {
    getDbSession().delete(incoming);
    if (LOG.isLoggable(Level.FINE)) {
      LOG.fine("Removing incoming event: " + incoming + "...");
    }
  }

  @Override
  public void removeSubscriptions(final ProcessInstanceUUID instanceUUID) {
    final Set events = getIncomingEvents(instanceUUID);
    if (events != null && !events.isEmpty()) {
      for (final IncomingEventInstance event : events) {
        removeSubscription(event);
      }
    }
  }

  @Override
  public void removeSubscriptions(final ActivityDefinitionUUID activityUUID) {
    final Set events = getIncomingEvents(activityUUID);
    if (events != null && !events.isEmpty()) {
      for (final IncomingEventInstance event : events) {
        removeSubscription(event);
      }
    }
  }

  @Override
  public void removeFiredEvents(final ProcessInstanceUUID instanceUUID) {
    final Set events = getOutgoingEvents(instanceUUID);
    if (events != null && !events.isEmpty()) {
      for (final OutgoingEventInstance event : events) {
        removeFiredEvent(event);
      }
    }
  }

  @Override
  public void removeEvent(final EventInstance event) {
    if (event instanceof OutgoingEventInstance) {
      removeFiredEvent((OutgoingEventInstance) event);
    } else {
      removeSubscription((IncomingEventInstance) event);
    }
  }

  @Override
  public IncomingEventInstance getSignalStartIncomingEvent(final List processNames, final String signalCode) {
    return getDbSession().getSignalStartIncomingEvent(processNames, signalCode);
  }

  @Override
  public List getMessageStartIncomingEvents(final Set processNames) {
    return getDbSession().getMessageStartIncomingEvents(processNames);
  }

  @Override
  public void storeJob(final Job job) {
    final int retries = EnvTool.getEventExecutor().getRetries();
    job.setRetries(retries);
    getDbSession().save(job);
    if (LOG.isLoggable(Level.INFO)) {
      LOG.info("New job: " + job + "...");
    }
    refreshJobExecutor();
  }

  private void refreshJobExecutor() {
    EnvTool.getEventExecutor().refreshJobExecutor();
  }

  @Override
  public Job getJob(final Long jobId) {
    return getDbSession().getJob(jobId);
  }

  @Override
  public void removeJob(final Job job) {
    getDbSession().delete(job);
  }

  @Override
  public void removeJob(final ActivityDefinitionUUID activityUUID) {
    final Job job = getDbSession().getJob(activityUUID);
    if (job != null) {
      getDbSession().delete(job);
    }
  }

  @Override
  public List getExecutableJobs(final List lockedRootInstances, final int maxResult) {
    return getDbSession().getExecutableJobs(lockedRootInstances, maxResult);
  }

  @Override
  public Long getNextJobDueDate() {
    return getDbSession().getNextJobDueDate();
  }

  @Override
  public List getMessageEventCouples() {
    return getDbSession().getMessageEventCouples();
  }

  @Override
  public List getJobs() {
    return getDbSession().getJobs();
  }

  @Override
  public void removeJobs(final String executionEventUUID) {
    final List jobs = getDbSession().getJobsOfExecution(executionEventUUID);
    for (final Job job : jobs) {
      getDbSession().delete(job);
    }
  }

  @Override
  public void removeJobs(final ProcessInstanceUUID instanceUUID) {
    final List jobs = getDbSession().getJobsOfInstance(instanceUUID);
    for (final Job job : jobs) {
      getDbSession().delete(job);
    }
  }

  @Override
  public List getTimerJobs() {
    return getDbSession().getJobs(EventConstants.TIMER);
  }

  @Override
  public List getTimerJobs(final ProcessInstanceUUID instanceUUID) {
    return getDbSession().getJobs(EventConstants.TIMER, instanceUUID);
  }

  @Override
  public List getTimerJobs(final String eventUUID) {
    return getDbSession().getJobs(EventConstants.TIMER, eventUUID);
  }

  @Override
  public List getCorrelationKeyMessageEventCouples() {
    return getDbSession().getCorrelationKeyMessageEventCouples();
  }

  @Override
  public Long getNextEventDueDate() {
    return getDbSession().getNextEventDueDate();
  }

  @Override
  public Long getNextExpressionEventDueDate() {
    return getDbSession().getNextExpressionEventDueDate();
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy