[jboss-svn-commits] JBL Code SVN: r18623 - in labs/jbossrules/branches/4.0.x: drools-core/src/main/java/org/drools/common and 1 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Feb 28 14:37:41 EST 2008


Author: tirelli
Date: 2008-02-28 14:37:41 -0500 (Thu, 28 Feb 2008)
New Revision: 18623

Modified:
   labs/jbossrules/branches/4.0.x/drools-compiler/src/test/java/org/drools/integrationtests/DynamicRulesTest.java
   labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java
   labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/MapBackedClassLoader.java
Log:
JBRULES-1489: fixing ClassNotFoundException when deserializing shadow facts

Modified: labs/jbossrules/branches/4.0.x/drools-compiler/src/test/java/org/drools/integrationtests/DynamicRulesTest.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-compiler/src/test/java/org/drools/integrationtests/DynamicRulesTest.java	2008-02-28 19:21:42 UTC (rev 18622)
+++ labs/jbossrules/branches/4.0.x/drools-compiler/src/test/java/org/drools/integrationtests/DynamicRulesTest.java	2008-02-28 19:37:41 UTC (rev 18623)
@@ -30,6 +30,7 @@
 import org.drools.RuleBaseFactory;
 import org.drools.StatefulSession;
 import org.drools.WorkingMemory;
+import org.drools.common.DroolsObjectInputStream;
 import org.drools.common.InternalFactHandle;
 import org.drools.compiler.PackageBuilder;
 import org.drools.compiler.PackageBuilderConfiguration;
@@ -783,6 +784,61 @@
     }
 
     
+    public void testSerializeAdd() throws Exception {
+
+        //Create a rulebase, a session, and test it
+        RuleBaseConfiguration conf = new RuleBaseConfiguration();
+        //conf.setShadowProxy( false );
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase( conf );
+        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
+        DroolsObjectInputStream stream = new DroolsObjectInputStream( new ByteArrayInputStream( serializedRulebase ) );
+        ruleBase = (RuleBase) stream.readObject();
+        stream.close();
+        
+        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 ));
+        
+    }
+
     public class SubvertedClassLoader extends URLClassLoader {
 
         private static final long serialVersionUID = 400L;

Modified: labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java	2008-02-28 19:21:42 UTC (rev 18622)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java	2008-02-28 19:37:41 UTC (rev 18623)
@@ -88,7 +88,7 @@
 
     protected transient CompositePackageClassLoader packageClassLoader;
 
-    protected transient MapBackedClassLoader        classLoader;
+    protected MapBackedClassLoader                  classLoader;
 
 	private transient Objenesis                     objenesis;
 
@@ -175,6 +175,7 @@
     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[]
@@ -208,15 +209,16 @@
                                                       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 );

Modified: labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/MapBackedClassLoader.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/MapBackedClassLoader.java	2008-02-28 19:21:42 UTC (rev 18622)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/rule/MapBackedClassLoader.java	2008-02-28 19:37:41 UTC (rev 18623)
@@ -33,6 +33,11 @@
         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, 
@@ -114,5 +119,9 @@
             return input;
         }
     }
+    
+    public Map getStore() {
+        return this.store;
+    }
 
 }




More information about the jboss-svn-commits mailing list