package is.idega.idegaweb.egov.bpm.scheduler; /* * JBoss, Home of Professional Open Source * Copyright 2005, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This 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; either version 2.1 of * the License, or (at your option) any later version. * * This software 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 software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ import is.idega.idegaweb.egov.bpm.cases.testbase.EgovBPMBaseTest; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import org.jbpm.JbpmConfiguration; import org.jbpm.JbpmContext; import org.jbpm.JbpmException; import org.jbpm.graph.def.ActionHandler; import org.jbpm.graph.def.ProcessDefinition; import org.jbpm.graph.exe.ExecutionContext; import org.jbpm.graph.exe.ProcessInstance; import org.jbpm.graph.exe.Token; import org.jbpm.job.Timer; import org.jbpm.scheduler.SchedulerService; import org.jbpm.scheduler.db.DbSchedulerServiceFactory; import org.jbpm.svc.Service; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.transaction.annotation.Transactional; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration @Transactional public class SchedulerTest extends EgovBPMBaseTest { public static class TestSchedulerServiceFactory extends DbSchedulerServiceFactory { private static final long serialVersionUID = 1L; @Override public Service openService() { return new TestSchedulerService(); } @Override public void close() { } } @SuppressWarnings("unchecked") public static class TestSchedulerService implements SchedulerService { List createdTimers = new ArrayList(); List cancelledTimersByName = new ArrayList(); List cancelledTimersByProcessInstance = new ArrayList(); private static final long serialVersionUID = 1L; public void createTimer(Timer timer) { createdTimers.add(timer); } public void deleteTimer(Timer timer) { cancelledTimersByName.add(new Object[]{timer.getName(), timer.getToken()}); } public void deleteTimersByName(String timerName, Token token) { cancelledTimersByName.add(new Object[]{timerName, token}); } public void deleteTimersByProcessInstance(ProcessInstance processInstance) { cancelledTimersByProcessInstance.add(processInstance); } public void close() { } } static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.parseXmlString( "<jbpm-configuration>" + " <jbpm-context>" + "<service name='persistence'>" + " <factory>" + " <bean class='org.jbpm.persistence.db.DbPersistenceServiceFactory'>" + " <field name='isCurrentSessionEnabled'><true /></field>" + " <field name='isTransactionEnabled'><false /></field>" + " </bean>" + " </factory>" + "</service>" + " <service name='scheduler' factory='is.idega.idegaweb.egov.bpm.scheduler.SchedulerTest$TestSchedulerServiceFactory' />" + " </jbpm-context>" + " <string name='resource.varmapping' value='com/idega/jbpm/jbpm.varmapping.xml' />" + " <bean name='jbpm.task.instance.factory' class='org.jbpm.taskmgmt.impl.DefaultTaskInstanceFactoryImpl' singleton='true' />" + "</jbpm-configuration>" ); @Test public void testTimerCreation() { ProcessDefinition processDefinition = ProcessDefinition.parseXmlString( "<process-definition>" + " <start-state>" + " <transition to='catch crooks' />" + " </start-state>" + " <state name='catch crooks'>" + " <timer name='reminder' " + " duedate='5 seconds' " + " transition='time-out-transition' >" + " <action class='the-remainder-action-class-name' />" + " </timer>" + " </state>" + "</process-definition>" ); JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); try { TestSchedulerService testSchedulerService = (TestSchedulerService) jbpmContext.getServices().getSchedulerService(); ProcessInstance processInstance = new ProcessInstance(processDefinition); processInstance.signal(); assertEquals(1, testSchedulerService.createdTimers.size()); Timer scheduledTimer = (Timer) testSchedulerService.createdTimers.get(0); assertEquals("reminder", scheduledTimer.getName()); assertEquals(processDefinition.getNode("catch crooks"), scheduledTimer.getGraphElement()); // System.out.println("due date: "+scheduledTimer.getDueDate()); assertNotNull(scheduledTimer.getDueDate()); assertEquals("the-remainder-action-class-name", scheduledTimer.getAction().getActionDelegation().getClassName()); assertSame(processInstance.getRootToken(), scheduledTimer.getToken()); assertEquals("time-out-transition", scheduledTimer.getTransitionName()); } finally { jbpmContext.close(); } } @Test public void testTimerCreationRepeat() { ProcessDefinition processDefinition = ProcessDefinition.parseXmlString( "<process-definition>" + " <start-state>" + " <transition to='catch crooks' />" + " </start-state>" + " <state name='catch crooks'>" + " <timer name='reminder' " + " duedate='3 business hours' " + " repeat='10 business minutes' >" + " <action class='the-remainder-action-class-name' />" + " </timer>" + " </state>" + "</process-definition>" ); JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); try { TestSchedulerService testSchedulerService = (TestSchedulerService) jbpmContext.getServices().getSchedulerService(); ProcessInstance processInstance = new ProcessInstance(processDefinition); processInstance.signal(); assertEquals(1, testSchedulerService.createdTimers.size()); Timer scheduledTimer = (Timer) testSchedulerService.createdTimers.get(0); assertEquals("reminder", scheduledTimer.getName()); assertEquals(processDefinition.getNode("catch crooks"), scheduledTimer.getGraphElement()); // System.out.println("due date: "+scheduledTimer.getDueDate()); assertNotNull(scheduledTimer.getDueDate()); assertEquals("10 business minutes", scheduledTimer.getRepeat()); assertEquals("the-remainder-action-class-name", scheduledTimer.getAction().getActionDelegation().getClassName()); assertSame(processInstance.getRootToken(), scheduledTimer.getToken()); } finally { jbpmContext.close(); } } @Test public void testCreateTimerAction() { ProcessDefinition processDefinition = ProcessDefinition.parseXmlString( "<process-definition>" + " <start-state>" + " <transition to='catch crooks' />" + " </start-state>" + " <state name='catch crooks'>" + " <event type='node-enter'>" + " <create-timer name='reminder' " + " duedate='3 business hours' " + " transition='time-out-transition' >" + " <action class='the-remainder-action-class-name' />" + " </create-timer>" + " </event>" + " <transition to='end'/>" + " </state>" + " <end-state name='end'/>" + "</process-definition>" ); JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); try { TestSchedulerService testSchedulerService = (TestSchedulerService) jbpmContext.getServices().getSchedulerService(); ProcessInstance processInstance = new ProcessInstance(processDefinition); processInstance.signal(); assertEquals(1, testSchedulerService.createdTimers.size()); Timer scheduledTimer = (Timer) testSchedulerService.createdTimers.get(0); assertEquals("reminder", scheduledTimer.getName()); assertEquals(processDefinition.getNode("catch crooks"), scheduledTimer.getGraphElement()); // System.out.println("due date: "+scheduledTimer.getDueDate()); assertNotNull(scheduledTimer.getDueDate()); assertEquals("the-remainder-action-class-name", scheduledTimer.getAction().getActionDelegation().getClassName()); assertSame(processInstance.getRootToken(), scheduledTimer.getToken()); assertEquals("time-out-transition", scheduledTimer.getTransitionName()); // while we are at it, i might as well check if the cancel timer is not executed ;) processInstance.signal(); assertEquals(0, testSchedulerService.cancelledTimersByName.size()); } finally { jbpmContext.close(); } } @Test public void testCreateTimerActionRepeat() { ProcessDefinition processDefinition = ProcessDefinition.parseXmlString( "<process-definition>" + " <start-state>" + " <transition to='catch crooks' />" + " </start-state>" + " <state name='catch crooks'>" + " <event type='node-enter'>" + " <create-timer name='reminder' " + " duedate='3 business hours' " + " repeat='10 business minutes'>" + " <action class='the-remainder-action-class-name' />" + " </create-timer>" + " </event>" + " <transition to='end'/>" + " </state>" + " <end-state name='end'/>" + "</process-definition>" ); JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); try { TestSchedulerService testSchedulerService = (TestSchedulerService) jbpmContext.getServices().getSchedulerService(); ProcessInstance processInstance = new ProcessInstance(processDefinition); processInstance.signal(); assertEquals(1, testSchedulerService.createdTimers.size()); Timer scheduledTimer = (Timer) testSchedulerService.createdTimers.get(0); assertEquals("reminder", scheduledTimer.getName()); assertEquals(processDefinition.getNode("catch crooks"), scheduledTimer.getGraphElement()); // System.out.println("due date: "+scheduledTimer.getDueDate()); assertNotNull(scheduledTimer.getDueDate()); assertEquals("10 business minutes", scheduledTimer.getRepeat()); assertEquals("the-remainder-action-class-name", scheduledTimer.getAction().getActionDelegation().getClassName()); assertSame(processInstance.getRootToken(), scheduledTimer.getToken()); // while we are at it, i might as well check if the cancel timer is not executed ;) processInstance.signal(); assertEquals(0, testSchedulerService.cancelledTimersByName.size()); } finally { jbpmContext.close(); } } @Test public void testTimerCancelAction() { ProcessDefinition processDefinition = ProcessDefinition.parseXmlString( "<process-definition>" + " <start-state>" + " <transition to='catch crooks' />" + " </start-state>" + " <state name='catch crooks'>" + " <timer name='reminder' " + " duedate='3 business hours' " + " repeat='10 business minutes'" + " transition='time-out-transition' >" + " <action class='the-remainder-action-class-name' />" + " </timer>" + " <transition to='end'/>" + " </state>" + " <end-state name='end'/>" + "</process-definition>" ); JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); try { TestSchedulerService testSchedulerService = (TestSchedulerService) jbpmContext.getServices().getSchedulerService(); ProcessInstance processInstance = new ProcessInstance(processDefinition); processInstance.signal(); processInstance.signal(); List cancelledTimerNames = testSchedulerService.cancelledTimersByName; assertEquals(1, cancelledTimerNames.size()); Object[] cancelledTimer = (Object[]) cancelledTimerNames.get(0); assertEquals("reminder", cancelledTimer[0]); assertSame(processInstance.getRootToken(), cancelledTimer[1]); } finally { jbpmContext.close(); } } public static class TimerCreateAction implements ActionHandler { private static final long serialVersionUID = 1L; static Timer timer = null; public void execute(ExecutionContext executionContext) throws Exception { timer = executionContext.getTimer(); } } @Test public void testTimerEvent() { ProcessDefinition processDefinition = ProcessDefinition.parseXmlString( "<process-definition>" + " <start-state>" + " <transition to='catch crooks' />" + " </start-state>" + " <state name='catch crooks'>" + " <event type='timer-create'>" + " <action class='is.idega.idegaweb.egov.bpm.scheduler.SchedulerTest$TimerCreateAction' />" + " </event>" + " <timer name='reminder' " + " duedate='2 seconds' >" + " <action class='the-timer-create-event-class-name' />" + " </timer>" + " <transition to='end'/>" + " </state>" + " <end-state name='end'/>" + "</process-definition>" ); JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); try { ProcessInstance processInstance = new ProcessInstance(processDefinition); assertNull(TimerCreateAction.timer); processInstance.signal(); assertNotNull(TimerCreateAction.timer); assertEquals("the-timer-create-event-class-name", TimerCreateAction.timer.getAction().getActionDelegation().getClassName()); } finally { jbpmContext.close(); } } @Test public void testUnavailableSchedulerService() { ProcessDefinition processDefinition = ProcessDefinition.parseXmlString( "<process-definition>" + " <start-state>" + " <transition to='catch crooks' />" + " </start-state>" + " <state name='catch crooks'>" + " <timer name='reminder' " + " duedate='2 seconds' >" + " <action class='the-timer-create-event-class-name' />" + " </timer>" + " </state>" + "</process-definition>" ); try { new ProcessInstance(processDefinition).signal(); fail("expected exception"); } catch (JbpmException e) { // OK } } @Test public void testTaskTimerExecution() { ProcessDefinition processDefinition = ProcessDefinition.parseXmlString( "<process-definition>" + " <start-state>" + " <transition to='timed task' />" + " </start-state>" + " <task-node name='timed task'>" + " <task name='find the hole in the market'>" + " <timer duedate='23 business seconds'>" + " <action class='geftem-eu-shuppe-oender-ze-konte'/>" + " </timer>" + " </task>" + " </task-node>" + "</process-definition>" ); JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); try { TestSchedulerService testSchedulerService = (TestSchedulerService) jbpmContext.getServices().getSchedulerService(); ProcessInstance processInstance = new ProcessInstance(processDefinition); processInstance.signal(); List scheduledTimers = testSchedulerService.createdTimers; assertEquals(1, scheduledTimers.size()); } finally { jbpmContext.close(); } } static boolean isCustomized = false; public static class TimerCustomizingAction implements ActionHandler { private static final long serialVersionUID = 1L; public void execute(ExecutionContext executionContext) throws Exception { assertNotNull(executionContext.getTimer()); assertEquals("reminder", executionContext.getTimer().getName()); isCustomized = true; } } @Test public void testTaskTimerActionExecution() { ProcessDefinition processDefinition = ProcessDefinition.parseXmlString( "<process-definition>" + " <start-state>" + " <transition to='timed task' />" + " </start-state>" + " <task-node name='timed task'>" + " <task name='find the hole in the market'>" + " <event type='timer-create'>" + " <action class='is.idega.idegaweb.egov.bpm.scheduler.SchedulerTest$TimerCustomizingAction' />" + " </event>" + " <timer name='reminder' duedate='23 business seconds'>" + " <action class='geftem-eu-shuppe-oender-ze-konte'/>" + " </timer>" + " </task>" + " </task-node>" + "</process-definition>" ); JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); try { ProcessInstance processInstance = new ProcessInstance(processDefinition); processInstance.signal(); assertTrue(isCustomized); } finally { jbpmContext.close(); } } @Test public void testTimerELCreation() { ProcessDefinition processDefinition = ProcessDefinition.parseXmlString( "<process-definition>" + " <start-state>" + " <transition to='get old' />" + " </start-state>" + " <state name='get old'>" + " <timer name='pension' " + " duedate='#{dateOfPension}' " + " transition='time-out-transition' >" + " <action class='the-remainder-action-class-name' />" + " </timer>" + " </state>" + "</process-definition>" ); JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); try { TestSchedulerService testSchedulerService = (TestSchedulerService) jbpmContext.getServices().getSchedulerService(); ProcessInstance processInstance = new ProcessInstance(processDefinition); Calendar dateOfPension = Calendar.getInstance(); dateOfPension.set(2036, 1, 12, 2, 10, 0); dateOfPension.clear(Calendar.MILLISECOND); processInstance.getContextInstance().setVariable("dateOfPension", dateOfPension.getTime()); processInstance.signal(); assertEquals(1, testSchedulerService.createdTimers.size()); Timer scheduledTimer = (Timer) testSchedulerService.createdTimers.get(0); assertEquals("pension", scheduledTimer.getName()); assertEquals(processDefinition.getNode("get old"), scheduledTimer.getGraphElement()); Calendar dateOfPensionTest = Calendar.getInstance(); dateOfPensionTest.clear(Calendar.MILLISECOND); dateOfPensionTest.set(2036, 1, 12, 2, 10, 0); assertEquals(dateOfPensionTest.getTime(), scheduledTimer.getDueDate()); assertNotNull(scheduledTimer.getDueDate()); assertEquals("the-remainder-action-class-name", scheduledTimer.getAction().getActionDelegation().getClassName()); assertSame(processInstance.getRootToken(), scheduledTimer.getToken()); assertEquals("time-out-transition", scheduledTimer.getTransitionName()); } finally { jbpmContext.close(); } } @Test public void testTimerELPlusCreation() { ProcessDefinition processDefinition = ProcessDefinition.parseXmlString( "<process-definition>" + " <start-state>" + " <transition to='get old' />" + " </start-state>" + " <state name='get old'>" + " <timer name='pension' " + " duedate='#{dateOfBirth} + 65 years' " + " transition='time-out-transition' >" + " <action class='the-remainder-action-class-name' />" + " </timer>" + " </state>" + "</process-definition>" ); JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); try { TestSchedulerService testSchedulerService = (TestSchedulerService) jbpmContext.getServices().getSchedulerService(); ProcessInstance processInstance = new ProcessInstance(processDefinition); Calendar dateOfBirth = Calendar.getInstance(); dateOfBirth.set(1971, 1, 12, 2, 10, 0); dateOfBirth.clear(Calendar.MILLISECOND); processInstance.getContextInstance().setVariable("dateOfBirth", dateOfBirth.getTime()); processInstance.signal(); assertEquals(1, testSchedulerService.createdTimers.size()); Timer scheduledTimer = (Timer) testSchedulerService.createdTimers.get(0); assertEquals("pension", scheduledTimer.getName()); assertEquals(processDefinition.getNode("get old"), scheduledTimer.getGraphElement()); assertNotNull(scheduledTimer.getDueDate()); Calendar dateOfPension = Calendar.getInstance(); dateOfPension.set(2036, 1, 12, 2, 10, 0); dateOfPension.clear(Calendar.MILLISECOND); assertEquals(dateOfPension.getTime(), scheduledTimer.getDueDate()); assertEquals("the-remainder-action-class-name", scheduledTimer.getAction().getActionDelegation().getClassName()); assertSame(processInstance.getRootToken(), scheduledTimer.getToken()); assertEquals("time-out-transition", scheduledTimer.getTransitionName()); } finally { jbpmContext.close(); } } @Test public void testTimerELMinusCreation() { ProcessDefinition processDefinition = ProcessDefinition.parseXmlString( "<process-definition>" + " <start-state>" + " <transition to='get old' />" + " </start-state>" + " <state name='get old'>" + " <timer name='pensionReminder' " + " duedate='#{dateOfPension} - 1 year' " + " transition='time-out-transition' >" + " <action class='the-remainder-action-class-name' />" + " </timer>" + " </state>" + "</process-definition>" ); JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); try { TestSchedulerService testSchedulerService = (TestSchedulerService) jbpmContext.getServices().getSchedulerService(); ProcessInstance processInstance = new ProcessInstance(processDefinition); Calendar dateOfPension = Calendar.getInstance(); dateOfPension.set(2036, 1, 12, 2, 10, 0); dateOfPension.clear(Calendar.MILLISECOND); processInstance.getContextInstance().setVariable("dateOfPension", dateOfPension.getTime()); processInstance.signal(); assertEquals(1, testSchedulerService.createdTimers.size()); Timer scheduledTimer = (Timer) testSchedulerService.createdTimers.get(0); assertEquals("pensionReminder", scheduledTimer.getName()); assertEquals(processDefinition.getNode("get old"), scheduledTimer.getGraphElement()); assertNotNull(scheduledTimer.getDueDate()); Calendar dateOfPensionReminder = Calendar.getInstance(); dateOfPensionReminder.set(2035, 1, 12, 2, 10, 0); dateOfPensionReminder.clear(Calendar.MILLISECOND); assertEquals(dateOfPensionReminder.getTime(), scheduledTimer.getDueDate()); assertEquals("the-remainder-action-class-name", scheduledTimer.getAction().getActionDelegation().getClassName()); assertSame(processInstance.getRootToken(), scheduledTimer.getToken()); assertEquals("time-out-transition", scheduledTimer.getTransitionName()); } finally { jbpmContext.close(); } } @Test public void testTimerELCalendarCreation() { ProcessDefinition processDefinition = ProcessDefinition.parseXmlString( "<process-definition>" + " <start-state>" + " <transition to='get old' />" + " </start-state>" + " <state name='get old'>" + " <timer name='pension' " + " duedate='#{dateOfPension}' " + " transition='time-out-transition' >" + " <action class='the-remainder-action-class-name' />" + " </timer>" + " </state>" + "</process-definition>" ); JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); try { TestSchedulerService testSchedulerService = (TestSchedulerService) jbpmContext.getServices().getSchedulerService(); ProcessInstance processInstance = new ProcessInstance(processDefinition); Calendar dateOfPension = Calendar.getInstance(); dateOfPension.set(2036, 1, 12, 2, 10, 0); dateOfPension.clear(Calendar.MILLISECOND); processInstance.getContextInstance().setVariable("dateOfPension", dateOfPension); processInstance.signal(); assertEquals(1, testSchedulerService.createdTimers.size()); Timer scheduledTimer = (Timer) testSchedulerService.createdTimers.get(0); assertEquals("pension", scheduledTimer.getName()); assertEquals(processDefinition.getNode("get old"), scheduledTimer.getGraphElement()); Calendar dateOfPensionTest = Calendar.getInstance(); dateOfPensionTest.clear(Calendar.MILLISECOND); dateOfPensionTest.set(2036, 1, 12, 2, 10, 0); assertEquals(dateOfPensionTest.getTime(), scheduledTimer.getDueDate()); assertNotNull(scheduledTimer.getDueDate()); assertEquals("the-remainder-action-class-name", scheduledTimer.getAction().getActionDelegation().getClassName()); assertSame(processInstance.getRootToken(), scheduledTimer.getToken()); assertEquals("time-out-transition", scheduledTimer.getTransitionName()); } finally { jbpmContext.close(); } } @Test public void testTimerELUnsupportedFormatCreation() { ProcessDefinition processDefinition = ProcessDefinition.parseXmlString( "<process-definition>" + " <start-state>" + " <transition to='get old' />" + " </start-state>" + " <state name='get old'>" + " <timer name='pension' " + " duedate='#{dateOfPension}' " + " transition='time-out-transition' >" + " <action class='the-remainder-action-class-name' />" + " </timer>" + " </state>" + "</process-definition>" ); JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); try { /*TestSchedulerService testSchedulerService = (TestSchedulerService)*/ jbpmContext.getServices().getSchedulerService(); ProcessInstance processInstance = new ProcessInstance(processDefinition); processInstance.getContextInstance().setVariable("dateOfPension", "Today"); try { processInstance.signal(); } catch (JbpmException je){ assertEquals("Invalid basedate type: #{dateOfPension} is of type java.lang.String. Only Date and Calendar are supported", je.getMessage()); } //TODO Shouldn't signalling the process while not able to create a timer result in a rolback? // processInstance.getContextInstance().setVariable("dateOfPension", "2036-02-12"); // // try { // processInstance.signal(); // } catch (JbpmException je){ // assertEquals("Invalid basedate type: #{dateOfPension} is of type java.lang.String. Only Date and Calendar are supported", je.getMessage()); // } } finally { jbpmContext.close(); } } @Test public void testTimerErrorCreation() { ProcessDefinition processDefinition = ProcessDefinition.parseXmlString( "<process-definition>" + " <start-state>" + " <transition to='get old' />" + " </start-state>" + " <state name='get old'>" + " <timer name='pension' " + " duedate='1 demo' " + " transition='time-out-transition' >" + " <action class='the-remainder-action-class-name' />" + " </timer>" + " </state>" + "</process-definition>" ); JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); try { /*TestSchedulerService testSchedulerService = (TestSchedulerService)*/ jbpmContext.getServices().getSchedulerService(); ProcessInstance processInstance = new ProcessInstance(processDefinition); try { processInstance.signal(); } catch (JbpmException je){ assertEquals("improper format of duration '1 demo'", je.getMessage()); } //TODO Shouldn't signalling the process while not able to create a timer result in a rolback? // try { // processInstance.signal(); // } catch (JbpmException je){ // assertEquals("Invalid basedate type: #{dateOfPension} is of type java.lang.String. Only Date and Calendar are supported", je.getMessage()); // } } finally { jbpmContext.close(); } } // @Test // public void testTimerTwiceExecuted() { // ProcessDefinition processDefinition = ProcessDefinition.parseXmlString( // "<process-definition>" + // " <start-state>" + // " <transition to='timed task' />" + // " </start-state>" + // " <task-node name='timed task'>" + // " <event type='timer-create'>" + // " <action class='is.idega.idegaweb.egov.bpm.scheduler.SchedulerTest$TimerCreateAction' />" + // " </event>" + // " <task name='find the hole in the market'>" + // " <timer name='reminder' duedate='4 seconds'>" + // " <transition to='end'/>" + // " </timer>" + // " </task>" + // " <transition to='timed task'/>" + // " </task-node>" + // " <end-state name='end'/>" + // "</process-definition>" // ); // // JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); // try { // TestSchedulerService testSchedulerService = (TestSchedulerService) jbpmContext.getServices().getSchedulerService(); // ProcessInstance processInstance = new ProcessInstance(processDefinition); // processInstance.signal(); // assertEquals(1, testSchedulerService.createdTimers.size()); // processInstance.signal(); // assertEquals(2, testSchedulerService.createdTimers.size()); // // List scheduledTimers = testSchedulerService.createdTimers; // assertEquals(2, scheduledTimers.size()); // // List cancelledTimerNames = testSchedulerService.cancelledTimersByName; // assertEquals(0, cancelledTimerNames.size()); // // List cancelledTimer = testSchedulerService.cancelledTimersByName; // assertEquals(0, cancelledTimerNames.size()); // // } finally { // jbpmContext.close(); // } // } }