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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Feb 29 07:57:00 EST 2008


Author: tirelli
Date: 2008-02-29 07:57:00 -0500 (Fri, 29 Feb 2008)
New Revision: 18635

Modified:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MarshallingTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooStatefulSession.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MapBackedClassLoader.java
Log:
JBRULES-1489: fixing trunk. There was also a regression that I'm fixing now

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MarshallingTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MarshallingTest.java	2008-02-29 12:02:56 UTC (rev 18634)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MarshallingTest.java	2008-02-29 12:57:00 UTC (rev 18635)
@@ -14,11 +14,14 @@
 import java.util.List;
 import java.util.Map;
 
+import org.drools.Cheese;
 import org.drools.Person;
 import org.drools.RuleBase;
 import org.drools.RuleBaseConfiguration;
 import org.drools.RuleBaseFactory;
+import org.drools.StatefulSession;
 import org.drools.WorkingMemory;
+import org.drools.common.InternalFactHandle;
 import org.drools.compiler.PackageBuilder;
 import org.drools.rule.Package;
 import org.drools.rule.Rule;
@@ -314,6 +317,59 @@
         assertTrue( IteratorToList.convert( workingMemory.iterateObjects() ).contains( new Person( "help" ) ) );
     }
 
+    public void testSerializeAdd() throws Exception {
+
+        //Create a rulebase, a session, and test it
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase( );
+        PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_Dynamic1.drl" ) ) );
+        Package pkg = serialisePackage( builder.getPackage() );
+        ruleBase.addPackage( pkg );
+        
+        StatefulSession session = ruleBase.newStatefulSession();
+        List list = new ArrayList();
+        session.setGlobal( "list", list );
+        
+        InternalFactHandle stilton = (InternalFactHandle) session.insert( new Cheese( "stilton", 10 ) );
+        InternalFactHandle brie = (InternalFactHandle) session.insert( new Cheese( "brie", 10 ) );
+        session.fireAllRules();
+        
+        assertEquals( list.size(), 1 );
+        assertEquals( "stilton", list.get( 0 ));
+        
+        byte[] serializedSession = serializeOut( session );
+        session.dispose();
+        
+        byte[] serializedRulebase = serializeOut( ruleBase );
+        
+        // now recreate the rulebase, deserialize the session and test it
+        ruleBase = (RuleBase) serializeIn( serializedRulebase );
+        
+        session = ruleBase.newStatefulSession( new ByteArrayInputStream( serializedSession ) );
+        list = (List) session.getGlobal( "list" );
+        
+        assertNotNull( list );
+        assertEquals( list.size(), 1 );
+        assertEquals( "stilton", list.get( 0 ));
+        
+        builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_Dynamic3.drl" ) ) );
+        pkg = serialisePackage( builder.getPackage() );
+        ruleBase.addPackage( pkg );
+        
+        InternalFactHandle stilton2 = (InternalFactHandle) session.insert( new Cheese( "stilton", 10 ) );
+        InternalFactHandle brie2 = (InternalFactHandle) session.insert( new Cheese( "brie", 10 ) );
+        InternalFactHandle bob = (InternalFactHandle) session.insert( new Person( "bob", 30 ) );
+        session.fireAllRules();
+        
+        assertEquals( list.size(), 3 );
+        assertEquals( bob.getObject(), list.get( 1 ));
+        assertEquals( "stilton", list.get( 2 ));
+        
+        session.dispose();
+        
+    }
+
     protected RuleBase getRuleBase() throws Exception {
 
         return RuleBaseFactory.newRuleBase( RuleBase.RETEOO,

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java	2008-02-29 12:02:56 UTC (rev 18634)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java	2008-02-29 12:57:00 UTC (rev 18635)
@@ -21,6 +21,7 @@
 import org.drools.common.ObjectStore;
 import org.drools.common.TruthMaintenanceSystem;
 import org.drools.common.WorkingMemoryAction;
+import org.drools.concurrent.ExecutorService;
 import org.drools.event.AgendaEventListener;
 import org.drools.event.AgendaEventSupport;
 import org.drools.event.RuleBaseEventListener;
@@ -478,4 +479,14 @@
         return null;
     }
 
+    public ExecutorService getExecutorService() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public void setExecutorService(ExecutorService executor) {
+        // TODO Auto-generated method stub
+        
+    }
+
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java	2008-02-29 12:02:56 UTC (rev 18634)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java	2008-02-29 12:57:00 UTC (rev 18635)
@@ -174,25 +174,31 @@
      * The Package uses PackageCompilationData to hold a reference to the generated bytecode. The generated bytecode must be restored before any Rules.
      *
      */
-    public void doWriteExternal(final ObjectOutput stream) throws IOException {
+    public void doWriteExternal(final ObjectOutput stream,
+                                final Object[] objects) throws IOException {        
         stream.writeObject( this.pkgs );
+        stream.writeObject( this.classLoader.getStore() );
 
         // Rules must be restored by an ObjectInputStream that can resolve using a given ClassLoader to handle seaprately by storing as
         // a byte[]
-        //final ByteArrayOutputStream bos = new ByteArrayOutputStream();
-        //final ObjectOutput out = new ObjectOutputStream( bos );
+        final ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        final ObjectOutput out = new ObjectOutputStream( bos );
+        out.writeObject( this.id );
+        out.writeObject( this.processes );
+        out.writeObject( this.agendaGroupRuleTotals );
+        out.writeObject( this.factHandleFactory );
+        out.writeObject( this.globals );
+        out.writeObject( this.config );
         
-        stream.writeObject( this.id );
-        stream.writeObject( this.processes );
-        stream.writeObject( this.agendaGroupRuleTotals );
-        stream.writeObject( this.factHandleFactory );
-        stream.writeObject( this.globals );
-        stream.writeObject( this.config );
-
         this.eventSupport.removeEventListener( RuleBaseEventListener.class );
-        stream.writeObject( this.eventSupport );
-
-        //stream.writeObject( bos.toByteArray() );
+        out.writeObject( this.eventSupport );
+        
+        for ( int i = 0, length = objects.length; i < length; i++ ) {
+            out.writeObject( objects[i] );
+        }        
+        
+        out.close();
+        stream.writeObject( bos.toByteArray() );
     }
 
     /**
@@ -201,19 +207,21 @@
      * A custom ObjectInputStream, able to resolve classes against the bytecode in the PackageCompilationData, is used to restore the Rules.
      *
      */
-    public void doReadExternal(final ObjectInput stream) throws IOException,
-                                                        ClassNotFoundException {
-        // PackageCompilationData must be restored before Rules as it has the ClassLoader needed to resolve the generated code references in Rules
+    public void doReadExternal(final ObjectInput stream,
+                               final Object[] objects) throws IOException,
+                                                      ClassNotFoundException {
+        // PackageCompilationData must be restored before Rules as it has the ClassLoader needed to resolve the generated code references in Rules        
         this.pkgs = (Map) stream.readObject();
-
+        Map store = (Map) stream.readObject();
+        
         if ( stream instanceof DroolsObjectInputStream ) {
             final DroolsObjectInputStream parentStream = (DroolsObjectInputStream) stream;
             parentStream.setRuleBase( this );
             this.packageClassLoader = new CompositePackageClassLoader( parentStream.getClassLoader() );
-            this.classLoader = new MapBackedClassLoader( parentStream.getClassLoader() );
+            this.classLoader = new MapBackedClassLoader( parentStream.getClassLoader(), store );
         } else {
             this.packageClassLoader = new CompositePackageClassLoader( Thread.currentThread().getContextClassLoader() );
-            this.classLoader = new MapBackedClassLoader( Thread.currentThread().getContextClassLoader() );
+            this.classLoader = new MapBackedClassLoader( Thread.currentThread().getContextClassLoader(), store );
         }
 
         this.packageClassLoader.addClassLoader( this.classLoader );
@@ -223,20 +231,31 @@
             this.packageClassLoader.addClassLoader( ((Package) it.next()).getDialectDatas().getClassLoader() );
         }
 
-        this.id = (String) stream.readObject();
-        this.processes = (Map) stream.readObject();
-        this.agendaGroupRuleTotals = (Map) stream.readObject();
-        this.factHandleFactory = (FactHandleFactory) stream.readObject();
-        this.globals = (Map) stream.readObject();
+        // Return the rules stored as a byte[]
+        final byte[] bytes = (byte[]) stream.readObject();
 
-        this.config = (RuleBaseConfiguration) stream.readObject();
-        
-        this.config.setClassLoader( this.packageClassLoader );
-        
-        this.eventSupport = (RuleBaseEventSupport) stream.readObject();
+        //  Use a custom ObjectInputStream that can resolve against a given classLoader
+        final DroolsObjectInputStream childStream = new DroolsObjectInputStream( new ByteArrayInputStream( bytes ),
+                                                                                 this.packageClassLoader );
+        childStream.setRuleBase( this );
+
+        this.id = (String) childStream.readObject();
+        this.processes = (Map) childStream.readObject();
+        this.agendaGroupRuleTotals = (Map) childStream.readObject();
+        this.factHandleFactory = (FactHandleFactory) childStream.readObject();
+        this.globals = (Map) childStream.readObject();
+
+        this.config = (RuleBaseConfiguration) childStream.readObject();
+        this.config.setClassLoader( childStream.getClassLoader() );
+        this.eventSupport = (RuleBaseEventSupport) childStream.readObject();
         this.eventSupport.setRuleBase( this );
 
         this.statefulSessions = new ObjectHashSet();
+
+        for ( int i = 0, length = objects.length; i < length; i++ ) {
+            objects[i] = childStream.readObject();
+        }
+        childStream.close();
     }
 
     /**
@@ -706,6 +725,8 @@
             ExecutorService executor = ExecutorServiceFactory.createExecutorService( this.config.getExecutorService() );
 
             executor.setCommandExecutor( new CommandExecutor( session ) );
+            
+            ((InternalWorkingMemory) session).setExecutorService( executor );
 
             if ( keepReference ) {
                 addStatefulSession( session );

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java	2008-02-29 12:02:56 UTC (rev 18634)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java	2008-02-29 12:57:00 UTC (rev 18635)
@@ -50,6 +50,7 @@
 import org.drools.RuleBaseConfiguration.LogicalOverride;
 import org.drools.base.MapGlobalResolver;
 import org.drools.base.ShadowProxy;
+import org.drools.concurrent.ExecutorService;
 import org.drools.event.AgendaEventListener;
 import org.drools.event.AgendaEventSupport;
 import org.drools.event.RuleBaseEventListener;
@@ -1625,6 +1626,14 @@
         this.timeMachine = timeMachine;
     }
 
+    public ExecutorService getExecutorService() {
+        return null; // no executor service
+    }
+
+    public void setExecutorService(ExecutorService executor) {
+        // no executor service, so nothing to set
+    }
+
     /**
      * Returns the ObjectTypeConfiguration object for the given object or
      * creates a new one if none is found in the cache

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java	2008-02-29 12:02:56 UTC (rev 18634)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java	2008-02-29 12:57:00 UTC (rev 18635)
@@ -6,6 +6,7 @@
 import org.drools.FactException;
 import org.drools.FactHandle;
 import org.drools.WorkingMemory;
+import org.drools.concurrent.ExecutorService;
 import org.drools.event.AgendaEventSupport;
 import org.drools.event.RuleFlowEventSupport;
 import org.drools.event.WorkingMemoryEventSupport;
@@ -19,7 +20,6 @@
 import org.drools.spi.Activation;
 import org.drools.spi.FactHandleFactory;
 import org.drools.spi.PropagationContext;
-import org.drools.util.ObjectHashMap;
 
 public interface InternalWorkingMemory
     extends
@@ -106,4 +106,8 @@
      * @return
      */
     public Map<Object, ObjectTypeConf> getObjectTypeConfMap(EntryPoint entryPoint);
+
+    public ExecutorService getExecutorService();
+
+    public void setExecutorService(ExecutorService executor);
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java	2008-02-29 12:02:56 UTC (rev 18634)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java	2008-02-29 12:57:00 UTC (rev 18635)
@@ -146,7 +146,9 @@
      * 
      */
     public void writeExternal(final ObjectOutput stream) throws IOException {
-        doWriteExternal( stream );
+        final Object[] objects = new Object[]{this.rete, this.reteooBuilder};
+        doWriteExternal( stream,
+                         objects );
     }
 
     /**
@@ -157,18 +159,12 @@
      */
     public void readExternal(final ObjectInput stream) throws IOException,
                                                       ClassNotFoundException {
-        doReadExternal( stream );
+        final Object[] objects = new Object[2];
+        doReadExternal( stream,
+                        objects );
 
-        // rebuild the Rete network from the pkg information
-        this.reteooBuilder = new ReteooBuilder( this );
-        this.rete = new Rete( this );
-        synchronized ( this.pkgs ) {
-            for ( Package pkg : this.pkgs.values() ) {
-                for ( Rule rule : pkg.getRules() ) {
-                    addRule( rule );
-                }
-            }
-        }
+        this.rete = (Rete) objects[0];
+        this.reteooBuilder = (ReteooBuilder) objects[1];
     }
 
     // ------------------------------------------------------------

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooStatefulSession.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooStatefulSession.java	2008-02-29 12:02:56 UTC (rev 18634)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooStatefulSession.java	2008-02-29 12:57:00 UTC (rev 18635)
@@ -102,4 +102,11 @@
         return this.ruleBaseListeners;
     }
 
+    public ExecutorService getExecutorService() {
+        return executor;
+    }
+
+    public void setExecutorService(ExecutorService executor) {
+        this.executor = executor;
+    }
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MapBackedClassLoader.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MapBackedClassLoader.java	2008-02-29 12:02:56 UTC (rev 18634)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MapBackedClassLoader.java	2008-02-29 12:57:00 UTC (rev 18635)
@@ -13,41 +13,48 @@
     implements
     DroolsClassLoader,
     Serializable {
-	
-	private static final long serialVersionUID = 400L;
 
-	private static final ProtectionDomain PROTECTION_DOMAIN;
-    
-    private Map store;
+    private static final long             serialVersionUID = 400L;
 
+    private static final ProtectionDomain PROTECTION_DOMAIN;
+
+    private Map                           store;
+
     static {
         PROTECTION_DOMAIN = (ProtectionDomain) AccessController.doPrivileged( new PrivilegedAction() {
             public Object run() {
                 return MapBackedClassLoader.class.getProtectionDomain();
             }
         } );
-    }    
+    }
 
     public MapBackedClassLoader(final ClassLoader parentClassLoader) {
         super( parentClassLoader );
         this.store = new HashMap();
     }
-    
+
+    public MapBackedClassLoader(final ClassLoader parentClassLoader,
+                                final Map store) {
+        super( parentClassLoader );
+        this.store = store;
+    }
+
     public void addResource(String className,
                             byte[] bytes) {
-        addClass(className, 
-                 bytes);
+        addClass( className,
+                  bytes );
     }
-    
+
     private String convertResourcePathToClassName(final String pName) {
-    	return pName.replaceAll(".java$|.class$", "").replace('/', '.');
+        return pName.replaceAll( ".java$|.class$",
+                                 "" ).replace( '/',
+                                               '.' );
     }
-    
 
     public void addClass(final String className,
                          byte[] bytes) {
-    	
-        this.store.put( convertResourcePathToClassName(className),
+
+        this.store.put( convertResourcePathToClassName( className ),
                         bytes );
     }
 
@@ -115,4 +122,7 @@
         }
     }
 
+    public Map getStore() {
+        return this.store;
+    }
 }




More information about the jboss-svn-commits mailing list