/**
* Copyright 2010 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.bpmn2;
import org.jbpm.bpmn2.xml.XmlBPMNProcessDumper;
import org.jbpm.persistence.session.objects.TestWorkItemHandler;
import org.jbpm.ruleflow.core.RuleFlowProcess;
import org.jbpm.ruleflow.core.RuleFlowProcessFactory;
import org.jbpm.test.util.CountDownProcessEventListener;
import org.junit.Test;
import org.kie.internal.io.ResourceFactory;
import org.kie.internal.runtime.StatefulKnowledgeSession;
import org.kie.api.KieBase;
import org.kie.api.io.Resource;
import org.kie.api.runtime.process.ProcessInstance;
public class ProcessFactoryTest extends JbpmBpmn2TestCase {
public ProcessFactoryTest() {
super(false);
}
@Test
public void testProcessFactory() throws Exception {
RuleFlowProcessFactory factory = RuleFlowProcessFactory.createProcess("org.jbpm.process");
factory
// header
.name("My process").packageName("org.jbpm")
// nodes
.startNode(1).name("Start").done()
.actionNode(2).name("Action")
.action("java", "System.out.println(\"Action\");").done()
.endNode(3).name("End").done()
// connections
.connection(1, 2)
.connection(2, 3);
RuleFlowProcess process = factory.validate().getProcess();
Resource res = ResourceFactory.newByteArrayResource(XmlBPMNProcessDumper.INSTANCE.dump(process).getBytes());
res.setSourcePath("/tmp/processFactory.bpmn2"); // source path or target path must be set to be added into kbase
KieBase kbase = createKnowledgeBaseFromResources(res);
StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
ksession.startProcess("org.jbpm.process");
ksession.dispose();
}
@Test
public void testCompositeNode() throws Exception {
RuleFlowProcessFactory factory = RuleFlowProcessFactory.createProcess("org.jbpm.process");
factory
// header
.name("My process").packageName("org.jbpm")
// nodes
.startNode(1).name("Start").done()
.compositeNode(2)
.name("SubProcess")
.startNode(1).name("SubProcess Start").done()
.actionNode(2).name("SubProcess Action").action("java", "System.out.println(\"SubProcess Action\");").done()
.endNode(3).name("SubProcess End").terminate(true).done()
.connection(1, 2)
.connection(2, 3)
.done()
.endNode(3).name("End").done()
// connections
.connection(1, 2)
.connection(2, 3);
RuleFlowProcess process = factory.validate().getProcess();
assertEquals("SubProcess", process.getNode(2).getName());
Resource res = ResourceFactory.newByteArrayResource(XmlBPMNProcessDumper.INSTANCE.dump(process).getBytes());
res.setSourcePath("/tmp/processFactory.bpmn2"); // source path or target path must be set to be added into kbase
KieBase kbase = createKnowledgeBaseFromResources(res);
StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
ProcessInstance pi = ksession.startProcess("org.jbpm.process");
assertEquals(ProcessInstance.STATE_COMPLETED, pi.getState());
ksession.dispose();
}
@Test(timeout=10000)
public void testBoundaryTimerTimeCycle() throws Exception {
CountDownProcessEventListener countDownListener = new CountDownProcessEventListener("BoundaryTimerEvent", 1);
RuleFlowProcessFactory factory = RuleFlowProcessFactory.createProcess("org.jbpm.process");
factory
// header
.name("My process").packageName("org.jbpm")
// nodes
.startNode(1).name("Start").done()
.humanTaskNode(2).name("Task").actorId("john").taskName("MyTask").done()
.endNode(3).name("End1").terminate(false).done()
.boundaryEventNode(4).name("BoundaryTimerEvent").attachedTo(2).timeCycle("1s###5s").cancelActivity(false).done()
.endNode(5).name("End2").terminate(false).done()
// connections
.connection(1, 2)
.connection(2, 3)
.connection(4, 5);
RuleFlowProcess process = factory.validate().getProcess();
Resource res = ResourceFactory.newByteArrayResource(XmlBPMNProcessDumper.INSTANCE.dump(process).getBytes());
res.setSourcePath("/tmp/processFactory.bpmn2"); // source path or target path must be set to be added into kbase
KieBase kbase = createKnowledgeBaseFromResources(res);
StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
TestWorkItemHandler testHandler = new TestWorkItemHandler();
ksession.getWorkItemManager().registerWorkItemHandler("Human Task", testHandler);
ksession.addEventListener(countDownListener);
ProcessInstance pi = ksession.startProcess("org.jbpm.process");
assertProcessInstanceActive(pi);
countDownListener.waitTillCompleted(); // wait for boundary timer firing
assertNodeTriggered(pi.getId(), "End2");
assertProcessInstanceActive(pi); // still active because CancelActivity = false
ksession.getWorkItemManager().completeWorkItem(testHandler.getWorkItem().getId(), null);
assertProcessInstanceCompleted(pi);
ksession.dispose();
}
@Test(timeout=10000)
public void testBoundaryTimerTimeDuration() throws Exception {
CountDownProcessEventListener countDownListener = new CountDownProcessEventListener("BoundaryTimerEvent", 1);
RuleFlowProcessFactory factory = RuleFlowProcessFactory.createProcess("org.jbpm.process");
factory
// header
.name("My process").packageName("org.jbpm")
// nodes
.startNode(1).name("Start").done()
.humanTaskNode(2).name("Task").actorId("john").taskName("MyTask").done()
.endNode(3).name("End1").terminate(false).done()
.boundaryEventNode(4).name("BoundaryTimerEvent").attachedTo(2).timeDuration("1s").cancelActivity(false).done()
.endNode(5).name("End2").terminate(false).done()
// connections
.connection(1, 2)
.connection(2, 3)
.connection(4, 5);
RuleFlowProcess process = factory.validate().getProcess();
Resource res = ResourceFactory.newByteArrayResource(XmlBPMNProcessDumper.INSTANCE.dump(process).getBytes());
res.setSourcePath("/tmp/processFactory.bpmn2"); // source path or target path must be set to be added into kbase
KieBase kbase = createKnowledgeBaseFromResources(res);
StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
TestWorkItemHandler testHandler = new TestWorkItemHandler();
ksession.getWorkItemManager().registerWorkItemHandler("Human Task", testHandler);
ksession.addEventListener(countDownListener);
ProcessInstance pi = ksession.startProcess("org.jbpm.process");
assertProcessInstanceActive(pi);
countDownListener.waitTillCompleted(); // wait for boundary timer firing
assertNodeTriggered(pi.getId(), "End2");
assertProcessInstanceActive(pi); // still active because CancelActivity = false
ksession.getWorkItemManager().completeWorkItem(testHandler.getWorkItem().getId(), null);
assertProcessInstanceCompleted(pi);
ksession.dispose();
}
}