[jboss-svn-commits] JBL Code SVN: r33842 - in labs/jbossrules/trunk: drools-compiler/src/test/java/org/drools/compiler and 6 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Jul 12 12:59:19 EDT 2010


Author: tirelli
Date: 2010-07-12 12:59:18 -0400 (Mon, 12 Jul 2010)
New Revision: 33842

Added:
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_CEP_StreamMode.drl
Modified:
   labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/rule/Activation.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/compiler/PackageBuilderTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/CepEspTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/RuleCoverageListenerTest.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AgendaItem.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/rule/impl/SerializableActivation.java
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/BaseQueueable.java
Log:
JBRULES-2150: adding test case for checking streammed kbases behave the same as non-streammed ones. Adding methods to Activation to provide additional information on data that caused the activation.

Modified: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/rule/Activation.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/rule/Activation.java	2010-07-12 14:50:44 UTC (rev 33841)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/rule/Activation.java	2010-07-12 16:59:18 UTC (rev 33842)
@@ -1,6 +1,6 @@
 package org.drools.runtime.rule;
 
-import java.util.Collection;
+import java.util.List;
 
 import org.drools.definition.rule.Rule;
 
@@ -24,5 +24,30 @@
      * @return
      *     The matched FactHandles for this activation
      */
-    Collection< ? extends FactHandle> getFactHandles();
+    List< ? extends FactHandle> getFactHandles();
+    
+    /**
+     * Returns the list of objects that make the tuple that created
+     * this activation. The objects are in the proper tuple order.
+     * 
+     * @return
+     */
+    List< Object > getObjects();
+    
+    /**
+     * Returns the list of declaration identifiers that are bound to the
+     * tuple that created this activation.
+     * 
+     * @return
+     */
+    List< String > getDeclarationIDs();
+    
+    /**
+     * Returns the bound declaration value for the given declaration identifier.
+     * 
+     * @param declarationId
+     * @return
+     */
+    Object getDeclarationValue( String declarationId );
+    
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/compiler/PackageBuilderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/compiler/PackageBuilderTest.java	2010-07-12 14:50:44 UTC (rev 33841)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/compiler/PackageBuilderTest.java	2010-07-12 16:59:18 UTC (rev 33842)
@@ -20,7 +20,6 @@
 import java.io.InputStreamReader;
 import java.io.StringReader;
 import java.lang.reflect.Field;
-import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -29,18 +28,16 @@
 import org.drools.DroolsTestCase;
 import org.drools.FactHandle;
 import org.drools.Primitives;
-import org.drools.QueryResults;
 import org.drools.RuleBase;
 import org.drools.RuleBaseFactory;
-import org.drools.StatefulSession;
 import org.drools.StockTick;
 import org.drools.WorkingMemory;
 import org.drools.base.ClassObjectType;
 import org.drools.base.DefaultKnowledgeHelper;
 import org.drools.common.ActivationGroupNode;
+import org.drools.common.ActivationNode;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.LogicalDependency;
-import org.drools.common.ActivationNode;
 import org.drools.commons.jci.compilers.EclipseJavaCompiler;
 import org.drools.commons.jci.compilers.JaninoJavaCompiler;
 import org.drools.commons.jci.compilers.JavaCompiler;
@@ -65,19 +62,17 @@
 import org.drools.lang.descr.PackageDescr;
 import org.drools.lang.descr.PatternDescr;
 import org.drools.lang.descr.PredicateDescr;
-import org.drools.lang.descr.QueryDescr;
 import org.drools.lang.descr.ReturnValueRestrictionDescr;
 import org.drools.lang.descr.RuleDescr;
 import org.drools.lang.descr.SlidingWindowDescr;
 import org.drools.lang.descr.TypeDeclarationDescr;
 import org.drools.lang.descr.TypeFieldDescr;
-import org.drools.lang.descr.VariableRestrictionDescr;
 import org.drools.process.core.Context;
 import org.drools.process.core.Process;
 import org.drools.reteoo.ReteooRuleBase;
 import org.drools.rule.Behavior;
+import org.drools.rule.Declaration;
 import org.drools.rule.DroolsCompositeClassLoader;
-import org.drools.rule.Declaration;
 import org.drools.rule.EvalCondition;
 import org.drools.rule.GroupElement;
 import org.drools.rule.JavaDialectRuntimeData;
@@ -1579,10 +1574,25 @@
 
         }
 
-        public Collection<FactHandle> getFactHandles() {
+        public List<FactHandle> getFactHandles() {
             // TODO Auto-generated method stub
             return null;
         }
+
+        public List<Object> getObjects() {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        public Object getDeclarationValue(String variableName) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        public List<String> getDeclarationIDs() {
+            // TODO Auto-generated method stub
+            return null;
+        }
     }
 
     class MockTuple

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/CepEspTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/CepEspTest.java	2010-07-12 14:50:44 UTC (rev 33841)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/CepEspTest.java	2010-07-12 16:59:18 UTC (rev 33842)
@@ -5,6 +5,7 @@
 import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.times;
 
 import java.io.IOException;
 import java.io.InputStreamReader;
@@ -26,6 +27,7 @@
 import org.drools.RuleBase;
 import org.drools.RuleBaseConfiguration;
 import org.drools.RuleBaseFactory;
+import org.drools.Sensor;
 import org.drools.SessionConfiguration;
 import org.drools.StatefulSession;
 import org.drools.StockTick;
@@ -642,10 +644,10 @@
 
         final PseudoClockScheduler clock = (PseudoClockScheduler) ksession.getSessionClock();
         clock.setStartupTime( 1000 );
-        
+
         AgendaEventListener ael = mock( AgendaEventListener.class );
         ksession.addEventListener( ael );
-        
+
         StockTick tick1 = new StockTick( 1,
                                          "DROO",
                                          50,
@@ -705,13 +707,14 @@
         clock.advanceTime( 2,
                            TimeUnit.MILLISECONDS );
         ksession.insert( tick8 );
-        
+
         ArgumentCaptor<ActivationCreatedEvent> arg = ArgumentCaptor.forClass( ActivationCreatedEvent.class );
         verify( ael ).activationCreated( arg.capture() );
-        assertThat( arg.getValue().getActivation().getRule().getName(), is( "before" ) );
+        assertThat( arg.getValue().getActivation().getRule().getName(),
+                    is( "before" ) );
 
         ksession.fireAllRules();
-        
+
         verify( ael ).afterActivationFired( any( AfterActivationFiredEvent.class ) );
     }
 
@@ -730,10 +733,10 @@
 
         final PseudoClockScheduler clock = (PseudoClockScheduler) ksession.getSessionClock();
         clock.setStartupTime( 1000 );
-        
+
         AgendaEventListener ael = mock( AgendaEventListener.class );
         ksession.addEventListener( ael );
-        
+
         StockTick tick1 = new StockTick( 1,
                                          "DROO",
                                          50,
@@ -793,17 +796,19 @@
         clock.advanceTime( 2,
                            TimeUnit.MILLISECONDS );
         ksession.insert( tick8 );
-        
+
         ArgumentCaptor<ActivationCreatedEvent> arg = ArgumentCaptor.forClass( ActivationCreatedEvent.class );
         verify( ael ).activationCreated( arg.capture() );
-        Activation activation = arg.getValue().getActivation(); 
-        assertThat( activation.getRule().getName(), is( "metby" ) );
+        Activation activation = arg.getValue().getActivation();
+        assertThat( activation.getRule().getName(),
+                    is( "metby" ) );
 
         ksession.fireAllRules();
-        
+
         ArgumentCaptor<AfterActivationFiredEvent> aaf = ArgumentCaptor.forClass( AfterActivationFiredEvent.class );
         verify( ael ).afterActivationFired( aaf.capture() );
-        assertThat( (InternalFactHandle) aaf.getValue().getActivation().getFactHandles().toArray()[0], is( fh2 ));
+        assertThat( (InternalFactHandle) aaf.getValue().getActivation().getFactHandles().toArray()[0],
+                    is( fh2 ) );
     }
 
     public void testAfterOnArbitraryDates() throws Exception {
@@ -1208,11 +1213,11 @@
 
         clock.advanceTime( 10,
                            TimeUnit.SECONDS );
-        
+
         StockTick st1O = new StockTick( 1,
-                                       "DROO",
-                                       100,
-                                       clock.getCurrentTime() ); 
+                                        "DROO",
+                                        100,
+                                        clock.getCurrentTime() );
 
         EventFactHandle st1 = (EventFactHandle) wm.insert( st1O );
 
@@ -1633,4 +1638,81 @@
         implements
         Serializable {
     }
+
+    public void testStreamModeNoSerialization() throws IOException,
+                                               ClassNotFoundException {
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newClassPathResource( "test_CEP_StreamMode.drl",
+                                                            CepEspTest.class ),
+                      ResourceType.DRL );
+        if ( kbuilder.getErrors().size() > 0 ) {
+            throw new IllegalArgumentException( "Could not parse knowledge." );
+        }
+
+        KnowledgeBaseConfiguration kbaseConfig = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
+        kbaseConfig.setOption( EventProcessingOption.STREAM );
+        KnowledgeBase kbase1 = KnowledgeBaseFactory.newKnowledgeBase( kbaseConfig );
+        kbase1.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        KnowledgeBase kbase2 = (KnowledgeBase) DroolsStreamUtils.streamIn( DroolsStreamUtils.streamOut( kbase1 ),
+                                                                           null );
+
+        final StatefulKnowledgeSession ksession1 = kbase1.newStatefulKnowledgeSession();
+        AgendaEventListener ael1 = mock( AgendaEventListener.class );
+        ksession1.addEventListener( ael1 );
+        
+        final StatefulKnowledgeSession ksession2 = kbase2.newStatefulKnowledgeSession();
+        AgendaEventListener ael2 = mock( AgendaEventListener.class );
+        ksession2.addEventListener( ael2 );
+
+        // -------------
+        // first, check the non-serialized session
+        // -------------
+        ksession1.insert( new Sensor( 10,
+                                      10 ) );
+        ksession1.fireAllRules();
+        
+        ArgumentCaptor<AfterActivationFiredEvent> aafe1 = ArgumentCaptor.forClass(AfterActivationFiredEvent.class);
+        verify( ael1, times(1) ).afterActivationFired( aafe1.capture() );
+        List<AfterActivationFiredEvent> events1 = aafe1.getAllValues();
+        assertThat( events1.get( 0 ).getActivation().getDeclarationValue( "$avg" ), is( (Object) 10 ) );
+
+        ksession1.insert( new Sensor( 20,
+                                      20 ) );
+        ksession1.fireAllRules();
+        verify( ael1, times(2) ).afterActivationFired( aafe1.capture() );
+        assertThat( events1.get( 1 ).getActivation().getDeclarationValue( "$avg" ), is( (Object) 15 ) );
+        ksession1.insert( new Sensor( 30,
+                                      30 ) );
+        ksession1.fireAllRules();
+        verify( ael1, times(3) ).afterActivationFired( aafe1.capture() );
+        assertThat( events1.get( 2 ).getActivation().getDeclarationValue( "$avg" ), is( (Object) 25 ) );
+        
+        ksession1.dispose();
+        
+        // -------------
+        // now we check the serialized session
+        // -------------
+        ArgumentCaptor<AfterActivationFiredEvent> aafe2 = ArgumentCaptor.forClass(AfterActivationFiredEvent.class);
+
+        ksession2.insert( new Sensor( 10,
+                                      10 ) );
+        ksession2.fireAllRules();
+        verify( ael2, times(1) ).afterActivationFired( aafe2.capture() );
+        List<AfterActivationFiredEvent> events2 = aafe2.getAllValues();
+        assertThat( events2.get( 0 ).getActivation().getDeclarationValue( "$avg" ), is( (Object) 10 ) );
+        
+        ksession2.insert( new Sensor( 20,
+                                      20 ) );
+        ksession2.fireAllRules();
+        verify( ael2, times(2) ).afterActivationFired( aafe2.capture() );
+        assertThat( events2.get( 1 ).getActivation().getDeclarationValue( "$avg" ), is( (Object) 15 ) );
+
+        ksession2.insert( new Sensor( 30,
+                                      30 ) );
+        ksession2.fireAllRules();
+        verify( ael2, times(3) ).afterActivationFired( aafe2.capture() );
+        assertThat( events2.get( 2 ).getActivation().getDeclarationValue( "$avg" ), is( (Object) 25 ) );
+        ksession2.dispose();
+    }
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/RuleCoverageListenerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/RuleCoverageListenerTest.java	2010-07-12 14:50:44 UTC (rev 33841)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/RuleCoverageListenerTest.java	2010-07-12 16:59:18 UTC (rev 33842)
@@ -1,14 +1,14 @@
 package org.drools.testframework;
 
-import java.util.Collection;
 import java.util.HashSet;
+import java.util.List;
 
 import junit.framework.TestCase;
 
 import org.drools.FactHandle;
 import org.drools.common.ActivationGroupNode;
+import org.drools.common.ActivationNode;
 import org.drools.common.LogicalDependency;
-import org.drools.common.ActivationNode;
 import org.drools.core.util.LinkedList;
 import org.drools.event.AfterActivationFiredEvent;
 import org.drools.rule.GroupElement;
@@ -68,6 +68,7 @@
 
 }
 
+ at SuppressWarnings("serial")
 class MockActivation
     implements
     Activation {
@@ -139,9 +140,24 @@
     public void setActivationNode(ActivationNode ruleFlowGroupNode) {
     }
 
-    public Collection<FactHandle> getFactHandles() {
+    public List<FactHandle> getFactHandles() {
         // TODO Auto-generated method stub
         return null;
     }
 
+    public List<Object> getObjects() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public Object getDeclarationValue(String variableName) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public List<String> getDeclarationIDs() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
 }

Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_CEP_StreamMode.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_CEP_StreamMode.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_CEP_StreamMode.drl	2010-07-12 16:59:18 UTC (rev 33842)
@@ -0,0 +1,15 @@
+package org.drools;
+
+declare Sensor
+	@role (event)
+end
+
+rule 'dupa2'
+when
+Number( $avg : intValue ) from accumulate(
+        Sensor( $v : temperature ) over window:length( 2 ),
+        average( $v ) )
+then
+	// noop
+end
+

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AgendaItem.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AgendaItem.java	2010-07-12 14:50:44 UTC (rev 33841)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AgendaItem.java	2010-07-12 16:59:18 UTC (rev 33842)
@@ -21,16 +21,16 @@
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 
+import org.drools.FactHandle;
 import org.drools.core.util.LinkedList;
 import org.drools.core.util.Queue;
 import org.drools.core.util.Queueable;
+import org.drools.rule.Declaration;
 import org.drools.rule.GroupElement;
 import org.drools.rule.Rule;
-import org.drools.FactHandle;
 import org.drools.spi.Activation;
 import org.drools.spi.AgendaGroup;
 import org.drools.spi.PropagationContext;
@@ -314,16 +314,41 @@
         return this.subrule;
     }
 
-    public Collection<FactHandle> getFactHandles() {
+    public List<FactHandle> getFactHandles() {
         FactHandle[] factHandles = this.tuple.getFactHandles();
         List<FactHandle> list = new ArrayList<FactHandle>( factHandles.length );
         for ( FactHandle factHandle : factHandles ) {
             list.add( factHandle );
         }
-        return Collections.unmodifiableCollection( list );
+        return Collections.unmodifiableList( list );
     }
     
     public String toExternalForm() {
         return "[ "+this.getRule().getName()+" active="+this.activated+ " ]";
     }
+
+    public List<Object> getObjects() {
+        FactHandle[] factHandles = this.tuple.getFactHandles();
+        List<Object> list = new ArrayList<Object>( factHandles.length );
+        for ( FactHandle factHandle : factHandles ) {
+            list.add( ((InternalFactHandle) factHandle).getObject() );
+        }
+        return Collections.unmodifiableList( list );
+    }
+
+    public Object getDeclarationValue(String variableName) {
+        Declaration decl = this.getRule().getDeclaration( variableName ); 
+        InternalFactHandle handle = this.tuple.get( decl );
+        // need to double check, but the working memory reference is only used for resolving globals, right?
+        return decl.getValue( null, handle.getObject() );
+    }
+
+    public List<String> getDeclarationIDs() {
+        Declaration[] declArray = this.getRule().getDeclarations(); 
+        List<String> declarations = new ArrayList<String>();
+        for( Declaration decl : declArray ) {
+            declarations.add( decl.getIdentifier() );
+        }
+        return Collections.unmodifiableList( declarations );
+    }
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/rule/impl/SerializableActivation.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/rule/impl/SerializableActivation.java	2010-07-12 14:50:44 UTC (rev 33841)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/rule/impl/SerializableActivation.java	2010-07-12 16:59:18 UTC (rev 33842)
@@ -4,9 +4,13 @@
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
-import java.util.Collection;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
 
+import org.drools.common.InternalFactHandle;
 import org.drools.definition.rule.Rule;
+import org.drools.rule.Declaration;
 import org.drools.runtime.rule.Activation;
 import org.drools.runtime.rule.FactHandle;
 import org.drools.runtime.rule.PropagationContext;
@@ -16,7 +20,7 @@
     Activation,
     Externalizable {
     private Rule                              rule;
-    private Collection< ? extends FactHandle> factHandles;
+    private List< ? extends FactHandle>       factHandles;
     private PropagationContext                propgationContext;
 
     public SerializableActivation() {
@@ -40,11 +44,33 @@
         return this.rule;
     }
 
-    public Collection< ? extends FactHandle> getFactHandles() {
+    public List< ? extends FactHandle> getFactHandles() {
         return this.factHandles;
     }
 
     public PropagationContext getPropagationContext() {
         return this.propgationContext;
     }
+
+    public List<Object> getObjects() {
+        List<Object> objects = new ArrayList<Object>( this.factHandles.size() );
+        for( FactHandle handle : this.factHandles ) {
+            objects.add( ((InternalFactHandle)handle).getObject() );
+        }
+        return Collections.unmodifiableList( objects );
+    }
+
+    public Object getDeclarationValue(String variableName) {
+        Declaration decl = ((org.drools.rule.Rule)this.rule).getDeclaration( variableName ); 
+        return decl.getValue( null, ((InternalFactHandle)factHandles.get(decl.getPattern().getOffset())).getObject() );
+    }
+
+    public List<String> getDeclarationIDs() {
+        Declaration[] declArray = ((org.drools.rule.Rule)this.rule).getDeclarations(); 
+        List<String> declarations = new ArrayList<String>();
+        for( Declaration decl : declArray ) {
+            declarations.add( decl.getIdentifier() );
+        }
+        return Collections.unmodifiableList( declarations );
+    }
 }

Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/BaseQueueable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/BaseQueueable.java	2010-07-12 14:50:44 UTC (rev 33841)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/util/BaseQueueable.java	2010-07-12 16:59:18 UTC (rev 33842)
@@ -1,16 +1,16 @@
 package org.drools.util;
 
-import java.util.Collection;
+import java.util.List;
 
+import org.drools.FactHandle;
 import org.drools.common.ActivationGroupNode;
+import org.drools.common.ActivationNode;
 import org.drools.common.LogicalDependency;
-import org.drools.common.ActivationNode;
 import org.drools.core.util.LinkedList;
 import org.drools.core.util.Queue;
 import org.drools.core.util.Queueable;
 import org.drools.rule.GroupElement;
 import org.drools.rule.Rule;
-import org.drools.FactHandle;
 import org.drools.spi.AgendaGroup;
 import org.drools.spi.PropagationContext;
 import org.drools.spi.Tuple;
@@ -134,8 +134,23 @@
         
     }
 
-    public Collection<FactHandle> getFactHandles() {
+    public List<FactHandle> getFactHandles() {
         // TODO Auto-generated method stub
         return null;
     }
+
+    public List<Object> getObjects() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public Object getDeclarationValue(String variableName) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public List<String> getDeclarationIDs() {
+        // TODO Auto-generated method stub
+        return null;
+    }
 }
\ No newline at end of file



More information about the jboss-svn-commits mailing list