[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