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

org.jbpm.job.Timer Maven / Gradle / Ivy

The newest version!
package org.jbpm.job;

import java.util.Date;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jbpm.JbpmContext;
import org.jbpm.calendar.BusinessCalendar;
import org.jbpm.calendar.Duration;
import org.jbpm.graph.def.Action;
import org.jbpm.graph.def.Event;
import org.jbpm.graph.def.GraphElement;
import org.jbpm.graph.def.Node;
import org.jbpm.graph.def.Transition;
import org.jbpm.graph.exe.ExecutionContext;
import org.jbpm.graph.exe.Token;
import org.jbpm.taskmgmt.exe.TaskInstance;

public class Timer extends Job {

  private static final long serialVersionUID = 1L;

  private String name;
  private String repeat;
  private String transitionName;
  private Action action;
  private GraphElement graphElement;
  private String calendarResource;

  public Timer() {
  }

  public Timer(Token token) {
    super(token);
  }

  public boolean execute(JbpmContext jbpmContext) throws Exception {
    Token token = getToken();
    ExecutionContext executionContext = new ExecutionContext(token);
    executionContext.setTimer(this);

    TaskInstance taskInstance = getTaskInstance();
    if (taskInstance != null) {
      executionContext.setTaskInstance(taskInstance);
    }

    // first fire the event if there is a graph element specified
    if (graphElement != null) {
      graphElement.fireEvent(Event.EVENTTYPE_TIMER, executionContext);
    }

    // then execute the action if there is one
    if (action != null) {
      if (graphElement != null) {
        graphElement.executeAction(action, executionContext);
      }
      else {
        action.execute(executionContext);
      }
    }

    // then take a transition if one is specified
    // and if no unhandled exception occurred during the action
    String exception = getException();
    if (transitionName != null && exception == null) {
      Node node = token.getNode();
      Transition transition = node.getLeavingTransition(transitionName);
      if (transition != null) {
        token.signal(transition);
      }
      else {
        log.warn(node + " has no leaving transition named " + transitionName);
      }
    }

    // if repeat is specified, reschedule the job
    if (repeat != null) {
      // if a calendar resource is specified, use it to calculate repeat dates
      // https://jira.jboss.org/browse/JBPM-2958
      BusinessCalendar businessCalendar = calendarResource == null ? new BusinessCalendar()
        : new BusinessCalendar(calendarResource);

      Date repeatDate = businessCalendar.add(getDueDate(), new Duration(repeat));
      if (log.isDebugEnabled()) {
        log.debug("scheduling " + this + " for repeat on " + repeatDate);
      }
      setDueDate(repeatDate);

      // unlock timer so that:
      // (a) any job executor thread can acquire it the next time
      // (b) the engine knows it is not executing and can be canceled
      // https://jira.jboss.org/jira/browse/JBPM-2036
      setLockOwner(null);

      return false;
    }

    return true;
  }

  public String toString() {
    StringBuffer text = new StringBuffer("Timer(");

    // name or id
    if (name != null) {
      text.append(name);
    }
    else {
      text.append(getId());
    }

    return text.append(')').toString();
  }

  public String getRepeat() {
    return repeat;
  }

  public void setRepeat(String repeat) {
    this.repeat = repeat;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getTransitionName() {
    return transitionName;
  }

  public void setTransitionName(String transitionName) {
    this.transitionName = transitionName;
  }

  public GraphElement getGraphElement() {
    return graphElement;
  }

  public void setGraphElement(GraphElement graphElement) {
    this.graphElement = graphElement;
  }

  public Action getAction() {
    return action;
  }

  public void setAction(Action action) {
    this.action = action;
  }

  /**
   * Gets the business calendar resource used for calculating repeat dates.
   */
  public String getCalendarResource() {
    return calendarResource;
  }

  /**
   * Sets the business calendar resource to use for calculating repeat dates.
   */
  public void setCalendarResource(String calendarResource) {
    this.calendarResource = calendarResource;
  }

  private static final Log log = LogFactory.getLog(Timer.class);
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy