[jboss-svn-commits] JBL Code SVN: r30067 - in labs/jbossrules/trunk: drools-core/src/main/java/org/drools/marshalling/impl and 6 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Nov 6 20:16:04 EST 2009


Author: KrisVerlaenen
Date: 2009-11-06 20:16:03 -0500 (Fri, 06 Nov 2009)
New Revision: 30067

Added:
   labs/jbossrules/trunk/drools-persistence-jpa/src/test/resources/RuleSetProcess.rf
   labs/jbossrules/trunk/drools-persistence-jpa/src/test/resources/RuleSetRules.drl
   labs/jbossrules/trunk/drools-persistence-jpa/src/test/resources/StateProcess.rf
Modified:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/RuleFlowGroupImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/AbstractProcessInstanceMarshaller.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/PersisterHelper.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/PropagationQueuingNode.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/WorkflowProcessInstanceImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/MilestoneNodeInstance.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/RuleSetNodeInstance.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/StateNodeInstance.java
   labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/JPAProcessInstanceManager.java
   labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/ProcessInstanceInfo.java
   labs/jbossrules/trunk/drools-persistence-jpa/src/test/java/org/drools/persistence/session/PersistentStatefulSessionTest.java
Log:
JBRULES-2328: Change the way activations are notified from listener to event signaling
 - changed from event listener to signal listener

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java	2009-11-06 20:27:50 UTC (rev 30066)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java	2009-11-07 01:16:03 UTC (rev 30067)
@@ -54,11 +54,15 @@
 import org.drools.concurrent.ExecutorService;
 import org.drools.concurrent.ExternalExecutorService;
 import org.drools.definition.process.Process;
+import org.drools.event.ActivationCreatedEvent;
 import org.drools.event.AgendaEventListener;
 import org.drools.event.AgendaEventSupport;
+import org.drools.event.DefaultAgendaEventListener;
+import org.drools.event.DefaultRuleFlowEventListener;
 import org.drools.event.RuleBaseEventListener;
 import org.drools.event.RuleFlowEventListener;
 import org.drools.event.RuleFlowEventSupport;
+import org.drools.event.RuleFlowGroupDeactivatedEvent;
 import org.drools.event.WorkingMemoryEventListener;
 import org.drools.event.WorkingMemoryEventSupport;
 import org.drools.management.DroolsManagementAgent;
@@ -340,6 +344,8 @@
         this.lastIdleTimestamp = new AtomicLong( -1 );
         
         initManagementBeans();
+        
+        initProcessActivationListener();
     }
 
     private void initManagementBeans() {
@@ -1681,6 +1687,31 @@
 
         }
     }
+    
+    private void initProcessActivationListener() {
+    	addEventListener(new DefaultAgendaEventListener() {
+    	    public void activationCreated(ActivationCreatedEvent event, WorkingMemory workingMemory) {
+		        String ruleFlowGroup = event.getActivation().getRule().getRuleFlowGroup();
+		        if ("DROOLS_SYSTEM".equals(ruleFlowGroup)) {
+		            // new activations of the rule associate with a state node
+		            // signal process instances of that state node
+		            String ruleName = event.getActivation().getRule().getName();
+		            if (ruleName.startsWith("RuleFlowStateNode-")) {
+		            	int index = ruleName.indexOf("-", 18);
+		            	index = ruleName.indexOf("-", index + 1);
+		            	String eventType = ruleName.substring(0, index);
+		            	signalManager.signalEvent(eventType, event);
+		            }
+	            }
+            }
+    	});
+    	addEventListener(new DefaultRuleFlowEventListener() {
+    	    public void afterRuleFlowGroupDeactivated(final RuleFlowGroupDeactivatedEvent event,
+                    final WorkingMemory workingMemory) {
+    	    	signalManager.signalEvent("RuleFlowGroup_" + event.getRuleFlowGroup().getName(), null);
+            }
+    	});
+    }
 
     public ProcessInstance startProcess(final String processId) {
         return startProcess( processId,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/RuleFlowGroupImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/RuleFlowGroupImpl.java	2009-11-06 20:27:50 UTC (rev 30066)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/RuleFlowGroupImpl.java	2009-11-07 01:16:03 UTC (rev 30067)
@@ -253,24 +253,23 @@
         return this.name.hashCode();
     }
 
-    public static class DeactivateCallback
-        implements
-        WorkingMemoryAction {
-        private static final long     serialVersionUID = 400L;
+    public static class DeactivateCallback implements WorkingMemoryAction {
+    	
+        private static final long serialVersionUID = 400L;
+        
         private InternalRuleFlowGroup ruleFlowGroup;
 
-        public DeactivateCallback() {
-        }
-
         public DeactivateCallback(InternalRuleFlowGroup ruleFlowGroup) {
             this.ruleFlowGroup = ruleFlowGroup;
         }
 
         public DeactivateCallback(MarshallerReaderContext context) throws IOException {
-
+        	this.ruleFlowGroup = (InternalRuleFlowGroup) context.wm.getAgenda().getRuleFlowGroup(context.readUTF());
         }
 
         public void write(MarshallerWriteContext context) throws IOException {
+        	context.writeInt( WorkingMemoryAction.DeactivateCallback );
+        	context.writeUTF(ruleFlowGroup.getName());
         }
 
         public void readExternal(ObjectInput in) throws IOException,
@@ -279,14 +278,14 @@
         }
 
         public void writeExternal(ObjectOutput out) throws IOException {
-            out.writeObject( ruleFlowGroup );
+            out.writeObject(ruleFlowGroup);
         }
 
         public void execute(InternalWorkingMemory workingMemory) {
             // check whether ruleflow group is still empty first
-            if ( this.ruleFlowGroup.isEmpty() ) {
+            if (this.ruleFlowGroup.isEmpty()) {
                 // deactivate ruleflow group
-                this.ruleFlowGroup.setActive( false );
+                this.ruleFlowGroup.setActive(false);
             }
         }
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/AbstractProcessInstanceMarshaller.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/AbstractProcessInstanceMarshaller.java	2009-11-06 20:27:50 UTC (rev 30066)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/AbstractProcessInstanceMarshaller.java	2009-11-07 01:16:03 UTC (rev 30067)
@@ -163,6 +163,18 @@
                 stream.writeLong(key);
                 stream.writeInt(triggers.get(key));
             }
+        } else if (nodeInstance instanceof StateNodeInstance) {
+            stream.writeShort(PersisterEnums.STATE_NODE_INSTANCE);
+            List<Long> timerInstances =
+                    ((StateNodeInstance) nodeInstance).getTimerInstances();
+            if (timerInstances != null) {
+                stream.writeInt(timerInstances.size());
+                for (Long id : timerInstances) {
+                    stream.writeLong(id);
+                }
+            } else {
+                stream.writeInt(0);
+            }
         } else if (nodeInstance instanceof CompositeContextNodeInstance) {
             stream.writeShort(PersisterEnums.COMPOSITE_NODE_INSTANCE);
             CompositeContextNodeInstance compositeNodeInstance = (CompositeContextNodeInstance) nodeInstance;
@@ -177,20 +189,23 @@
                 stream.writeInt(0);
             }
             VariableScopeInstance variableScopeInstance = (VariableScopeInstance) compositeNodeInstance.getContextInstance(VariableScope.VARIABLE_SCOPE);
-            Map<String, Object> variables = variableScopeInstance.getVariables();
-            List<String> keys = new ArrayList<String>(variables.keySet());
-            Collections.sort(keys,
-                    new Comparator<String>() {
-
-                        public int compare(String o1,
-                                String o2) {
-                            return o1.compareTo(o2);
-                        }
-                    });
-            stream.writeInt(keys.size());
-            for (String key : keys) {
-                stream.writeUTF(key);
-                stream.writeObject(variables.get(key));
+            if (variableScopeInstance == null) {
+            	stream.writeInt(0);
+            } else {
+	            Map<String, Object> variables = variableScopeInstance.getVariables();
+	            List<String> keys = new ArrayList<String>(variables.keySet());
+	            Collections.sort(keys,
+	                    new Comparator<String>() {
+	                        public int compare(String o1,
+	                                String o2) {
+	                            return o1.compareTo(o2);
+	                        }
+	                    });
+	            stream.writeInt(keys.size());
+	            for (String key : keys) {
+	                stream.writeUTF(key);
+	                stream.writeObject(variables.get(key));
+	            }
             }
             List<NodeInstance> nodeInstances = new ArrayList<NodeInstance>(compositeNodeInstance.getNodeInstances());
             Collections.sort(nodeInstances,
@@ -227,18 +242,6 @@
                 }
             }
             stream.writeShort(PersisterEnums.END);
-        } else if (nodeInstance instanceof StateNodeInstance) {
-            stream.writeShort(PersisterEnums.STATE_NODE_INSTANCE);
-            List<Long> timerInstances =
-                    ((StateNodeInstance) nodeInstance).getTimerInstances();
-            if (timerInstances != null) {
-                stream.writeInt(timerInstances.size());
-                for (Long id : timerInstances) {
-                    stream.writeLong(id);
-                }
-            } else {
-                stream.writeInt(0);
-            }
         } else {
             throw new IllegalArgumentException("Unknown node instance type: " + nodeInstance);
         }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/PersisterHelper.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/PersisterHelper.java	2009-11-06 20:27:50 UTC (rev 30066)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/marshalling/impl/PersisterHelper.java	2009-11-07 01:16:03 UTC (rev 30067)
@@ -8,6 +8,7 @@
 import org.drools.process.instance.event.DefaultSignalManager.SignalProcessInstanceAction;
 import org.drools.reteoo.PropagationQueuingNode.PropagateAction;
 import org.drools.reteoo.ReteooWorkingMemory.WorkingMemoryReteAssertAction;
+import org.drools.reteoo.ReteooWorkingMemory.WorkingMemoryReteExpireAction;
 
 public class PersisterHelper {
     public static WorkingMemoryAction readWorkingMemoryAction(MarshallerReaderContext context) throws IOException, ClassNotFoundException {
@@ -25,7 +26,9 @@
             case WorkingMemoryAction.LogicalRetractCallback : {
                 return new LogicalRetractCallback(context);
             }
-            
+            case WorkingMemoryAction.WorkingMemoryReteExpireAction : {
+                return new WorkingMemoryReteExpireAction(context);
+            }
             case WorkingMemoryAction.SignalProcessInstanceAction : {
                 return new SignalProcessInstanceAction(context);
             }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/PropagationQueuingNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/PropagationQueuingNode.java	2009-11-06 20:27:50 UTC (rev 30066)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/PropagationQueuingNode.java	2009-11-07 01:16:03 UTC (rev 30067)
@@ -379,6 +379,7 @@
         }
 
         public void write( MarshallerWriteContext context ) throws IOException {
+        	context.writeInt( WorkingMemoryAction.PropagateAction );
             context.write( node.getId() );
         }
 

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/WorkflowProcessInstanceImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/WorkflowProcessInstanceImpl.java	2009-11-06 20:27:50 UTC (rev 30066)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/impl/WorkflowProcessInstanceImpl.java	2009-11-07 01:16:03 UTC (rev 30067)
@@ -32,6 +32,7 @@
 import org.drools.definition.process.NodeContainer;
 import org.drools.definition.process.WorkflowProcess;
 import org.drools.process.core.context.variable.VariableScope;
+import org.drools.process.instance.ContextInstance;
 import org.drools.process.instance.ProcessInstance;
 import org.drools.process.instance.context.variable.VariableScopeInstance;
 import org.drools.process.instance.impl.ProcessInstanceImpl;
@@ -160,6 +161,23 @@
 	}
 	
 	public Object getVariable(String name) {
+		// for disconnected process instances, try going through the variable scope instances
+		// (as the default variable scope cannot be retrieved as the link to the process could
+		// be null and the associated working memory is no longer accessible)
+		if (getWorkingMemory() == null) {
+			List<ContextInstance> variableScopeInstances = 
+				getContextInstances(VariableScope.VARIABLE_SCOPE);
+			if (variableScopeInstances != null && variableScopeInstances.size() == 1) {
+				for (ContextInstance contextInstance: variableScopeInstances) {
+					Object value = ((VariableScopeInstance) contextInstance).getVariable(name);
+					if (value != null) {
+						return value;
+					}
+				}
+			}
+			return null;
+		}
+		// else retrieve the variable scope
 		VariableScopeInstance variableScopeInstance = (VariableScopeInstance)
 			getContextInstance(VariableScope.VARIABLE_SCOPE);
 		if (variableScopeInstance == null) {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/MilestoneNodeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/MilestoneNodeInstance.java	2009-11-06 20:27:50 UTC (rev 30066)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/MilestoneNodeInstance.java	2009-11-07 01:16:03 UTC (rev 30067)
@@ -20,6 +20,7 @@
 import java.util.Map;
 
 import org.drools.WorkingMemory;
+import org.drools.common.AbstractWorkingMemory;
 import org.drools.common.InternalAgenda;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
@@ -111,6 +112,9 @@
             String ruleName = event.getActivation().getRule().getName();
             String milestoneName = "RuleFlow-Milestone-" + getProcessInstance().getProcessId() + "-" + getNodeId();
             if (milestoneName.equals(ruleName) && checkProcessInstance(event.getActivation())) {
+        		if ( !((AbstractWorkingMemory) getProcessInstance().getWorkingMemory()).getActionQueue().isEmpty() ) {
+        			((AbstractWorkingMemory) getProcessInstance().getWorkingMemory()).executeQueuedActions();
+                }
             	synchronized(getProcessInstance()) {
 	                removeEventListeners();
 	                triggerCompleted();

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/RuleSetNodeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/RuleSetNodeInstance.java	2009-11-06 20:27:50 UTC (rev 30066)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/RuleSetNodeInstance.java	2009-11-07 01:16:03 UTC (rev 30067)
@@ -16,9 +16,8 @@
  * limitations under the License.
  */
 
-import org.drools.common.InternalAgenda;
-import org.drools.common.RuleFlowGroupListener;
 import org.drools.process.instance.ProcessInstance;
+import org.drools.runtime.process.EventListener;
 import org.drools.runtime.process.NodeInstance;
 import org.drools.workflow.core.node.RuleSetNode;
 
@@ -27,18 +26,15 @@
  * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
  */
-public class RuleSetNodeInstance extends StateBasedNodeInstance
-    implements
-    RuleFlowGroupListener {
+public class RuleSetNodeInstance extends StateBasedNodeInstance implements EventListener {
 
-    private static final long               serialVersionUID = 400L;
+    private static final long serialVersionUID = 400L;
 
     protected RuleSetNode getRuleSetNode() {
         return (RuleSetNode) getNode();
     }
 
-    public void internalTrigger(final NodeInstance from,
-                                String type) {
+    public void internalTrigger(final NodeInstance from, String type) {
         if ( !org.drools.workflow.core.Node.CONNECTION_DEFAULT_TYPE.equals( type ) ) {
             throw new IllegalArgumentException( "A RuleSetNode only accepts default incoming connections!" );
         }
@@ -51,15 +47,17 @@
         addRuleSetListener();
     }
     
+    private String getRuleSetEventType() {
+    	return "RuleFlowGroup_" + getRuleSetNode().getRuleFlowGroup();
+    }
+    
     private void addRuleSetListener() {
-        ((InternalAgenda) ((ProcessInstance) getProcessInstance()).getWorkingMemory().getAgenda()).addRuleFlowGroupListener( getRuleSetNode().getRuleFlowGroup(),
-                                                                                                         this );
+    	getProcessInstance().addEventListener(getRuleSetEventType(), this, true);
     }
 
     public void removeEventListeners() {
         super.removeEventListeners();
-        ((InternalAgenda) ((ProcessInstance) getProcessInstance()).getWorkingMemory().getAgenda()).removeRuleFlowGroupListener( getRuleSetNode().getRuleFlowGroup(),
-                                                                                                         this );
+    	getProcessInstance().removeEventListener(getRuleSetEventType(), this, true);
     }
 
     public void cancel() {
@@ -67,8 +65,8 @@
         ((ProcessInstance) getProcessInstance()).getAgenda().deactivateRuleFlowGroup( getRuleSetNode().getRuleFlowGroup() );
     }
 
-    public void ruleFlowGroupDeactivated() {
-    	synchronized (getProcessInstance()) {
+	public void signalEvent(String type, Object event) {
+		if (getRuleSetEventType().equals(type)) {
             removeEventListeners();
             triggerCompleted();
 		}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/StateNodeInstance.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/StateNodeInstance.java	2009-11-06 20:27:50 UTC (rev 30066)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/workflow/instance/node/StateNodeInstance.java	2009-11-07 01:16:03 UTC (rev 30067)
@@ -3,18 +3,12 @@
 import java.util.Iterator;
 import java.util.Map;
 
-import org.drools.WorkingMemory;
+import org.drools.common.AbstractWorkingMemory;
 import org.drools.common.InternalAgenda;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.definition.process.Connection;
-import org.drools.event.ActivationCancelledEvent;
 import org.drools.event.ActivationCreatedEvent;
-import org.drools.event.AfterActivationFiredEvent;
-import org.drools.event.AgendaEventListener;
-import org.drools.event.AgendaGroupPoppedEvent;
-import org.drools.event.AgendaGroupPushedEvent;
-import org.drools.event.BeforeActivationFiredEvent;
 import org.drools.process.instance.ProcessInstance;
 import org.drools.rule.Declaration;
 import org.drools.runtime.process.EventListener;
@@ -26,7 +20,7 @@
 import org.drools.workflow.core.node.StateNode;
 import org.drools.workflow.instance.NodeInstanceContainer;
 
-public class StateNodeInstance extends CompositeContextNodeInstance implements EventListener, AgendaEventListener {
+public class StateNodeInstance extends CompositeContextNodeInstance implements EventListener {
 
 	private static final long serialVersionUID = 4L;
 
@@ -91,6 +85,10 @@
 					}
 				}
 			}
+		} else if (getActivationEventType().equals(type)) {
+			if (event instanceof ActivationCreatedEvent) {
+				activationCreated((ActivationCreatedEvent) event);
+			}
 		} else {
 			super.signalEvent(type, event);
 		}
@@ -101,7 +99,7 @@
 	}
 
     private void addActivationListener() {
-    	((ProcessInstance) getProcessInstance()).getWorkingMemory().addEventListener(this);
+    	getProcessInstance().addEventListener(getActivationEventType(), this, true);
     }
 
     public void addEventListeners() {
@@ -113,13 +111,18 @@
     public void removeEventListeners() {
         super.removeEventListeners();
         getProcessInstance().removeEventListener("signal", this, false);
-        ((ProcessInstance) getProcessInstance()).getWorkingMemory().removeEventListener(this);
+        getProcessInstance().removeEventListener(getActivationEventType(), this, true);
     }
 
     public String[] getEventTypes() {
-    	return new String[] { "signal" };
+    	return new String[] { "signal", getActivationEventType() };
     }
     
+    private String getActivationEventType() {
+    	return "RuleFlowStateNode-" + getProcessInstance().getProcessId()
+    		+ "-" + getStateNode().getUniqueId();
+    }
+    
     private boolean checkProcessInstance(Activation activation) {
     	final Map<?, ?> declarations = activation.getSubRule().getOuterDeclarations();
         for ( Iterator<?> it = declarations.values().iterator(); it.hasNext(); ) {
@@ -136,62 +139,26 @@
         return true;
     }
     
-    public void activationCancelled(ActivationCancelledEvent event, WorkingMemory workingMemory) {
-        // Do nothing
-    }
-
-    public void activationCreated(ActivationCreatedEvent event, WorkingMemory workingMemory) {
-        // check whether this activation is from the DROOLS_SYSTEM agenda group
-        String ruleFlowGroup = event.getActivation().getRule().getRuleFlowGroup();
-        if ("DROOLS_SYSTEM".equals(ruleFlowGroup)) {
-            // new activations of the rule associate with a milestone node
-            // trigger node instances of that milestone node
-            String ruleName = event.getActivation().getRule().getName();
-            String constraintNameStart = "RuleFlowStateNode-"
-            	+ getProcessInstance().getProcessId() + "-" + getNode().getId();
-            if (ruleName.startsWith(constraintNameStart)) {
-                Connection selected = null;
-                int priority = Integer.MAX_VALUE;
-	            for (Connection connection: getNode().getOutgoingConnections(NodeImpl.CONNECTION_DEFAULT_TYPE)) {
-	                Constraint constraint = getStateNode().getConstraint(connection);
-	                if (constraint != null && constraint.getPriority() < priority) {
-			            String constraintName =  constraintNameStart + "-"
-			            	+ connection.getTo().getId() + "-" + connection.getToType();
-			            if (constraintName.equals(ruleName) && checkProcessInstance(event.getActivation())) {
-			            	selected = connection;
-			            	priority = constraint.getPriority();
-			            }
-	                }
+    public void activationCreated(ActivationCreatedEvent event) {
+        Connection selected = null;
+        for (Connection connection: getNode().getOutgoingConnections(NodeImpl.CONNECTION_DEFAULT_TYPE)) {
+            Constraint constraint = getStateNode().getConstraint(connection);
+            if (constraint != null) {
+	            String constraintName =  getActivationEventType() + "-"
+	            	+ connection.getTo().getId() + "-" + connection.getToType();
+	            if (constraintName.equals(event.getActivation().getRule().getName()) && checkProcessInstance(event.getActivation())) {
+	            	selected = connection;
 	            }
-	            if (selected != null) {
-	            	synchronized(getProcessInstance()) {
-		            	removeEventListeners();
-		            	((NodeInstanceContainer) getNodeInstanceContainer()).removeNodeInstance(this);
-		                triggerConnection(selected);
-	            	}
-	            }
             }
         }
+        if (selected != null) {
+    		if ( !((AbstractWorkingMemory) getProcessInstance().getWorkingMemory()).getActionQueue().isEmpty() ) {
+    			((AbstractWorkingMemory) getProcessInstance().getWorkingMemory()).executeQueuedActions();
+            }
+        	removeEventListeners();
+        	((NodeInstanceContainer) getNodeInstanceContainer()).removeNodeInstance(this);
+            triggerConnection(selected);
+        }
     }
 
-    public void afterActivationFired(AfterActivationFiredEvent event,
-            WorkingMemory workingMemory) {
-        // Do nothing
-    }
-
-    public void agendaGroupPopped(AgendaGroupPoppedEvent event,
-            WorkingMemory workingMemory) {
-        // Do nothing
-    }
-
-    public void agendaGroupPushed(AgendaGroupPushedEvent event,
-            WorkingMemory workingMemory) {
-        // Do nothing
-    }
-
-    public void beforeActivationFired(BeforeActivationFiredEvent event,
-            WorkingMemory workingMemory) {
-        // Do nothing
-    }
-
 }

Modified: labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/JPAProcessInstanceManager.java
===================================================================
--- labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/JPAProcessInstanceManager.java	2009-11-06 20:27:50 UTC (rev 30066)
+++ labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/JPAProcessInstanceManager.java	2009-11-07 01:16:03 UTC (rev 30067)
@@ -95,7 +95,9 @@
     
     public void clearProcessInstances() {
     	if (processInstances != null) {
-    		processInstances.clear();
+    		for (ProcessInstance processInstance: new ArrayList<ProcessInstance>(processInstances.values())) {
+    			((ProcessInstanceImpl) processInstance).disconnect();
+    		}
     	}
     }
 

Modified: labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/ProcessInstanceInfo.java
===================================================================
--- labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/ProcessInstanceInfo.java	2009-11-06 20:27:50 UTC (rev 30066)
+++ labs/jbossrules/trunk/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/ProcessInstanceInfo.java	2009-11-07 01:16:03 UTC (rev 30067)
@@ -309,9 +309,11 @@
 			if (nodeInstance instanceof ContextInstanceContainer) {
 				List<ContextInstance> variableScopeInstances = ((ContextInstanceContainer) nodeInstance)
 						.getContextInstances(VariableScope.VARIABLE_SCOPE);
-				for (ContextInstance contextInstance : variableScopeInstances) {
-					VariableScopeInstance variableScopeInstance = (VariableScopeInstance) contextInstance;
-					persist(variableScopeInstance.getVariables(), prefix, newVariables);
+				if (variableScopeInstances != null) {
+					for (ContextInstance contextInstance : variableScopeInstances) {
+						VariableScopeInstance variableScopeInstance = (VariableScopeInstance) contextInstance;
+						persist(variableScopeInstance.getVariables(), prefix, newVariables);
+					}
 				}
 			}
 			if (nodeInstance instanceof NodeInstanceContainer) {

Modified: labs/jbossrules/trunk/drools-persistence-jpa/src/test/java/org/drools/persistence/session/PersistentStatefulSessionTest.java
===================================================================
--- labs/jbossrules/trunk/drools-persistence-jpa/src/test/java/org/drools/persistence/session/PersistentStatefulSessionTest.java	2009-11-06 20:27:50 UTC (rev 30066)
+++ labs/jbossrules/trunk/drools-persistence-jpa/src/test/java/org/drools/persistence/session/PersistentStatefulSessionTest.java	2009-11-07 01:16:03 UTC (rev 30067)
@@ -27,6 +27,7 @@
 import org.drools.event.process.ProcessStartedEvent;
 import org.drools.io.ResourceFactory;
 import org.drools.io.impl.ClassPathResource;
+import org.drools.logger.KnowledgeRuntimeLoggerFactory;
 import org.drools.persistence.jpa.JPAKnowledgeService;
 import org.drools.process.instance.impl.demo.SystemOutWorkItemHandler;
 import org.drools.runtime.Environment;
@@ -372,6 +373,68 @@
         assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
     }
     
+    public void testPersistenceState() {
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( new ClassPathResource( "StateProcess.rf" ),
+                      ResourceType.DRF );
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.drools.persistence.jpa" );
+        Environment env = KnowledgeBaseFactory.newEnvironment();
+        env.set( EnvironmentName.ENTITY_MANAGER_FACTORY, emf );
+        env.set( EnvironmentName.GLOBALS, new MapGlobalResolver() );
+
+        StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
+        int id = ksession.getId();
+        
+        ProcessInstance processInstance = ksession.startProcess( "org.drools.test.TestProcess" );
+        System.out.println( "Started process instance " + processInstance.getId() );
+
+        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+        processInstance = ksession.getProcessInstance( processInstance.getId() );
+        assertNotNull( processInstance );
+
+        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+        ksession.insert(new ArrayList());
+
+        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+        processInstance = ksession.getProcessInstance( processInstance.getId() );
+        assertNull( processInstance );
+    }
+    
+    public void testPersistenceRuleSet() {
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( new ClassPathResource( "RuleSetProcess.rf" ),
+                      ResourceType.DRF );
+        kbuilder.add( new ClassPathResource( "RuleSetRules.drl" ),
+                	  ResourceType.DRL );
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.drools.persistence.jpa" );
+        Environment env = KnowledgeBaseFactory.newEnvironment();
+        env.set( EnvironmentName.ENTITY_MANAGER_FACTORY, emf );
+        env.set( EnvironmentName.GLOBALS, new MapGlobalResolver() );
+
+        StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
+        int id = ksession.getId();
+        
+        ksession.insert(new ArrayList());
+
+        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+        ProcessInstance processInstance = ksession.startProcess( "org.drools.test.TestProcess" );
+
+        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+        processInstance = ksession.getProcessInstance( processInstance.getId() );
+        assertNotNull( processInstance );
+
+        ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( id, kbase, null, env );
+        ksession.fireAllRules();
+        processInstance = ksession.getProcessInstance( processInstance.getId() );
+        assertNull( processInstance );
+    }
+    
     public void testPersistenceEvents() {
         KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
         kbuilder.add( new ClassPathResource( "EventsProcess.rf" ),

Added: labs/jbossrules/trunk/drools-persistence-jpa/src/test/resources/RuleSetProcess.rf
===================================================================
--- labs/jbossrules/trunk/drools-persistence-jpa/src/test/resources/RuleSetProcess.rf	                        (rev 0)
+++ labs/jbossrules/trunk/drools-persistence-jpa/src/test/resources/RuleSetProcess.rf	2009-11-07 01:16:03 UTC (rev 30067)
@@ -0,0 +1,24 @@
+<?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="ruleflow" id="org.drools.test.TestProcess" package-name="org.drools.test" >
+
+  <header>
+    <imports>
+      <import name="java.util.List" />
+    </imports>
+  </header>
+
+  <nodes>
+    <start id="1" name="Start" />
+    <ruleSet id="2" name="RuleSet" ruleFlowGroup="group1" />
+    <end id="3" name="End" />
+  </nodes>
+
+  <connections>
+    <connection from="1" to="2" />
+    <connection from="2" to="3" />
+  </connections>
+
+</process>
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-persistence-jpa/src/test/resources/RuleSetRules.drl
===================================================================
--- labs/jbossrules/trunk/drools-persistence-jpa/src/test/resources/RuleSetRules.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-persistence-jpa/src/test/resources/RuleSetRules.drl	2009-11-07 01:16:03 UTC (rev 30067)
@@ -0,0 +1,10 @@
+package org.drools.test
+
+import java.util.List
+
+rule SimpleRule
+  when
+    l: List()
+  then
+    System.out.println("Found list " + l);
+end
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-persistence-jpa/src/test/resources/StateProcess.rf
===================================================================
--- labs/jbossrules/trunk/drools-persistence-jpa/src/test/resources/StateProcess.rf	                        (rev 0)
+++ labs/jbossrules/trunk/drools-persistence-jpa/src/test/resources/StateProcess.rf	2009-11-07 01:16:03 UTC (rev 30067)
@@ -0,0 +1,28 @@
+<?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="ruleflow" id="org.drools.test.TestProcess" package-name="org.drools.test" >
+
+  <header>
+    <imports>
+      <import name="java.util.List" />
+    </imports>
+  </header>
+
+  <nodes>
+    <start id="1" name="Start" />
+    <state id="2" name="State" >
+      <constraints>
+        <constraint toNodeId="3" name="constraint" priority="1" >List()</constraint>
+      </constraints>
+    </state>
+    <end id="3" name="End" />
+  </nodes>
+
+  <connections>
+    <connection from="1" to="2" />
+    <connection from="2" to="3" />
+  </connections>
+
+</process>
\ No newline at end of file



More information about the jboss-svn-commits mailing list