[jboss-svn-commits] JBL Code SVN: r22664 - in labs/jbossrules/trunk/drools-process/drools-process-enterprise: src/main/java/org/drools and 14 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Sep 10 19:47:45 EDT 2008


Author: KrisVerlaenen
Date: 2008-09-10 19:47:45 -0400 (Wed, 10 Sep 2008)
New Revision: 22664

Added:
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/jpa/
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/jpa/ByteArrayObject.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/jpa/JPAPersister.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/jpa/JPAXaResource.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/JPAProcessInstanceManager.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/JPAProcessInstanceManagerFactory.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/JPAWorkItemManager.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/JPAWorkItemManagerFactory.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/ProcessInstanceEventInfo.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/JPAPersisterManager.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/SingleSessionCommandService.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/jpa/
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/jpa/JPAPersisterTest.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/session/
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/session/SingleSessionCommandServiceTest.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/session/TestWorkItemHandler.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/resources/
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/resources/META-INF/
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/resources/META-INF/MyWorkItemHandlers.conf
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/resources/META-INF/drools.rulebase.conf
Removed:
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/EJB3ProcessInstanceManager.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/ProcessService.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/ProcessServiceBean.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/process/enterprise/processinstance/
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/process/enterprise/repository/
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/process/enterprise/client/
Modified:
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/.classpath
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/ProcessInstanceInfo.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/WorkItemInfo.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/resources/META-INF/persistence.xml
Log:
JBRULES-1761: Add JPA persistence
 - JPA-based command service

Modified: labs/jbossrules/trunk/drools-process/drools-process-enterprise/.classpath
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/.classpath	2008-09-10 23:44:26 UTC (rev 22663)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/.classpath	2008-09-10 23:47:45 UTC (rev 22664)
@@ -1,14 +1,24 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src/main/java"/>
-	<classpathentry kind="src" path="src/main/resources"/>
-	<classpathentry kind="src" path="src/test/java"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/3"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/drools-compiler"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/drools-core"/>
-	<classpathentry kind="lib" path="lib/jboss-ejb3x.jar"/>
-	<classpathentry kind="lib" path="lib/jbossall-client.jar"/>
-	<classpathentry kind="lib" path="lib/ejb3-persistence.jar"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src/main/java"/>
+	<classpathentry kind="src" path="src/main/resources"/>
+	<classpathentry kind="src" path="src/test/java"/>
+	<classpathentry kind="src" path="src/test/resources"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/3"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/drools-compiler"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/drools-core"/>
+	<classpathentry kind="var" path="M2_REPO/javax/persistence/persistence-api/1.0/persistence-api-1.0.jar"/>
+	<classpathentry kind="var" path="M2_REPO/com/h2database/h2/1.0.77/h2-1.0.77.jar"/>
+	<classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-annotations/3.4.0.GA/hibernate-annotations-3.4.0.GA.jar"/>
+	<classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-commons-annotations/3.1.0.GA/hibernate-commons-annotations-3.1.0.GA.jar"/>
+	<classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-entitymanager/3.4.0.GA/hibernate-entitymanager-3.4.0.GA.jar"/>
+	<classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-core/3.3.0.SP1/hibernate-core-3.3.0.SP1.jar"/>
+	<classpathentry kind="var" path="M2_REPO/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar"/>
+	<classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-api/1.5.2/slf4j-api-1.5.2.jar"/>
+	<classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-jdk14/1.5.2/slf4j-jdk14-1.5.2.jar"/>
+	<classpathentry kind="var" path="M2_REPO/javassist/javassist/3.4.GA/javassist-3.4.GA.jar"/>
+	<classpathentry kind="var" path="M2_REPO/commons-collections/commons-collections/3.2/commons-collections-3.2.jar"/>
+	<classpathentry kind="var" path="M2_REPO/javax/transaction/jta/1.0.1B/jta-1.0.1B.jar"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>

Added: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/jpa/ByteArrayObject.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/jpa/ByteArrayObject.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/jpa/ByteArrayObject.java	2008-09-10 23:47:45 UTC (rev 22664)
@@ -0,0 +1,32 @@
+package org.drools.persistence.jpa;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+ at Entity
+public class ByteArrayObject {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.AUTO)        
+    private long id;
+    private byte[] byteArray;
+    
+	public long getId() {
+		return id;
+	}
+	
+	public void setId(long id) {
+		this.id = id;
+	}
+	
+	public byte[] getByteArray() {
+		return byteArray;
+	}
+	
+	public void setByteArray(byte[] byteArray) {
+		this.byteArray = byteArray;
+	}
+    
+}

Added: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/jpa/JPAPersister.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/jpa/JPAPersister.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/jpa/JPAPersister.java	2008-09-10 23:47:45 UTC (rev 22664)
@@ -0,0 +1,80 @@
+package org.drools.persistence.jpa;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.transaction.xa.XAResource;
+import javax.transaction.xa.Xid;
+
+import org.drools.persistence.ByteArraySnapshotter;
+import org.drools.persistence.Persister;
+import org.drools.persistence.Transaction;
+
+public class JPAPersister<T> implements Persister<T> {
+
+	private String id;
+	private ByteArrayObject object;
+	private ByteArraySnapshotter<T> snapshotter;
+    private EntityManagerFactory emf;
+    private EntityManager em;
+
+    public JPAPersister(EntityManagerFactory emf, ByteArraySnapshotter<T> snapshotter) {
+        this.emf = emf;
+        this.em = emf.createEntityManager();
+        this.snapshotter = snapshotter;
+    }
+    
+    public EntityManagerFactory getEntityManagerFactory() {
+    	return emf;
+    }
+    
+    public EntityManager getEntityManager() {
+    	return em;
+    }
+    
+    public void save() {
+        em.getTransaction().begin();
+        updateObject();
+        em.getTransaction().commit();
+    }
+    
+    public void updateObject() {
+        if (object == null) {
+        	object = new ByteArrayObject();
+        }
+        object.setByteArray(snapshotter.getSnapshot());
+        em.persist(object);
+        if (this.id == null) {
+        	id = object.getId() + "";
+        }
+    }
+
+    public void load() {
+		object = em.find(ByteArrayObject.class, new Long(id));
+		snapshotter.loadSnapshot(object.getByteArray());
+    }
+
+	public T getObject() {
+		return snapshotter.getObject();
+	}
+
+	public Transaction getTransaction() {
+		return new Transaction(getUniqueXID(), getXAResource());
+	}
+
+	public String getUniqueId() {
+		return object == null ? null : object.getId() + "";
+	}
+
+	public XAResource getXAResource() {
+		return new JPAXaResource<T>(this, em.getTransaction());
+	}
+
+	public void setUniqueId(String id) {
+		this.id = id;
+	}
+	
+	private Xid getUniqueXID() {
+		return null;
+	}
+
+}

Added: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/jpa/JPAXaResource.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/jpa/JPAXaResource.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/jpa/JPAXaResource.java	2008-09-10 23:47:45 UTC (rev 22664)
@@ -0,0 +1,62 @@
+package org.drools.persistence.jpa;
+
+import javax.persistence.EntityTransaction;
+import javax.transaction.xa.XAException;
+import javax.transaction.xa.XAResource;
+import javax.transaction.xa.Xid;
+
+public class JPAXaResource<T> implements XAResource {
+	
+	private JPAPersister<T> persister;
+    private EntityTransaction transaction;
+    
+    public JPAXaResource(JPAPersister<T> persister, EntityTransaction transaction) {
+    	this.persister = persister;
+        this.transaction = transaction;
+    }
+    
+    public boolean isInTransaction() {
+    	return transaction.isActive();
+    }
+
+    public void start(Xid xid, int flags) throws XAException {
+        transaction.begin();
+    }     
+    
+    public void rollback(Xid xid) throws XAException {   
+        transaction.rollback();
+    }    
+    
+    public void commit(Xid xid, boolean onePhase) throws XAException {
+    	persister.updateObject();
+        transaction.commit();        
+    }
+    
+    public void end(Xid xid,
+                    int flags) throws XAException {    
+    }        
+
+    public void forget(Xid xid) throws XAException {        
+    }
+
+    public int getTransactionTimeout() throws XAException {
+        return 0;
+    }
+
+    public boolean isSameRM(XAResource xares) throws XAException {
+        return false;
+    }
+
+    public int prepare(Xid xid) throws XAException {
+        return 0;
+    }
+
+    public Xid[] recover(int flag) throws XAException {
+        return null;
+    }
+
+    public boolean setTransactionTimeout(int seconds) throws XAException {
+        return false;
+    }      
+
+}

Copied: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance (from rev 21975, labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/process/enterprise/processinstance)


Property changes on: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance
___________________________________________________________________
Name: svn:mergeinfo
   + 

Deleted: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/EJB3ProcessInstanceManager.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/process/enterprise/processinstance/EJB3ProcessInstanceManager.java	2008-08-28 21:03:48 UTC (rev 21975)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/EJB3ProcessInstanceManager.java	2008-09-10 23:47:45 UTC (rev 22664)
@@ -1,70 +0,0 @@
-package org.drools.process.enterprise.processinstance;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import javax.persistence.EntityManager;
-
-import org.drools.WorkingMemory;
-import org.drools.common.InternalRuleBase;
-import org.drools.common.InternalWorkingMemory;
-import org.drools.process.instance.ProcessInstance;
-import org.drools.process.instance.ProcessInstanceManager;
-import org.drools.process.instance.impl.ProcessInstanceImpl;
-
-public class EJB3ProcessInstanceManager implements ProcessInstanceManager {
-
-    private EntityManager manager;
-    private WorkingMemory workingMemory;
-    
-    public void setEntityManager(EntityManager manager) {
-        this.manager = manager;
-    }
-    
-    public void setWorkingMemory(WorkingMemory workingMemory) {
-        this.workingMemory = workingMemory;
-    }
-    
-    public void addProcessInstance(ProcessInstance processInstance) {
-        ProcessInstanceInfo processInstanceInfo = new ProcessInstanceInfo();
-        processInstanceInfo.setProcessInstance(processInstance);
-        manager.persist(processInstanceInfo);
-        manager.flush();
-        processInstance.setId(processInstanceInfo.getId());
-    }
-
-    public ProcessInstance getProcessInstance(long id) {
-        ProcessInstanceInfo processInstanceInfo = manager.find(ProcessInstanceInfo.class, id);
-        if (processInstanceInfo == null) {
-            return null;
-        }
-        ProcessInstance processInstance = processInstanceInfo.getProcessInstance();
-        processInstance.setProcess(((InternalRuleBase) workingMemory.getRuleBase()).getProcess(processInstance.getProcessId()));
-        if (processInstance.getWorkingMemory() == null) {
-            processInstance.setWorkingMemory((InternalWorkingMemory) workingMemory);
-            ((ProcessInstanceImpl) processInstance).reconnect();
-        }
-        return processInstance;
-    }
-
-    public Collection<ProcessInstance> getProcessInstances() {
-        List<ProcessInstance> result = new ArrayList<ProcessInstance>();
-        List<ProcessInstanceInfo> processInstanceInfos = 
-            manager.createQuery("from ProcessInstanceInfo").getResultList();
-        if (processInstanceInfos != null) {
-            for (ProcessInstanceInfo processInstanceInfo: processInstanceInfos) {
-                result.add(processInstanceInfo.getProcessInstance());
-            }
-        }
-        return result;
-    }
-
-    public void removeProcessInstance(ProcessInstance processInstance) {
-        ProcessInstanceInfo processInstanceInfo = manager.find(ProcessInstanceInfo.class, processInstance.getId());
-        if (processInstanceInfo != null) {
-            manager.remove(processInstanceInfo);
-        }
-    }
-
-}

Copied: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/JPAProcessInstanceManager.java (from rev 21975, labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/process/enterprise/processinstance/EJB3ProcessInstanceManager.java)
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/JPAProcessInstanceManager.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/JPAProcessInstanceManager.java	2008-09-10 23:47:45 UTC (rev 22664)
@@ -0,0 +1,67 @@
+package org.drools.persistence.processinstance;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import javax.persistence.EntityManager;
+
+import org.drools.WorkingMemory;
+import org.drools.common.InternalRuleBase;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.process.instance.ProcessInstance;
+import org.drools.process.instance.ProcessInstanceManager;
+import org.drools.process.instance.impl.ProcessInstanceImpl;
+
+public class JPAProcessInstanceManager implements ProcessInstanceManager {
+
+    private EntityManager manager;
+    private WorkingMemory workingMemory;
+    
+    public void setEntityManager(EntityManager manager) {
+        this.manager = manager;
+    }
+    
+    public void setWorkingMemory(WorkingMemory workingMemory) {
+        this.workingMemory = workingMemory;
+    }
+    
+    public void addProcessInstance(ProcessInstance processInstance) {
+        ProcessInstanceInfo processInstanceInfo = new ProcessInstanceInfo(processInstance);
+        manager.persist(processInstanceInfo);
+        processInstance.setId(processInstanceInfo.getId());
+        processInstanceInfo.updateLastReadDate();
+    }
+    
+    public void internalAddProcessInstance(ProcessInstance processInstance) {
+    }
+
+    public ProcessInstance getProcessInstance(long id) {
+        ProcessInstanceInfo processInstanceInfo = manager.find(ProcessInstanceInfo.class, id);
+        if (processInstanceInfo == null) {
+            return null;
+        }
+        processInstanceInfo.updateLastReadDate();
+        ProcessInstance processInstance = processInstanceInfo.getProcessInstance();
+        processInstance.setProcess(((InternalRuleBase) workingMemory.getRuleBase()).getProcess(processInstance.getProcessId()));
+        if (processInstance.getWorkingMemory() == null) {
+            processInstance.setWorkingMemory((InternalWorkingMemory) workingMemory);
+            ((ProcessInstanceImpl) processInstance).reconnect();
+        }
+        return processInstance;
+    }
+
+	public Collection<ProcessInstance> getProcessInstances() {
+        return new ArrayList<ProcessInstance>();
+    }
+
+    public void removeProcessInstance(ProcessInstance processInstance) {
+        ProcessInstanceInfo processInstanceInfo = manager.find(ProcessInstanceInfo.class, processInstance.getId());
+        if (processInstanceInfo != null) {
+            manager.remove(processInstanceInfo);
+        }
+    }
+
+    public void internalRemoveProcessInstance(ProcessInstance processInstance) {
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/JPAProcessInstanceManager.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Added: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/JPAProcessInstanceManagerFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/JPAProcessInstanceManagerFactory.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/JPAProcessInstanceManagerFactory.java	2008-09-10 23:47:45 UTC (rev 22664)
@@ -0,0 +1,15 @@
+package org.drools.persistence.processinstance;
+
+import org.drools.WorkingMemory;
+import org.drools.process.instance.ProcessInstanceManager;
+import org.drools.process.instance.ProcessInstanceManagerFactory;
+
+public class JPAProcessInstanceManagerFactory implements ProcessInstanceManagerFactory {
+
+	public ProcessInstanceManager createProcessInstanceManager(WorkingMemory workingMemory) {
+		JPAProcessInstanceManager result = new JPAProcessInstanceManager();
+		result.setWorkingMemory(workingMemory);
+		return result;
+	}
+
+}

Added: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/JPAWorkItemManager.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/JPAWorkItemManager.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/JPAWorkItemManager.java	2008-09-10 23:47:45 UTC (rev 22664)
@@ -0,0 +1,147 @@
+package org.drools.persistence.processinstance;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import javax.persistence.EntityManager;
+
+import org.drools.WorkingMemory;
+import org.drools.common.InternalRuleBase;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.process.instance.ProcessInstance;
+import org.drools.process.instance.WorkItem;
+import org.drools.process.instance.WorkItemHandler;
+import org.drools.process.instance.WorkItemManager;
+import org.drools.process.instance.impl.ProcessInstanceImpl;
+import org.drools.process.instance.impl.WorkItemImpl;
+
+public class JPAWorkItemManager implements WorkItemManager {
+
+    private EntityManager manager;
+    private WorkingMemory workingMemory;
+	private Map<String, WorkItemHandler> workItemHandlers = new HashMap<String, WorkItemHandler>();
+    
+    public JPAWorkItemManager(WorkingMemory workingMemory) {
+    	this.workingMemory = workingMemory;
+    }
+    
+    public void setEntityManager(EntityManager manager) {
+        this.manager = manager;
+    }
+    
+    public void addProcessInstance(ProcessInstance processInstance) {
+        ProcessInstanceInfo processInstanceInfo = new ProcessInstanceInfo(processInstance);
+        manager.persist(processInstanceInfo);
+        processInstance.setId(processInstanceInfo.getId());
+    }
+
+    public ProcessInstance getProcessInstance(long id) {
+        ProcessInstanceInfo processInstanceInfo = manager.find(ProcessInstanceInfo.class, id);
+        if (processInstanceInfo == null) {
+            return null;
+        }
+        ProcessInstance processInstance = processInstanceInfo.getProcessInstance();
+        processInstance.setProcess(((InternalRuleBase) workingMemory.getRuleBase()).getProcess(processInstance.getProcessId()));
+        if (processInstance.getWorkingMemory() == null) {
+            processInstance.setWorkingMemory((InternalWorkingMemory) workingMemory);
+            ((ProcessInstanceImpl) processInstance).reconnect();
+        }
+        return processInstance;
+    }
+
+	public Collection<ProcessInstance> getProcessInstances() {
+        return new ArrayList<ProcessInstance>();
+    }
+
+    public void removeProcessInstance(ProcessInstance processInstance) {
+        ProcessInstanceInfo processInstanceInfo = manager.find(ProcessInstanceInfo.class, processInstance.getId());
+        if (processInstanceInfo != null) {
+            manager.remove(processInstanceInfo);
+        }
+    }
+
+	public void internalExecuteWorkItem(WorkItem workItem) {
+		WorkItemInfo workItemInfo = new WorkItemInfo(workItem);
+        manager.persist(workItemInfo);
+        ((WorkItemImpl) workItem).setId(workItemInfo.getId());
+        workItemInfo.update();
+        WorkItemHandler handler = (WorkItemHandler) this.workItemHandlers.get(workItem.getName());
+	    if (handler != null) {
+	        handler.executeWorkItem(workItem, this);
+	    } else {
+	        System.err.println("Could not find work item handler for " + workItem.getName());
+	    }
+	}
+
+	public void internalAbortWorkItem(long id) {
+        WorkItemInfo workItemInfo = manager.find(WorkItemInfo.class, id);
+        // work item may have been aborted
+        if (workItemInfo != null) {
+        	WorkItemImpl workItem = (WorkItemImpl) workItemInfo.getWorkItem();
+            WorkItemHandler handler = (WorkItemHandler) this.workItemHandlers.get(workItem.getName());
+            if (handler != null) {
+                handler.abortWorkItem(workItem, this);
+            } else {
+                System.err.println("Could not find work item handler for " + workItem.getName());
+            }
+            manager.remove(workItemInfo);
+        }
+	}
+
+	public void internalAddWorkItem(WorkItem workItem) {
+	}
+
+    public void completeWorkItem(long id, Map<String, Object> results) {
+        WorkItemInfo workItemInfo = manager.find(WorkItemInfo.class, id);
+        // work item may have been aborted
+        if (workItemInfo != null) {
+        	WorkItemImpl workItem = (WorkItemImpl) workItemInfo.getWorkItem();
+            workItem.setResults(results);
+            ProcessInstance processInstance = workingMemory.getProcessInstance(workItem.getProcessInstanceId());
+            workItem.setState(WorkItem.COMPLETED);
+            // process instance may have finished already
+            if (processInstance != null) {
+                processInstance.signalEvent("workItemCompleted", workItem);
+            }
+            manager.remove(workItemInfo);
+            workingMemory.fireAllRules();
+    	}
+    }
+
+    public void abortWorkItem(long id) {
+        WorkItemInfo workItemInfo = manager.find(WorkItemInfo.class, id);
+        // work item may have been aborted
+        if (workItemInfo != null) {
+        	WorkItemImpl workItem = (WorkItemImpl) workItemInfo.getWorkItem();
+            ProcessInstance processInstance = workingMemory.getProcessInstance(workItem.getProcessInstanceId());
+            workItem.setState(WorkItem.ABORTED);
+            // process instance may have finished already
+            if (processInstance != null) {
+                processInstance.signalEvent("workItemAborted", workItem);
+            }
+            manager.remove(workItemInfo);
+            workingMemory.fireAllRules();
+        }
+    }
+
+	public WorkItem getWorkItem(long id) {
+		WorkItemInfo workItemInfo = manager.find(WorkItemInfo.class, id);
+        if (workItemInfo == null) {
+            return null;
+        }
+        return workItemInfo.getWorkItem();
+	}
+
+	public Set<WorkItem> getWorkItems() {
+		return new HashSet<WorkItem>();
+	}
+
+	public void registerWorkItemHandler(String workItemName, WorkItemHandler handler) {
+        this.workItemHandlers.put(workItemName, handler);
+	}
+
+}

Added: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/JPAWorkItemManagerFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/JPAWorkItemManagerFactory.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/JPAWorkItemManagerFactory.java	2008-09-10 23:47:45 UTC (rev 22664)
@@ -0,0 +1,13 @@
+package org.drools.persistence.processinstance;
+
+import org.drools.WorkingMemory;
+import org.drools.process.instance.WorkItemManager;
+import org.drools.process.instance.WorkItemManagerFactory;
+
+public class JPAWorkItemManagerFactory implements WorkItemManagerFactory {
+
+	public WorkItemManager createWorkItemManager(WorkingMemory workingMemory) {
+		return new JPAWorkItemManager(workingMemory);
+	}
+
+}

Added: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/ProcessInstanceEventInfo.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/ProcessInstanceEventInfo.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/ProcessInstanceEventInfo.java	2008-09-10 23:47:45 UTC (rev 22664)
@@ -0,0 +1,31 @@
+package org.drools.persistence.processinstance;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+ at Entity
+public class ProcessInstanceEventInfo {
+
+	private @Id @GeneratedValue(strategy=GenerationType.AUTO) Long id;
+	private String eventType;
+	private long processInstanceId;
+	
+	ProcessInstanceEventInfo() {
+	}
+	
+	public ProcessInstanceEventInfo(long processInstanceId, String eventType) {
+		this.processInstanceId = processInstanceId;
+		this.eventType = eventType;
+	}
+	
+	public long getProcessInstanceId() {
+		return processInstanceId;
+	}
+	
+	public String getEventType() {
+		return eventType;
+	}
+	
+}

Modified: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/ProcessInstanceInfo.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/process/enterprise/processinstance/ProcessInstanceInfo.java	2008-08-28 21:03:48 UTC (rev 21975)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/ProcessInstanceInfo.java	2008-09-10 23:47:45 UTC (rev 22664)
@@ -1,14 +1,17 @@
-package org.drools.process.enterprise.processinstance;
+package org.drools.persistence.processinstance;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.util.Arrays;
+import java.util.Date;
 
 import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
 import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.Lob;
+import javax.persistence.PreUpdate;
 import javax.persistence.Transient;
 
 import org.drools.marshalling.InputMarshaller;
@@ -23,9 +26,24 @@
 
 	private @Id @GeneratedValue(strategy=GenerationType.AUTO) Long processInstanceId;
 	private String processId;
+	private Date startDate;
+	private Date lastReadDate;
+	private Date lastModificationDate;
+	private int state;
 	private @Lob byte[] processInstanceByteArray;
+	// TODO How do I mark a process instance info as dirty when the process instance
+	// has changed (so that byte array is regenerated and saved) ?
 	private @Transient ProcessInstance processInstance;
 	
+	ProcessInstanceInfo() {
+	}
+	
+	public ProcessInstanceInfo(ProcessInstance processInstance) {
+		this.processInstance = processInstance;
+		this.processId = processInstance.getProcessId();
+		startDate = new Date();
+	}
+	
 	public long getId() {
 		return processInstanceId;
 	}
@@ -34,6 +52,26 @@
 		return processId;
 	}
 	
+	public Date getStartDate() {
+		return startDate;
+	}
+	
+	public Date getLastModificationDate() {
+		return lastModificationDate;
+	}
+	
+	public Date getLastReadDate() {
+		return lastReadDate;
+	}
+	
+	public void updateLastReadDate() {
+		lastReadDate = new Date();
+	}
+	
+	public int getState() {
+		return state;
+	}
+	
 	public ProcessInstance getProcessInstance() {
 		if (processInstance == null) {
 			try {
@@ -49,21 +87,24 @@
 		}
 		return processInstance;
 	}
-	
-	public void setProcessInstance(ProcessInstance processInstance) {
-		this.processInstance = processInstance;
-//		this.processInstanceId = processInstance.getId();
-		this.processId = processInstance.getProcessId();
+
+	@PreUpdate
+	public void update() {
 		ByteArrayOutputStream baos = new ByteArrayOutputStream();
 		try {
 			MarshallerWriteContext context = new MarshallerWriteContext(baos, null, null, null, null);
 			OutputMarshaller.writeProcessInstance(context, (RuleFlowProcessInstance) processInstance);
 			context.close();
-			this.processInstanceByteArray = baos.toByteArray();
 		} catch (IOException e) {
 			throw new IllegalArgumentException(
 				"IOException while storing process instance " + processInstance.getId() + ": " + e.getMessage());
 		}
+		byte[] newByteArray = baos.toByteArray();
+		if (!Arrays.equals(newByteArray, processInstanceByteArray)) {
+			this.state = processInstance.getState();
+			this.lastModificationDate = new Date();
+			this.processInstanceByteArray = newByteArray;
+		}
 	}
 	
 }

Deleted: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/ProcessService.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/process/enterprise/processinstance/ProcessService.java	2008-08-28 21:03:48 UTC (rev 21975)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/ProcessService.java	2008-09-10 23:47:45 UTC (rev 22664)
@@ -1,14 +0,0 @@
-package org.drools.process.enterprise.processinstance;
-
-import java.util.Map;
-
-import javax.ejb.Remote;
-
- at Remote
-public interface ProcessService {
-
-	long startProcess(String processId);
-	
-	void completeWorkItem(long workItemId, Map<String, Object> results);
-	
-}

Deleted: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/ProcessServiceBean.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/process/enterprise/processinstance/ProcessServiceBean.java	2008-08-28 21:03:48 UTC (rev 21975)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/ProcessServiceBean.java	2008-09-10 23:47:45 UTC (rev 22664)
@@ -1,157 +0,0 @@
-package org.drools.process.enterprise.processinstance;
-
-import java.io.StringReader;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
-import javax.ejb.EJB;
-import javax.ejb.Stateless;
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-
-import org.drools.RuleBase;
-import org.drools.RuleBaseConfiguration;
-import org.drools.RuleBaseFactory;
-import org.drools.common.InternalWorkingMemory;
-import org.drools.compiler.PackageBuilder;
-import org.drools.process.enterprise.repository.ProcessInfo;
-import org.drools.process.enterprise.repository.ProcessRepository;
-import org.drools.process.instance.ProcessInstance;
-import org.drools.process.instance.WorkItem;
-import org.drools.process.instance.WorkItemHandler;
-import org.drools.process.instance.WorkItemManager;
-import org.drools.process.instance.impl.WorkItemImpl;
-import org.drools.process.instance.impl.demo.SystemOutWorkItemHandler;
-import org.drools.rule.Package;
-
- at Stateless
-public class ProcessServiceBean implements ProcessService {
-
-	private @PersistenceContext EntityManager manager;
-	private @EJB ProcessRepository processRepository;
-	   
-	public long startProcess(String processId) {
-		System.out.println("Starting process " + processId);
-		InternalWorkingMemory workingMemory = createWorkingMemory();
-		// start process
-		long start = System.nanoTime();
-		ProcessInstance processInstance = workingMemory.startProcess(processId);
-		persistProcessInstance(processInstance);
-		System.out.println("Time to execute: " + (System.nanoTime() - start));
-		return processInstance.getId();
-	}
-
-	public void completeWorkItem(long workItemId, Map<String, Object> results) {
-		InternalWorkingMemory workingMemory = createWorkingMemory();
-		WorkItemInfo workItemInfo = manager.find(WorkItemInfo.class, workItemId);
-		if (workItemInfo == null) {
-			throw new IllegalArgumentException(
-				"Could not find work item " + workItemId);
-		}
-		// TODO: should load other work items as well ?
-		WorkItemImpl workItem = new WorkItemImpl();
-		workItem.setId(workItemInfo.getWorkItemId());
-		workItem.setProcessInstanceId(workItemInfo.getProcessInstanceId());
-		workItem.setName(workItemInfo.getName());
-		workingMemory.getWorkItemManager().internalAddWorkItem(workItem);
-		manager.remove(workItemInfo);
-		// TODO: should load other process instances as well
-		workingMemory.getWorkItemManager().completeWorkItem(workItemId, results);
-        System.out.println("Executed work item " + workItem.getName() + " [" + workItem.getId() + "]");
-		persistProcessInstance(workItemInfo.getProcessInstanceId());
-	}
-	
-	private InternalWorkingMemory createWorkingMemory() {
-		// TODO: share rule base
-		List<ProcessInfo> processInfos = processRepository.getProcessInfos();
-		PackageBuilder builder = new PackageBuilder();
-		for (ProcessInfo processInfo: processInfos) {
-			builder.addRuleFlow(new StringReader(processInfo.getProcessXML()));
-		}
-		Package pkg = builder.getPackage();
-		Properties properties = new Properties();
-		properties.put(
-	        "processInstanceManager", 
-	        "org.drools.process.enterprise.processinstance.EJB3ProcessInstanceManager");
-        RuleBaseConfiguration conf = new RuleBaseConfiguration(properties);
-		RuleBase ruleBase = RuleBaseFactory.newRuleBase(conf);
-		ruleBase.addPackage(pkg);
-		// create new working memory
-		InternalWorkingMemory workingMemory = (InternalWorkingMemory) ruleBase.newStatefulSession();
-		// TODO auto-register work item handlers (e.g. based on config)
-		workingMemory.getWorkItemManager().registerWorkItemHandler("Log", new SystemOutWorkItemHandler());
-		workingMemory.getWorkItemManager().registerWorkItemHandler("Human Task", new EnterpriseWorkItemHandler());
-//		workingMemory.addEventListener(new DefaultRuleFlowEventListener() {
-//            public void afterRuleFlowCompleted(RuleFlowCompletedEvent event,
-//                    WorkingMemory workingMemory) {
-//                System.out.println("Process instance completed: " + 
-//                    event.getProcessInstance().getProcessId() + 
-//                    "[" + event.getProcessInstance().getId() + "]");
-//            }
-//            public void afterRuleFlowNodeTriggered(
-//                    RuleFlowNodeTriggeredEvent event,
-//                    WorkingMemory workingMemory) {
-//                System.out.println("Node completed: " + 
-//                    event.getRuleFlowNodeInstance().getNode().getName() +
-//                    "[" + event.getRuleFlowNodeInstance().getNodeId() + "] for process instance " +
-//                    event.getProcessInstance().getProcessId() + 
-//                    "[" + event.getProcessInstance().getId() + "]");
-//            }
-//            public void afterRuleFlowStarted(RuleFlowStartedEvent event,
-//                    WorkingMemory workingMemory) {
-//                System.out.println("Process instance started: " + 
-//                    event.getProcessInstance().getProcessId() + 
-//                    "[" + event.getProcessInstance().getId() + "]");
-//            }
-//		});
-		// TODO
-		EJB3ProcessInstanceManager processInstanceManager = 
-		    (EJB3ProcessInstanceManager)((InternalWorkingMemory) workingMemory).getProcessInstanceManager();
-		processInstanceManager.setEntityManager(manager);
-		processInstanceManager.setWorkingMemory(workingMemory);
-		return workingMemory;
-	}
-	
-	private void persistProcessInstance(long processInstanceId) {
-	    
-	}
-	
-	private void persistProcessInstance(ProcessInstance processInstance) {
-		ProcessInstanceInfo processInstanceInfo = manager.find(ProcessInstanceInfo.class, processInstance.getId());
-		if (processInstanceInfo == null) {
-			processInstanceInfo = new ProcessInstanceInfo();
-		}
-		processInstanceInfo.setProcessInstance(processInstance);
-        manager.merge(processInstanceInfo);
-        manager.flush();
-		System.out.println("Persisted process instance " + processInstanceInfo.getId());
-		// TODO remove process instances that are not longer there
-		// TODO make smarter, e.g. by registering a listener
-		// before starting execution and only updating changed instances
-	}
-
-	public class EnterpriseWorkItemHandler implements WorkItemHandler {
-
-		public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
-			WorkItemInfo workItemInfo = new WorkItemInfo();
-			workItemInfo.setWorkItemId(workItem.getId());
-			workItemInfo.setProcessInstanceId(workItem.getProcessInstanceId());
-			workItemInfo.setName(workItem.getName());
-			workItemInfo.setParameters(workItem.getParameters());
-			ProcessServiceBean.this.manager.persist(workItemInfo);
-			System.out.println("Persisted work item " + workItem.getName() + " [" + workItem.getId() + "]");
-			for (Map.Entry<String, Object> entry: workItem.getParameters().entrySet()) {
-				System.out.println("  " + entry.getKey() + " = " + entry.getValue());
-			}
-		}
-
-		public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {
-			WorkItemInfo workItemInfo = ProcessServiceBean.this.manager.find(WorkItemInfo.class, workItem.getId());
-			ProcessServiceBean.this.manager.remove(workItemInfo);
-			System.out.println("Aborted work item " + workItem.getName() + " [" + workItem.getId() + "]");
-		}
-
-	}
-
-}

Modified: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/WorkItemInfo.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/process/enterprise/processinstance/WorkItemInfo.java	2008-08-28 21:03:48 UTC (rev 21975)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/WorkItemInfo.java	2008-09-10 23:47:45 UTC (rev 22664)
@@ -1,50 +1,94 @@
-package org.drools.process.enterprise.processinstance;
+package org.drools.persistence.processinstance;
 
-import java.util.Map;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Date;
 
 import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
 import javax.persistence.Id;
+import javax.persistence.Lob;
+import javax.persistence.PreUpdate;
 import javax.persistence.Transient;
 
+import org.drools.marshalling.InputMarshaller;
+import org.drools.marshalling.MarshallerReaderContext;
+import org.drools.marshalling.MarshallerWriteContext;
+import org.drools.marshalling.OutputMarshaller;
+import org.drools.process.instance.WorkItem;
+
 @Entity
 public class WorkItemInfo {
 
-	private @Id long workItemId;
+	private @Id @GeneratedValue(strategy=GenerationType.AUTO) long workItemId;
 	private String name;
-	// TODO
-    private @Transient Map<String, Object> parameters;
+	private Date creationDate;
     private long processInstanceId;
+    private long state;
+	private @Lob byte[] workItemByteArray;
+    private @Transient WorkItem workItem;
     
-	public long getWorkItemId() {
+    WorkItemInfo() {
+    }
+    
+    public WorkItemInfo(WorkItem workItem) {
+    	this.workItem = workItem;
+    	this.name = workItem.getName();
+    	this.creationDate = new Date();
+    	this.processInstanceId = workItem.getProcessInstanceId();
+    }
+    
+	public long getId() {
 		return workItemId;
 	}
 	
-	public void setWorkItemId(long workItemId) {
-		this.workItemId = workItemId;
-	}
-	
 	public String getName() {
 		return name;
 	}
 	
-	public void setName(String name) {
-		this.name = name;
+	public Date getCreationDate() {
+		return creationDate;
 	}
 	
-	public Map<String, Object> getParameters() {
-		return parameters;
+	public long getProcessInstanceId() {
+		return processInstanceId;
 	}
 	
-	public void setParameters(Map<String, Object> parameters) {
-		this.parameters = parameters;
+	public long getState() {
+		return state;
 	}
 	
-	public long getProcessInstanceId() {
-		return processInstanceId;
+	public WorkItem getWorkItem() {
+		if (workItem == null) {
+			try {
+				ByteArrayInputStream bais = new ByteArrayInputStream(workItemByteArray);
+				MarshallerReaderContext context = new MarshallerReaderContext(bais, null, null, null);
+				workItem = InputMarshaller.readWorkItem(context);
+				context.close();
+			} catch (IOException e) {
+				e.printStackTrace();
+				throw new IllegalArgumentException(
+					"IOException while loading process instance: " + e.getMessage());
+			}
+		}
+		return workItem;
 	}
 	
-	public void setProcessInstanceId(long processInstanceId) {
-		this.processInstanceId = processInstanceId;
+	@PreUpdate
+	public void update() {
+		this.state = workItem.getState();
+		ByteArrayOutputStream baos = new ByteArrayOutputStream();
+		try {
+			MarshallerWriteContext context = new MarshallerWriteContext(baos, null, null, null, null);
+			OutputMarshaller.writeWorkItem(context, workItem);
+			context.close();
+			this.workItemByteArray = baos.toByteArray();
+		} catch (IOException e) {
+			throw new IllegalArgumentException(
+				"IOException while storing workItem " + workItem.getId() + ": " + e.getMessage());
+		}
 	}
 	
 }

Added: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/JPAPersisterManager.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/JPAPersisterManager.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/JPAPersisterManager.java	2008-09-10 23:47:45 UTC (rev 22664)
@@ -0,0 +1,39 @@
+package org.drools.persistence.session;
+
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+
+import org.drools.RuleBase;
+import org.drools.StatefulSession;
+import org.drools.persistence.Persister;
+import org.drools.persistence.jpa.JPAPersister;
+
+public class JPAPersisterManager {
+
+	private EntityManagerFactory emf;
+	
+	public JPAPersisterManager() {
+		emf = Persistence.createEntityManagerFactory("org.drools.persistence.jpa");
+	}
+	
+	public void dispose() {
+		emf.close();
+	}
+	
+	public Persister<StatefulSession> getSessionPersister(StatefulSession session) {
+		return new JPAPersister<StatefulSession>(emf, new StatefulSessionSnapshotter(session));
+	}
+	
+	public Persister<StatefulSession> getSessionPersister(RuleBase ruleBase) {
+		return new JPAPersister<StatefulSession>(emf, new StatefulSessionSnapshotter(ruleBase.newStatefulSession()));
+	}
+	
+	public Persister<StatefulSession> getSessionPersister(String uniqueId, RuleBase ruleBase) {
+		Persister<StatefulSession> persister = new JPAPersister<StatefulSession>(
+			emf, new StatefulSessionSnapshotter(ruleBase));
+		persister.setUniqueId(uniqueId);
+		persister.load();
+		return persister;
+	}
+	
+}

Added: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/SingleSessionCommandService.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/SingleSessionCommandService.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/SingleSessionCommandService.java	2008-09-10 23:47:45 UTC (rev 22664)
@@ -0,0 +1,61 @@
+package org.drools.persistence.session;
+
+import javax.transaction.xa.XAException;
+
+import org.drools.RuleBase;
+import org.drools.StatefulSession;
+import org.drools.audit.WorkingMemoryConsoleLogger;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.persistence.Persister;
+import org.drools.persistence.Transaction;
+import org.drools.persistence.jpa.JPAPersister;
+import org.drools.persistence.processinstance.JPAProcessInstanceManager;
+import org.drools.persistence.processinstance.JPAWorkItemManager;
+import org.drools.process.command.Command;
+import org.drools.process.command.CommandService;
+
+public class SingleSessionCommandService implements CommandService {
+
+	private Persister<StatefulSession> persister;
+	
+	public SingleSessionCommandService(RuleBase ruleBase) {
+		persister = new JPAPersisterManager().getSessionPersister(ruleBase);
+		init();
+	}
+	
+	public SingleSessionCommandService(RuleBase ruleBase, String sessionId) {
+		persister = new JPAPersisterManager().getSessionPersister(sessionId, ruleBase);
+		init();
+	}
+	
+	private void init() {
+		StatefulSession session = persister.getObject();
+		((JPAProcessInstanceManager) ((InternalWorkingMemory) session).getProcessInstanceManager())
+			.setEntityManager(((JPAPersister<StatefulSession>) persister).getEntityManager());
+		((JPAWorkItemManager) ((InternalWorkingMemory) session).getWorkItemManager())
+			.setEntityManager(((JPAPersister<StatefulSession>) persister).getEntityManager());
+	}
+	
+	public Object execute(Command command) {
+		StatefulSession session = persister.getObject();
+		Transaction transaction = persister.getTransaction();
+		try {
+			transaction.start();
+			Object result = command.execute(session);
+			transaction.commit();
+			return result;
+		} catch (Throwable t) {
+			try {
+				transaction.rollback();
+				throw new RuntimeException("Could not execute command", t);
+			} catch (XAException e) {
+				throw new RuntimeException("Could not rollback transaction", e);
+			}
+		}
+	}
+	
+	public String getSessionId() {
+		return persister.getUniqueId(); 
+	}
+
+}

Modified: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/resources/META-INF/persistence.xml
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/resources/META-INF/persistence.xml	2008-09-10 23:44:26 UTC (rev 22663)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/resources/META-INF/persistence.xml	2008-09-10 23:47:45 UTC (rev 22664)
@@ -1,8 +1,43 @@
-<persistence>
- <persistence-unit name="ProcessService">
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<persistence
+    version="1.0"
+    xsi:schemaLocation=
+    	"http://java.sun.com/xml/ns/persistence
+    	 http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd
+		 http://java.sun.com/xml/ns/persistence/orm 
+		 http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
+    xmlns:orm="http://java.sun.com/xml/ns/persistence/orm"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns="http://java.sun.com/xml/ns/persistence">
+
+ <!--persistence-unit name="ProcessService">
   <jta-data-source>java:/DefaultDS</jta-data-source>
   <properties>
    <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
   </properties>
- </persistence-unit>
+ </persistence-unit-->
+
+    <persistence-unit name="org.drools.persistence.jpa">
+        <provider>org.hibernate.ejb.HibernatePersistence</provider>
+        <class>org.drools.persistence.jpa.ByteArrayObject</class>
+
+	    <properties>
+	        <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
+	        <property name="hibernate.connection.driver_class" value="org.h2.Driver"/>	        
+	        <!--property name="hibernate.connection.url" value="jdbc:h2:mem:mydb" /-->
+	        <property name="hibernate.connection.url" value="jdbc:h2:file:/home/kverlaen/NotBackedUp/development/drools/drools-process/drools-process-enterprise/bin/mydb" />
+	        
+<!--			<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>-->
+<!--	        <property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/>	  	        -->
+<!--	        <property name="hibernate.connection.url" value="jdbc:postgresql://localhost/postgres"/>-->
+	        
+	        <property name="hibernate.connection.username" value="sa"/>
+	        <property name="hibernate.connection.password" value="sasa"/>	
+	        <property name="hibernate.connection.autocommit" value="false" /> 	               
+	        <property name="hibernate.max_fetch_depth" value="3"/>
+		    <property name="hibernate.hbm2ddl.auto" value="update" />
+            <property name="hibernate.show_sql" value="true" />		    
+	    </properties>        
+    </persistence-unit>
+    
 </persistence>
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/jpa/JPAPersisterTest.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/jpa/JPAPersisterTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/jpa/JPAPersisterTest.java	2008-09-10 23:47:45 UTC (rev 22664)
@@ -0,0 +1,112 @@
+package org.drools.persistence.jpa;
+
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+
+import junit.framework.TestCase;
+
+import org.drools.RuleBase;
+import org.drools.RuleBaseFactory;
+import org.drools.StatefulSession;
+import org.drools.WorkingMemory;
+import org.drools.persistence.session.StatefulSessionSnapshotter;
+import org.drools.process.core.Work;
+import org.drools.process.core.impl.WorkImpl;
+import org.drools.process.instance.ProcessInstance;
+import org.drools.process.instance.WorkItem;
+import org.drools.process.instance.WorkItemHandler;
+import org.drools.process.instance.WorkItemManager;
+import org.drools.rule.Package;
+import org.drools.ruleflow.core.RuleFlowProcess;
+import org.drools.spi.Action;
+import org.drools.spi.KnowledgeHelper;
+import org.drools.spi.ProcessContext;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.impl.ConnectionImpl;
+import org.drools.workflow.core.impl.DroolsConsequenceAction;
+import org.drools.workflow.core.node.ActionNode;
+import org.drools.workflow.core.node.EndNode;
+import org.drools.workflow.core.node.StartNode;
+import org.drools.workflow.core.node.WorkItemNode;
+
+public class JPAPersisterTest extends TestCase {
+	
+	private EntityManagerFactory emf;
+	private WorkItem workItem;
+	
+	protected void setUp() {
+		emf = Persistence.createEntityManagerFactory("org.drools.persistence.jpa");
+	}
+	
+	protected void tearDown() {
+        emf.close();
+    }
+	
+	public void testPersistence() {
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        Package pkg = new Package("org.drools.test");
+        pkg.addProcess(getProcess());
+        ruleBase.addPackage(pkg);
+
+        StatefulSession session = ruleBase.newStatefulSession();
+		JPAPersister<StatefulSession> persister = new JPAPersister<StatefulSession>(
+			emf, new StatefulSessionSnapshotter(session));
+		
+		session.getWorkItemManager().registerWorkItemHandler("MyWork", new WorkItemHandler() {
+			public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
+				JPAPersisterTest.this.workItem = workItem;
+			}
+			public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {
+			}
+        });
+        ProcessInstance processInstance = session.startProcess("org.drools.test.TestProcess");
+        assertNotNull(workItem);
+        persister.save();
+        
+        persister.load();
+        processInstance = session.getProcessInstance(processInstance.getId());
+        assertNotNull(processInstance);
+        assertEquals(ProcessInstance.STATE_ACTIVE, processInstance.getState());
+        
+        session.getWorkItemManager().completeWorkItem(workItem.getId(), null);
+        assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
+    }
+
+    private RuleFlowProcess getProcess() {
+    	RuleFlowProcess process = new RuleFlowProcess();
+    	process.setId("org.drools.test.TestProcess");
+    	process.setName("TestProcess");
+    	process.setPackageName("org.drools.test");
+    	StartNode start = new StartNode();
+    	start.setId(1);
+    	start.setName("Start");
+    	process.addNode(start);
+    	ActionNode actionNode = new ActionNode();
+    	actionNode.setId(2);
+    	actionNode.setName("Action");
+    	DroolsConsequenceAction action = new DroolsConsequenceAction();
+    	action.setMetaData("Action", new Action() {
+            public void execute(KnowledgeHelper knowledgeHelper, WorkingMemory workingMemory, ProcessContext context) throws Exception {
+            	System.out.println("Executed action");
+            }
+        });
+    	actionNode.setAction(action);
+    	process.addNode(actionNode);
+    	new ConnectionImpl(start, Node.CONNECTION_DEFAULT_TYPE, actionNode, Node.CONNECTION_DEFAULT_TYPE);
+    	WorkItemNode workItemNode = new WorkItemNode();
+    	workItemNode.setId(3);
+    	workItemNode.setName("WorkItem");
+    	Work work = new WorkImpl();
+    	work.setName("MyWork");
+    	workItemNode.setWork(work);
+    	process.addNode(workItemNode);
+    	new ConnectionImpl(actionNode, Node.CONNECTION_DEFAULT_TYPE, workItemNode, Node.CONNECTION_DEFAULT_TYPE);
+    	EndNode end = new EndNode();
+    	end.setId(4);
+    	end.setName("End");
+    	process.addNode(end);
+    	new ConnectionImpl(workItemNode, Node.CONNECTION_DEFAULT_TYPE, end, Node.CONNECTION_DEFAULT_TYPE);
+        return process;
+    }
+    
+}

Added: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/session/SingleSessionCommandServiceTest.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/session/SingleSessionCommandServiceTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/session/SingleSessionCommandServiceTest.java	2008-09-10 23:47:45 UTC (rev 22664)
@@ -0,0 +1,373 @@
+package org.drools.persistence.session;
+
+import java.util.Collection;
+import java.util.Properties;
+
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+
+import junit.framework.TestCase;
+
+import org.drools.RuleBase;
+import org.drools.RuleBaseConfiguration;
+import org.drools.RuleBaseFactory;
+import org.drools.compiler.PackageBuilder;
+import org.drools.compiler.ProcessBuilder;
+import org.drools.process.command.CompleteWorkItemCommand;
+import org.drools.process.command.GetProcessInstanceCommand;
+import org.drools.process.command.StartProcessCommand;
+import org.drools.process.core.Work;
+import org.drools.process.core.impl.WorkImpl;
+import org.drools.process.core.timer.Timer;
+import org.drools.process.instance.ProcessInstance;
+import org.drools.process.instance.WorkItem;
+import org.drools.rule.Package;
+import org.drools.ruleflow.core.RuleFlowProcess;
+import org.drools.ruleflow.instance.RuleFlowProcessInstance;
+import org.drools.workflow.core.Node;
+import org.drools.workflow.core.impl.ConnectionImpl;
+import org.drools.workflow.core.impl.DroolsConsequenceAction;
+import org.drools.workflow.core.node.ActionNode;
+import org.drools.workflow.core.node.EndNode;
+import org.drools.workflow.core.node.StartNode;
+import org.drools.workflow.core.node.SubProcessNode;
+import org.drools.workflow.core.node.TimerNode;
+import org.drools.workflow.core.node.WorkItemNode;
+import org.drools.workflow.instance.NodeInstance;
+import org.drools.workflow.instance.node.SubProcessNodeInstance;
+
+public class SingleSessionCommandServiceTest extends TestCase {
+	
+	private EntityManagerFactory emf;
+	
+	protected void setUp() {
+		emf = Persistence.createEntityManagerFactory("org.drools.persistence.jpa");
+	}
+	
+	protected void tearDown() {
+        emf.close();
+    }
+	
+	public void testPersistenceWorkItems() {
+		Properties properties = new Properties();
+		properties.put(
+	        "processInstanceManagerFactory", 
+	        "org.drools.persistence.processinstance.JPAProcessInstanceManagerFactory");
+		properties.put(
+	        "workItemManagerFactory", 
+	        "org.drools.persistence.processinstance.JPAWorkItemManagerFactory");
+        RuleBaseConfiguration conf = new RuleBaseConfiguration(properties);
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase(conf);
+        Package pkg = getProcessWorkItems();
+        ruleBase.addPackage(pkg);
+
+        SingleSessionCommandService service = new SingleSessionCommandService(ruleBase);
+        StartProcessCommand startProcessCommand = new StartProcessCommand();
+        startProcessCommand.setProcessId("org.drools.test.TestProcess");
+        ProcessInstance processInstance = (ProcessInstance) service.execute(startProcessCommand);
+        System.out.println("Started process instance " + processInstance.getId());
+        
+        TestWorkItemHandler handler = TestWorkItemHandler.getInstance();
+        WorkItem workItem = handler.getWorkItem();
+        assertNotNull(workItem);
+        
+        service = new SingleSessionCommandService(ruleBase);
+        GetProcessInstanceCommand getProcessInstanceCommand = new GetProcessInstanceCommand();
+        getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
+        processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
+        assertNotNull(processInstance);
+        
+        service = new SingleSessionCommandService(ruleBase);
+        CompleteWorkItemCommand completeWorkItemCommand = new CompleteWorkItemCommand();
+        completeWorkItemCommand.setWorkItemId(workItem.getId());
+        service.execute(completeWorkItemCommand);
+
+        workItem = handler.getWorkItem();
+        assertNotNull(workItem);
+        
+        service = new SingleSessionCommandService(ruleBase);
+        getProcessInstanceCommand = new GetProcessInstanceCommand();
+        getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
+        processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
+        assertNotNull(processInstance);
+        
+        service = new SingleSessionCommandService(ruleBase);
+        completeWorkItemCommand = new CompleteWorkItemCommand();
+        completeWorkItemCommand.setWorkItemId(workItem.getId());
+        service.execute(completeWorkItemCommand);
+        
+        workItem = handler.getWorkItem();
+        assertNotNull(workItem);
+        
+        service = new SingleSessionCommandService(ruleBase);
+        getProcessInstanceCommand = new GetProcessInstanceCommand();
+        getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
+        processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
+        assertNotNull(processInstance);
+        
+        service = new SingleSessionCommandService(ruleBase);
+        completeWorkItemCommand = new CompleteWorkItemCommand();
+        completeWorkItemCommand.setWorkItemId(workItem.getId());
+        service.execute(completeWorkItemCommand);
+
+        workItem = handler.getWorkItem();
+        assertNull(workItem);
+        
+        service = new SingleSessionCommandService(ruleBase);
+        getProcessInstanceCommand = new GetProcessInstanceCommand();
+        getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
+        processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
+        assertNull(processInstance);
+	}
+
+    private Package getProcessWorkItems() {
+    	RuleFlowProcess process = new RuleFlowProcess();
+    	process.setId("org.drools.test.TestProcess");
+    	process.setName("TestProcess");
+    	process.setPackageName("org.drools.test");
+    	StartNode start = new StartNode();
+    	start.setId(1);
+    	start.setName("Start");
+    	process.addNode(start);
+    	ActionNode actionNode = new ActionNode();
+    	actionNode.setId(2);
+    	actionNode.setName("Action");
+    	DroolsConsequenceAction action = new DroolsConsequenceAction();
+    	action.setDialect("java");
+    	action.setConsequence("System.out.println(\"Executed action\");");
+    	actionNode.setAction(action);
+    	process.addNode(actionNode);
+    	new ConnectionImpl(start, Node.CONNECTION_DEFAULT_TYPE, actionNode, Node.CONNECTION_DEFAULT_TYPE);
+    	WorkItemNode workItemNode = new WorkItemNode();
+    	workItemNode.setId(3);
+    	workItemNode.setName("WorkItem1");
+    	Work work = new WorkImpl();
+    	work.setName("MyWork");
+    	workItemNode.setWork(work);
+    	process.addNode(workItemNode);
+    	new ConnectionImpl(actionNode, Node.CONNECTION_DEFAULT_TYPE, workItemNode, Node.CONNECTION_DEFAULT_TYPE);
+    	WorkItemNode workItemNode2 = new WorkItemNode();
+    	workItemNode2.setId(4);
+    	workItemNode2.setName("WorkItem2");
+    	work = new WorkImpl();
+    	work.setName("MyWork");
+    	workItemNode2.setWork(work);
+    	process.addNode(workItemNode2);
+    	new ConnectionImpl(workItemNode, Node.CONNECTION_DEFAULT_TYPE, workItemNode2, Node.CONNECTION_DEFAULT_TYPE);
+    	WorkItemNode workItemNode3 = new WorkItemNode();
+    	workItemNode3.setId(5);
+    	workItemNode3.setName("WorkItem3");
+    	work = new WorkImpl();
+    	work.setName("MyWork");
+    	workItemNode3.setWork(work);
+    	process.addNode(workItemNode3);
+    	new ConnectionImpl(workItemNode2, Node.CONNECTION_DEFAULT_TYPE, workItemNode3, Node.CONNECTION_DEFAULT_TYPE);
+    	EndNode end = new EndNode();
+    	end.setId(6);
+    	end.setName("End");
+    	process.addNode(end);
+    	new ConnectionImpl(workItemNode3, Node.CONNECTION_DEFAULT_TYPE, end, Node.CONNECTION_DEFAULT_TYPE);
+    	
+    	PackageBuilder packageBuilder = new PackageBuilder();
+    	ProcessBuilder processBuilder = new ProcessBuilder(packageBuilder);
+    	processBuilder.buildProcess(process);
+    	return packageBuilder.getPackage();
+    }
+    
+	public void testPersistenceSubProcess() {
+		Properties properties = new Properties();
+		properties.put(
+	        "processInstanceManagerFactory", 
+	        "org.drools.persistence.processinstance.JPAProcessInstanceManagerFactory");
+		properties.put(
+	        "workItemManagerFactory", 
+	        "org.drools.persistence.processinstance.JPAWorkItemManagerFactory");
+        RuleBaseConfiguration conf = new RuleBaseConfiguration(properties);
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase(conf);
+        Package pkg = getProcessSubProcess();
+        ruleBase.addPackage(pkg);
+
+        SingleSessionCommandService service = new SingleSessionCommandService(ruleBase);
+        StartProcessCommand startProcessCommand = new StartProcessCommand();
+        startProcessCommand.setProcessId("org.drools.test.TestProcess");
+        RuleFlowProcessInstance processInstance = (RuleFlowProcessInstance) service.execute(startProcessCommand);
+        System.out.println("Started process instance " + processInstance.getId());
+        long processInstanceId = processInstance.getId();
+        
+        TestWorkItemHandler handler = TestWorkItemHandler.getInstance();
+        WorkItem workItem = handler.getWorkItem();
+        assertNotNull(workItem);
+        
+        service = new SingleSessionCommandService(ruleBase);
+        GetProcessInstanceCommand getProcessInstanceCommand = new GetProcessInstanceCommand();
+        getProcessInstanceCommand.setProcessInstanceId(processInstanceId);
+        processInstance = (RuleFlowProcessInstance) service.execute(getProcessInstanceCommand);
+        assertNotNull(processInstance);
+        
+        Collection<NodeInstance> nodeInstances = processInstance.getNodeInstances();
+        assertEquals(1, nodeInstances.size());
+        SubProcessNodeInstance subProcessNodeInstance = (SubProcessNodeInstance) nodeInstances.iterator().next();
+        long subProcessInstanceId = subProcessNodeInstance.getProcessInstanceId();
+        getProcessInstanceCommand = new GetProcessInstanceCommand();
+        getProcessInstanceCommand.setProcessInstanceId(subProcessInstanceId);
+        RuleFlowProcessInstance subProcessInstance = (RuleFlowProcessInstance) service.execute(getProcessInstanceCommand);
+        assertNotNull(subProcessInstance);
+
+        service = new SingleSessionCommandService(ruleBase);
+        CompleteWorkItemCommand completeWorkItemCommand = new CompleteWorkItemCommand();
+        completeWorkItemCommand.setWorkItemId(workItem.getId());
+        service.execute(completeWorkItemCommand);
+
+        service = new SingleSessionCommandService(ruleBase);
+        getProcessInstanceCommand = new GetProcessInstanceCommand();
+        getProcessInstanceCommand.setProcessInstanceId(processInstanceId);
+        processInstance = (RuleFlowProcessInstance) service.execute(getProcessInstanceCommand);
+        assertNull(processInstance);
+        
+        getProcessInstanceCommand = new GetProcessInstanceCommand();
+        getProcessInstanceCommand.setProcessInstanceId(subProcessInstanceId);
+        subProcessInstance = (RuleFlowProcessInstance) service.execute(getProcessInstanceCommand);
+        assertNull(subProcessInstance);
+	}
+	
+	private Package getProcessSubProcess() {
+    	RuleFlowProcess process = new RuleFlowProcess();
+    	process.setId("org.drools.test.TestProcess");
+    	process.setName("TestProcess");
+    	process.setPackageName("org.drools.test");
+    	StartNode start = new StartNode();
+    	start.setId(1);
+    	start.setName("Start");
+    	process.addNode(start);
+    	ActionNode actionNode = new ActionNode();
+    	actionNode.setId(2);
+    	actionNode.setName("Action");
+    	DroolsConsequenceAction action = new DroolsConsequenceAction();
+    	action.setDialect("java");
+    	action.setConsequence("System.out.println(\"Executed action\");");
+    	actionNode.setAction(action);
+    	process.addNode(actionNode);
+    	new ConnectionImpl(start, Node.CONNECTION_DEFAULT_TYPE, actionNode, Node.CONNECTION_DEFAULT_TYPE);
+    	SubProcessNode subProcessNode = new SubProcessNode();
+    	subProcessNode.setId(3);
+    	subProcessNode.setName("SubProcess");
+    	subProcessNode.setProcessId("org.drools.test.SubProcess");
+    	process.addNode(subProcessNode);
+    	new ConnectionImpl(actionNode, Node.CONNECTION_DEFAULT_TYPE, subProcessNode, Node.CONNECTION_DEFAULT_TYPE);
+    	EndNode end = new EndNode();
+    	end.setId(4);
+    	end.setName("End");
+    	process.addNode(end);
+    	new ConnectionImpl(subProcessNode, Node.CONNECTION_DEFAULT_TYPE, end, Node.CONNECTION_DEFAULT_TYPE);
+    	
+    	PackageBuilder packageBuilder = new PackageBuilder();
+    	ProcessBuilder processBuilder = new ProcessBuilder(packageBuilder);
+    	processBuilder.buildProcess(process);
+
+    	process = new RuleFlowProcess();
+    	process.setId("org.drools.test.SubProcess");
+    	process.setName("SubProcess");
+    	process.setPackageName("org.drools.test");
+    	start = new StartNode();
+    	start.setId(1);
+    	start.setName("Start");
+    	process.addNode(start);
+    	actionNode = new ActionNode();
+    	actionNode.setId(2);
+    	actionNode.setName("Action");
+    	action = new DroolsConsequenceAction();
+    	action.setDialect("java");
+    	action.setConsequence("System.out.println(\"Executed action\");");
+    	actionNode.setAction(action);
+    	process.addNode(actionNode);
+    	new ConnectionImpl(start, Node.CONNECTION_DEFAULT_TYPE, actionNode, Node.CONNECTION_DEFAULT_TYPE);
+    	WorkItemNode workItemNode = new WorkItemNode();
+    	workItemNode.setId(3);
+    	workItemNode.setName("WorkItem1");
+    	Work work = new WorkImpl();
+    	work.setName("MyWork");
+    	workItemNode.setWork(work);
+    	process.addNode(workItemNode);
+    	new ConnectionImpl(actionNode, Node.CONNECTION_DEFAULT_TYPE, workItemNode, Node.CONNECTION_DEFAULT_TYPE);
+    	end = new EndNode();
+    	end.setId(6);
+    	end.setName("End");
+    	process.addNode(end);
+    	new ConnectionImpl(workItemNode, Node.CONNECTION_DEFAULT_TYPE, end, Node.CONNECTION_DEFAULT_TYPE);
+
+    	processBuilder.buildProcess(process);
+    	return packageBuilder.getPackage();
+    }
+    
+	public void testPersistenceTimer() throws Exception {
+		Properties properties = new Properties();
+		properties.put(
+	        "processInstanceManagerFactory", 
+	        "org.drools.persistence.processinstance.JPAProcessInstanceManagerFactory");
+		properties.put(
+	        "workItemManagerFactory", 
+	        "org.drools.persistence.processinstance.JPAWorkItemManagerFactory");
+        RuleBaseConfiguration conf = new RuleBaseConfiguration(properties);
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase(conf);
+        Package pkg = getProcessTimer();
+        ruleBase.addPackage(pkg);
+
+        SingleSessionCommandService service = new SingleSessionCommandService(ruleBase);
+        StartProcessCommand startProcessCommand = new StartProcessCommand();
+        startProcessCommand.setProcessId("org.drools.test.TestProcess");
+        ProcessInstance processInstance = (ProcessInstance) service.execute(startProcessCommand);
+        System.out.println("Started process instance " + processInstance.getId());
+        
+        service = new SingleSessionCommandService(ruleBase);
+        GetProcessInstanceCommand getProcessInstanceCommand = new GetProcessInstanceCommand();
+        getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
+        processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
+        assertNotNull(processInstance);
+
+        service = new SingleSessionCommandService(ruleBase);
+        Thread.sleep(200);
+        getProcessInstanceCommand = new GetProcessInstanceCommand();
+        getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
+        processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
+        assertNull(processInstance);
+	}
+
+    private Package getProcessTimer() {
+    	RuleFlowProcess process = new RuleFlowProcess();
+    	process.setId("org.drools.test.TestProcess");
+    	process.setName("TestProcess");
+    	process.setPackageName("org.drools.test");
+    	StartNode start = new StartNode();
+    	start.setId(1);
+    	start.setName("Start");
+    	process.addNode(start);
+    	TimerNode timerNode = new TimerNode();
+    	timerNode.setId(2);
+    	timerNode.setName("Timer");
+    	Timer timer = new Timer();
+    	timer.setDelay(200);
+    	timerNode.setTimer(timer);
+    	process.addNode(timerNode);
+    	new ConnectionImpl(start, Node.CONNECTION_DEFAULT_TYPE, timerNode, Node.CONNECTION_DEFAULT_TYPE);
+    	ActionNode actionNode = new ActionNode();
+    	actionNode.setId(3);
+    	actionNode.setName("Action");
+    	DroolsConsequenceAction action = new DroolsConsequenceAction();
+    	action.setDialect("java");
+    	action.setConsequence("System.out.println(\"Executed action\");");
+    	actionNode.setAction(action);
+    	process.addNode(actionNode);
+    	new ConnectionImpl(timerNode, Node.CONNECTION_DEFAULT_TYPE, actionNode, Node.CONNECTION_DEFAULT_TYPE);
+    	EndNode end = new EndNode();
+    	end.setId(6);
+    	end.setName("End");
+    	process.addNode(end);
+    	new ConnectionImpl(actionNode, Node.CONNECTION_DEFAULT_TYPE, end, Node.CONNECTION_DEFAULT_TYPE);
+    	
+    	PackageBuilder packageBuilder = new PackageBuilder();
+    	ProcessBuilder processBuilder = new ProcessBuilder(packageBuilder);
+    	processBuilder.buildProcess(process);
+    	return packageBuilder.getPackage();
+    }
+    
+}

Added: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/session/TestWorkItemHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/session/TestWorkItemHandler.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/session/TestWorkItemHandler.java	2008-09-10 23:47:45 UTC (rev 22664)
@@ -0,0 +1,33 @@
+package org.drools.persistence.session;
+
+import org.drools.process.instance.WorkItem;
+import org.drools.process.instance.WorkItemHandler;
+import org.drools.process.instance.WorkItemManager;
+
+public class TestWorkItemHandler implements WorkItemHandler {
+
+	private static TestWorkItemHandler INSTANCE = new TestWorkItemHandler();
+	
+	private WorkItem workItem;
+	
+	private TestWorkItemHandler() {
+	}
+	
+	public static TestWorkItemHandler getInstance() {
+		return INSTANCE;
+	}
+	
+	public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
+		this.workItem = workItem;
+	}
+
+	public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {
+	}
+	
+	public WorkItem getWorkItem() {
+		WorkItem result = workItem;
+		workItem = null;
+		return result;
+	}
+
+}

Added: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/resources/META-INF/MyWorkItemHandlers.conf
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/resources/META-INF/MyWorkItemHandlers.conf	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/resources/META-INF/MyWorkItemHandlers.conf	2008-09-10 23:47:45 UTC (rev 22664)
@@ -0,0 +1,11 @@
+// We use MVEL to return a List of work definitions
+// The properties of the work definitions are specified as a Map<String, Object>
+// The allowed properties are name, parameters, displayName, icon and customEditor
+// The returned result should thus be of type List<Map<String, Object>>
+import org.drools.persistence.session.TestWorkItemHandler;
+
+[
+
+  "MyWork" : TestWorkItemHandler.getInstance()
+      
+]
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/resources/META-INF/drools.rulebase.conf
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/resources/META-INF/drools.rulebase.conf	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/resources/META-INF/drools.rulebase.conf	2008-09-10 23:47:45 UTC (rev 22664)
@@ -0,0 +1 @@
+drools.workItemHandlers = MyWorkItemHandlers.conf




More information about the jboss-svn-commits mailing list