/*
* Copyright 2016 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.kie.server.integrationtests.jbpm;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeFalse;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Assume;
import org.junit.BeforeClass;
import org.junit.Test;
import org.kie.api.KieServices;
import org.kie.server.api.KieServerConstants;
import org.kie.server.api.model.KieContainerResource;
import org.kie.server.api.model.ReleaseId;
import org.kie.server.api.model.ServiceResponse;
import org.kie.server.api.model.admin.ExecutionErrorInstance;
import org.kie.server.api.model.definition.ProcessDefinition;
import org.kie.server.api.model.definition.QueryDefinition;
import org.kie.server.api.model.definition.QueryFilterSpec;
import org.kie.server.api.model.instance.ProcessInstance;
import org.kie.server.api.model.instance.TaskInstance;
import org.kie.server.api.util.QueryFilterSpecBuilder;
import org.kie.server.client.KieServicesClient;
import org.kie.server.api.exception.KieServicesException;
import org.kie.server.client.QueryServicesClient;
import org.kie.server.integrationtests.config.TestConfig;
import org.kie.server.integrationtests.shared.KieServerDeployer;
import static org.junit.Assert.*;
import static org.junit.Assume.*;
public class QueryDataServiceIntegrationTest extends JbpmKieServerBaseIntegrationTest {
private static ReleaseId releaseId = new ReleaseId("org.kie.server.testing", "query-definition-project", "1.0.0.Final");
private static final String CONTAINER_ID = "query-definition-project";
private static final long EXTENDED_TIMEOUT = 300000;
@BeforeClass
public static void buildAndDeployArtifacts() {
KieServerDeployer.buildAndDeployCommonMavenParent();
KieServerDeployer.buildAndDeployMavenProject(ClassLoader.class.getResource("/kjars-sources/query-definition-project").getFile());
kieContainer = KieServices.Factory.get().newKieContainer(releaseId);
// Having timeout issues due to kjar dependencies -> raised timeout.
KieServicesClient client = createDefaultStaticClient(EXTENDED_TIMEOUT);
ServiceResponse<KieContainerResource> reply = client.createContainer(CONTAINER_ID, new KieContainerResource(CONTAINER_ID, releaseId));
Assume.assumeTrue(reply.getType().equals(ServiceResponse.ResponseType.SUCCESS));
}
@Override
protected void addExtraCustomClasses(Map<String, Class<?>> extraClasses) throws Exception {
extraClasses.put(PERSON_CLASS_NAME, Class.forName(PERSON_CLASS_NAME, true, kieContainer.getClassLoader()));
}
@Test
public void testQueryDefinitionsFromKjar() throws Exception {
String expectedResolvedDS = System.getProperty("org.kie.server.persistence.ds", "jdbc/jbpm-ds");
QueryDefinition registeredQuery = queryClient.getQuery("first-query");
assertNotNull(registeredQuery);
assertEquals("first-query", registeredQuery.getName());
assertEquals(expectedResolvedDS, registeredQuery.getSource());
assertEquals("select * from ProcessInstanceLog", registeredQuery.getExpression());
assertEquals("PROCESS", registeredQuery.getTarget());
registeredQuery = queryClient.getQuery("second-query");
assertNotNull(registeredQuery);
assertEquals("second-query", registeredQuery.getName());
assertEquals(expectedResolvedDS, registeredQuery.getSource());
assertEquals("select * from NodeInstanceLog", registeredQuery.getExpression());
assertEquals("CUSTOM", registeredQuery.getTarget());
}
@Test
public void testCRUDOnQueryDefinition() throws Exception {
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("stringData", "waiting for signal");
parameters.put("personData", createPersonInstance(USER_JOHN));
List<Long> processInstanceIds = createProcessInstances(parameters);
QueryDefinition query = createQueryDefinition("PROCESS");
try {
queryClient.registerQuery(query);
List<QueryDefinition> queries = queryClient.getQueries(0, 100);
QueryDefinition registeredQuery = queries.stream().filter(q -> q.getName().equals("allProcessInstances")).findFirst().orElse(null);
assertNotNull(registeredQuery);
assertEquals(query.getName(), registeredQuery.getName());
assertEquals(query.getSource(), registeredQuery.getSource());
assertEquals(query.getExpression(), registeredQuery.getExpression());
assertEquals(query.getTarget(), registeredQuery.getTarget());
registeredQuery = queryClient.getQuery(query.getName());
assertNotNull(registeredQuery);
assertEquals(query.getName(), registeredQuery.getName());
assertEquals(query.getSource(), registeredQuery.getSource());
assertEquals(query.getExpression(), registeredQuery.getExpression());
assertEquals(query.getTarget(), registeredQuery.getTarget());
} finally {
abortProcessInstances(processInstanceIds);
queryClient.unregisterQuery(query.getName());
}
}
@Test
public void testGetProcessInstancesWithQueryDataService() throws Exception {
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("stringData", "waiting for signal");
parameters.put("personData", createPersonInstance(USER_JOHN));
List<Long> processInstanceIds = createProcessInstances(parameters);
QueryDefinition query = createQueryDefinition("CUSTOM");
try {
queryClient.registerQuery(query);
List<ProcessInstance> instances = queryClient.query(query.getName(), QueryServicesClient.QUERY_MAP_PI, 0, 10, ProcessInstance.class);
assertNotNull(instances);
assertEquals(5, instances.size());
List<Long> found = collectInstances(instances);
assertEquals(processInstanceIds, found);
instances = queryClient.query(query.getName(), QueryServicesClient.QUERY_MAP_PI, 0, 3, ProcessInstance.class);
assertNotNull(instances);
assertEquals(3, instances.size());
instances = queryClient.query(query.getName(), QueryServicesClient.QUERY_MAP_PI, "status", 1, 3, ProcessInstance.class);
assertNotNull(instances);
assertEquals(2, instances.size());
} finally {
abortProcessInstances(processInstanceIds);
queryClient.unregisterQuery(query.getName());
}
}
@Test
public void testGetProcessInstancesWithVariablesQueryDataService() throws Exception {
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("stringData", "waiting for signal");
parameters.put("personData", createPersonInstance(USER_JOHN));
parameters.put("nullAccepted", true);
List<Long> processInstanceIds = createProcessInstances(parameters);
final QueryDefinition query = getProcessInstanceWithVariablesQueryDefinition();
try {
queryClient.registerQuery(query);
final List<ProcessInstance> instances = queryClient.query(query.getName(), QueryServicesClient.QUERY_MAP_PI_WITH_VARS, 0, 20, ProcessInstance.class);
assertNotNull(instances);
final List<Long> found = collectInstances(instances);
assertEquals(processInstanceIds, found);
for (ProcessInstance instance : instances) {
final Map<String, Object> variables = instance.getVariables();
assertNotNull(variables);
assertEquals(4, variables.size());
assertEquals(TestConfig.getUsername(), variables.get("initiator"));
assertEquals("waiting for signal", variables.get("stringData"));
assertEquals("Person{name='john'}", variables.get("personData"));
assertEquals("true", variables.get("nullAccepted"));
}
} finally {
abortProcessInstances(processInstanceIds);
queryClient.unregisterQuery(query.getName());
}
}
@Test
public void testGetProcessInstancesFilteredWithVariablesQueryDataService() throws Exception {
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("stringData", "waiting for signal");
parameters.put("personData", createPersonInstance(USER_JOHN));
List<Long> processInstanceIds = createProcessInstances(parameters);
final QueryDefinition query = getProcessInstanceWithVariablesQueryDefinition();
try {
queryClient.registerQuery(query);
QueryFilterSpec filterSpec = new QueryFilterSpecBuilder().greaterThan("processinstanceid", processInstanceIds.get(3)).get();
List<ProcessInstance> instances = queryClient.query(query.getName(), QueryServicesClient.QUERY_MAP_PI_WITH_VARS, filterSpec, 0, 10, ProcessInstance.class);
assertNotNull(instances);
assertEquals(1, instances.size());
for (ProcessInstance instance : instances) {
final Map<String, Object> variables = instance.getVariables();
assertNotNull(variables);
assertEquals(4, variables.size());
assertEquals(TestConfig.getUsername(), variables.get("initiator"));
assertEquals("waiting for signal", variables.get("stringData"));
assertEquals("Person{name='john'}", variables.get("personData"));
assertEquals("true", variables.get("nullAccepted"));
}
} finally {
abortProcessInstances(processInstanceIds);
queryClient.unregisterQuery(query.getName());
}
}
@Test
public void testGetProcessInstancesWithQueryDataServiceUsingCustomMapper() throws Exception {
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("stringData", "waiting for signal");
parameters.put("personData", createPersonInstance(USER_JOHN));
List<Long> processInstanceIds = createProcessInstances(parameters);
QueryDefinition query = createQueryDefinition("CUSTOM");
try {
queryClient.registerQuery(query);
List<ProcessInstance> instances = queryClient.query(query.getName(), "CustomMapper", 0, 10, ProcessInstance.class);
assertNotNull(instances);
assertEquals(5, instances.size());
List<Long> found = collectInstances(instances);
assertEquals(processInstanceIds, found);
instances = queryClient.query(query.getName(), "CustomMapper", 0, 3, ProcessInstance.class);
assertNotNull(instances);
assertEquals(3, instances.size());
instances = queryClient.query(query.getName(), "CustomMapper", "status", 1, 3, ProcessInstance.class);
assertNotNull(instances);
assertEquals(2, instances.size());
} finally {
abortProcessInstances(processInstanceIds);
queryClient.unregisterQuery(query.getName());
}
}
@Test
public void testGetProcessInstancesWithQueryDataServiceUsingCustomQueryBuilder() throws Exception {
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("stringData", "waiting for signal");
parameters.put("personData", createPersonInstance(USER_JOHN));
List<Long> processInstanceIds = createProcessInstances(parameters);
QueryDefinition query = createQueryDefinition("CUSTOM");
try {
queryClient.registerQuery(query);
Map<String, Object> params = new HashMap<String, Object>();
params.put("min", processInstanceIds.get(4));
params.put("max", processInstanceIds.get(0));
List<ProcessInstance> instances = queryClient.query(query.getName(), QueryServicesClient.QUERY_MAP_PI, "test", params, 0, 10, ProcessInstance.class);
assertNotNull(instances);
assertEquals(2, instances.size());
} finally {
abortProcessInstances(processInstanceIds);
queryClient.unregisterQuery(query.getName());
}
}
@Test
public void testGetProcessInstancesWithQueryDataServiceRawMapper() throws Exception {
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("stringData", "waiting for signal");
parameters.put("personData", createPersonInstance(USER_JOHN));
List<Long> processInstanceIds = createProcessInstances(parameters);
QueryDefinition query = createQueryDefinition("CUSTOM");
try {
queryClient.registerQuery(query);
List<List> instances = queryClient.query(query.getName(), QueryServicesClient.QUERY_MAP_RAW, 0, 10, List.class);
assertNotNull(instances);
assertEquals(5, instances.size());
for (List row : instances) {
assertEquals(16, row.size());
}
instances = queryClient.query(query.getName(), QueryServicesClient.QUERY_MAP_RAW, 0, 3, List.class);
assertNotNull(instances);
assertEquals(3, instances.size());
instances = queryClient.query(query.getName(), QueryServicesClient.QUERY_MAP_RAW, "status", 1, 3, List.class);
assertNotNull(instances);
assertEquals(2, instances.size());
} finally {
abortProcessInstances(processInstanceIds);
queryClient.unregisterQuery(query.getName());
}
}
@Test
public void testQueryDataServiceReplaceQuery() throws Exception {
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("stringData", "waiting for signal");
parameters.put("personData", createPersonInstance(CONTAINER_ID));
Long pid = processClient.startProcess(CONTAINER_ID, PROCESS_ID_USERTASK, parameters);
QueryDefinition query = new QueryDefinition();
query.setName("getTasksByState");
query.setSource(System.getProperty("org.kie.server.persistence.ds", "jdbc/jbpm-ds"));
query.setExpression("select * from AuditTaskImpl where status = 'Reserved'");
query.setTarget("CUSTOM");
try {
queryClient.registerQuery(query);
List<TaskInstance> tasks = queryClient.query(query.getName(), QueryServicesClient.QUERY_MAP_TASK, 0, 10, TaskInstance.class);
assertNotNull(tasks);
assertEquals(1, tasks.size());
Long taskId = tasks.get(0).getId();
query.setExpression("select * from AuditTaskImpl where status = 'InProgress'");
queryClient.replaceQuery(query);
tasks = queryClient.query(query.getName(), QueryServicesClient.QUERY_MAP_TASK, 0, 10, TaskInstance.class);
assertNotNull(tasks);
assertEquals(0, tasks.size());
taskClient.startTask(CONTAINER_ID, taskId, USER_YODA);
tasks = queryClient.query(query.getName(), QueryServicesClient.QUERY_MAP_TASK, 0, 10, TaskInstance.class);
assertNotNull(tasks);
assertEquals(1, tasks.size());
assertEquals(taskId, tasks.get(0).getId());
} finally {
processClient.abortProcessInstance(CONTAINER_ID, pid);
queryClient.unregisterQuery(query.getName());
}
}
@Test
public void testCRUDOnQueryDefinitionWithDSAsProperty() throws Exception {
String expectedResolvedDS = System.getProperty("org.kie.server.persistence.ds", "jdbc/jbpm-ds");
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("stringData", "waiting for signal");
parameters.put("personData", createPersonInstance("john"));
List<Long> processInstanceIds = createProcessInstances(parameters);
QueryDefinition query = new QueryDefinition();
query.setName("allProcessInstances");
query.setSource("${org.kie.server.persistence.ds}");
query.setExpression("select * from ProcessInstanceLog where status = 1");
query.setTarget("PROCESS");
try {
queryClient.registerQuery(query);
List<QueryDefinition> queries = queryClient.getQueries(0, 100);
QueryDefinition registeredQuery = queries.stream().filter(q -> q.getName().equals("allProcessInstances")).findFirst().orElse(null);
assertNotNull(registeredQuery);
assertEquals(query.getName(), registeredQuery.getName());
assertEquals(expectedResolvedDS, registeredQuery.getSource());
assertEquals(query.getExpression(), registeredQuery.getExpression());
assertEquals(query.getTarget(), registeredQuery.getTarget());
registeredQuery = queryClient.getQuery(query.getName());
assertNotNull(registeredQuery);
assertEquals(query.getName(), registeredQuery.getName());
assertEquals(expectedResolvedDS, registeredQuery.getSource());
assertEquals(query.getExpression(), registeredQuery.getExpression());
assertEquals(query.getTarget(), registeredQuery.getTarget());
} finally {
abortProcessInstances(processInstanceIds);
queryClient.unregisterQuery(query.getName());
}
}
@Test
public void testGetFilteredProcessInstancesWithQueryDataService() throws Exception {
// don't run the test on local server as it does not properly support authentication
assumeFalse(TestConfig.isLocalServer());
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("stringData", "waiting for signal");
parameters.put("personData", createPersonInstance("john"));
List<Long> processInstanceIds = createProcessInstances(parameters);
QueryDefinition query = new QueryDefinition();
query.setName("allProcessInstancesForUser");
query.setSource(System.getProperty("org.kie.server.persistence.ds", "jdbc/jbpm-ds"));
query.setExpression("select * from ProcessInstanceLog where status = 1");
query.setTarget("FILTERED_PROCESS");
try {
queryClient.registerQuery(query);
// default user (yoda) does not have engineering role so should not be able to find any instances
List<ProcessInstance> instances = queryClient.query(query.getName(), QueryServicesClient.QUERY_MAP_PI, 0, 10, ProcessInstance.class);
assertNotNull(instances);
assertEquals(0, instances.size());
// switch to john user who has engineering role
changeUser(USER_JOHN);
instances = queryClient.query(query.getName(), QueryServicesClient.QUERY_MAP_PI, 0, 10, ProcessInstance.class);
assertNotNull(instances);
assertEquals(5, instances.size());
} finally {
abortProcessInstances(processInstanceIds);
queryClient.unregisterQuery(query.getName());
changeUser(TestConfig.getUsername());
}
}
@Test
public void testGetProcessInstancesWithQueryDataServiceUsingCustomQueryBuilderAndFilterSpec() throws Exception {
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("stringData", "waiting for signal");
parameters.put("personData", createPersonInstance(USER_JOHN));
List<Long> processInstanceIds = createProcessInstances(parameters);
QueryDefinition query = createQueryDefinition("CUSTOM");
try {
queryClient.registerQuery(query);
Map<String, Object> params = new HashMap<String, Object>();
params.put("min", processInstanceIds.get(4));
params.put("max", processInstanceIds.get(0));
params.put(KieServerConstants.QUERY_ORDER_BY, "processInstanceId");
params.put(KieServerConstants.QUERY_ASCENDING, false);
List<ProcessInstance> instances = queryClient.query(query.getName(), QueryServicesClient.QUERY_MAP_PI, "test", params, 0, 10, ProcessInstance.class);
assertNotNull(instances);
assertEquals(2, instances.size());
long pi1 = instances.get(0).getId();
long pi2 = instances.get(1).getId();
// since sort order is descending first should be instance id which is bigger then second
assertTrue(pi1 > pi2);
} finally {
abortProcessInstances(processInstanceIds);
queryClient.unregisterQuery(query.getName());
}
}
@Test
public void testQueryDataServiceUsingCustomQueryBuilderFilterSpecWithOrderByClause() throws Exception {
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("stringData", "waiting for signal");
parameters.put("personData", createPersonInstance(USER_JOHN));
List<Long> processInstanceIds = createProcessInstances(parameters);
QueryDefinition query = createQueryDefinition("CUSTOM");
try {
queryClient.registerQuery(query);
Map<String, Object> params = new HashMap<String, Object>();
params.put("min", processInstanceIds.get(1));
params.put("max", processInstanceIds.get(0));
params.put(KieServerConstants.QUERY_ORDER_BY_CLAUSE, "processId asc , processInstanceId desc");
List<ProcessInstance> instances = queryClient.query(query.getName(), QueryServicesClient.QUERY_MAP_PI, "test", params, 0, 10, ProcessInstance.class);
assertNotNull(instances);
assertEquals(5, instances.size());
long pi1 = instances.get(0).getId();
long pi2 = instances.get(1).getId();
// since sort order is descending first should be instance id which is bigger then second
assertTrue(pi1 + " not greater than " + pi2, pi1 > pi2);
} finally {
abortProcessInstances(processInstanceIds);
queryClient.unregisterQuery(query.getName());
}
}
@Test
public void testGetProcessInstancesWithQueryDataServiceUsingCustomQueryBuilderAndColumnMapping() throws Exception {
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("stringData", "waiting for signal");
parameters.put("personData", createPersonInstance(USER_JOHN));
List<Long> processInstanceIds = createProcessInstances(parameters);
QueryDefinition query = getProcessInstanceWithVariablesQueryDefinition();
try {
queryClient.registerQuery(query);
Map<String, String> columnMapping = new HashMap<>();
columnMapping.put("variableId", "String");
columnMapping.put("value", "String");
Map<String, Object> params = new HashMap<String, Object>();
params.put("min", processInstanceIds.get(4));
params.put("max", processInstanceIds.get(0));
params.put(KieServerConstants.QUERY_ORDER_BY, "processInstanceId");
params.put(KieServerConstants.QUERY_ASCENDING, false);
params.put(KieServerConstants.QUERY_COLUMN_MAPPING, columnMapping);
List<ProcessInstance> instances = queryClient.query(query.getName(), QueryServicesClient.QUERY_MAP_PI_WITH_CUSTOM_VARS, "test", params, 0, 10, ProcessInstance.class);
assertNotNull(instances);
assertEquals(2, instances.size());
long pi1 = instances.get(0).getId();
long pi2 = instances.get(1).getId();
// since sort order is descending first should be instance id which is bigger then second
assertTrue(pi1 > pi2);
for (ProcessInstance instance : instances) {
final Map<String, Object> variables = instance.getVariables();
assertNotNull(variables);
assertEquals(2, variables.size());
assertTrue(variables.containsKey("variableId"));
assertTrue(variables.containsKey("value"));
}
} finally {
abortProcessInstances(processInstanceIds);
queryClient.unregisterQuery(query.getName());
}
}
/*
* JBPM-5468 Test case for using ORDER BY clause with query builder and columm mapper.
*/
@Test
public void testQueryDataServiceUsingCustomQueryBuilderColumnMappingWithOrderByClause() throws Exception {
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("stringData", "waiting for signal");
parameters.put("personData", createPersonInstance(USER_JOHN));
List<Long> processInstanceIds = createProcessInstances(parameters);
QueryDefinition query = getProcessInstanceWithVariablesQueryDefinition();
try {
queryClient.registerQuery(query);
Map<String, String> columnMapping = new HashMap<>();
columnMapping.put("variableId", "String");
columnMapping.put("value", "String");
Map<String, Object> params = new HashMap<String, Object>();
params.put("min", processInstanceIds.get(4));
params.put("max", processInstanceIds.get(0));
params.put(KieServerConstants.QUERY_ORDER_BY_CLAUSE, "processInstanceId desc");
params.put(KieServerConstants.QUERY_COLUMN_MAPPING, columnMapping);
List<ProcessInstance> instances = queryClient.query(query.getName(), QueryServicesClient.QUERY_MAP_PI_WITH_CUSTOM_VARS, "test", params, 0, 10, ProcessInstance.class);
assertNotNull(instances);
assertEquals(2, instances.size());
long pi1 = instances.get(0).getId();
long pi2 = instances.get(1).getId();
// since sort order is descending first should be instance id which is bigger then second
assertTrue(pi1 + " not greater than " + pi2, pi1 > pi2);
for (ProcessInstance instance : instances) {
final Map<String, Object> variables = instance.getVariables();
assertNotNull(variables);
assertEquals(2, variables.size());
assertTrue(variables.containsKey("variableId"));
assertTrue(variables.containsKey("value"));
}
} finally {
abortProcessInstances(processInstanceIds);
queryClient.unregisterQuery(query.getName());
}
}
/*
* JBPM-5468 Client requests with 'sortBy' request parameter can now use full ORDER BY clause syntax.
*/
@Test
public void testGetProcessInstancesWithOrderByClause() throws Exception {
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("stringData", "waiting for signal");
parameters.put("personData", createPersonInstance(USER_JOHN));
List<Long> processInstanceIds = createProcessInstances(parameters);
QueryDefinition query = createQueryDefinition("CUSTOM");
try {
queryClient.registerQuery(query);
List<ProcessInstance> instances = queryClient.query(query.getName(), QueryServicesClient.QUERY_MAP_PI, "processId asc, processInstanceId desc", 0, 10, ProcessInstance.class);
assertNotNull(instances);
assertEquals(5, instances.size());
List<Long> found = collectInstances(instances);
assertEquals(processInstanceIds, found);
long pi1 = instances.get(0).getId();
long pi2 = instances.get(1).getId();
// since sort order is descending first should be instance id which is bigger then second
assertTrue(pi1 + " not greater than " + pi2, pi1 > pi2);
} finally {
abortProcessInstances(processInstanceIds);
queryClient.unregisterQuery(query.getName());
}
}
@Test
public void testErrorHandlingFailedToSignal() throws Exception {
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("nullAccepted", false);
QueryDefinition query = createErrorsQueryDefinition();
Long processInstanceId = null;
try {
queryClient.registerQuery(query);
processInstanceId = processClient.startProcess(CONTAINER_ID, PROCESS_ID_SIGNAL_PROCESS, parameters);
List<ExecutionErrorInstance> errors = processAdminClient.getErrors(CONTAINER_ID, false, 0, 10);
assertNotNull(errors);
assertEquals(0, errors.size());
try {
processClient.signalProcessInstance(CONTAINER_ID, processInstanceId, "Signal1", null);
fail("Process instance signal should fail as it provides null as event");
} catch (KieServicesException e) {
// expected
}
errors = queryClient.query(query.getName(), QueryServicesClient.QUERY_MAP_ERROR, 0, 10, ExecutionErrorInstance.class);
assertNotNull(errors);
assertEquals(1, errors.size());
ExecutionErrorInstance errorInstance = errors.get(0);
assertNotNull(errorInstance.getErrorId());
assertNull(errorInstance.getError());
assertNotNull(errorInstance.getProcessInstanceId());
assertNotNull(errorInstance.getActivityId());
assertNotNull(errorInstance.getErrorDate());
assertEquals(CONTAINER_ID, errorInstance.getContainerId());
assertEquals(PROCESS_ID_SIGNAL_PROCESS, errorInstance.getProcessId());
assertEquals("Signal 1 data", errorInstance.getActivityName());
assertFalse(errorInstance.isAcknowledged());
assertNull(errorInstance.getAcknowledgedAt());
assertNull(errorInstance.getAcknowledgedBy());
errors = processAdminClient.getErrorsByProcessInstanceAndNode(CONTAINER_ID, processInstanceId, "Signal 1 data", false, 0, 10);
assertNotNull(errors);
assertEquals(1, errors.size());
ExecutionErrorInstance errorInstance2 = errors.get(0);
assertEquals(errorInstance.getErrorId(), errorInstance2.getErrorId());
processAdminClient.acknowledgeError(CONTAINER_ID, errorInstance.getErrorId());
errors = processAdminClient.getErrors(CONTAINER_ID, false, 0, 10);
assertNotNull(errors);
assertEquals(0, errors.size());
errorInstance = processAdminClient.getError(CONTAINER_ID, errorInstance.getErrorId());
assertNotNull(errorInstance);
assertNotNull(errorInstance.getErrorId());
assertTrue(errorInstance.isAcknowledged());
assertNotNull(errorInstance.getAcknowledgedAt());
assertEquals(USER_YODA, errorInstance.getAcknowledgedBy());
} catch (Exception e) {
logger.error("Unexpected error", e);
fail(e.getMessage());
} finally {
queryClient.unregisterQuery(query.getName());
if (processInstanceId != null) {
processClient.abortProcessInstance(CONTAINER_ID, processInstanceId);
}
}
}
protected QueryDefinition getProcessInstanceWithVariablesQueryDefinition() {
final QueryDefinition query = new QueryDefinition();
query.setName("allProcessInstancesWithVars");
query.setSource(System.getProperty("org.kie.server.persistence.ds", "jdbc/jbpm-ds"));
query.setExpression("select pil.*, v.variableId, v.value " + "from ProcessInstanceLog pil " + "inner join (select vil.processInstanceId ,vil.variableId, max(vil.ID) maxvilid from VariableInstanceLog vil " + "group by vil.processInstanceId, vil.variableId) x on (x.processInstanceId = pil.processInstanceId) " + "inner join VariableInstanceLog v " + "on (v.variableId = x.variableId and v.id = x.maxvilid and v.processInstanceId = pil.processInstanceId) " + "where pil.status = 1");
query.setTarget("CUSTOM");
return query;
}
private QueryDefinition createQueryDefinition(String target) {
QueryDefinition query = new QueryDefinition();
query.setName("allProcessInstances");
query.setSource(System.getProperty("org.kie.server.persistence.ds", "jdbc/jbpm-ds"));
query.setExpression("select * from ProcessInstanceLog where status = 1");
query.setTarget(target);
return query;
}
private QueryDefinition createErrorsQueryDefinition() {
QueryDefinition query = new QueryDefinition();
query.setName("unAckErrors");
query.setSource(System.getProperty("org.kie.server.persistence.ds", "jdbc/jbpm-ds"));
query.setExpression("select * from ExecutionErrorInfo where ERROR_ACK = '0'");
query.setTarget("CUSTOM");
return query;
}
protected List<Long> createProcessInstances(Map<String, Object> parameters) {
List<Long> processInstanceIds = new ArrayList<Long>();
processInstanceIds.add(processClient.startProcess(CONTAINER_ID, PROCESS_ID_SIGNAL_PROCESS, parameters));
processInstanceIds.add(processClient.startProcess(CONTAINER_ID, PROCESS_ID_USERTASK, parameters));
processInstanceIds.add(processClient.startProcess(CONTAINER_ID, PROCESS_ID_SIGNAL_PROCESS, parameters));
processInstanceIds.add(processClient.startProcess(CONTAINER_ID, PROCESS_ID_USERTASK, parameters));
processInstanceIds.add(processClient.startProcess(CONTAINER_ID, PROCESS_ID_SIGNAL_PROCESS, parameters));
Collections.sort(processInstanceIds);
return processInstanceIds;
}
protected void abortProcessInstances(List<Long> processInstanceIds) {
for (Long piId : processInstanceIds) {
processClient.abortProcessInstance(CONTAINER_ID, piId);
}
}
protected List<String> collectDefinitions(List<ProcessDefinition> definitions) {
List<String> ids = new ArrayList<String>();
for (ProcessDefinition definition : definitions) {
ids.add(definition.getId());
}
return ids;
}
protected List<Long> collectInstances(List<ProcessInstance> instances) {
List<Long> ids = new ArrayList<Long>();
for (ProcessInstance instance : instances) {
ids.add(instance.getId());
}
Collections.sort(ids);
return ids;
}
}