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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Tue Jul 13 12:21:00 EDT 2010


Author: tirelli
Date: 2010-07-13 12:20:58 -0400 (Tue, 13 Jul 2010)
New Revision: 33856

Added:
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_CEP_AssertBehaviorOnEntryPoints.drl
Modified:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/StockTick.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/CepEspTest.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/NamedEntryPoint.java
Log:
JBRULES-2154: adding support for assert behavior to entry points

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/StockTick.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/StockTick.java	2010-07-13 15:03:45 UTC (rev 33855)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/StockTick.java	2010-07-13 16:20:58 UTC (rev 33856)
@@ -85,6 +85,30 @@
     public Date getDateTimestamp() {
         return new Date( this.time );
     }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((company == null) ? 0 : company.hashCode());
+        result = prime * result + (int) (seq ^ (seq >>> 32));
+        result = prime * result + (int) (time ^ (time >>> 32));
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if ( this == obj ) return true;
+        if ( obj == null ) return false;
+        if ( getClass() != obj.getClass() ) return false;
+        StockTick other = (StockTick) obj;
+        if ( company == null ) {
+            if ( other.company != null ) return false;
+        } else if ( !company.equals( other.company ) ) return false;
+        if ( seq != other.seq ) return false;
+        if ( time != other.time ) return false;
+        return true;
+    }
     
 
 }

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-13 15:03:45 UTC (rev 33855)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/CepEspTest.java	2010-07-13 16:20:58 UTC (rev 33856)
@@ -43,6 +43,7 @@
 import org.drools.compiler.DrlParser;
 import org.drools.compiler.DroolsParserException;
 import org.drools.compiler.PackageBuilder;
+import org.drools.conf.AssertBehaviorOption;
 import org.drools.conf.EventProcessingOption;
 import org.drools.core.util.DroolsStreamUtils;
 import org.drools.definition.KnowledgePackage;
@@ -60,6 +61,7 @@
 import org.drools.runtime.conf.ClockTypeOption;
 import org.drools.runtime.rule.Activation;
 import org.drools.runtime.rule.FactHandle;
+import org.drools.runtime.rule.WorkingMemoryEntryPoint;
 import org.drools.time.SessionPseudoClock;
 import org.drools.time.impl.DurationTimer;
 import org.drools.time.impl.PseudoClockScheduler;
@@ -124,6 +126,27 @@
         return kbase;
     }
 
+    private KnowledgeBase loadKnowledgeBase(final String resource,
+                                            final KnowledgeBaseConfiguration conf,
+                                            final boolean serialize) throws IOException,
+                                                                    ClassNotFoundException {
+        final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newClassPathResource( resource,
+                                                            CepEspTest.class ),
+                      ResourceType.DRL );
+        assertFalse( kbuilder.getErrors().toString(),
+                     kbuilder.hasErrors() );
+
+        // add the packages to a rulebase
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase( conf );
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        if ( serialize ) {
+            kbase = SerializationHelper.serializeObject( kbase );
+        }
+        return kbase;
+    }
+
     public void testEventAssertion() throws Exception {
         // read in the source
         KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
@@ -1476,20 +1499,12 @@
     }
 
     public void testCollectWithWindows() throws Exception {
-        // read in the source
-        final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
-        kbuilder.add( ResourceFactory.newInputStreamResource( getClass().getResourceAsStream( "test_CEP_CollectWithWindows.drl" ) ),
-                      ResourceType.DRL );
-
-        assertFalse( kbuilder.getErrors().toString(),
-                     kbuilder.hasErrors() );
-
         final KnowledgeBaseConfiguration kbconf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
         kbconf.setOption( EventProcessingOption.STREAM );
-        final KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        final KnowledgeBase kbase = loadKnowledgeBase( "test_CEP_CollectWithWindows.drl",
+                                                       kbconf,
+                                                       true );
 
-        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
-
         KnowledgeSessionConfiguration ksconf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
         ksconf.setOption( ClockTypeOption.get( ClockType.PSEUDO_CLOCK.getId() ) );
 
@@ -1641,26 +1656,19 @@
 
     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." );
-        }
+        final KnowledgeBaseConfiguration kbconf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
+        kbconf.setOption( EventProcessingOption.STREAM );
+        final KnowledgeBase kbase1 = loadKnowledgeBase( "test_CEP_StreamMode.drl",
+                                                        kbconf,
+                                                        false );
 
-        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 );
@@ -1671,48 +1679,157 @@
         ksession1.insert( new Sensor( 10,
                                       10 ) );
         ksession1.fireAllRules();
-        
-        ArgumentCaptor<AfterActivationFiredEvent> aafe1 = ArgumentCaptor.forClass(AfterActivationFiredEvent.class);
-        verify( ael1, times(1) ).afterActivationFired( aafe1.capture() );
+
+        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 ) );
+        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 ) );
+        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 ) );
-        
+        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);
+        ArgumentCaptor<AfterActivationFiredEvent> aafe2 = ArgumentCaptor.forClass( AfterActivationFiredEvent.class );
 
         ksession2.insert( new Sensor( 10,
                                       10 ) );
         ksession2.fireAllRules();
-        verify( ael2, times(1) ).afterActivationFired( aafe2.capture() );
+        verify( ael2,
+                times( 1 ) ).afterActivationFired( aafe2.capture() );
         List<AfterActivationFiredEvent> events2 = aafe2.getAllValues();
-        assertThat( events2.get( 0 ).getActivation().getDeclarationValue( "$avg" ), is( (Object) 10 ) );
-        
+        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 ) );
+        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 ) );
+        verify( ael2,
+                times( 3 ) ).afterActivationFired( aafe2.capture() );
+        assertThat( events2.get( 2 ).getActivation().getDeclarationValue( "$avg" ),
+                    is( (Object) 25 ) );
         ksession2.dispose();
     }
+
+    public void testIdentityAssertBehaviorOnEntryPoints() throws IOException,
+                                                         ClassNotFoundException {
+        StockTick st1 = new StockTick( 1,
+                                       "RHT",
+                                       10,
+                                       10 );
+        StockTick st2 = new StockTick( 1,
+                                       "RHT",
+                                       10,
+                                       10 );
+        StockTick st3 = new StockTick( 2,
+                                       "RHT",
+                                       15,
+                                       20 );
+
+        final KnowledgeBaseConfiguration kbconf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
+        kbconf.setOption( EventProcessingOption.STREAM );
+        kbconf.setOption( AssertBehaviorOption.IDENTITY );
+        final KnowledgeBase kbase1 = loadKnowledgeBase( "test_CEP_AssertBehaviorOnEntryPoints.drl",
+                                                        kbconf,
+                                                        true );
+
+        final StatefulKnowledgeSession ksession1 = kbase1.newStatefulKnowledgeSession();
+        AgendaEventListener ael1 = mock( AgendaEventListener.class );
+        ksession1.addEventListener( ael1 );
+        WorkingMemoryEntryPoint ep1 = ksession1.getWorkingMemoryEntryPoint( "stocktick stream" );
+
+        FactHandle fh1 = ep1.insert( st1 );
+        FactHandle fh1_2 = ep1.insert( st1 );
+        FactHandle fh2 = ep1.insert( st2 );
+        FactHandle fh3 = ep1.insert( st3 );
+
+        assertSame( fh1,
+                    fh1_2 );
+        assertNotSame( fh1,
+                       fh2 );
+        assertNotSame( fh1,
+                       fh3 );
+        assertNotSame( fh2,
+                       fh3 );
+
+        ksession1.fireAllRules();
+        // must have fired 3 times, one for each event identity
+        verify( ael1,
+                times( 3 ) ).afterActivationFired( any( AfterActivationFiredEvent.class ) );
+
+        ksession1.dispose();
+    }
+
+    public void testEqualityAssertBehaviorOnEntryPoints() throws IOException,
+                                                         ClassNotFoundException {
+        StockTick st1 = new StockTick( 1,
+                                       "RHT",
+                                       10,
+                                       10 );
+        StockTick st2 = new StockTick( 1,
+                                       "RHT",
+                                       10,
+                                       10 );
+        StockTick st3 = new StockTick( 2,
+                                       "RHT",
+                                       15,
+                                       20 );
+
+        final KnowledgeBaseConfiguration kbconf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
+        kbconf.setOption( EventProcessingOption.STREAM );
+        kbconf.setOption( AssertBehaviorOption.EQUALITY );
+        final KnowledgeBase kbase1 = loadKnowledgeBase( "test_CEP_AssertBehaviorOnEntryPoints.drl",
+                                                        kbconf,
+                                                        true );
+
+        final StatefulKnowledgeSession ksession1 = kbase1.newStatefulKnowledgeSession();
+        AgendaEventListener ael1 = mock( AgendaEventListener.class );
+        ksession1.addEventListener( ael1 );
+        WorkingMemoryEntryPoint ep1 = ksession1.getWorkingMemoryEntryPoint( "stocktick stream" );
+
+        FactHandle fh1 = ep1.insert( st1 );
+        FactHandle fh1_2 = ep1.insert( st1 );
+        FactHandle fh2 = ep1.insert( st2 );
+        FactHandle fh3 = ep1.insert( st3 );
+
+        assertSame( fh1,
+                    fh1_2 );
+        assertSame( fh1,
+                    fh2 );
+        assertNotSame( fh1,
+                       fh3 );
+
+        ksession1.fireAllRules();
+        // must have fired 2 times, one for each event equality
+        verify( ael1,
+                times( 2 ) ).afterActivationFired( any( AfterActivationFiredEvent.class ) );
+
+        ksession1.dispose();
+    }
+
 }

Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_CEP_AssertBehaviorOnEntryPoints.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_CEP_AssertBehaviorOnEntryPoints.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_CEP_AssertBehaviorOnEntryPoints.drl	2010-07-13 16:20:58 UTC (rev 33856)
@@ -0,0 +1,14 @@
+package org.drools;
+
+declare StockTick
+    @role( event )
+    @timestamp( time )
+end
+
+rule "test assert behavior on entry-points"
+when
+    $a : StockTick( ) from entry-point "stocktick stream"
+then
+    // no-op
+end
+

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/NamedEntryPoint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/NamedEntryPoint.java	2010-07-13 15:03:45 UTC (rev 33855)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/NamedEntryPoint.java	2010-07-13 16:20:58 UTC (rev 33856)
@@ -102,14 +102,22 @@
             // you cannot assert a null object
             return null;
         }
-        
+
         try {
             this.wm.startOperation();
             ObjectTypeConf typeConf = this.typeConfReg.getObjectTypeConf( this.entryPoint,
                                                                           object );
-            InternalFactHandle handle = this.handleFactory.newFactHandle( object,
-                                                                          typeConf,
-                                                                          wm );
+            // check if the object already exists in the WM
+            InternalFactHandle handle = (InternalFactHandle) this.objectStore.getHandleForObject( object );
+
+            if ( handle != null ) {
+                // already inserted, so return the same handle
+                return handle;
+            }
+
+            handle = this.handleFactory.newFactHandle( object,
+                                                       typeConf,
+                                                       wm );
             handle.setEntryPoint( this );
             this.objectStore.addHandle( handle,
                                         object );
@@ -176,9 +184,9 @@
     }
 
     public void update(final org.drools.runtime.rule.FactHandle factHandle,
-                          final Object object,
-                          final Rule rule,
-                          final Activation activation) throws FactException {
+                       final Object object,
+                       final Rule rule,
+                       final Activation activation) throws FactException {
         try {
             this.ruleBase.readLock();
             this.lock.lock();
@@ -188,7 +196,7 @@
             final InternalFactHandle handle = (InternalFactHandle) factHandle;
             final Object originalObject = handle.getObject();
 
-            if ( handle.getId() == -1 || object == null || ( handle.isEvent() && ((EventFactHandle)handle).isExpired() )) {
+            if ( handle.getId() == -1 || object == null || (handle.isEvent() && ((EventFactHandle) handle).isExpired()) ) {
                 // the handle is invalid, most likely already retracted, so
                 // return
                 // and we cannot assert a null object
@@ -234,7 +242,7 @@
                                               this.wm );
 
             this.wm.getWorkingMemoryEventSupport().fireObjectUpdated( propagationContext,
-                                                                      (org.drools.FactHandle)factHandle,
+                                                                      (org.drools.FactHandle) factHandle,
                                                                       originalObject,
                                                                       object,
                                                                       this.wm );
@@ -285,9 +293,9 @@
                                                                                       -1,
                                                                                       -1,
                                                                                       this.entryPoint );
-            
+
             ObjectTypeConf typeConf = this.typeConfReg.getObjectTypeConf( this.entryPoint,
-                                                                          handle.getObject() );            
+                                                                          handle.getObject() );
 
             this.entryPointNode.retractObject( handle,
                                                propagationContext,
@@ -302,7 +310,7 @@
                                                                         this.wm );
 
             this.objectStore.removeHandle( handle );
-            
+
             this.handleFactory.destroyFactHandle( handle );
 
             this.wm.executeQueuedActions();
@@ -333,7 +341,7 @@
             // ((ShadowProxy) handle.getObject()).getShadowedObject() :
             // handle.getObject();
 
-            if ( handle.getId() == -1 || ( handle.isEvent() && ((EventFactHandle)handle).isExpired() ) ) {
+            if ( handle.getId() == -1 || (handle.isEvent() && ((EventFactHandle) handle).isExpired()) ) {
                 // the handle is invalid, most likely already retracted, so
                 // return
                 return;
@@ -352,9 +360,9 @@
                                                                                       -1,
                                                                                       -1,
                                                                                       entryPoint );
-            
+
             ObjectTypeConf typeConf = this.typeConfReg.getObjectTypeConf( this.entryPoint,
-                                                                          handle.getObject() );            
+                                                                          handle.getObject() );
 
             this.entryPointNode.retractObject( handle,
                                                propagationContext,
@@ -401,7 +409,7 @@
             final InternalFactHandle handle = (InternalFactHandle) factHandle;
             final Object originalObject = handle.getObject();
 
-            if ( handle.getId() == -1 || ( handle.isEvent() && ((EventFactHandle)handle).isExpired() ) ) {
+            if ( handle.getId() == -1 || (handle.isEvent() && ((EventFactHandle) handle).isExpired()) ) {
                 // the handle is invalid, most likely already retracted, so
                 // return
                 return;
@@ -422,9 +430,9 @@
                                                                                       -1,
                                                                                       -1,
                                                                                       entryPoint );
-            
+
             ObjectTypeConf typeConf = this.typeConfReg.getObjectTypeConf( this.entryPoint,
-                                                                          handle.getObject() );            
+                                                                          handle.getObject() );
 
             this.entryPointNode.assertObject( handle,
                                               propagationContext,
@@ -510,7 +518,7 @@
     public RuleBase getRuleBase() {
         return this.ruleBase;
     }
-        
+
     public FactHandle getFactHandle(Object object) {
         return this.objectStore.getHandleForObject( object );
     }
@@ -518,40 +526,42 @@
     public EntryPoint getEntryPoint() {
         return this.entryPoint;
     }
-    
+
     public InternalWorkingMemory getInternalWorkingMemory() {
         return this.wm;
     }
+
     public FactHandle getFactHandleByIdentity(final Object object) {
         return this.objectStore.getHandleForObjectIdentity( object );
     }
+
     public Object getObject(org.drools.runtime.rule.FactHandle factHandle) {
         return this.objectStore.getObjectForHandle( (InternalFactHandle) factHandle );
-    }    
-    
+    }
+
     @SuppressWarnings("unchecked")
-    public <T extends org.drools.runtime.rule.FactHandle> Collection< T > getFactHandles() {
+    public <T extends org.drools.runtime.rule.FactHandle> Collection<T> getFactHandles() {
         return new ObjectStoreWrapper( this.objectStore,
                                        null,
                                        ObjectStoreWrapper.FACT_HANDLE );
     }
 
     @SuppressWarnings("unchecked")
-    public <T extends org.drools.runtime.rule.FactHandle> Collection< T > getFactHandles(org.drools.runtime.ObjectFilter filter) {
+    public <T extends org.drools.runtime.rule.FactHandle> Collection<T> getFactHandles(org.drools.runtime.ObjectFilter filter) {
         return new ObjectStoreWrapper( this.objectStore,
                                        filter,
                                        ObjectStoreWrapper.FACT_HANDLE );
     }
 
     @SuppressWarnings("unchecked")
-    public Collection< Object > getObjects() {
+    public Collection<Object> getObjects() {
         return new ObjectStoreWrapper( this.objectStore,
                                        null,
                                        ObjectStoreWrapper.OBJECT );
     }
 
     @SuppressWarnings("unchecked")
-    public Collection< Object > getObjects(org.drools.runtime.ObjectFilter filter) {
+    public Collection<Object> getObjects(org.drools.runtime.ObjectFilter filter) {
         return new ObjectStoreWrapper( this.objectStore,
                                        filter,
                                        ObjectStoreWrapper.OBJECT );
@@ -563,6 +573,6 @@
 
     public long getFactCount() {
         return this.objectStore.size();
-    }    
+    }
 
 }



More information about the jboss-svn-commits mailing list