[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