[jboss-svn-commits] JBL Code SVN: r7304 - in labs/jbossrules/trunk/drools-core/src: main/java/org/drools/base main/java/org/drools/spi test/java/org/drools/base
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Wed Nov 1 19:01:26 EST 2006
Author: mark.proctor at jboss.com
Date: 2006-11-01 19:01:21 -0500 (Wed, 01 Nov 2006)
New Revision: 7304
Added:
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/DelegateJavaFactHandler.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/JavaFactRegistryEntry.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/JavaFact.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/DelegateJavaFactHandlerTest.java
Log:
JBRULES-540 Create a Java Interface to allow JavaBeans to work more seamlessly as Facts
Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/DelegateJavaFactHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/DelegateJavaFactHandler.java 2006-11-01 23:37:37 UTC (rev 7303)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/DelegateJavaFactHandler.java 2006-11-02 00:01:21 UTC (rev 7304)
@@ -0,0 +1,135 @@
+package org.drools.base;
+
+import org.drools.FactHandle;
+import org.drools.WorkingMemory;
+import org.drools.spi.JavaFact;
+
+public class DelegateJavaFactHandler
+ implements
+ JavaFact {
+ private JavaFactRegistryEntry[] entries;
+
+ public JavaFactRegistryEntry[] listWorkingMemories() {
+ return this.entries;
+ }
+
+ public boolean register(final WorkingMemory workingMemory) {
+ if ( workingMemory == null ) {
+ return false;
+ }
+
+ if (isRegistered( workingMemory ) ) {
+ return false;
+ }
+
+ final JavaFactRegistryEntry[] newEntries;
+ int position;
+ if ( this.entries == null ) {
+ newEntries = new JavaFactRegistryEntry[1];
+ position = 0;
+ } else {
+ int newLength = this.entries.length + 1;
+ newEntries = new JavaFactRegistryEntry[ newLength ];
+ System.arraycopy( this.entries,
+ 0,
+ newEntries,
+ 0,
+ newLength - 1 );
+ position = this.entries.length;
+ }
+
+ final FactHandle handle = workingMemory.assertObject( this );
+
+ newEntries[position] = new JavaFactRegistryEntry( workingMemory,
+ handle );
+
+ this.entries = newEntries;
+ return true;
+ }
+
+ public void unregisterAll() {
+ for ( int i = 0, length = this.entries.length; i < length; i++ ) {
+ final WorkingMemory workingMemory = this.entries[i].getWorkingMemory();
+ final FactHandle handle = this.entries[i].getFactHandle();
+ workingMemory.retractObject( handle );
+ }
+
+ }
+
+ public boolean unregister(final WorkingMemory workingMemory) {
+ if ( this.entries == null ) {
+ return false;
+ }
+
+
+ // If there is only one entry, see if it matched and if so null
+ if ( this.entries.length == 1 && this.entries[0].getWorkingMemory() == workingMemory ) {
+ this.entries = null;
+ return true;
+ }
+
+
+ // try the first
+ if ( this.entries[0].getWorkingMemory() == workingMemory ) {
+ final JavaFactRegistryEntry[] newEntries = new JavaFactRegistryEntry[this.entries.length - 1];
+ System.arraycopy( this.entries,
+ 1,
+ newEntries,
+ 0,
+ newEntries.length );
+ this.entries = newEntries;
+ return true;
+ }
+
+ // try the last
+ if ( this.entries[this.entries.length-1].getWorkingMemory() == workingMemory ) {
+ final JavaFactRegistryEntry[] newEntries = new JavaFactRegistryEntry[this.entries.length - 1];
+ System.arraycopy( this.entries,
+ 0,
+ newEntries,
+ 0,
+ newEntries.length );
+ this.entries = newEntries;
+ return true;
+ }
+
+ // try middle
+ for ( int i = 0, length = this.entries.length; i < length; i++ ) {
+ if ( this.entries[i].getWorkingMemory() == workingMemory ) {
+ final JavaFactRegistryEntry[] newEntries = new JavaFactRegistryEntry[this.entries.length - 1];
+ System.arraycopy( this.entries,
+ 0,
+ newEntries,
+ 0,
+ i );
+ System.arraycopy( this.entries,
+ i+1,
+ newEntries,
+ i,
+ newEntries.length -1 );
+ this.entries = newEntries;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public boolean isRegistered(final WorkingMemory workingMemory) {
+ if ( this.entries == null ) {
+ return false;
+ }
+
+ for ( int i = 0, length = this.entries.length; i < length; i++ ) {
+ if ( this.entries[i].getWorkingMemory() == workingMemory ) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public int[] getChanges() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+}
Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/JavaFactRegistryEntry.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/JavaFactRegistryEntry.java 2006-11-01 23:37:37 UTC (rev 7303)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/JavaFactRegistryEntry.java 2006-11-02 00:01:21 UTC (rev 7304)
@@ -0,0 +1,28 @@
+/**
+ *
+ */
+package org.drools.base;
+
+import org.drools.FactHandle;
+import org.drools.WorkingMemory;
+
+public class JavaFactRegistryEntry {
+ private WorkingMemory workingMemory;
+ private FactHandle handle;
+
+ public JavaFactRegistryEntry(final WorkingMemory workingMemory,
+ final FactHandle handle) {
+ super();
+ this.workingMemory = workingMemory;
+ this.handle = handle;
+ }
+
+ public FactHandle getFactHandle() {
+ return this.handle;
+ }
+
+ public WorkingMemory getWorkingMemory() {
+ return this.workingMemory;
+ }
+
+}
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/JavaFact.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/JavaFact.java 2006-11-01 23:37:37 UTC (rev 7303)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/spi/JavaFact.java 2006-11-02 00:01:21 UTC (rev 7304)
@@ -0,0 +1,18 @@
+package org.drools.spi;
+
+import org.drools.WorkingMemory;
+import org.drools.base.JavaFactRegistryEntry;
+
+public interface JavaFact {
+ public JavaFactRegistryEntry[] listWorkingMemories();
+
+ public boolean register(final WorkingMemory workingMemory);
+
+ public void unregisterAll();
+
+ public boolean unregister(final WorkingMemory workingMemory);
+
+ public boolean isRegistered(final WorkingMemory workingMemory);
+
+ public int[] getChanges();
+}
Added: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/DelegateJavaFactHandlerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/DelegateJavaFactHandlerTest.java 2006-11-01 23:37:37 UTC (rev 7303)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/DelegateJavaFactHandlerTest.java 2006-11-02 00:01:21 UTC (rev 7304)
@@ -0,0 +1,124 @@
+package org.drools.base;
+
+import java.lang.reflect.Field;
+
+import junit.framework.TestCase;
+
+import org.drools.RuleBaseFactory;
+import org.drools.WorkingMemory;
+
+public class DelegateJavaFactHandlerTest extends TestCase {
+
+ public void test1Entry() throws Exception {
+ DelegateJavaFactHandler handler = new DelegateJavaFactHandler();
+
+ Field field = handler.getClass().getDeclaredField( "entries" );
+ field.setAccessible( true );
+
+ WorkingMemory wm1 = RuleBaseFactory.newRuleBase().newWorkingMemory();
+ handler.register( wm1 );
+
+ JavaFactRegistryEntry[] entries = ( JavaFactRegistryEntry[] ) field.get( handler );
+ assertEquals( 1, entries.length );
+
+ assertTrue( handler.isRegistered( wm1 ));
+
+ assertEquals(1, handler.listWorkingMemories().length );
+ assertSame( wm1, handler.listWorkingMemories()[0].getWorkingMemory() );
+
+ WorkingMemory wm2 = RuleBaseFactory.newRuleBase().newWorkingMemory();
+ assertFalse( handler.isRegistered( wm2 ));
+
+ handler.unregister( wm1 );
+ assertFalse( handler.isRegistered( wm1 ));
+ entries = ( JavaFactRegistryEntry[] ) field.get( handler );
+ assertNull( entries );
+ }
+
+ public void test2Entries() throws Exception {
+ DelegateJavaFactHandler handler = new DelegateJavaFactHandler();
+
+ Field field = handler.getClass().getDeclaredField( "entries" );
+ field.setAccessible( true );
+
+ WorkingMemory wm1 = RuleBaseFactory.newRuleBase().newWorkingMemory();
+ WorkingMemory wm2 = RuleBaseFactory.newRuleBase().newWorkingMemory();
+ handler.register( wm1 );
+ handler.register( wm2 );
+
+ JavaFactRegistryEntry[] entries = ( JavaFactRegistryEntry[] ) field.get( handler );
+ assertEquals( 2, entries.length );
+
+ assertTrue( handler.isRegistered( wm1 ));
+ assertTrue( handler.isRegistered( wm2 ));
+
+ assertEquals(2, handler.listWorkingMemories().length );
+ assertSame( wm1, handler.listWorkingMemories()[0].getWorkingMemory() );
+ assertSame( wm2, handler.listWorkingMemories()[1].getWorkingMemory() );
+
+ handler.unregister( wm1 );
+ assertFalse( handler.isRegistered( wm1 ));
+ entries = ( JavaFactRegistryEntry[] ) field.get( handler );
+ assertEquals( 1, entries.length );
+
+ handler.unregister( wm2 );
+ assertFalse( handler.isRegistered( wm2 ));
+ entries = ( JavaFactRegistryEntry[] ) field.get( handler );
+ assertNull( entries );
+
+ // check revererse
+ handler.register( wm1 );
+ handler.register( wm2 );
+
+ handler.unregister( wm2 );
+ assertFalse( handler.isRegistered( wm2 ));
+ entries = ( JavaFactRegistryEntry[] ) field.get( handler );
+ assertEquals( 1, entries.length );
+
+ handler.unregister( wm1 );
+ assertFalse( handler.isRegistered( wm1 ));
+ entries = ( JavaFactRegistryEntry[] ) field.get( handler );
+ assertNull( entries );
+ }
+
+ public void test3Entries() throws Exception {
+ DelegateJavaFactHandler handler = new DelegateJavaFactHandler();
+
+ Field field = handler.getClass().getDeclaredField( "entries" );
+ field.setAccessible( true );
+
+ WorkingMemory wm1 = RuleBaseFactory.newRuleBase().newWorkingMemory();
+ WorkingMemory wm2 = RuleBaseFactory.newRuleBase().newWorkingMemory();
+ WorkingMemory wm3 = RuleBaseFactory.newRuleBase().newWorkingMemory();
+ handler.register( wm1 );
+ handler.register( wm2 );
+ handler.register( wm3 );
+
+ JavaFactRegistryEntry[] entries = ( JavaFactRegistryEntry[] ) field.get( handler );
+ assertEquals( 3, entries.length );
+
+ assertTrue( handler.isRegistered( wm1 ));
+ assertTrue( handler.isRegistered( wm2 ));
+ assertTrue( handler.isRegistered( wm3 ));
+
+ assertEquals(3, handler.listWorkingMemories().length );
+ assertSame( wm1, handler.listWorkingMemories()[0].getWorkingMemory() );
+ assertSame( wm2, handler.listWorkingMemories()[1].getWorkingMemory() );
+ assertSame( wm3, handler.listWorkingMemories()[2].getWorkingMemory() );
+
+ handler.unregister( wm2 );
+ assertFalse( handler.isRegistered( wm2 ));
+ entries = ( JavaFactRegistryEntry[] ) field.get( handler );
+ assertEquals( 2, entries.length );
+
+ handler.unregister( wm1 );
+ assertFalse( handler.isRegistered( wm1 ));
+ entries = ( JavaFactRegistryEntry[] ) field.get( handler );
+ assertEquals( 1, entries.length );
+
+ handler.unregister( wm3 );
+ assertFalse( handler.isRegistered( wm3 ));
+ entries = ( JavaFactRegistryEntry[] ) field.get( handler );
+ assertNull( entries );
+ }
+}
More information about the jboss-svn-commits
mailing list