[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