/*
* Copyright 2014 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.
* You may obtain a copy of the License at
*
* 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.kie.services.test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;
import static org.kie.scanner.MavenRepository.getMavenRepository;
import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.drools.compiler.kie.builder.impl.InternalKieModule;
import org.drools.core.command.runtime.process.GetProcessInstanceCommand;
import org.jbpm.kie.services.impl.KModuleDeploymentUnit;
import org.jbpm.kie.test.util.AbstractKieServicesBaseTest;
import org.jbpm.services.api.ProcessInstanceNotFoundException;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.kie.api.KieServices;
import org.kie.api.builder.ReleaseId;
import org.kie.api.runtime.process.ProcessInstance;
import org.kie.api.runtime.process.WorkItem;
import org.kie.internal.KieInternalServices;
import org.kie.internal.process.CorrelationKey;
import org.kie.internal.runtime.conf.RuntimeStrategy;
import org.kie.internal.runtime.manager.context.ProcessInstanceIdContext;
import org.kie.scanner.MavenRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ProcessServiceImplPerProcessInstanceTest extends AbstractKieServicesBaseTest {
private static final Logger logger = LoggerFactory.getLogger(KModuleDeploymentServiceTest.class);
private static KModuleDeploymentUnit deploymentUnit;
private static final String PROCESS_ID_HUMAN_TASK = "org.jbpm.writedocument";
private static final String PROCESS_ID_SIGNAL = "org.jbpm.signal";
@BeforeClass
public static void prepareDeploymentUnit() {
deploymentUnit = new KModuleDeploymentUnit(GROUP_ID, ARTIFACT_ID, VERSION);
deploymentUnit.setStrategy(RuntimeStrategy.PER_PROCESS_INSTANCE);
}
@Before
public void prepare() {
configureServices();
logger.debug("Preparing kjar");
KieServices ks = KieServices.Factory.get();
ReleaseId releaseId = ks.newReleaseId(GROUP_ID, ARTIFACT_ID, VERSION);
List<String> processes = new ArrayList<String>();
processes.add("repo/processes/general/customtask.bpmn");
processes.add("repo/processes/general/humanTask.bpmn");
processes.add("repo/processes/general/import.bpmn");
processes.add("repo/processes/general/signal.bpmn");
InternalKieModule kJar1 = createKieJar(ks, releaseId, processes);
File pom = new File("target/kmodule", "pom.xml");
pom.getParentFile().mkdir();
try {
FileOutputStream fs = new FileOutputStream(pom);
fs.write(getPom(releaseId).getBytes());
fs.close();
} catch (Exception e) {
}
MavenRepository repository = getMavenRepository();
repository.deployArtifact(releaseId, kJar1, pom);
deploymentService.deploy(deploymentUnit);
}
@After
public void cleanup() {
cleanupSingletonSessionId();
try {
deploymentService.undeploy(deploymentUnit);
} catch (Exception e) {
// do nothing in case of some failed tests to avoid next test to fail as well
}
close();
}
@Test
public void testAbortAlreadyAbortedProcess() {
long processInstanceId = processService.startProcess(deploymentUnit.getIdentifier(), PROCESS_ID_HUMAN_TASK);
assertNotNull(processInstanceId);
processService.abortProcessInstance(processInstanceId);
try {
processService.abortProcessInstance(processInstanceId);
fail("Aborting of already aborted process instance should throw ProcessInstanceNotFoundException.");
} catch(ProcessInstanceNotFoundException e) {
// expected
}
}
@Test
public void testSignalProcessInstanceAbortedProcess() {
long processInstanceId = processService.startProcess(deploymentUnit.getIdentifier(), PROCESS_ID_SIGNAL);
assertNotNull(processInstanceId);
processService.abortProcessInstance(processInstanceId);
try {
processService.signalProcessInstance(processInstanceId, "MySignal", null);
fail("Signalling of already aborted process instance should throw ProcessInstanceNotFoundException.");
} catch(ProcessInstanceNotFoundException e) {
// expected
}
}
@Test
public void testGetProcessInstanceAbortedProcess() {
long processInstanceId = processService.startProcess(deploymentUnit.getIdentifier(), PROCESS_ID_SIGNAL);
assertNotNull(processInstanceId);
processService.abortProcessInstance(processInstanceId);
try {
processService.getProcessInstance(processInstanceId);
fail("Getting of already aborted process instance should throw ProcessInstanceNotFoundException.");
} catch(ProcessInstanceNotFoundException e) {
// expected
}
}
@Test
public void testGetProcessInstanceWithCorrelationKeyAbortedProcess() {
CorrelationKey key = KieInternalServices.Factory.get().newCorrelationKeyFactory().newCorrelationKey("my business key");
long processInstanceId = processService.startProcess(deploymentUnit.getIdentifier(), PROCESS_ID_SIGNAL, key);
assertNotNull(processInstanceId);
processService.abortProcessInstance(processInstanceId);
ProcessInstance processInstance = processService.getProcessInstance(key);
assertNull(processInstance);
}
@Test
public void testSetProcessVariableAbortedProcess() {
long processInstanceId = processService.startProcess(deploymentUnit.getIdentifier(), PROCESS_ID_HUMAN_TASK);
assertNotNull(processInstanceId);
processService.abortProcessInstance(processInstanceId);
try {
processService.setProcessVariable(processInstanceId, "approval_reviewComment", "updated review comment");
fail("Setting process variable of already aborted process instance should throw ProcessInstanceNotFoundException.");
} catch(ProcessInstanceNotFoundException e) {
// expected
}
}
@Test
public void testSetProcessVariablesAbortedProcess() {
long processInstanceId = processService.startProcess(deploymentUnit.getIdentifier(), PROCESS_ID_HUMAN_TASK);
assertNotNull(processInstanceId);
processService.abortProcessInstance(processInstanceId);
try {
// and lastly let's update both variables
Map<String, Object> params = new HashMap<String, Object>();
params.put("approval_document", "updated document");
params.put("approval_reviewComment", "final review");
processService.setProcessVariables(processInstanceId, params);
fail("Setting process variables of already aborted process instance should throw ProcessInstanceNotFoundException.");
} catch(ProcessInstanceNotFoundException e) {
// expected
}
}
@Test
public void testGetProcessInstanceVariableAbortedProcess() {
long processInstanceId = processService.startProcess(deploymentUnit.getIdentifier(), PROCESS_ID_HUMAN_TASK);
assertNotNull(processInstanceId);
processService.abortProcessInstance(processInstanceId);
try {
processService.getProcessInstanceVariable(processInstanceId, "approval_document");
fail("Getting process variable of already aborted process instance should throw ProcessInstanceNotFoundException.");
} catch(ProcessInstanceNotFoundException e) {
// expected
}
}
@Test
public void testGetProcessInstanceVariablesAbortedProcess() {
long processInstanceId = processService.startProcess(deploymentUnit.getIdentifier(), PROCESS_ID_HUMAN_TASK);
assertNotNull(processInstanceId);
processService.abortProcessInstance(processInstanceId);
try {
processService.getProcessInstanceVariables(processInstanceId);
fail("Getting process variables of already aborted process instance should throw ProcessInstanceNotFoundException.");
} catch(ProcessInstanceNotFoundException e) {
// expected
}
}
@Test
public void testGetAvailableSignalsAbortedProcess() {
long processInstanceId = processService.startProcess(deploymentUnit.getIdentifier(), PROCESS_ID_SIGNAL);
assertNotNull(processInstanceId);
processService.abortProcessInstance(processInstanceId);
try {
processService.getAvailableSignals(processInstanceId);
fail("Getting available signals of already aborted process instance should throw ProcessInstanceNotFoundException.");
} catch(ProcessInstanceNotFoundException e) {
// expected
}
}
@Test
public void testGetWorkItemByProcessInstanceAbortedProcess() {
long processInstanceId = processService.startProcess(deploymentUnit.getIdentifier(), PROCESS_ID_HUMAN_TASK);
assertNotNull(processInstanceId);
processService.abortProcessInstance(processInstanceId);
try {
processService.getWorkItemByProcessInstance(processInstanceId);
fail("Getting work items of already aborted process instance should throw ProcessInstanceNotFoundException.");
} catch(ProcessInstanceNotFoundException e) {
// expected
}
}
@Test
public void testCompleteWorkItemAbortedProcess() {
long processInstanceId = processService.startProcess(deploymentUnit.getIdentifier(), PROCESS_ID_HUMAN_TASK);
assertNotNull(processInstanceId);
List<WorkItem> workItems = processService.getWorkItemByProcessInstance(processInstanceId);
assertEquals(1, workItems.size());
processService.abortProcessInstance(processInstanceId);
try {
processService.completeWorkItem(workItems.get(0).getId(), null);
fail("Completing work item of already aborted process instance should throw ProcessInstanceNotFoundException.");
} catch(ProcessInstanceNotFoundException e) {
// expected
}
}
@Test
public void testAbortWorkItemAbortedProcess() {
long processInstanceId = processService.startProcess(deploymentUnit.getIdentifier(), PROCESS_ID_HUMAN_TASK);
assertNotNull(processInstanceId);
List<WorkItem> workItems = processService.getWorkItemByProcessInstance(processInstanceId);
assertEquals(1, workItems.size());
processService.abortProcessInstance(processInstanceId);
try {
processService.abortWorkItem(workItems.get(0).getId());
fail("Aborting work item of already aborted process instance should throw ProcessInstanceNotFoundException.");
} catch(ProcessInstanceNotFoundException e) {
// expected
}
}
@Test
public void testGetWorkItemAbortedProcess() {
long processInstanceId = processService.startProcess(deploymentUnit.getIdentifier(), PROCESS_ID_HUMAN_TASK);
assertNotNull(processInstanceId);
List<WorkItem> workItems = processService.getWorkItemByProcessInstance(processInstanceId);
assertEquals(1, workItems.size());
processService.abortProcessInstance(processInstanceId);
try {
processService.getWorkItem(workItems.get(0).getId());
fail("Getting work item of already aborted process instance should throw ProcessInstanceNotFoundException.");
} catch(ProcessInstanceNotFoundException e) {
// expected
}
}
@Test
public void testExecuteCommandOnAbortedProcess() {
long processInstanceId = processService.startProcess(deploymentUnit.getIdentifier(), PROCESS_ID_HUMAN_TASK);
assertNotNull(processInstanceId);
processService.abortProcessInstance(processInstanceId);
try {
processService.execute(deploymentUnit.getIdentifier(), new GetProcessInstanceCommand(processInstanceId));
fail("Executing command on already aborted process instance should throw ProcessInstanceNotFoundException.");
} catch(ProcessInstanceNotFoundException e) {
// expected
}
}
@Test
public void testExecuteCommandWithContextOnAbortedProcess() {
long processInstanceId = processService.startProcess(deploymentUnit.getIdentifier(), PROCESS_ID_HUMAN_TASK);
assertNotNull(processInstanceId);
processService.abortProcessInstance(processInstanceId);
try {
processService.execute(deploymentUnit.getIdentifier(), ProcessInstanceIdContext.get(processInstanceId), new GetProcessInstanceCommand(processInstanceId));
fail("Executing command with context on already aborted process instance should throw ProcessInstanceNotFoundException.");
} catch(ProcessInstanceNotFoundException e) {
// expected
}
}
}