/*
Copyright 2013 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 java.io.ByteArrayInputStream;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.drools.core.process.core.datatype.impl.type.ObjectDataType;
import org.jbpm.bpmn2.core.Association;
import org.jbpm.bpmn2.core.DataStore;
import org.jbpm.bpmn2.core.Definitions;
import org.jbpm.bpmn2.xml.ProcessHandler;
import org.jbpm.process.instance.impl.demo.SystemOutWorkItemHandler;
import org.junit.After;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import org.kie.api.KieBase;
import org.kie.api.runtime.process.ProcessInstance;
import org.kie.api.runtime.process.WorkItem;
import org.kie.api.runtime.process.WorkItemHandler;
import org.kie.api.runtime.process.WorkItemManager;
import org.kie.internal.runtime.StatefulKnowledgeSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
@RunWith(Parameterized.class)
public class DataTest extends JbpmBpmn2TestCase {
@Parameters
public static Collection<Object[]> persistence() {
Object[][] data = new Object[][] { { false }, { true } };
return Arrays.asList(data);
};
private static final Logger logger = LoggerFactory.getLogger(DataTest.class);
private StatefulKnowledgeSession ksession;
public DataTest(boolean persistence) {
super(persistence);
}
@BeforeClass
public static void setup() throws Exception {
setUpDataSource();
}
@After
public void dispose() {
if (ksession != null) {
ksession.dispose();
ksession = null;
}
}
@Test
public void testImport() throws Exception {
KieBase kbase = createKnowledgeBaseWithoutDumper("BPMN2-Import.bpmn2");
ksession = createKnowledgeSession(kbase);
ProcessInstance processInstance = ksession.startProcess("Import");
assertProcessInstanceCompleted(processInstance);
}
@Test
public void testDataObject() throws Exception {
KieBase kbase = createKnowledgeBase("BPMN2-DataObject.bpmn2");
ksession = createKnowledgeSession(kbase);
Map<String, Object> params = new HashMap<String, Object>();
params.put("employee", "UserId-12345");
ProcessInstance processInstance = ksession.startProcess("Evaluation",
params);
assertProcessInstanceCompleted(processInstance);
}
@Test
public void testDataStore() throws Exception {
KieBase kbase = createKnowledgeBase("BPMN2-DataStore.bpmn2");
ksession = createKnowledgeSession(kbase);
ProcessInstance processInstance = ksession.startProcess("Evaluation");
Definitions def = (Definitions) processInstance.getProcess()
.getMetaData().get("Definitions");
assertNotNull(def.getDataStores());
assertTrue(def.getDataStores().size() == 1);
DataStore dataStore = def.getDataStores().get(0);
assertEquals("employee", dataStore.getId());
assertEquals("employeeStore", dataStore.getName());
assertEquals(String.class.getCanonicalName(),
((ObjectDataType) dataStore.getType()).getClassName());
}
@Test
public void testAssociation() throws Exception {
KieBase kbase = createKnowledgeBase("BPMN2-Association.bpmn2");
ksession = createKnowledgeSession(kbase);
ProcessInstance processInstance = ksession.startProcess("Evaluation");
List<Association> associations = (List<Association>) processInstance.getProcess().getMetaData().get(ProcessHandler.ASSOCIATIONS);
assertNotNull(associations);
assertTrue(associations.size() == 1);
Association assoc = associations.get(0);
assertEquals("_1234", assoc.getId());
assertEquals("_1", assoc.getSourceRef());
assertEquals("_2", assoc.getTargetRef());
}
@Test
public void testEvaluationProcess() throws Exception {
KieBase kbase = createKnowledgeBase("BPMN2-EvaluationProcess.bpmn2");
ksession = createKnowledgeSession(kbase);
ksession.getWorkItemManager().registerWorkItemHandler("Human Task",
new SystemOutWorkItemHandler());
ksession.getWorkItemManager().registerWorkItemHandler(
"RegisterRequest", new SystemOutWorkItemHandler());
Map<String, Object> params = new HashMap<String, Object>();
params.put("employee", "UserId-12345");
ProcessInstance processInstance = ksession.startProcess("Evaluation",
params);
assertProcessInstanceCompleted(processInstance);
}
@Test
public void testEvaluationProcess2() throws Exception {
KieBase kbase = createKnowledgeBase("BPMN2-EvaluationProcess2.bpmn2");
ksession = createKnowledgeSession(kbase);
ksession.getWorkItemManager().registerWorkItemHandler("Human Task",
new SystemOutWorkItemHandler());
Map<String, Object> params = new HashMap<String, Object>();
params.put("employee", "UserId-12345");
ProcessInstance processInstance = ksession.startProcess(
"com.sample.evaluation", params);
assertProcessInstanceCompleted(processInstance);
}
@Test
public void testEvaluationProcess3() throws Exception {
KieBase kbase = createKnowledgeBase("BPMN2-EvaluationProcess3.bpmn2");
ksession = createKnowledgeSession(kbase);
ksession.getWorkItemManager().registerWorkItemHandler("Human Task",
new SystemOutWorkItemHandler());
ksession.getWorkItemManager().registerWorkItemHandler(
"RegisterRequest", new SystemOutWorkItemHandler());
Map<String, Object> params = new HashMap<String, Object>();
params.put("employee", "john2");
ProcessInstance processInstance = ksession.startProcess("Evaluation",
params);
assertProcessInstanceCompleted(processInstance);
}
@Test
public void testXpathExpression() throws Exception {
KieBase kbase = createKnowledgeBase("BPMN2-XpathExpression.bpmn2");
ksession = createKnowledgeSession(kbase);
Document document = DocumentBuilderFactory
.newInstance()
.newDocumentBuilder()
.parse(new ByteArrayInputStream(
"<instanceMetadata><user approved=\"false\" /></instanceMetadata>"
.getBytes()));
Map<String, Object> params = new HashMap<String, Object>();
params.put("instanceMetadata", document);
ProcessInstance processInstance = ksession.startProcess("XPathProcess",
params);
assertProcessInstanceCompleted(processInstance);
}
@Test
public void testDataInputAssociations() throws Exception {
KieBase kbase = createKnowledgeBaseWithoutDumper("BPMN2-DataInputAssociations.bpmn2");
ksession = createKnowledgeSession(kbase);
ksession.getWorkItemManager().registerWorkItemHandler("Human Task",
new WorkItemHandler() {
public void abortWorkItem(WorkItem manager,
WorkItemManager mgr) {
}
public void executeWorkItem(WorkItem workItem,
WorkItemManager mgr) {
assertEquals("hello world",
workItem.getParameter("coId"));
}
});
Document document = DocumentBuilderFactory
.newInstance()
.newDocumentBuilder()
.parse(new ByteArrayInputStream("<user hello='hello world' />"
.getBytes()));
Map<String, Object> params = new HashMap<String, Object>();
params.put("instanceMetadata", document.getFirstChild());
ProcessInstance processInstance = ksession.startProcess("process",
params);
}
@Test
public void testDataInputAssociationsWithStringObject() throws Exception {
KieBase kbase = createKnowledgeBaseWithoutDumper("BPMN2-DataInputAssociations-string-object.bpmn2");
ksession = createKnowledgeSession(kbase);
ksession.getWorkItemManager().registerWorkItemHandler("Human Task",
new WorkItemHandler() {
public void abortWorkItem(WorkItem manager,
WorkItemManager mgr) {
}
public void executeWorkItem(WorkItem workItem,
WorkItemManager mgr) {
assertEquals("hello", workItem.getParameter("coId"));
}
});
Map<String, Object> params = new HashMap<String, Object>();
params.put("instanceMetadata", "hello");
ProcessInstance processInstance = ksession.startProcess("process",
params);
}
/**
* TODO testDataInputAssociationsWithLazyLoading
*/
@Test
@Ignore
public void testDataInputAssociationsWithLazyLoading()
throws Exception {
KieBase kbase = createKnowledgeBase("BPMN2-DataInputAssociations-lazy-creating.bpmn2");
ksession = createKnowledgeSession(kbase);
ksession.getWorkItemManager().registerWorkItemHandler("Human Task",
new WorkItemHandler() {
public void abortWorkItem(WorkItem manager,
WorkItemManager mgr) {
}
public void executeWorkItem(WorkItem workItem,
WorkItemManager mgr) {
Object coIdParamObj = workItem.getParameter("coId");
assertEquals("mydoc", ((Element) coIdParamObj).getNodeName());
assertEquals("mynode", ((Element) workItem.getParameter("coId")).getFirstChild().getNodeName());
assertEquals("user",
((Element) workItem.getParameter("coId"))
.getFirstChild().getFirstChild()
.getNodeName());
assertEquals("hello world",
((Element) workItem.getParameter("coId"))
.getFirstChild().getFirstChild()
.getAttributes().getNamedItem("hello")
.getNodeValue());
}
});
Document document = DocumentBuilderFactory
.newInstance()
.newDocumentBuilder()
.parse(new ByteArrayInputStream("<user hello='hello world' />"
.getBytes()));
Map<String, Object> params = new HashMap<String, Object>();
params.put("instanceMetadata", document.getFirstChild());
ProcessInstance processInstance = ksession.startProcess("process",
params);
}
@Test
public void testDataInputAssociationsWithString() throws Exception {
KieBase kbase = createKnowledgeBase("BPMN2-DataInputAssociations-string.bpmn2");
ksession = createKnowledgeSession(kbase);
ksession.getWorkItemManager().registerWorkItemHandler("Human Task",
new WorkItemHandler() {
public void abortWorkItem(WorkItem manager,
WorkItemManager mgr) {
}
public void executeWorkItem(WorkItem workItem,
WorkItemManager mgr) {
assertEquals("hello", workItem.getParameter("coId"));
}
});
ProcessInstance processInstance = ksession
.startProcess("process", null);
}
@Test
public void testDataInputAssociationsWithStringWithoutQuotes()
throws Exception {
KieBase kbase = createKnowledgeBase("BPMN2-DataInputAssociations-string-no-quotes.bpmn2");
ksession = createKnowledgeSession(kbase);
ksession.getWorkItemManager().registerWorkItemHandler("Human Task",
new WorkItemHandler() {
public void abortWorkItem(WorkItem manager,
WorkItemManager mgr) {
}
public void executeWorkItem(WorkItem workItem,
WorkItemManager mgr) {
assertEquals("hello", workItem.getParameter("coId"));
}
});
ProcessInstance processInstance = ksession
.startProcess("process", null);
}
@Test
public void testDataInputAssociationsWithXMLLiteral() throws Exception {
KieBase kbase = createKnowledgeBaseWithoutDumper("BPMN2-DataInputAssociations-xml-literal.bpmn2");
ksession = createKnowledgeSession(kbase);
ksession.getWorkItemManager().registerWorkItemHandler("Human Task",
new WorkItemHandler() {
public void abortWorkItem(WorkItem manager,
WorkItemManager mgr) {
}
public void executeWorkItem(WorkItem workItem,
WorkItemManager mgr) {
assertEquals("id", ((org.w3c.dom.Node) workItem
.getParameter("coId")).getNodeName());
assertEquals("some text", ((org.w3c.dom.Node) workItem
.getParameter("coId")).getFirstChild()
.getTextContent());
}
});
ProcessInstance processInstance = ksession
.startProcess("process", null);
}
/**
* TODO testDataInputAssociationsWithTwoAssigns
*/
@Test
@Ignore
public void testDataInputAssociationsWithTwoAssigns() throws Exception {
KieBase kbase = createKnowledgeBase("BPMN2-DataInputAssociations-two-assigns.bpmn2");
ksession = createKnowledgeSession(kbase);
ksession.getWorkItemManager().registerWorkItemHandler("Human Task",
new WorkItemHandler() {
public void abortWorkItem(WorkItem manager,
WorkItemManager mgr) {
}
public void executeWorkItem(WorkItem workItem,
WorkItemManager mgr) {
assertEquals("foo", ((Element) workItem
.getParameter("Comment")).getNodeName());
// assertEquals("mynode", ((Element)
// workItem.getParameter("Comment")).getFirstChild().getNodeName());
// assertEquals("user", ((Element)
// workItem.getParameter("Comment")).getFirstChild().getFirstChild().getNodeName());
// assertEquals("hello world", ((Element)
// workItem.getParameter("coId")).getFirstChild().getFirstChild().getAttributes().getNamedItem("hello").getNodeValue());
}
});
Document document = DocumentBuilderFactory
.newInstance()
.newDocumentBuilder()
.parse(new ByteArrayInputStream("<user hello='hello world' />"
.getBytes()));
Map<String, Object> params = new HashMap<String, Object>();
params.put("instanceMetadata", document.getFirstChild());
ProcessInstance processInstance = ksession.startProcess("process",
params);
}
@Test
public void testDataOutputAssociationsforHumanTask() throws Exception {
KieBase kbase = createKnowledgeBaseWithoutDumper("BPMN2-DataOutputAssociations-HumanTask.bpmn2");
ksession = createKnowledgeSession(kbase);
ksession.getWorkItemManager().registerWorkItemHandler("Human Task",
new WorkItemHandler() {
public void abortWorkItem(WorkItem manager,
WorkItemManager mgr) {
}
public void executeWorkItem(WorkItem workItem,
WorkItemManager mgr) {
DocumentBuilderFactory factory = DocumentBuilderFactory
.newInstance();
DocumentBuilder builder;
try {
builder = factory.newDocumentBuilder();
} catch (ParserConfigurationException e) {
throw new RuntimeException(e);
}
final Map<String, Object> results = new HashMap<String, Object>();
// process metadata
org.w3c.dom.Document processMetadaDoc = builder
.newDocument();
org.w3c.dom.Element processMetadata = processMetadaDoc
.createElement("previoustasksowner");
processMetadaDoc.appendChild(processMetadata);
// org.w3c.dom.Element procElement =
// processMetadaDoc.createElement("previoustasksowner");
processMetadata
.setAttribute("primaryname", "my_result");
// processMetadata.appendChild(procElement);
results.put("output", processMetadata);
mgr.completeWorkItem(workItem.getId(), results);
}
});
Map<String, Object> params = new HashMap<String, Object>();
ProcessInstance processInstance = ksession.startProcess("process",
params);
}
@Test
public void testDataOutputAssociations() throws Exception {
KieBase kbase = createKnowledgeBaseWithoutDumper("BPMN2-DataOutputAssociations.bpmn2");
ksession = createKnowledgeSession(kbase);
ksession.getWorkItemManager().registerWorkItemHandler("Human Task",
new WorkItemHandler() {
public void abortWorkItem(WorkItem manager,
WorkItemManager mgr) {
}
public void executeWorkItem(WorkItem workItem,
WorkItemManager mgr) {
try {
Document document = DocumentBuilderFactory
.newInstance()
.newDocumentBuilder()
.parse(new ByteArrayInputStream(
"<user hello='hello world' />"
.getBytes()));
Map<String, Object> params = new HashMap<String, Object>();
params.put("output", document.getFirstChild());
mgr.completeWorkItem(workItem.getId(), params);
} catch (Throwable e) {
throw new RuntimeException(e);
}
}
});
ProcessInstance processInstance = ksession
.startProcess("process", null);
}
@Test
public void testDataOutputAssociationsXmlNode() throws Exception {
KieBase kbase = createKnowledgeBaseWithoutDumper("BPMN2-DataOutputAssociations-xml-node.bpmn2");
ksession = createKnowledgeSession(kbase);
ksession.getWorkItemManager().registerWorkItemHandler("Human Task",
new WorkItemHandler() {
public void abortWorkItem(WorkItem manager,
WorkItemManager mgr) {
}
public void executeWorkItem(WorkItem workItem,
WorkItemManager mgr) {
try {
Document document = DocumentBuilderFactory
.newInstance()
.newDocumentBuilder()
.parse(new ByteArrayInputStream(
"<user hello='hello world' />"
.getBytes()));
Map<String, Object> params = new HashMap<String, Object>();
params.put("output", document.getFirstChild());
mgr.completeWorkItem(workItem.getId(), params);
} catch (Throwable e) {
throw new RuntimeException(e);
}
}
});
ProcessInstance processInstance = ksession
.startProcess("process", null);
}
}