[jboss-svn-commits] JBL Code SVN: r10956 - in labs/jbossrules/trunk/drools-core/src: main/java/org/drools/reteoo and 1 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Apr 12 22:23:19 EDT 2007


Author: mark.proctor at jboss.com
Date: 2007-04-12 22:23:19 -0400 (Thu, 12 Apr 2007)
New Revision: 10956

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/DefaultAgenda.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalRuleFlowGroup.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/RuleFlowGroupImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooWorkingMemory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleTerminalNode.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AgendaTest.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/LogicalAssertionTest.java
Log:
JBRULES-788 lock-on-activate rule attribute
-lock-on-active now works with ruleflowgroup, including modifies.

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	2007-04-13 02:02:52 UTC (rev 10955)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java	2007-04-13 02:23:19 UTC (rev 10956)
@@ -122,7 +122,7 @@
     /** Rule-firing agenda. */
     protected DefaultAgenda                   agenda;
 
-    protected final List                      factQueue                                     = new ArrayList();
+    protected final List                      actionQueue                                     = new ArrayList();
 
     protected final ReentrantLock             lock                                          = new ReentrantLock();
 
@@ -352,8 +352,8 @@
         // nested inside, avoiding concurrent-modification
         // exceptions, depending on code paths of the actions.
 
-        if ( !this.factQueue.isEmpty() ) {
-            propagateQueuedActions();
+        if ( !this.actionQueue.isEmpty() ) {
+            executeQueuedActions();
         }
 
         boolean noneFired = true;
@@ -364,6 +364,9 @@
 
                 while ( this.agenda.fireNextItem( agendaFilter ) ) {
                     noneFired = false;
+                    if ( !this.actionQueue.isEmpty() ) {
+                        executeQueuedActions();
+                    }
                 }
             } finally {
                 this.firing = false;
@@ -382,8 +385,8 @@
      */
     private void doOtherwise(final AgendaFilter agendaFilter) {
         final FactHandle handle = this.assertObject( new Otherwise() );
-        if ( !this.factQueue.isEmpty() ) {
-            propagateQueuedActions();
+        if ( !this.actionQueue.isEmpty() ) {
+            executeQueuedActions();
         }
 
         while ( this.agenda.fireNextItem( agendaFilter ) ) {
@@ -734,8 +737,8 @@
                                                                handle,
                                                                object );
 
-            if ( !this.factQueue.isEmpty() ) {
-                propagateQueuedActions();
+            if ( !this.actionQueue.isEmpty() ) {
+                executeQueuedActions();
             }
         } finally {
             this.lock.unlock();
@@ -893,8 +896,8 @@
 
             this.handleFactory.destroyFactHandle( handle );
 
-            if ( !this.factQueue.isEmpty() ) {
-                propagateQueuedActions();
+            if ( !this.actionQueue.isEmpty() ) {
+                executeQueuedActions();
             }
         } finally {
             this.lock.unlock();
@@ -990,25 +993,25 @@
 
             propagationContext.clearRetractedTuples();
 
-            if ( !this.factQueue.isEmpty() ) {
-                propagateQueuedActions();
+            if ( !this.actionQueue.isEmpty() ) {
+                executeQueuedActions();
             }
         } finally {
             this.lock.unlock();
         }
     }
 
-    public void propagateQueuedActions() {
-        for ( final Iterator it = this.factQueue.iterator(); it.hasNext(); ) {
+    public void executeQueuedActions() {
+        for ( final Iterator it = this.actionQueue.iterator(); it.hasNext(); ) {
             final WorkingMemoryAction action = (WorkingMemoryAction) it.next();
             it.remove();
-            action.propagate();
+            action.execute();
         }
 
     }
 
     public void queueWorkingMemoryAction(final WorkingMemoryAction action) {
-        this.factQueue.add( action );
+        this.actionQueue.add( action );
     }
 
     public void queueRetractAction(final InternalFactHandle factHandle,
@@ -1109,7 +1112,7 @@
     }
 
     public interface WorkingMemoryAction {
-        public void propagate();
+        public void execute();
     }
 
     public class WorkingMemoryRetractAction
@@ -1138,7 +1141,7 @@
             this.activationOrigin = activationOrigin;
         }
 
-        public void propagate() {
+        public void execute() {
             retractObject( this.factHandle,
                            this.removeLogical,
                            this.updateEqualsMap,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultAgenda.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultAgenda.java	2007-04-13 02:02:52 UTC (rev 10955)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/DefaultAgenda.java	2007-04-13 02:23:19 UTC (rev 10956)
@@ -67,7 +67,7 @@
     private static final long          serialVersionUID = 320L;
 
     /** Working memory of this Agenda. */
-    private final WorkingMemory        workingMemory;
+    private final InternalWorkingMemory workingMemory;
 
     private org.drools.util.LinkedList scheduledActivations;
 
@@ -102,7 +102,7 @@
      * @param conflictResolver
      *            The conflict resolver.
      */
-    public DefaultAgenda(final WorkingMemory workingMemory) {
+    public DefaultAgenda(final InternalWorkingMemory workingMemory) {
         this.workingMemory = workingMemory;
         this.knowledgeHelper = new DefaultKnowledgeHelper( this.workingMemory );
         this.agendaGroups = new HashMap();
@@ -392,7 +392,7 @@
 
             if ( item.getRuleFlowGroupNode() != null ) {
                 final InternalRuleFlowGroup ruleFlowGroup = item.getRuleFlowGroupNode().getRuleFlowGroup();
-                ruleFlowGroup.removeActivation( item );
+                ruleFlowGroup.removeActivation( item, this.workingMemory );
             }
 
             eventsupport.getAgendaEventSupport().fireActivationCancelled( item,
@@ -428,7 +428,7 @@
 
                 if ( activation.getRuleFlowGroupNode() != null ) {
                     final InternalRuleFlowGroup ruleFlowGroup = activation.getRuleFlowGroupNode().getRuleFlowGroup();
-                    ruleFlowGroup.removeActivation( activation );
+                    ruleFlowGroup.removeActivation( activation, this.workingMemory );
                 }
 
                 eventsupport.getAgendaEventSupport().fireActivationCancelled( activation,
@@ -504,7 +504,7 @@
 
         if ( activation.getRuleFlowGroupNode() != null ) {
             final InternalRuleFlowGroup ruleFlowGroup = activation.getRuleFlowGroupNode().getRuleFlowGroup();
-            ruleFlowGroup.removeActivation( activation );
+            ruleFlowGroup.removeActivation( activation, this.workingMemory );
         }
 
         eventsupport.getAgendaEventSupport().fireAfterActivationFired( activation );

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalRuleFlowGroup.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalRuleFlowGroup.java	2007-04-13 02:02:52 UTC (rev 10955)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalRuleFlowGroup.java	2007-04-13 02:23:19 UTC (rev 10956)
@@ -9,7 +9,7 @@
 
     void addActivation(Activation activation);
 
-    void removeActivation(Activation activation);
+    void removeActivation(final Activation activation, InternalWorkingMemory workingMemory);
 
     /**
      * Activates or deactivates this <code>RuleFlowGroup</code>.

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java	2007-04-13 02:02:52 UTC (rev 10955)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java	2007-04-13 02:23:19 UTC (rev 10956)
@@ -2,6 +2,7 @@
 
 import org.drools.FactException;
 import org.drools.WorkingMemory;
+import org.drools.common.AbstractWorkingMemory.WorkingMemoryAction;
 import org.drools.event.AgendaEventSupport;
 import org.drools.rule.Rule;
 import org.drools.spi.Activation;
@@ -26,7 +27,9 @@
 
     public TruthMaintenanceSystem getTruthMaintenanceSystem();
 
-    public void propagateQueuedActions();
+    public void executeQueuedActions();
+    
+    public void queueWorkingMemoryAction(final WorkingMemoryAction action);
 
     public FactHandleFactory getFactHandleFactory();
 

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	2007-04-13 02:02:52 UTC (rev 10955)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/RuleFlowGroupImpl.java	2007-04-13 02:23:19 UTC (rev 10956)
@@ -16,9 +16,11 @@
  * limitations under the License.
  */
 
+import org.drools.common.AbstractWorkingMemory.WorkingMemoryAction;
 import org.drools.ruleflow.instance.IRuleFlowNodeInstance;
 import org.drools.ruleflow.instance.impl.RuleFlowSequenceNodeInstance;
 import org.drools.spi.Activation;
+import org.drools.spi.RuleFlowGroup;
 import org.drools.util.LinkedList;
 import org.drools.util.LinkedList.LinkedListIterator;
 
@@ -127,18 +129,15 @@
         }
     }
 
-    public void removeActivation(final Activation activation) {
+    public void removeActivation(final Activation activation, InternalWorkingMemory workingMemory) {
         final RuleFlowGroupNode node = activation.getRuleFlowGroupNode();
         this.list.remove( node );
         activation.setActivationGroupNode( null );
         if ( this.autoDeactivate ) {
             if ( this.list.isEmpty() ) {
-                this.active = false;
-                // only trigger next node if this RuleFlowGroup was
-                // triggered from inside a process instance
-                if ( getProcessInstance() != null ) {
-                    triggerCompleted();
-                }
+                // deactivate callback
+                WorkingMemoryAction action = new DeactivateCallback( this );
+                workingMemory.queueWorkingMemoryAction( action );
             }
         }
     }
@@ -174,4 +173,24 @@
     public void trigger(final IRuleFlowNodeInstance parent) {
         setActive( true );
     }
+
+    public class DeactivateCallback implements WorkingMemoryAction {
+        private InternalRuleFlowGroup ruleFlowGroup;
+
+        public DeactivateCallback(InternalRuleFlowGroup ruleFlowGroup) {
+            this.ruleFlowGroup = ruleFlowGroup;
+        }
+
+        public void execute() {
+            if ( this.ruleFlowGroup.isEmpty() ) {
+                this.ruleFlowGroup.setActive( false );
+                // only trigger next node if this RuleFlowGroup was
+                // triggered from inside a process instance
+                if ( getProcessInstance() != null ) {
+                    triggerCompleted();
+                }
+            }
+        }
+
+    }
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooWorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooWorkingMemory.java	2007-04-13 02:02:52 UTC (rev 10955)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooWorkingMemory.java	2007-04-13 02:23:19 UTC (rev 10956)
@@ -148,7 +148,7 @@
             this.activationOrigin = activationOrigin;
         }
 
-        public void propagate() {
+        public void execute() {
 
             final PropagationContext context = new PropagationContextImpl( ReteooWorkingMemory.this.propagationIdCounter++,
                                                                            PropagationContext.ASSERTION,

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleTerminalNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleTerminalNode.java	2007-04-13 02:02:52 UTC (rev 10955)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/RuleTerminalNode.java	2007-04-13 02:23:19 UTC (rev 10956)
@@ -309,7 +309,7 @@
 
             if ( activation.getRuleFlowGroupNode() != null ) {
                 final InternalRuleFlowGroup ruleFlowGroup = activation.getRuleFlowGroupNode().getRuleFlowGroup();
-                ruleFlowGroup.removeActivation( activation );
+                ruleFlowGroup.removeActivation( activation, workingMemory );
             }
 
             workingMemory.getAgendaEventSupport().fireActivationCancelled( activation,
@@ -377,7 +377,7 @@
                                                                                      this.rule );
             }
 
-            workingMemory.propagateQueuedActions();
+            workingMemory.executeQueuedActions();
         }
 
         this.tupleSource.remove( this,

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AgendaTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AgendaTest.java	2007-04-13 02:02:52 UTC (rev 10955)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/AgendaTest.java	2007-04-13 02:23:19 UTC (rev 10956)
@@ -1261,6 +1261,7 @@
                       ruleFlowGroup0.size() );
         assertEquals( 0,
                       agenda.agendaSize() );
+        workingMemory.executeQueuedActions();
         assertFalse( ruleFlowGroup0.isActive() );
 
         // A new activation should now be added to the RuleFlowGroup but not to the agenda 

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/LogicalAssertionTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/LogicalAssertionTest.java	2007-04-13 02:02:52 UTC (rev 10955)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/reteoo/LogicalAssertionTest.java	2007-04-13 02:23:19 UTC (rev 10956)
@@ -96,7 +96,7 @@
                            context1,
                            workingMemory );
 
-        workingMemory.propagateQueuedActions();
+        workingMemory.executeQueuedActions();
 
         assertLength( 1,
                       sink.getRetracted() );
@@ -124,7 +124,7 @@
                            context1,
                            workingMemory );
 
-        workingMemory.propagateQueuedActions();
+        workingMemory.executeQueuedActions();
 
         assertLength( 2,
                       sink.getRetracted() );
@@ -642,7 +642,7 @@
                             context2,
                             workingMemory );
 
-        workingMemory.propagateQueuedActions();
+        workingMemory.executeQueuedActions();
 
         // because this logical fact has two relationships it shouldn't retract yet
         assertLength( 0,
@@ -657,7 +657,7 @@
                            context1,
                            workingMemory );
 
-        workingMemory.propagateQueuedActions();
+        workingMemory.executeQueuedActions();
 
         // Should cause the logical fact to be retracted
         assertLength( 1,




More information about the jboss-svn-commits mailing list