[jboss-svn-commits] JBL Code SVN: r24677 - in labs/jbossrules/trunk: drools-core/src/main/java/org/drools/process/command/impl and 4 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Tue Jan 13 12:18:06 EST 2009


Author: KrisVerlaenen
Date: 2009-01-13 12:18:06 -0500 (Tue, 13 Jan 2009)
New Revision: 24677

Added:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/AbortWorkItemCommand.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/Interceptor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/AbstractInterceptor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/AsynchronousInterceptor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/LoggingInterceptor.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/TransactionInterceptor.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/CommandBasedStatefulKnowledgeSession.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/session/PersistentStatefulSessionTest.java
   labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/resources/WorkItemsProcess.rf
Removed:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/AsynchronousCommandService.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/StatefulSessionCommandService.java
Modified:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/Command.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/CommandService.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/CompleteWorkItemCommand.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/GetProcessInstanceCommand.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/InsertObjectCommand.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/SignalEventCommand.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/StartProcessCommand.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/DefaultCommandService.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/resources/META-INF/drools.rulebase.conf
Log:
JBRULES-1915: Improve process persistence usability
 - added partial command-based implementation of StatefulKnowledgeSession

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/AbortWorkItemCommand.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/AbortWorkItemCommand.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/AbortWorkItemCommand.java	2009-01-13 17:18:06 UTC (rev 24677)
@@ -0,0 +1,26 @@
+package org.drools.process.command;
+
+import org.drools.StatefulSession;
+
+public class AbortWorkItemCommand implements Command<Object> {
+	
+	private long workItemId;
+	
+	public long getWorkItemId() {
+		return workItemId;
+	}
+
+	public void setWorkItemId(long workItemId) {
+		this.workItemId = workItemId;
+	}
+
+	public Object execute(StatefulSession session) {
+		session.getWorkItemManager().abortWorkItem(workItemId);
+		return null;
+	}
+	
+	public String toString() {
+		return "session.getWorkItemManager().abortWorkItem(" + workItemId + ");";
+	}
+
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/Command.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/Command.java	2009-01-13 17:02:55 UTC (rev 24676)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/Command.java	2009-01-13 17:18:06 UTC (rev 24677)
@@ -1,9 +1,9 @@
 package org.drools.process.command;
 
-import org.drools.WorkingMemory;
+import org.drools.StatefulSession;
 
 public interface Command<T> {
 	
-	T execute(WorkingMemory workingMemory);
+	T execute(StatefulSession session);
 	
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/CommandService.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/CommandService.java	2009-01-13 17:02:55 UTC (rev 24676)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/CommandService.java	2009-01-13 17:18:06 UTC (rev 24677)
@@ -1,7 +1,13 @@
 package org.drools.process.command;
 
+import org.drools.StatefulSession;
+
 public interface CommandService {
 	
 	<T> T execute(Command<T> command);
 
+	StatefulSession getSession();
+	
+	void dispose();
+	
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/CompleteWorkItemCommand.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/CompleteWorkItemCommand.java	2009-01-13 17:02:55 UTC (rev 24676)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/CompleteWorkItemCommand.java	2009-01-13 17:18:06 UTC (rev 24677)
@@ -3,7 +3,7 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import org.drools.WorkingMemory;
+import org.drools.StatefulSession;
 
 public class CompleteWorkItemCommand implements Command<Object> {
 	
@@ -26,9 +26,24 @@
 		this.results = results;
 	}
 
-	public Object execute(WorkingMemory workingMemory) {
-		workingMemory.getWorkItemManager().completeWorkItem(workItemId, results);
+	public Object execute(StatefulSession session) {
+		session.getWorkItemManager().completeWorkItem(workItemId, results);
 		return null;
 	}
 
+	public String toString() {
+		String result = "session.getWorkItemManager().completeWorkItem(" + workItemId + ", [";
+		if (results != null) {
+			int i = 0;
+			for (Map.Entry<String, Object> entry: results.entrySet()) {
+				if (i++ > 0) {
+					result += ", ";
+				}
+				result += entry.getKey() + "=" + entry.getValue();
+			}
+		}
+		result += "]);";
+		return result;
+	}
+
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/GetProcessInstanceCommand.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/GetProcessInstanceCommand.java	2009-01-13 17:02:55 UTC (rev 24676)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/GetProcessInstanceCommand.java	2009-01-13 17:18:06 UTC (rev 24677)
@@ -1,6 +1,8 @@
 package org.drools.process.command;
 
-import org.drools.WorkingMemory;
+import java.util.Map;
+
+import org.drools.StatefulSession;
 import org.drools.process.instance.ProcessInstance;
 
 public class GetProcessInstanceCommand implements Command<ProcessInstance> {
@@ -15,11 +17,15 @@
 		this.processInstanceId = processInstanceId;
 	}
 	
-	public ProcessInstance execute(WorkingMemory workingMemory) {
+	public ProcessInstance execute(StatefulSession session) {
 		if (processInstanceId == null) {
 			return null;
 		}
-		return workingMemory.getProcessInstance(processInstanceId);
+		return session.getProcessInstance(processInstanceId);
 	}
 
+	public String toString() {
+		return "session.getProcessInstance(" + processInstanceId + ");";
+	}
+
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/InsertObjectCommand.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/InsertObjectCommand.java	2009-01-13 17:02:55 UTC (rev 24676)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/InsertObjectCommand.java	2009-01-13 17:18:06 UTC (rev 24677)
@@ -3,7 +3,7 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import org.drools.WorkingMemory;
+import org.drools.StatefulSession;
 
 public class InsertObjectCommand implements Command<Object> {
 	
@@ -18,11 +18,23 @@
 		this.objects = objects;
 	}
 	
-	public Object execute(WorkingMemory workingMemory) {
+	public Object execute(StatefulSession session) {
 		for (Object object: objects) {
-			workingMemory.insert(object);
+			session.insert(object);
 		}
 		return null;
 	}
 
+	public String toString() {
+		String result = "";
+		int i = 0;
+		for (Object object: objects) {
+			if (i++ > 0) {
+				result += "\n";
+			}
+			result += "session.insert(" + object + ");";
+		}
+		return result;
+	}
+
 }

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/Interceptor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/Interceptor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/Interceptor.java	2009-01-13 17:18:06 UTC (rev 24677)
@@ -0,0 +1,10 @@
+package org.drools.process.command;
+
+
+public interface Interceptor extends CommandService {
+
+	void setNext(CommandService commandService);
+	
+	CommandService getNext();
+	
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/SignalEventCommand.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/SignalEventCommand.java	2009-01-13 17:02:55 UTC (rev 24676)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/SignalEventCommand.java	2009-01-13 17:18:06 UTC (rev 24677)
@@ -1,7 +1,7 @@
 package org.drools.process.command;
 
+import org.drools.StatefulSession;
 import org.drools.process.instance.ProcessInstance;
-import org.drools.WorkingMemory;
 
 public class SignalEventCommand implements Command<Object> {
 	
@@ -33,11 +33,11 @@
 		this.event = event;
 	}
 
-	public Object execute(WorkingMemory workingMemory) {
+	public Object execute(StatefulSession session) {
 		if (processInstanceId == -1) {
-			workingMemory.getSignalManager().signalEvent(eventType, event);
+			session.getSignalManager().signalEvent(eventType, event);
 		} else {
-			ProcessInstance processInstance = ( ProcessInstance ) workingMemory.getProcessInstance(processInstanceId);
+			ProcessInstance processInstance = session.getProcessInstance(processInstanceId);
 			if (processInstance != null) {
 				processInstance.signalEvent(eventType, processInstance);
 			}
@@ -45,4 +45,12 @@
 		return null;
 	}
 
+	public String toString() {
+		if (processInstanceId == -1) {
+			return "session.getSignalManager().signalEvent(" + eventType + ", " + event + ");";
+		} else {
+			return "processInstance.signalEvent(" + eventType + ", " + event + ");";
+		}
+	}
+
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/StartProcessCommand.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/StartProcessCommand.java	2009-01-13 17:02:55 UTC (rev 24676)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/StartProcessCommand.java	2009-01-13 17:18:06 UTC (rev 24677)
@@ -4,8 +4,8 @@
 import java.util.List;
 import java.util.Map;
 
+import org.drools.StatefulSession;
 import org.drools.process.instance.ProcessInstance;
-import org.drools.WorkingMemory;
 
 public class StartProcessCommand implements Command<ProcessInstance> {
 	
@@ -37,15 +37,30 @@
 		this.data = data;
 	}
 
-	public ProcessInstance execute(WorkingMemory workingMemory) {
+	public ProcessInstance execute(StatefulSession session) {
 		if (data != null) {
 			for (Object o: data) {
-				workingMemory.insert(o);
+				session.insert(o);
 			}
 		}
-		ProcessInstance processInstance = ( ProcessInstance ) workingMemory.startProcess(processId, parameters);
-		workingMemory.fireAllRules();
+		ProcessInstance processInstance = (ProcessInstance) session.startProcess(processId, parameters);
+		session.fireAllRules();
 		return processInstance;
 	}
 
+	public String toString() {
+		String result = "session.startProcess(" + processId + ", [";
+		if (parameters != null) {
+			int i = 0;
+			for (Map.Entry<String, Object> entry: parameters.entrySet()) {
+				if (i++ > 0) {
+					result += ", ";
+				}
+				result += entry.getKey() + "=" + entry.getValue();
+			}
+		}
+		result += "]);";
+		return result;
+	}
+
 }

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/AbstractInterceptor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/AbstractInterceptor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/AbstractInterceptor.java	2009-01-13 17:18:06 UTC (rev 24677)
@@ -0,0 +1,32 @@
+package org.drools.process.command.impl;
+
+import org.drools.StatefulSession;
+import org.drools.process.command.Command;
+import org.drools.process.command.CommandService;
+import org.drools.process.command.Interceptor;
+
+public abstract class AbstractInterceptor implements Interceptor {
+
+	private CommandService next;
+	
+	public StatefulSession getSession() {
+		return next.getSession();
+	}
+	
+	public void setNext(CommandService commandService) {
+		this.next = commandService;
+	}
+	
+	public CommandService getNext() {
+		return next;
+	}
+
+	protected <T> T executeNext(Command<T> command) {
+		return next.execute(command);
+	}
+	
+	public void dispose() {
+		next.dispose();
+	}
+
+}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/AsynchronousCommandService.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/AsynchronousCommandService.java	2009-01-13 17:02:55 UTC (rev 24676)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/AsynchronousCommandService.java	2009-01-13 17:18:06 UTC (rev 24677)
@@ -1,24 +0,0 @@
-package org.drools.process.command.impl;
-
-import org.drools.process.command.Command;
-import org.drools.process.command.CommandService;
-import org.drools.WorkingMemory;
-
-public class AsynchronousCommandService implements CommandService {
-
-	private WorkingMemory workingMemory;
-	
-	public AsynchronousCommandService(WorkingMemory workingMemory) {
-		this.workingMemory = workingMemory;
-	}
-	
-	public <T> T execute(final Command<T> command) {
-		new Thread(new Runnable() {
-			public void run() {
-				command.execute(workingMemory);	
-			}
-		}).start();
-		return null;
-	}
-
-}

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/AsynchronousInterceptor.java (from rev 24649, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/AsynchronousCommandService.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/AsynchronousInterceptor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/AsynchronousInterceptor.java	2009-01-13 17:18:06 UTC (rev 24677)
@@ -0,0 +1,16 @@
+package org.drools.process.command.impl;
+
+import org.drools.process.command.Command;
+
+public class AsynchronousInterceptor extends AbstractInterceptor {
+
+	public <T> T execute(final Command<T> command) {
+		new Thread(new Runnable() {
+			public void run() {
+				executeNext(command);
+			}
+		}).start();
+		return null;
+	}
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/AsynchronousInterceptor.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/DefaultCommandService.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/DefaultCommandService.java	2009-01-13 17:02:55 UTC (rev 24676)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/DefaultCommandService.java	2009-01-13 17:18:06 UTC (rev 24677)
@@ -1,19 +1,27 @@
 package org.drools.process.command.impl;
 
+import org.drools.StatefulSession;
 import org.drools.process.command.Command;
 import org.drools.process.command.CommandService;
-import org.drools.WorkingMemory;
 
 public class DefaultCommandService implements CommandService {
 
-	private WorkingMemory workingMemory;
+	private StatefulSession session;
 	
-	public DefaultCommandService(WorkingMemory workingMemory) {
-		this.workingMemory = workingMemory;
+	public DefaultCommandService(StatefulSession session) {
+		this.session = session;
 	}
 	
+	public StatefulSession getSession() {
+		return session;
+	}
+	
 	public <T> T execute(Command<T> command) {
-		return command.execute(workingMemory);
+		return command.execute(session);
 	}
+	
+	public void dispose() {
+		session.dispose();
+	}
 
 }

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/LoggingInterceptor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/LoggingInterceptor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/LoggingInterceptor.java	2009-01-13 17:18:06 UTC (rev 24677)
@@ -0,0 +1,14 @@
+package org.drools.process.command.impl;
+
+import org.drools.process.command.Command;
+
+public class LoggingInterceptor extends AbstractInterceptor {
+
+	public <T> T execute(Command<T> command) {
+		System.out.println("Executing --> " + command);
+		T result = executeNext(command);
+		System.out.println("Done executing --> " + command);
+		return result;
+	}
+
+}

Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/StatefulSessionCommandService.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/StatefulSessionCommandService.java	2009-01-13 17:02:55 UTC (rev 24676)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/StatefulSessionCommandService.java	2009-01-13 17:18:06 UTC (rev 24677)
@@ -1,41 +0,0 @@
-package org.drools.process.command.impl;
-
-import javax.transaction.xa.XAException;
-
-import org.drools.StatefulSession;
-import org.drools.persistence.Persister;
-import org.drools.persistence.Transaction;
-import org.drools.persistence.memory.MemoryPersister;
-import org.drools.persistence.session.StatefulSessionSnapshotter;
-import org.drools.process.command.Command;
-import org.drools.process.command.CommandService;
-
-public class StatefulSessionCommandService implements CommandService {
-
-	private StatefulSession session;
-	
-	public StatefulSessionCommandService(StatefulSession session) {
-		this.session = session;
-	}
-	
-	public <T> T execute(Command<T> command) {
-		Persister<StatefulSession> persister =
-			new MemoryPersister<StatefulSession>(new StatefulSessionSnapshotter(session));
-		persister.save();
-		Transaction transaction = persister.getTransaction();
-		try {
-			transaction.start();
-			T 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);
-			}
-		}
-	}
-
-}

Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/TransactionInterceptor.java (from rev 24649, labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/StatefulSessionCommandService.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/TransactionInterceptor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/TransactionInterceptor.java	2009-01-13 17:18:06 UTC (rev 24677)
@@ -0,0 +1,34 @@
+package org.drools.process.command.impl;
+
+import javax.transaction.xa.XAException;
+
+import org.drools.StatefulSession;
+import org.drools.persistence.Persister;
+import org.drools.persistence.Transaction;
+import org.drools.persistence.memory.MemoryPersister;
+import org.drools.persistence.session.StatefulSessionSnapshotter;
+import org.drools.process.command.Command;
+
+public class TransactionInterceptor extends AbstractInterceptor {
+
+	public <T> T execute(Command<T> command) {
+		Persister<StatefulSession> persister =
+			new MemoryPersister<StatefulSession>(new StatefulSessionSnapshotter(getSession()));
+		persister.save();
+		Transaction transaction = persister.getTransaction();
+		try {
+			transaction.start();
+			T result = super.executeNext(command);
+			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);
+			}
+		}
+	}
+
+}


Property changes on: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/command/impl/TransactionInterceptor.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Added: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/CommandBasedStatefulKnowledgeSession.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/CommandBasedStatefulKnowledgeSession.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/CommandBasedStatefulKnowledgeSession.java	2009-01-13 17:18:06 UTC (rev 24677)
@@ -0,0 +1,217 @@
+package org.drools.persistence.session;
+
+import java.util.Collection;
+import java.util.Map;
+
+import org.drools.KnowledgeBase;
+import org.drools.event.process.ProcessEventListener;
+import org.drools.event.rule.AgendaEventListener;
+import org.drools.event.rule.WorkingMemoryEventListener;
+import org.drools.process.command.AbortWorkItemCommand;
+import org.drools.process.command.CommandService;
+import org.drools.process.command.CompleteWorkItemCommand;
+import org.drools.process.command.GetProcessInstanceCommand;
+import org.drools.process.command.SignalEventCommand;
+import org.drools.process.command.StartProcessCommand;
+import org.drools.runtime.ExitPoint;
+import org.drools.runtime.GlobalResolver;
+import org.drools.runtime.ObjectFilter;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.process.ProcessInstance;
+import org.drools.runtime.process.WorkItemHandler;
+import org.drools.runtime.process.WorkItemManager;
+import org.drools.runtime.rule.Agenda;
+import org.drools.runtime.rule.AgendaFilter;
+import org.drools.runtime.rule.FactHandle;
+import org.drools.runtime.rule.WorkingMemoryEntryPoint;
+import org.drools.time.SessionClock;
+
+public class CommandBasedStatefulKnowledgeSession implements StatefulKnowledgeSession {
+
+	private CommandService commandService;
+	private transient WorkItemManager workItemManager;
+	
+	public CommandBasedStatefulKnowledgeSession(CommandService commandService) {
+		this.commandService = commandService;
+	}
+	
+	public ProcessInstance getProcessInstance(long id) {
+		GetProcessInstanceCommand command = new GetProcessInstanceCommand();
+		command.setProcessInstanceId(id);
+		return commandService.execute(command);
+	}
+
+	public Collection<ProcessInstance> getProcessInstances() {
+		throw new UnsupportedOperationException();
+	}
+
+	public WorkItemManager getWorkItemManager() {
+		if (workItemManager == null) {
+			workItemManager = new WorkItemManager() {
+				public void completeWorkItem(long id, Map<String, Object> results) {
+					CompleteWorkItemCommand command = new CompleteWorkItemCommand();
+					command.setWorkItemId(id);
+					command.setResults(results);
+					commandService.execute(command);
+				}
+				public void abortWorkItem(long id) {
+					AbortWorkItemCommand command = new AbortWorkItemCommand();
+					command.setWorkItemId(id);
+					commandService.execute(command);
+				}
+				public void registerWorkItemHandler(String workItemName, WorkItemHandler handler) {
+					throw new UnsupportedOperationException();
+				}
+			};
+		}
+		return workItemManager;
+	}
+
+	public void signalEvent(String type, Object event) {
+		SignalEventCommand command = new SignalEventCommand();
+		command.setEventType(type);
+		command.setEvent(event);
+		commandService.execute(command);
+	}
+
+	public ProcessInstance startProcess(String processId) {
+		return startProcess(processId, null);
+	}
+
+	public ProcessInstance startProcess(String processId,
+			Map<String, Object> parameters) {
+		StartProcessCommand command = new StartProcessCommand();
+		command.setProcessId(processId);
+		command.setParameters(parameters);
+		return commandService.execute(command);
+	}
+
+	public void dispose() {
+		commandService.dispose();
+	}
+
+	public int fireAllRules() {
+		throw new UnsupportedOperationException();
+	}
+
+	public int fireAllRules(int max) {
+		throw new UnsupportedOperationException();
+	}
+
+	public int fireAllRules(AgendaFilter agendaFilter) {
+		throw new UnsupportedOperationException();
+	}
+
+	public void fireUntilHalt() {
+		throw new UnsupportedOperationException();
+	}
+
+	public void fireUntilHalt(AgendaFilter agendaFilter) {
+		throw new UnsupportedOperationException();
+	}
+
+	public KnowledgeBase getKnowledgeBase() {
+		throw new UnsupportedOperationException();
+	}
+
+	public void registerExitPoint(String name, ExitPoint exitPoint) {
+		throw new UnsupportedOperationException();
+	}
+
+	public void setGlobal(String identifier, Object object) {
+		throw new UnsupportedOperationException();
+	}
+
+	public void setGlobalResolver(GlobalResolver globalResolver) {
+		throw new UnsupportedOperationException();
+	}
+
+	public void unregisterExitPoint(String name) {
+		throw new UnsupportedOperationException();
+	}
+
+	public Agenda getAgenda() {
+		throw new UnsupportedOperationException();
+	}
+
+	public FactHandle getFactHandle(Object object) {
+		throw new UnsupportedOperationException();
+	}
+
+	public Collection<? extends FactHandle> getFactHandles() {
+		throw new UnsupportedOperationException();
+	}
+
+	public Collection<? extends FactHandle> getFactHandles(ObjectFilter filter) {
+		throw new UnsupportedOperationException();
+	}
+
+	public Collection<?> getObjects() {
+		throw new UnsupportedOperationException();
+	}
+
+	public Collection<?> getObjects(ObjectFilter filter) {
+		throw new UnsupportedOperationException();
+	}
+
+	public SessionClock getSessionClock() {
+		throw new UnsupportedOperationException();
+	}
+
+	public WorkingMemoryEntryPoint getWorkingMemoryEntryPoint(String name) {
+		throw new UnsupportedOperationException();
+	}
+
+	public void halt() {
+		throw new UnsupportedOperationException();
+	}
+
+	public FactHandle insert(Object object) {
+		throw new UnsupportedOperationException();
+	}
+
+	public void retract(FactHandle handle) {
+		throw new UnsupportedOperationException();
+	}
+
+	public void update(FactHandle handle, Object object) {
+		throw new UnsupportedOperationException();
+	}
+
+	public void addEventListener(WorkingMemoryEventListener listener) {
+		throw new UnsupportedOperationException();
+	}
+
+	public void addEventListener(AgendaEventListener listener) {
+		throw new UnsupportedOperationException();
+	}
+
+	public Collection<AgendaEventListener> getAgendaEventListeners() {
+		throw new UnsupportedOperationException();
+	}
+
+	public Collection<WorkingMemoryEventListener> getWorkingMemoryEventListeners() {
+		throw new UnsupportedOperationException();
+	}
+
+	public void removeEventListener(WorkingMemoryEventListener listener) {
+		throw new UnsupportedOperationException();
+	}
+
+	public void removeEventListener(AgendaEventListener listener) {
+		throw new UnsupportedOperationException();
+	}
+
+	public void addEventListener(ProcessEventListener listener) {
+		throw new UnsupportedOperationException();
+	}
+
+	public Collection<ProcessEventListener> getProcessEventListeners() {
+		throw new UnsupportedOperationException();
+	}
+
+	public void removeEventListener(ProcessEventListener listener) {
+		throw new UnsupportedOperationException();
+	}
+
+}
\ No newline at end of file

Modified: 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	2009-01-13 17:02:55 UTC (rev 24676)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/SingleSessionCommandService.java	2009-01-13 17:18:06 UTC (rev 24677)
@@ -102,12 +102,16 @@
 			.setPersister(persister);
 	}
 	
-	public Object execute(Command command) {
+	public StatefulSession getSession() {
+		return persister.getObject();
+	}
+	
+	public <T> T execute(Command<T> command) {
 		StatefulSession session = persister.getObject();
 		Transaction transaction = persister.getTransaction();
 		try {
 			transaction.start();
-			Object result = command.execute(session);
+			T result = command.execute(session);
 			transaction.commit();
 			return result;
 		} catch (Throwable t) {

Added: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/session/PersistentStatefulSessionTest.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/session/PersistentStatefulSessionTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/session/PersistentStatefulSessionTest.java	2009-01-13 17:18:06 UTC (rev 24677)
@@ -0,0 +1,91 @@
+package org.drools.persistence.session;
+
+import junit.framework.TestCase;
+
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.io.impl.ClassPathResource;
+import org.drools.process.command.impl.LoggingInterceptor;
+import org.drools.runtime.process.ProcessInstance;
+import org.drools.runtime.process.WorkItem;
+
+public class PersistentStatefulSessionTest extends TestCase {
+	
+	public void testPersistenceWorkItems() {
+		KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add(new ClassPathResource("WorkItemsProcess.rf"), ResourceType.DRF);
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
+        
+        LoggingInterceptor interceptor = new LoggingInterceptor();
+        SingleSessionCommandService commandService = new SingleSessionCommandService(kbase);
+        interceptor.setNext(commandService);
+        CommandBasedStatefulKnowledgeSession session = new CommandBasedStatefulKnowledgeSession(interceptor);
+        ProcessInstance processInstance = session.startProcess("org.drools.test.TestProcess");
+        System.out.println("Started process instance " + processInstance.getId());
+        String sessionId = commandService.getSessionId();
+        
+        TestWorkItemHandler handler = TestWorkItemHandler.getInstance();
+        WorkItem workItem = handler.getWorkItem();
+        assertNotNull(workItem);
+        
+        interceptor = new LoggingInterceptor();
+        commandService = new SingleSessionCommandService(kbase, sessionId);
+        interceptor.setNext(commandService);
+        session = new CommandBasedStatefulKnowledgeSession(interceptor);
+        processInstance = session.getProcessInstance(processInstance.getId());
+        assertNotNull(processInstance);
+        
+        interceptor = new LoggingInterceptor();
+        commandService = new SingleSessionCommandService(kbase, sessionId);
+        interceptor.setNext(commandService);
+        session = new CommandBasedStatefulKnowledgeSession(interceptor);
+        session.getWorkItemManager().completeWorkItem(workItem.getId(), null);
+        
+        workItem = handler.getWorkItem();
+        assertNotNull(workItem);
+        
+        interceptor = new LoggingInterceptor();
+        commandService = new SingleSessionCommandService(kbase, sessionId);
+        interceptor.setNext(commandService);
+        session = new CommandBasedStatefulKnowledgeSession(interceptor);
+        processInstance = session.getProcessInstance(processInstance.getId());
+        assertNotNull(processInstance);
+        
+        interceptor = new LoggingInterceptor();
+        commandService = new SingleSessionCommandService(kbase, sessionId);
+        interceptor.setNext(commandService);
+        session = new CommandBasedStatefulKnowledgeSession(interceptor);
+        session.getWorkItemManager().completeWorkItem(workItem.getId(), null);
+        
+        workItem = handler.getWorkItem();
+        assertNotNull(workItem);
+        
+        interceptor = new LoggingInterceptor();
+        commandService = new SingleSessionCommandService(kbase, sessionId);
+        interceptor.setNext(commandService);
+        session = new CommandBasedStatefulKnowledgeSession(interceptor);
+        processInstance = session.getProcessInstance(processInstance.getId());
+        assertNotNull(processInstance);
+        
+        interceptor = new LoggingInterceptor();
+        commandService = new SingleSessionCommandService(kbase, sessionId);
+        interceptor.setNext(commandService);
+        session = new CommandBasedStatefulKnowledgeSession(interceptor);
+        session.getWorkItemManager().completeWorkItem(workItem.getId(), null);
+        
+        workItem = handler.getWorkItem();
+        assertNull(workItem);
+        
+        interceptor = new LoggingInterceptor();
+        commandService = new SingleSessionCommandService(kbase, sessionId);
+        interceptor.setNext(commandService);
+        session = new CommandBasedStatefulKnowledgeSession(interceptor);
+        processInstance = session.getProcessInstance(processInstance.getId());
+        assertNull(processInstance);
+	}
+    
+}

Modified: 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	2009-01-13 17:02:55 UTC (rev 24676)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/resources/META-INF/drools.rulebase.conf	2009-01-13 17:18:06 UTC (rev 24677)
@@ -1 +1,4 @@
 drools.workItemHandlers = MyWorkItemHandlers.conf
+processInstanceManagerFactory = org.drools.persistence.processinstance.JPAProcessInstanceManagerFactory
+workItemManagerFactory = org.drools.persistence.processinstance.JPAWorkItemManagerFactory
+processSignalManagerFactory = org.drools.persistence.processinstance.JPASignalManagerFactory
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/resources/WorkItemsProcess.rf
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/resources/WorkItemsProcess.rf	                        (rev 0)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/resources/WorkItemsProcess.rf	2009-01-13 17:18:06 UTC (rev 24677)
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?> 
+<process xmlns="http://drools.org/drools-5.0/process"
+         xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
+         xs:schemaLocation="http://drools.org/drools-5.0/process drools-processes-5.0.xsd"
+         type="RuleFlow" name="TestProcess" id="org.drools.test.TestProcess" package-name="org.drools.test" >
+
+  <header>
+  </header>
+
+  <nodes>
+    <actionNode id="2" name="Action" >
+        <action type="expression" dialect="java" >System.out.println("Executed action");</action>
+    </actionNode>
+    <workItem id="4" name="WorkItem2" >
+      <work name="MyWork" >
+      </work>
+    </workItem>
+    <end id="6" name="End" />
+    <start id="1" name="Start" />
+    <workItem id="3" name="WorkItem1" >
+      <work name="MyWork" >
+      </work>
+    </workItem>
+    <workItem id="5" name="WorkItem3" >
+      <work name="MyWork" >
+      </work>
+    </workItem>
+  </nodes>
+
+  <connections>
+    <connection from="1" to="2" />
+    <connection from="3" to="4" />
+    <connection from="5" to="6" />
+    <connection from="2" to="3" />
+    <connection from="4" to="5" />
+  </connections>
+
+</process>
\ No newline at end of file




More information about the jboss-svn-commits mailing list