[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