[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