[jboss-svn-commits] JBL Code SVN: r33432 - in labs/jbossrules/trunk: drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance and 3 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Wed Jun 9 18:48:30 EDT 2010
Author: salaboy21
Date: 2010-06-09 18:48:29 -0400 (Wed, 09 Jun 2010)
New Revision: 33432
Added:
labs/jbossrules/trunk/drools-persistence-jpa/src/test/resources/VPSProcessWithWorkItems.rf
Modified:
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/InputMarshaller.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/OutputMarshaller.java
labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/JPAWorkItemManager.java
labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/WorkItemInfo.java
labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/variabletypes/VariableInstanceInfo.java
labs/jbossrules/trunk/drools-persistence-jpa/src/test/java/org/drools/persistence/session/VariablePersistenceStrategyTest.java
Log:
JBRULES-2345: Work items should also support pluggable parameter persistence
- Merging the changes for this functionality into the trunk
- from the branch salaboy_diega_workitem_variablePersistence.
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/InputMarshaller.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/InputMarshaller.java 2010-06-09 21:21:23 UTC (rev 33431)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/InputMarshaller.java 2010-06-09 22:48:29 UTC (rev 33432)
@@ -737,6 +737,10 @@
}
public static WorkItem readWorkItem(MarshallerReaderContext context) throws IOException {
+ return readWorkItem(context, true);
+ }
+
+ public static WorkItem readWorkItem(MarshallerReaderContext context, boolean includeVariables) throws IOException {
ObjectInputStream stream = context.stream;
WorkItemImpl workItem = new WorkItemImpl();
@@ -745,6 +749,7 @@
workItem.setName( stream.readUTF() );
workItem.setState( stream.readInt() );
+ if(includeVariables){
int nbParameters = stream.readInt();
for ( int i = 0; i < nbParameters; i++ ) {
@@ -757,6 +762,7 @@
throw new IllegalArgumentException( "Could not reload parameter " + name );
}
}
+ }
return workItem;
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/OutputMarshaller.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/OutputMarshaller.java 2010-06-09 21:21:23 UTC (rev 33431)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/OutputMarshaller.java 2010-06-09 22:48:29 UTC (rev 33432)
@@ -733,14 +733,20 @@
}
stream.writeShort( PersisterEnums.END );
}
+ public static void writeWorkItem(MarshallerWriteContext context,
+ WorkItem workItem) throws IOException {
+ writeWorkItem(context, workItem, true);
+ }
public static void writeWorkItem(MarshallerWriteContext context,
- WorkItem workItem) throws IOException {
+ WorkItem workItem, boolean includeVariables) throws IOException {
ObjectOutputStream stream = context.stream;
stream.writeLong( workItem.getId() );
stream.writeLong( workItem.getProcessInstanceId() );
stream.writeUTF( workItem.getName() );
stream.writeInt( workItem.getState() );
+
+ if(includeVariables){
Map<String, Object> parameters = workItem.getParameters();
stream.writeInt( parameters.size() );
for ( Map.Entry<String, Object> entry : parameters.entrySet() ) {
@@ -748,6 +754,7 @@
stream.writeObject( entry.getValue() );
}
}
+ }
public static void writeTimers(MarshallerWriteContext context) throws IOException {
ObjectOutputStream stream = context.stream;
Modified: labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/JPAWorkItemManager.java
===================================================================
--- labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/JPAWorkItemManager.java 2010-06-09 21:21:23 UTC (rev 33431)
+++ labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/JPAWorkItemManager.java 2010-06-09 22:48:29 UTC (rev 33432)
@@ -12,6 +12,7 @@
import org.drools.process.instance.WorkItem;
import org.drools.process.instance.WorkItemManager;
import org.drools.process.instance.impl.WorkItemImpl;
+import org.drools.runtime.Environment;
import org.drools.runtime.EnvironmentName;
import org.drools.runtime.process.WorkItemHandler;
@@ -25,11 +26,11 @@
this.workingMemory = workingMemory;
}
-
public void internalExecuteWorkItem(WorkItem workItem) {
- EntityManager em = (EntityManager) this.workingMemory.getEnvironment().get( EnvironmentName.ENTITY_MANAGER );
+ Environment env = this.workingMemory.getEnvironment();
+ EntityManager em = (EntityManager) env.get(EnvironmentName.ENTITY_MANAGER);
- WorkItemInfo workItemInfo = new WorkItemInfo(workItem);
+ WorkItemInfo workItemInfo = new WorkItemInfo(workItem, env);
em.persist(workItemInfo);
((WorkItemImpl) workItem).setId(workItemInfo.getId());
workItemInfo.update();
@@ -48,12 +49,13 @@
}
public void internalAbortWorkItem(long id) {
- EntityManager em = (EntityManager) this.workingMemory.getEnvironment().get( EnvironmentName.ENTITY_MANAGER );
+ Environment env = this.workingMemory.getEnvironment();
+ EntityManager em = (EntityManager) env.get(EnvironmentName.ENTITY_MANAGER);
WorkItemInfo workItemInfo = em.find(WorkItemInfo.class, id);
// work item may have been aborted
if (workItemInfo != null) {
- WorkItemImpl workItem = (WorkItemImpl) workItemInfo.getWorkItem();
+ WorkItemImpl workItem = (WorkItemImpl) workItemInfo.getWorkItem(env);
WorkItemHandler handler = (WorkItemHandler) this.workItemHandlers.get(workItem.getName());
if (handler != null) {
handler.abortWorkItem(workItem, this);
@@ -71,7 +73,8 @@
}
public void completeWorkItem(long id, Map<String, Object> results) {
- EntityManager em = (EntityManager) this.workingMemory.getEnvironment().get( EnvironmentName.ENTITY_MANAGER );
+ Environment env = this.workingMemory.getEnvironment();
+ EntityManager em = (EntityManager) env.get(EnvironmentName.ENTITY_MANAGER);
WorkItemInfo workItemInfo = null;
if (this.workItems != null) {
@@ -87,7 +90,7 @@
// work item may have been aborted
if (workItemInfo != null) {
- WorkItem workItem = (WorkItemImpl) workItemInfo.getWorkItem();
+ WorkItem workItem = (WorkItemImpl) workItemInfo.getWorkItem(env);
workItem.setResults(results);
ProcessInstance processInstance = workingMemory.getProcessInstance(workItem.getProcessInstanceId());
workItem.setState(WorkItem.COMPLETED);
@@ -104,7 +107,8 @@
}
public void abortWorkItem(long id) {
- EntityManager em = (EntityManager) this.workingMemory.getEnvironment().get( EnvironmentName.ENTITY_MANAGER );
+ Environment env = this.workingMemory.getEnvironment();
+ EntityManager em = (EntityManager) env.get(EnvironmentName.ENTITY_MANAGER);
WorkItemInfo workItemInfo = null;
if (this.workItems != null) {
@@ -118,7 +122,7 @@
// work item may have been aborted
if (workItemInfo != null) {
- WorkItem workItem = (WorkItemImpl) workItemInfo.getWorkItem();
+ WorkItem workItem = (WorkItemImpl) workItemInfo.getWorkItem(env);
ProcessInstance processInstance = workingMemory.getProcessInstance(workItem.getProcessInstanceId());
workItem.setState(WorkItem.ABORTED);
// process instance may have finished already
@@ -134,20 +138,23 @@
}
public WorkItem getWorkItem(long id) {
+ Environment env = this.workingMemory.getEnvironment();
+ EntityManager em = (EntityManager) env.get(EnvironmentName.ENTITY_MANAGER);
+
WorkItemInfo workItemInfo = null;
if (this.workItems != null) {
workItemInfo = this.workItems.get(id);
}
- if (workItemInfo == null) {
- EntityManager em = (EntityManager) this.workingMemory.getEnvironment().get( EnvironmentName.ENTITY_MANAGER );
+ if (workItemInfo == null && em != null) {
+
workItemInfo = em.find(WorkItemInfo.class, id);
}
if (workItemInfo == null) {
return null;
}
- return workItemInfo.getWorkItem();
+ return workItemInfo.getWorkItem(env);
}
public Set<WorkItem> getWorkItems() {
@@ -163,5 +170,4 @@
workItems.clear();
}
}
-
}
Modified: labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/WorkItemInfo.java
===================================================================
--- labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/WorkItemInfo.java 2010-06-09 21:21:23 UTC (rev 33431)
+++ labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/WorkItemInfo.java 2010-06-09 22:48:29 UTC (rev 33432)
@@ -3,14 +3,22 @@
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
+import javax.persistence.JoinColumn;
import javax.persistence.Lob;
+import javax.persistence.MapKey;
+import javax.persistence.OneToMany;
import javax.persistence.PreUpdate;
import javax.persistence.Transient;
import javax.persistence.Version;
@@ -19,11 +27,15 @@
import org.drools.marshalling.impl.MarshallerReaderContext;
import org.drools.marshalling.impl.MarshallerWriteContext;
import org.drools.marshalling.impl.OutputMarshaller;
+import org.drools.persistence.processinstance.variabletypes.VariableInstanceInfo;
import org.drools.process.instance.WorkItem;
+import org.drools.runtime.Environment;
@Entity
public class WorkItemInfo {
+ private static final String VARIABLE_SEPARATOR = ":";
+
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long workItemId;
@@ -41,14 +53,25 @@
private @Transient
WorkItem workItem;
+ private @Transient
+ Environment env;
+ @OneToMany(cascade = CascadeType.ALL)
+ @JoinColumn(name = "workItemId")
+ @MapKey(name = "name")
+ private Map<String, VariableInstanceInfo> variables = new HashMap<String, VariableInstanceInfo>();
+ private boolean externalVariables = false;
+
+
+
protected WorkItemInfo() {
}
- public WorkItemInfo(WorkItem workItem) {
+ public WorkItemInfo(WorkItem workItem, Environment env) {
this.workItem = workItem;
this.name = workItem.getName();
this.creationDate = new Date();
this.processInstanceId = workItem.getProcessInstanceId();
+ this.env = env;
}
public long getId() {
@@ -75,7 +98,8 @@
return state;
}
- public WorkItem getWorkItem() {
+ public WorkItem getWorkItem(Environment env) {
+ this.env = env;
if ( workItem == null ) {
try {
ByteArrayInputStream bais = new ByteArrayInputStream( workItemByteArray );
@@ -83,7 +107,10 @@
null,
null,
null );
- workItem = InputMarshaller.readWorkItem( context );
+ workItem = InputMarshaller.readWorkItem( context, !externalVariables );
+ if ( externalVariables ) {
+ restoreVariables();
+ }
context.close();
} catch ( IOException e ) {
e.printStackTrace();
@@ -93,18 +120,58 @@
return workItem;
}
+ private void restoreVariables() {
+
+
+ for ( Map.Entry<String, VariableInstanceInfo> entry : variables.entrySet() ) {
+ String[] variableHierarchy = entry.getKey().split( VARIABLE_SEPARATOR );
+ // last one is variable name
+ String variableName = variableHierarchy[variableHierarchy.length - 1];
+ // other ones are parent ids
+ List<Long> parentIds = new ArrayList<Long>();
+ for ( int i = 0; i < variableHierarchy.length - 1; i++ ) {
+ parentIds.add( Long.valueOf( variableHierarchy[i] ) );
+ }
+ restoreVariable( entry.getValue(),
+ parentIds,
+ variableName,
+ workItem );
+ }
+ }
+
+ private void restoreVariable(VariableInstanceInfo variableInfo,
+ List<Long> parentIds,
+ String variableName,
+ WorkItem workItem) throws NumberFormatException {
+
+ VariablePersistenceStrategy persistenceStrategy = VariablePersistenceStrategyFactory.getVariablePersistenceStrategy();
+ Object value = persistenceStrategy.getVariable( variableInfo,
+ this.env );
+ System.out.println( ">>>>> Restoring variable inside workitem " + variableName + " = " + value );
+ workItem.setParameter( variableName, value );
+
+ }
+
+
@PreUpdate
public void update() {
this.state = workItem.getState();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ boolean variablesChanged = false;
try {
MarshallerWriteContext context = new MarshallerWriteContext( baos,
null,
null,
null,
null );
+ externalVariables = VariablePersistenceStrategyFactory.getVariablePersistenceStrategy().isEnabled();
OutputMarshaller.writeWorkItem( context,
- workItem );
+ workItem, !externalVariables );
+
+
+ if ( externalVariables ) {
+ variablesChanged = persistVariables();
+ }
context.close();
this.workItemByteArray = baos.toByteArray();
} catch ( IOException e ) {
@@ -112,4 +179,50 @@
}
}
+ private boolean persistVariables() {
+ // Get Process Variables
+
+ Map<String, Object> processVariables = workItem.getParameters();
+ Map<String, VariableInstanceInfo> newVariables = new HashMap<String, VariableInstanceInfo>();
+ // persist process variables
+ persist( processVariables,
+ "workItem.",
+ newVariables );
+ // persist variables in nested variable scopes
+
+ if ( newVariables.size() > 0 || this.variables.size() > 0 ) {
+ // clear variables so unnecessary values are removed
+ this.variables.clear();
+ this.variables.putAll( newVariables );
+ // TODO: how can I know that no variables were changed?
+ return true;
+ } else {
+ return false;
}
+ }
+
+ private void persist(Map<String, Object> variables,
+ String prefix,
+ Map<String, VariableInstanceInfo> newVariables) {
+ VariablePersistenceStrategy persistenceStrategy = VariablePersistenceStrategyFactory.getVariablePersistenceStrategy();
+ for ( Map.Entry<String, Object> entries : variables.entrySet() ) {
+ String variableName = prefix + entries.getKey();
+ Object value = entries.getValue();
+ VariableInstanceInfo oldValue = this.variables.get( variableName );
+ VariableInstanceInfo variable = persistenceStrategy.persistVariable( variableName,
+ value,
+ oldValue,
+ this.env );
+
+ if ( variable != null ) {
+ System.out.println( "<<<<< Persisting variable inside workitem " + variableName + " = " + value );
+ newVariables.put( variableName,
+ variable );
+ } else {
+ System.out.println( "<<<<< Variable inside workitem " + variableName + " not persisted (value null)" );
+ }
+ }
+ }
+
+
+}
Modified: labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/variabletypes/VariableInstanceInfo.java
===================================================================
--- labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/variabletypes/VariableInstanceInfo.java 2010-06-09 21:21:23 UTC (rev 33431)
+++ labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/variabletypes/VariableInstanceInfo.java 2010-06-09 22:48:29 UTC (rev 33432)
@@ -34,6 +34,7 @@
private String persister;
private Long processInstanceId;
+ private Long workItemId;
public Long getId() {
return id;
}
@@ -62,10 +63,21 @@
this.processInstanceId = processInstanceId;
}
+ public Long getWorkItemId() {
+ return workItemId;
+ }
+ public void setWorkItemId(Long workItemId) {
+ this.workItemId = workItemId;
+ }
+
+
public String toString() {
- return getClass().getName() + " id=" + id + " name=" + name + " persister=" + persister;
+ return getClass().getName() + " id=" + id + " name=" + name + " "
+ + "persister=" + persister + ""
+ + " processInstanceId=" + processInstanceId
+ + " workItemId=" + workItemId;
}
@Override
Modified: labs/jbossrules/trunk/drools-persistence-jpa/src/test/java/org/drools/persistence/session/VariablePersistenceStrategyTest.java
===================================================================
--- labs/jbossrules/trunk/drools-persistence-jpa/src/test/java/org/drools/persistence/session/VariablePersistenceStrategyTest.java 2010-06-09 21:21:23 UTC (rev 33431)
+++ labs/jbossrules/trunk/drools-persistence-jpa/src/test/java/org/drools/persistence/session/VariablePersistenceStrategyTest.java 2010-06-09 22:48:29 UTC (rev 33432)
@@ -1,5 +1,6 @@
package org.drools.persistence.session;
+import bitronix.tm.TransactionManagerServices;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -29,6 +30,7 @@
import org.drools.runtime.process.WorkflowProcessInstance;
import bitronix.tm.resource.jdbc.PoolingDataSource;
+import org.drools.builder.KnowledgeBuilderConfiguration;
public class VariablePersistenceStrategyTest extends TestCase {
@@ -285,6 +287,132 @@
assertNull( processInstance );
}
+ public void testWorkItemWithVariablePersistence() throws Exception{
+ KnowledgeBuilderConfiguration conf = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration();
+ conf.setProperty("drools.dialect.java.compiler", "JANINO");
+
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(conf);
+ kbuilder.add( new ClassPathResource( "VPSProcessWithWorkItems.rf" ), ResourceType.DRF );
+ for (KnowledgeBuilderError error: kbuilder.getErrors()) {
+ System.out.println(error);
+ }
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+ EntityManagerFactory emf =
+ Persistence.createEntityManagerFactory("org.drools.persistence.jpa");
+ Environment env = KnowledgeBaseFactory.newEnvironment();
+ env.set(EnvironmentName.ENTITY_MANAGER_FACTORY, emf);
+ env.set(EnvironmentName.GLOBALS, new MapGlobalResolver());
+ env.set( EnvironmentName.TRANSACTION_MANAGER,
+ TransactionManagerServices.getTransactionManager() );
+
+
+ StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
+ int id = ksession.getId();
+
+
+ System.out.println("### Starting process ###");
+ Map<String, Object> parameters = new HashMap<String, Object>();
+ parameters.put("x", "SomeString");
+ parameters.put("y", new MyEntity("This is a test Entity"));
+ parameters.put("z", new MyVariableSerializable("This is a test SerializableObject"));
+ WorkflowProcessInstance processInstance = (WorkflowProcessInstance)
+ ksession.startProcess( "com.sample.ruleflow", parameters );
+
+ TestWorkItemHandler handler = TestWorkItemHandler.getInstance();
+ WorkItem workItem = handler.getWorkItem();
+ assertNotNull( workItem );
+
+ List<?> result = emf.createEntityManager().createQuery("select i from VariableInstanceInfo i").getResultList();
+
+ assertEquals(5, result.size());
+
+ System.out.println("### Retrieving process instance ###");
+ ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+ processInstance = (WorkflowProcessInstance)
+ ksession.getProcessInstance( processInstance.getId() );
+ assertNotNull( processInstance );
+ assertEquals("SomeString", processInstance.getVariable("x"));
+ assertEquals("This is a test Entity", ((MyEntity) processInstance.getVariable("y")).getTest());
+ assertEquals("This is a test SerializableObject", ((MyVariableSerializable) processInstance.getVariable("z")).getText());
+ assertNull(processInstance.getVariable("a"));
+ assertNull(processInstance.getVariable("b"));
+ assertNull(processInstance.getVariable("c"));
+
+ System.out.println("### Completing first work item ###");
+ Map<String, Object> results = new HashMap<String, Object>();
+ results.put("zeta", processInstance.getVariable("z"));
+ results.put("equis", processInstance.getVariable("x")+"->modifiedResult");
+
+ ksession.getWorkItemManager().completeWorkItem( workItem.getId(), results );
+
+ workItem = handler.getWorkItem();
+ assertNotNull( workItem );
+
+ System.out.println("### Retrieving variable instance infos ###");
+ result = emf.createEntityManager().createQuery("select i from VariableInstanceInfo i").getResultList();
+ //6 Variables from the process and 2 variables from the workitems
+ assertEquals(8, result.size());
+ for (Object o: result) {
+ System.out.println(((VariableInstanceInfo) o));
+ }
+
+ System.out.println("### Retrieving process instance ###");
+ ksession = JPAKnowledgeService.loadStatefulKnowledgeSession(id, kbase, null, env);
+ processInstance = (WorkflowProcessInstance)
+ ksession.getProcessInstance(processInstance.getId());
+ assertNotNull(processInstance);
+ System.out.println("######## Getting the already Persisted Variables #########");
+ assertEquals("SomeString->modifiedResult", processInstance.getVariable("x"));
+ assertEquals("This is a test Entity", ((MyEntity) processInstance.getVariable("y")).getTest());
+ assertEquals("This is a test SerializableObject", ((MyVariableSerializable) processInstance.getVariable("z")).getText());
+ assertEquals("Some new String", processInstance.getVariable("a"));
+ assertEquals("This is a new test Entity", ((MyEntity) processInstance.getVariable("b")).getTest());
+ assertEquals("This is a new test SerializableObject", ((MyVariableSerializable) processInstance.getVariable("c")).getText());
+ System.out.println("### Completing second work item ###");
+ results = new HashMap<String, Object>();
+ results.put("zeta", processInstance.getVariable("z"));
+ results.put("equis", processInstance.getVariable("x"));
+ ksession.getWorkItemManager().completeWorkItem( workItem.getId(), results );
+
+
+ workItem = handler.getWorkItem();
+ assertNotNull(workItem);
+
+ result = emf.createEntityManager().createQuery("select i from VariableInstanceInfo i").getResultList();
+ assertEquals(8, result.size());
+
+ System.out.println("### Retrieving process instance ###");
+ ksession = JPAKnowledgeService.loadStatefulKnowledgeSession(id, kbase, null, env);
+ processInstance = (WorkflowProcessInstance)
+ ksession.getProcessInstance(processInstance.getId());
+ assertNotNull(processInstance);
+ assertEquals("SomeString->modifiedResult", processInstance.getVariable("x"));
+ assertEquals("This is a test Entity", ((MyEntity) processInstance.getVariable("y")).getTest());
+ assertEquals("This is a test SerializableObject", ((MyVariableSerializable) processInstance.getVariable("z")).getText());
+ assertEquals("Some changed String", processInstance.getVariable("a"));
+ assertEquals("This is a changed test Entity", ((MyEntity) processInstance.getVariable("b")).getTest());
+ assertEquals("This is a changed test SerializableObject", ((MyVariableSerializable) processInstance.getVariable("c")).getText());
+ System.out.println("### Completing third work item ###");
+ results = new HashMap<String, Object>();
+ results.put("zeta", processInstance.getVariable("z"));
+ results.put("equis", processInstance.getVariable("x"));
+ ksession.getWorkItemManager().completeWorkItem( workItem.getId(), results );
+
+ workItem = handler.getWorkItem();
+ assertNull(workItem);
+
+ result = emf.createEntityManager().createQuery("select i from VariableInstanceInfo i").getResultList();
+
+ assertEquals(0, result.size());
+
+ ksession = JPAKnowledgeService.loadStatefulKnowledgeSession(id, kbase, null, env);
+ processInstance = (WorkflowProcessInstance)
+ ksession.getProcessInstance(processInstance.getId());
+ assertNull(processInstance);
+ }
+
public void testEntityWithSuperClassAnnotationField() throws Exception {
MySubEntity subEntity = new MySubEntity();
subEntity.setId(3L);
Added: labs/jbossrules/trunk/drools-persistence-jpa/src/test/resources/VPSProcessWithWorkItems.rf
===================================================================
--- labs/jbossrules/trunk/drools-persistence-jpa/src/test/resources/VPSProcessWithWorkItems.rf (rev 0)
+++ labs/jbossrules/trunk/drools-persistence-jpa/src/test/resources/VPSProcessWithWorkItems.rf 2010-06-09 22:48:29 UTC (rev 33432)
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<process xmlns="http://drools.org/drools-5.0/process"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
+ xs:schemaLocation="http://drools.org/drools-5.0/process drools-processes-5.0.xsd"
+ type="RuleFlow" name="droolsflow" id="com.sample.ruleflow" package-name="com.sample" >
+
+ <header>
+ <imports>
+ <import name="org.drools.persistence.session.MyEntity" />
+ <import name="org.drools.persistence.session.MyVariableSerializable" />
+ </imports>
+ <variables>
+ <variable name="x" >
+ <type name="org.drools.process.core.datatype.impl.type.StringDataType" />
+ </variable>
+ <variable name="y" >
+ <type name="org.drools.process.core.datatype.impl.type.ObjectDataType" className="org.drools.persistence.session.MyEntity" />
+ </variable>
+ <variable name="z" >
+ <type name="org.drools.process.core.datatype.impl.type.ObjectDataType" className="org.drools.persistence.session.MyVariableSerializable" />
+ </variable>
+ <variable name="a" >
+ <type name="org.drools.process.core.datatype.impl.type.StringDataType" />
+ </variable>
+ <variable name="b" >
+ <type name="org.drools.process.core.datatype.impl.type.ObjectDataType" className="org.drools.persistence.session.MyEntity" />
+ </variable>
+ <variable name="c" >
+ <type name="org.drools.process.core.datatype.impl.type.ObjectDataType" className="org.drools.persistence.session.MyVariableSerializable" />
+ </variable>
+ </variables>
+ </header>
+
+ <nodes>
+ <start id="1" name="Start" x="16" y="16" width="48" height="48" />
+ <end id="3" name="End" x="957" y="16" width="48" height="48" />
+ <humanTask id="4" name="Human Task" x="208" y="16" width="93" height="48" >
+ <work name="Human Task" >
+ <parameter name="ActorId" >
+ <type name="org.drools.process.core.datatype.impl.type.StringDataType" />
+ </parameter>
+ <parameter name="Comment" >
+ <type name="org.drools.process.core.datatype.impl.type.StringDataType" />
+ </parameter>
+ <parameter name="Content" >
+ <type name="org.drools.process.core.datatype.impl.type.StringDataType" />
+ </parameter>
+ <parameter name="Priority" >
+ <type name="org.drools.process.core.datatype.impl.type.StringDataType" />
+ </parameter>
+ <parameter name="Skippable" >
+ <type name="org.drools.process.core.datatype.impl.type.StringDataType" />
+ </parameter>
+ <parameter name="TaskName" >
+ <type name="org.drools.process.core.datatype.impl.type.StringDataType" />
+ </parameter>
+ </work>
+ <mapping type="in" from="x" to="equis" />
+ <mapping type="in" from="z" to="zeta" />
+ <mapping type="out" from="equis" to="x" />
+ <mapping type="out" from="zeta" to="z" />
+ </humanTask>
+ <actionNode id="5" name="Action" x="96" y="20" width="80" height="40" >
+ <action type="expression" dialect="java" >System.out.println("x = " + x);
+System.out.println("y = " + y);
+System.out.println("z = " + z);</action>
+ </actionNode>
+ <actionNode id="6" name="Action" x="333" y="20" width="80" height="40" >
+ <action type="expression" dialect="java" >System.out.println("x = " + x);
+System.out.println("y = " + y);
+System.out.println("z = " + z);
+kcontext.setVariable("a", "Some new String");
+kcontext.setVariable("b", new MyEntity("This is a new test Entity"));
+kcontext.setVariable("c", new MyVariableSerializable("This is a new test SerializableObject"));</action>
+ </actionNode>
+ <humanTask id="7" name="Human Task" x="445" y="20" width="124" height="40" >
+ <work name="Human Task" >
+ <parameter name="ActorId" >
+ <type name="org.drools.process.core.datatype.impl.type.StringDataType" />
+ </parameter>
+ <parameter name="Comment" >
+ <type name="org.drools.process.core.datatype.impl.type.StringDataType" />
+ </parameter>
+ <parameter name="Content" >
+ <type name="org.drools.process.core.datatype.impl.type.StringDataType" />
+ </parameter>
+ <parameter name="Priority" >
+ <type name="org.drools.process.core.datatype.impl.type.StringDataType" />
+ </parameter>
+ <parameter name="Skippable" >
+ <type name="org.drools.process.core.datatype.impl.type.StringDataType" />
+ </parameter>
+ <parameter name="TaskName" >
+ <type name="org.drools.process.core.datatype.impl.type.StringDataType" />
+ </parameter>
+ </work>
+ <mapping type="in" from="x" to="equis" />
+ <mapping type="in" from="z" to="zeta" />
+ <mapping type="out" from="equis" to="x" />
+ <mapping type="out" from="zeta" to="z" />
+ </humanTask>
+ <actionNode id="8" name="Action" x="601" y="20" width="80" height="40" >
+ <action type="expression" dialect="java" >System.out.println("x = " + x);
+System.out.println("y = " + y);
+System.out.println("z = " + z);
+System.out.println("a = " + a);
+System.out.println("b = " + b);
+System.out.println("c = " + c);
+kcontext.setVariable("a", "Some changed String");
+kcontext.setVariable("b", new MyEntity("This is a changed test Entity"));
+kcontext.setVariable("c", new MyVariableSerializable("This is a changed test SerializableObject"));</action>
+ </actionNode>
+ <humanTask id="9" name="Human Task" x="713" y="16" width="100" height="48" >
+ <work name="Human Task" >
+ <parameter name="ActorId" >
+ <type name="org.drools.process.core.datatype.impl.type.StringDataType" />
+ </parameter>
+ <parameter name="Comment" >
+ <type name="org.drools.process.core.datatype.impl.type.StringDataType" />
+ </parameter>
+ <parameter name="Content" >
+ <type name="org.drools.process.core.datatype.impl.type.StringDataType" />
+ </parameter>
+ <parameter name="Priority" >
+ <type name="org.drools.process.core.datatype.impl.type.StringDataType" />
+ </parameter>
+ <parameter name="Skippable" >
+ <type name="org.drools.process.core.datatype.impl.type.StringDataType" />
+ </parameter>
+ <parameter name="TaskName" >
+ <type name="org.drools.process.core.datatype.impl.type.StringDataType" />
+ </parameter>
+
+ </work>
+ <mapping type="in" from="x" to="equis" />
+ <mapping type="in" from="z" to="zeta" />
+ <mapping type="out" from="equis" to="x" />
+ <mapping type="out" from="zeta" to="z" />
+ </humanTask>
+ <actionNode id="10" name="Action" x="845" y="16" width="80" height="48" >
+ <action type="expression" dialect="java" >System.out.println("x = " + x);
+System.out.println("y = " + y);
+System.out.println("z = " + z);
+System.out.println("a = " + a);
+System.out.println("b = " + b);
+System.out.println("c = " + c);</action>
+ </actionNode>
+ </nodes>
+
+ <connections>
+ <connection from="10" to="3" />
+ <connection from="5" to="4" />
+ <connection from="1" to="5" />
+ <connection from="4" to="6" />
+ <connection from="6" to="7" />
+ <connection from="7" to="8" />
+ <connection from="8" to="9" />
+ <connection from="9" to="10" />
+ </connections>
+
+</process>
\ No newline at end of file
More information about the jboss-svn-commits
mailing list