package org.jbpm.scheduler.ejbtimer; import java.util.Collection; import java.util.Iterator; import javax.ejb.FinderException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jbpm.JbpmContext; import org.jbpm.JbpmException; import org.jbpm.ejb.LocalTimerEntity; import org.jbpm.ejb.LocalTimerEntityHome; import org.jbpm.graph.exe.ProcessInstance; import org.jbpm.graph.exe.Token; import org.jbpm.job.Timer; import org.jbpm.scheduler.SchedulerService; public class EntitySchedulerService implements SchedulerService { private static final long serialVersionUID = 2L; private JbpmContext jbpmContext; private LocalTimerEntityHome timerEntityHome; public EntitySchedulerService(LocalTimerEntityHome timerEntityHome) { jbpmContext = JbpmContext.getCurrentJbpmContext(); if (jbpmContext == null) throw new JbpmException("no active jbpm context"); this.timerEntityHome = timerEntityHome; } public void createTimer(Timer timer) { if (log.isDebugEnabled()) log.debug("creating " + timer); jbpmContext.getJobSession().saveJob(timer); jbpmContext.getSession().flush(); try { LocalTimerEntity timerEntity = timerEntityHome.findByPrimaryKey(new Long(timer.getId())); timerEntity.createTimer(timer); } catch (FinderException e) { log.error("failed to retrieve entity for " + timer, e); } } public void deleteTimer(Timer timer) { if (log.isDebugEnabled()) log.debug("deleting " + timer); try { LocalTimerEntity timerEntity = timerEntityHome.findByPrimaryKey(new Long(timer.getId())); timerEntity.cancelTimer(timer); } catch (FinderException e) { log.error("failed to retrieve entity for " + timer, e); } jbpmContext.getJobSession().deleteJob(timer); } public void deleteTimersByName(String timerName, Token token) { try { Collection timerEntities = timerEntityHome.findByNameAndTokenId(timerName, new Long(token.getId())); if (log.isDebugEnabled()) { log.debug("found " + timerEntities.size() + " timer entities by name '" + timerName + "' for " + token); } for (Iterator i = timerEntities.iterator(); i.hasNext();) { LocalTimerEntity timerEntity = (LocalTimerEntity) i.next(); timerEntity.cancelTimersByName(timerName, token); } } catch (FinderException e) { log.error("failed to retrieve timer entities by name '" + timerName + "' for " + token, e); } jbpmContext.getJobSession().deleteTimersByName(timerName, token); } public void deleteTimersByProcessInstance(ProcessInstance processInstance) { try { Collection timerEntities = timerEntityHome.findByProcessInstanceId(new Long(processInstance.getId())); if (log.isDebugEnabled()) { log.debug("found " + timerEntities.size() + " timer entities for " + processInstance); } for (Iterator i = timerEntities.iterator(); i.hasNext();) { LocalTimerEntity timerEntity = (LocalTimerEntity) i.next(); timerEntity.cancelTimersForProcessInstance(processInstance); } } catch (FinderException e) { log.error("failed to retrieve timer entities for " + processInstance, e); } jbpmContext.getJobSession().deleteJobsForProcessInstance(processInstance); } public void close() { // nothing to do here } private static final Log log = LogFactory.getLog(EntitySchedulerService.class); }