/*
* 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.process.audit.command;
import java.util.List;
import org.drools.core.impl.EnvironmentFactory;
import org.jbpm.bpmn2.JbpmBpmn2TestCase;
import org.jbpm.bpmn2.objects.TestWorkItemHandler;
import org.jbpm.process.audit.AuditLogService;
import org.jbpm.process.audit.JPAAuditLogService;
import org.jbpm.process.audit.NodeInstanceLog;
import org.jbpm.process.audit.ProcessInstanceLog;
import org.jbpm.process.audit.VariableInstanceLog;
import org.jbpm.process.instance.impl.demo.SystemOutWorkItemHandler;
import org.junit.BeforeClass;
import org.junit.Test;
import org.kie.api.KieBase;
import org.kie.api.command.Command;
import org.kie.api.runtime.Environment;
import org.kie.api.runtime.EnvironmentName;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.process.ProcessInstance;
import org.kie.api.runtime.process.WorkItem;
public class AuditCommandsTest extends JbpmBpmn2TestCase {
public AuditCommandsTest() {
super(true);
}
private static AuditLogService logService;
@BeforeClass
public static void setup() throws Exception {
setUpDataSource();
// clear logs
Environment env = EnvironmentFactory.newEnvironment();
env.set(EnvironmentName.ENTITY_MANAGER_FACTORY, emf);
logService = new JPAAuditLogService(env);
logService.clear();
}
@Test
public void testFindProcessInstanceCommands() throws Exception {
String processId = "IntermediateCatchEvent";
KieBase kbase = createKnowledgeBase("BPMN2-IntermediateCatchEventSignal.bpmn2");
KieSession ksession = createKnowledgeSession(kbase);
ksession.getWorkItemManager().registerWorkItemHandler("Human Task", new SystemOutWorkItemHandler());
ProcessInstance processInstance = ksession.startProcess(processId);
assertTrue(processInstance.getState() == ProcessInstance.STATE_ACTIVE);
Command<?> cmd = new FindProcessInstancesCommand();
Object result = ksession.execute(cmd);
assertNotNull( "Command result is empty!", result );
assertTrue( result instanceof List );
List<ProcessInstanceLog> logList = (List<ProcessInstanceLog>) result;
assertEquals( "Log list size is incorrect.", 1, logList.size() );
ProcessInstanceLog log = logList.get(0);
assertEquals(log.getProcessInstanceId().longValue(), processInstance.getId());
assertEquals(log.getProcessId(), processInstance.getProcessId());
cmd = new FindActiveProcessInstancesCommand(processId);
result = ksession.execute(cmd);
assertNotNull( "Command result is empty!", result );
assertTrue( result instanceof List );
logList = (List<ProcessInstanceLog>) result;
assertEquals( "Log list size is incorrect.", 1, logList.size() );
log = logList.get(0);
assertEquals("Process instance id", log.getProcessInstanceId().longValue(), processInstance.getId());
assertEquals("Process id", log.getProcessId(), processInstance.getProcessId());
assertEquals("Status", log.getStatus().intValue(), ProcessInstance.STATE_ACTIVE );
cmd = new FindProcessInstanceCommand(processInstance.getId());
result = ksession.execute(cmd);
assertNotNull( "Command result is empty!", result );
assertTrue( result instanceof ProcessInstanceLog );
log = (ProcessInstanceLog) result;
assertEquals(log.getProcessInstanceId().longValue(), processInstance.getId());
assertEquals(log.getProcessId(), processInstance.getProcessId());
// now signal process instance
ksession = restoreSession(ksession, true);
ksession.signalEvent("MyMessage", "SomeValue", processInstance.getId());
assertProcessInstanceCompleted(processInstance.getId(), ksession);
cmd = new ClearHistoryLogsCommand();
result = ksession.execute(cmd);
assertEquals( "There should be no more logs", 0, logService.findProcessInstances().size() );
}
@Test
public void testVarAndNodeInstanceCommands() throws Exception {
KieBase kbase = createKnowledgeBase("BPMN2-SubProcessUserTask.bpmn2");
KieSession ksession = createKnowledgeSession(kbase);
TestWorkItemHandler workItemHandler = new TestWorkItemHandler();
ksession.getWorkItemManager().registerWorkItemHandler("Human Task", workItemHandler);
ProcessInstance processInstance = ksession.startProcess("SubProcess");
assertProcessInstanceActive(processInstance);
Command<?> cmd = new FindNodeInstancesCommand(processInstance.getId());
Object result = ksession.execute(cmd);
assertNotNull( "Command result is empty!", result );
assertTrue( result instanceof List );
List<NodeInstanceLog> nodeLogList = (List<NodeInstanceLog>) result;
assertEquals( "Log list size is incorrect.", 8, nodeLogList.size() );
cmd = new FindNodeInstancesCommand(processInstance.getId(), "UserTask_1");
result = ksession.execute(cmd);
assertNotNull( "Command result is empty!", result );
assertTrue( result instanceof List );
nodeLogList = (List<NodeInstanceLog>) result;
assertEquals( "Log list size is incorrect.", 1, nodeLogList.size() );
cmd = new FindVariableInstancesCommand(processInstance.getId(), "2:x");
result = ksession.execute(cmd);
assertNotNull( "Command result is empty!", result );
assertTrue( result instanceof List );
List<VariableInstanceLog> varLogList = (List<VariableInstanceLog>) result;
assertEquals( "Log list size is incorrect.", 1, varLogList.size() );
WorkItem workItem = workItemHandler.getWorkItem();
assertNotNull(workItem);
ksession.getWorkItemManager().completeWorkItem(workItem.getId(), null);
assertProcessInstanceFinished(processInstance, ksession);
}
}