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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Dec 21 13:54:01 EST 2009


Author: tirelli
Date: 2009-12-21 13:54:00 -0500 (Mon, 21 Dec 2009)
New Revision: 30788

Added:
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/TestEnum.java
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_EnumSerialization.drl
   labs/jbossrules/trunk/drools-compiler/src/test/resources/testEnum.jar
Modified:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Primitives.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/DynamicRulesTest.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/ObjectFieldImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/DroolsStreamUtils.java
Log:
JBRULES-2388: fixing de-serialization of enums

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java	2009-12-21 18:17:34 UTC (rev 30787)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java	2009-12-21 18:54:00 UTC (rev 30788)
@@ -487,7 +487,7 @@
                 addPackageFromDrl( new StringReader( string ) );
             } else if ( ResourceType.PKG.equals( type ) ) {
                 InputStream is = resource.getInputStream();
-                Package pkg = (Package) DroolsStreamUtils.streamIn( is );
+                Package pkg = (Package) DroolsStreamUtils.streamIn( is, this.configuration.getClassLoader() );
                 is.close();
                 addPackage( pkg );
             } else if ( ResourceType.CHANGE_SET.equals( type ) ) {

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Primitives.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Primitives.java	2009-12-21 18:17:34 UTC (rev 30787)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Primitives.java	2009-12-21 18:54:00 UTC (rev 30788)
@@ -51,7 +51,7 @@
     private Boolean           booleanWrapper;
 
     private Object            object;
-
+    
     public boolean isBooleanPrimitive() {
         return this.booleanPrimitive;
     }

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/DynamicRulesTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/DynamicRulesTest.java	2009-12-21 18:17:34 UTC (rev 30787)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/DynamicRulesTest.java	2009-12-21 18:54:00 UTC (rev 30788)
@@ -6,6 +6,7 @@
 import java.net.URLClassLoader;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 
 import junit.framework.Assert;
@@ -15,12 +16,14 @@
 import org.drools.FactA;
 import org.drools.FactB;
 import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseConfiguration;
 import org.drools.KnowledgeBaseFactory;
 import org.drools.Order;
 import org.drools.OrderItem;
 import org.drools.Person;
 import org.drools.PersonInterface;
 import org.drools.Precondition;
+import org.drools.Primitives;
 import org.drools.RuleBase;
 import org.drools.RuleBaseConfiguration;
 import org.drools.RuleBaseFactory;
@@ -28,12 +31,14 @@
 import org.drools.StockTick;
 import org.drools.WorkingMemory;
 import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderConfiguration;
 import org.drools.builder.KnowledgeBuilderFactory;
 import org.drools.builder.ResourceType;
 import org.drools.common.InternalFactHandle;
 import org.drools.compiler.PackageBuilder;
 import org.drools.compiler.PackageBuilderConfiguration;
 import org.drools.definition.KnowledgePackage;
+import org.drools.definitions.impl.KnowledgePackageImp;
 import org.drools.impl.StatefulKnowledgeSessionImpl;
 import org.drools.io.ResourceFactory;
 import org.drools.marshalling.MarshallerFactory;
@@ -41,6 +46,7 @@
 import org.drools.rule.Package;
 import org.drools.runtime.StatefulKnowledgeSession;
 import org.drools.runtime.rule.WorkingMemoryEntryPoint;
+import org.drools.util.DroolsStreamUtils;
 
 public class DynamicRulesTest extends TestCase {
     protected RuleBase getRuleBase() throws Exception {
@@ -1007,6 +1013,103 @@
 
     }
 
+    public void testIsolatedClassLoaderWithEnumsPkgBuilder() throws Exception {
+        try {
+            // Creates first class loader and use it to load fact classes
+            ClassLoader loader1 = new SubvertedClassLoader( new URL[]{getClass().getResource( "/testEnum.jar" )},
+                                                            this.getClass().getClassLoader() );
+
+            // create a builder with the given classloader
+            KnowledgeBuilderConfiguration conf = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration( null,
+                                                                                                           loader1 );
+            KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder( conf );
+            builder.add( ResourceFactory.newInputStreamResource( getClass().getResourceAsStream( "test_EnumSerialization.drl" ) ),
+                         ResourceType.DRL );
+            Collection<KnowledgePackage> pkgs = builder.getKnowledgePackages();
+            KnowledgePackage pkg = pkgs.iterator().next();
+            
+            // serialize out
+            byte[] out = DroolsStreamUtils.streamOut( ((KnowledgePackageImp) pkg).pkg );
+
+            // adding original packages to a kbase just to make sure they are fine
+            KnowledgeBaseConfiguration kbaseConf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration( null, loader1 );
+            KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase( kbaseConf );
+            kbase.addKnowledgePackages( pkgs );
+            
+            // now, create another classloader and make sure it has access to the classes
+            ClassLoader loader2 = new SubvertedClassLoader( new URL[]{getClass().getResource( "/testEnum.jar" )},
+                                                            this.getClass().getClassLoader() );
+            
+            // create another builder
+            KnowledgeBuilderConfiguration conf2 = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration( null,
+                                                                                                            loader2 );
+            KnowledgeBuilder builder2 = KnowledgeBuilderFactory.newKnowledgeBuilder( conf2 );
+            builder2.add( ResourceFactory.newByteArrayResource( out ),
+                         ResourceType.PKG );
+            Collection<KnowledgePackage> pkgs2 = builder2.getKnowledgePackages();
+            
+            // create another kbase
+            KnowledgeBaseConfiguration kbaseConf2 = KnowledgeBaseFactory.newKnowledgeBaseConfiguration( null, loader2 );
+            KnowledgeBase kbase2 = KnowledgeBaseFactory.newKnowledgeBase( kbaseConf2 );
+            kbase2.addKnowledgePackages( pkgs2 );
+
+        } catch ( ClassCastException cce ) {
+            cce.printStackTrace();
+            fail( "No ClassCastException should be raised." );
+        }
+
+    }
+
+    public void testIsolatedClassLoaderWithEnumsContextClassloader() throws Exception {
+        try {
+            // Creates first class loader and use it to load fact classes
+            ClassLoader loader1 = new SubvertedClassLoader( new URL[]{getClass().getResource( "/testEnum.jar" )},
+                                                            this.getClass().getClassLoader() );
+            //loader1.loadClass( "org.drools.Primitives" );
+            //loader1.loadClass( "org.drools.TestEnum" );
+
+            // create a builder with the given classloader
+            KnowledgeBuilderConfiguration conf = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration( null,
+                                                                                                           loader1 );
+            KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder( conf );
+            builder.add( ResourceFactory.newInputStreamResource( getClass().getResourceAsStream( "test_EnumSerialization.drl" ) ),
+                         ResourceType.DRL );
+            Collection<KnowledgePackage> pkgs = builder.getKnowledgePackages();
+            KnowledgePackage pkg = pkgs.iterator().next();
+            
+            // serialize out
+            byte[] out = DroolsStreamUtils.streamOut( pkg );
+
+            // adding original packages to a kbase just to make sure they are fine
+            KnowledgeBaseConfiguration kbaseConf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration( null, loader1 );
+            KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase( kbaseConf );
+            kbase.addKnowledgePackages( pkgs );
+            
+            // now, create another classloader and make sure it has access to the classes
+            ClassLoader loader2 = new SubvertedClassLoader( new URL[]{getClass().getResource( "/testEnum.jar" )},
+                                                            this.getClass().getClassLoader() );
+            //loader2.loadClass( "org.drools.Primitives" );
+            //loader2.loadClass( "org.drools.TestEnum" );
+            
+            // set context classloader and use it
+            ClassLoader ccl = Thread.currentThread().getContextClassLoader();
+            Thread.currentThread().setContextClassLoader( loader2 );
+            KnowledgePackage pkg2 = (KnowledgePackage) DroolsStreamUtils.streamIn( out );
+            Collection<KnowledgePackage> pkgs2 = Collections.singleton( pkg2 );
+            Thread.currentThread().setContextClassLoader( ccl );
+            
+            // create another kbase
+            KnowledgeBaseConfiguration kbaseConf2 = KnowledgeBaseFactory.newKnowledgeBaseConfiguration( null, loader2 );
+            KnowledgeBase kbase2 = KnowledgeBaseFactory.newKnowledgeBase( kbaseConf2 );
+            kbase2.addKnowledgePackages( pkgs2 );
+
+        } catch ( ClassCastException cce ) {
+            cce.printStackTrace();
+            fail( "No ClassCastException should be raised." );
+        }
+
+    }
+
     public class SubvertedClassLoader extends URLClassLoader {
 
         private static final long serialVersionUID = 400L;

Copied: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/TestEnum.java (from rev 30787, labs/jbossrules/branches/5.0.x/drools-compiler/src/test/resources/org/drools/TestEnum.java)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/TestEnum.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/TestEnum.java	2009-12-21 18:54:00 UTC (rev 30788)
@@ -0,0 +1,7 @@
+package org.drools;
+
+public enum TestEnum {
+    
+    ONE, TWO, THREE;
+
+}

Copied: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_EnumSerialization.drl (from rev 30787, labs/jbossrules/branches/5.0.x/drools-compiler/src/test/resources/org/drools/integrationtests/test_EnumSerialization.drl)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_EnumSerialization.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_EnumSerialization.drl	2009-12-21 18:54:00 UTC (rev 30788)
@@ -0,0 +1,11 @@
+package org.drools.test
+
+import org.drools.Primitives 
+import org.drools.TestEnum 
+
+rule "enum serialization with isolated classloader"
+    when
+        $p : Primitives( enumValue == TestEnum.TWO )
+    then
+        // do something
+end  

Copied: labs/jbossrules/trunk/drools-compiler/src/test/resources/testEnum.jar (from rev 30787, labs/jbossrules/branches/5.0.x/drools-compiler/src/test/resources/testEnum.jar)
===================================================================
(Binary files differ)

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/ObjectFieldImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/ObjectFieldImpl.java	2009-12-21 18:17:34 UTC (rev 30787)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/field/ObjectFieldImpl.java	2009-12-21 18:54:00 UTC (rev 30788)
@@ -26,6 +26,7 @@
 import java.util.Collection;
 
 import org.drools.RuntimeDroolsException;
+import org.drools.common.DroolsObjectInputStream;
 import org.drools.spi.FieldValue;
 import org.drools.util.MathUtils;
 
@@ -68,7 +69,7 @@
         if ( !isEnum || enumName == null || fieldName == null ) {
             value = (Serializable) in.readObject();
         } else {
-            resolveEnumValue();
+            resolveEnumValue( (DroolsObjectInputStream) in );
         }
         setBooleans();
     }
@@ -82,9 +83,11 @@
         }
     }
 
-    private void resolveEnumValue() {
+    private void resolveEnumValue( DroolsObjectInputStream in ) {
         try {
-            final Class<?> staticClass = Class.forName( enumName );
+            final ClassLoader loader = in.getClassLoader();
+            final Class<?> staticClass = Class.forName( enumName, true, loader );
+            //final Class<?> staticClass = Class.forName( enumName );
             value = (Serializable) staticClass.getField( fieldName ).get( null );
         } catch ( final Exception e ) {
             throw new RuntimeDroolsException("Error deserializing enum value "+enumName+"."+fieldName+" : "+e.getMessage());

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/DroolsStreamUtils.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/DroolsStreamUtils.java	2009-12-21 18:17:34 UTC (rev 30787)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/DroolsStreamUtils.java	2009-12-21 18:54:00 UTC (rev 30788)
@@ -186,6 +186,6 @@
             throws IOException, ClassNotFoundException {
         if (compressed)
             in  = new GZIPInputStream(in);
-        return new DroolsObjectInputStream(in).readObject();
+        return new DroolsObjectInputStream(in, classLoader).readObject();
      }
 }



More information about the jboss-svn-commits mailing list