/* * Copyright 2015 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jbpm.persistence.processinstance; import static org.jbpm.persistence.util.PersistenceUtil.*; import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.jbpm.persistence.util.LoggingPrintStream; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.kie.api.event.process.DefaultProcessEventListener; import org.kie.api.event.process.ProcessCompletedEvent; import org.kie.api.event.process.ProcessStartedEvent; import org.kie.api.io.ResourceType; import org.kie.api.runtime.Environment; import org.kie.internal.KnowledgeBase; import org.kie.internal.builder.KnowledgeBuilder; import org.kie.internal.builder.KnowledgeBuilderFactory; import org.kie.internal.io.ResourceFactory; import org.kie.internal.persistence.infinispan.InfinispanKnowledgeService; import org.kie.internal.runtime.StatefulKnowledgeSession; public class ParameterMappingTest { private HashMap<String, Object> context; private static final String PROCESS_ID = "org.jbpm.processinstance.subprocess"; private static final String SUBPROCESS_ID = "org.jbpm.processinstance.helloworld"; private StatefulKnowledgeSession ksession; private ProcessListener listener; // Want to see the System.out output? Set the debug level for console in log4j.xml to DEBUG. static { System.setOut(new LoggingPrintStream(System.out)); } @Before public void before() { context = setupWithPoolingDataSource(JBPM_PERSISTENCE_UNIT_NAME, false); Environment env = createEnvironment(context); ksession = InfinispanKnowledgeService.newStatefulKnowledgeSession(createKnowledgeBase(), null, env); assertTrue("Valid KnowledgeSession could not be created.", ksession != null && ksession.getIdentifier() > 0); listener = new ProcessListener(); ksession.addEventListener(listener); } private KnowledgeBase createKnowledgeBase() { KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add(ResourceFactory.newClassPathResource("processinstance/Subprocess.rf"), ResourceType.DRF); kbuilder.add(ResourceFactory.newClassPathResource("processinstance/HelloWorld.rf"), ResourceType.DRF); return kbuilder.newKnowledgeBase(); } @After public void after() { if (ksession != null) { ksession.dispose(); } cleanUp(context); } //org.jbpm.processinstance.subprocess @Test public void testChangingVariableByScript() throws Exception { Map<String, Object> mapping = new HashMap<String, Object>(); mapping.put("type", "script"); mapping.put("var", "value"); ksession.startProcess(PROCESS_ID, mapping); assertTrue(listener.isProcessStarted(PROCESS_ID)); assertTrue(listener.isProcessStarted(SUBPROCESS_ID)); assertTrue(listener.isProcessCompleted(SUBPROCESS_ID)); assertTrue(listener.isProcessCompleted(PROCESS_ID)); } @Test public void testChangingVariableByEvent() throws Exception { Map<String, Object> mapping = new HashMap<String, Object>(); mapping.put("type", "event"); mapping.put("var", "value"); ksession.startProcess(PROCESS_ID, mapping).getId(); ksession.signalEvent("pass", "new value"); assertTrue(listener.isProcessStarted(PROCESS_ID)); assertTrue(listener.isProcessStarted(SUBPROCESS_ID)); assertTrue(listener.isProcessCompleted(SUBPROCESS_ID)); assertTrue(listener.isProcessCompleted(PROCESS_ID)); } @Test public void testChangingVariableByEventSignalWithProcessId() throws Exception { Map<String, Object> mapping = new HashMap<String, Object>(); mapping.put("type", "event"); mapping.put("var", "value"); long processId = ksession.startProcess(PROCESS_ID, mapping).getId(); ksession.signalEvent("pass", "new value", processId); assertTrue(listener.isProcessStarted(PROCESS_ID)); assertTrue(listener.isProcessStarted(SUBPROCESS_ID)); assertTrue(listener.isProcessCompleted(SUBPROCESS_ID)); assertTrue(listener.isProcessCompleted(PROCESS_ID)); } @Test public void testNotChangingVariable() throws Exception { Map<String, Object> mapping = new HashMap<String, Object>(); mapping.put("type", "default"); mapping.put("var", "value"); ksession.startProcess(PROCESS_ID, mapping); assertTrue(listener.isProcessStarted(PROCESS_ID)); assertTrue(listener.isProcessStarted(SUBPROCESS_ID)); assertTrue(listener.isProcessCompleted(SUBPROCESS_ID)); assertTrue(listener.isProcessCompleted(PROCESS_ID)); } @Test public void testNotSettingVariable() throws Exception { Map<String, Object> mapping = new HashMap<String, Object>(); mapping.put("type", "default"); ksession.startProcess(PROCESS_ID, mapping); assertTrue(listener.isProcessStarted(PROCESS_ID)); assertTrue(listener.isProcessStarted(SUBPROCESS_ID)); assertTrue(listener.isProcessCompleted(SUBPROCESS_ID)); assertTrue(listener.isProcessCompleted(PROCESS_ID)); } public static class ProcessListener extends DefaultProcessEventListener { private final List<String> processesStarted = new ArrayList<String>(); private final List<String> processesCompleted = new ArrayList<String>(); public void afterProcessStarted(ProcessStartedEvent event) { processesStarted.add(event.getProcessInstance().getProcessId()); } public void afterProcessCompleted(ProcessCompletedEvent event) { processesCompleted.add(event.getProcessInstance().getProcessId()); } public boolean isProcessStarted(String processId) { return processesStarted.contains(processId); } public boolean isProcessCompleted(String processId) { return processesCompleted.contains(processId); } } }