[jboss-svn-commits] JBL Code SVN: r30787 - in labs/jbossrules/branches/5.0.x: drools-compiler/src/test/java/org/drools and 7 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Dec 21 13:17:34 EST 2009


Author: tirelli
Date: 2009-12-21 13:17:34 -0500 (Mon, 21 Dec 2009)
New Revision: 30787

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

Modified: labs/jbossrules/branches/5.0.x/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java
===================================================================
--- labs/jbossrules/branches/5.0.x/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java	2009-12-21 14:26:39 UTC (rev 30786)
+++ labs/jbossrules/branches/5.0.x/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java	2009-12-21 18:17:34 UTC (rev 30787)
@@ -510,7 +510,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/branches/5.0.x/drools-compiler/src/test/java/org/drools/Primitives.java
===================================================================
--- labs/jbossrules/branches/5.0.x/drools-compiler/src/test/java/org/drools/Primitives.java	2009-12-21 14:26:39 UTC (rev 30786)
+++ labs/jbossrules/branches/5.0.x/drools-compiler/src/test/java/org/drools/Primitives.java	2009-12-21 18:17:34 UTC (rev 30787)
@@ -51,7 +51,7 @@
     private Boolean           booleanWrapper;
 
     private Object            object;
-
+    
     public boolean isBooleanPrimitive() {
         return this.booleanPrimitive;
     }

Modified: labs/jbossrules/branches/5.0.x/drools-compiler/src/test/java/org/drools/integrationtests/DynamicRulesTest.java
===================================================================
--- labs/jbossrules/branches/5.0.x/drools-compiler/src/test/java/org/drools/integrationtests/DynamicRulesTest.java	2009-12-21 14:26:39 UTC (rev 30786)
+++ labs/jbossrules/branches/5.0.x/drools-compiler/src/test/java/org/drools/integrationtests/DynamicRulesTest.java	2009-12-21 18:17:34 UTC (rev 30787)
@@ -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,30 +16,35 @@
 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;
 import org.drools.StatefulSession;
 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;
 import org.drools.reteoo.ReteooWorkingMemory;
 import org.drools.rule.Package;
 import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.util.DroolsStreamUtils;
 
 public class DynamicRulesTest extends TestCase {
     protected RuleBase getRuleBase() throws Exception {
@@ -353,7 +359,7 @@
         StatefulSession session = ruleBase.newStatefulSession();
 
         session.insert( new Precondition( "genericcode",
-                                                "genericvalue" ) );
+                                          "genericvalue" ) );
         session.fireAllRules();
 
         RuleBase ruleBaseWM = session.getRuleBase();
@@ -569,13 +575,15 @@
     }
 
     public void testDynamicNotNode() throws Exception {
-        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();        
-        kbuilder.add( ResourceFactory.newClassPathResource( "test_CollectDynamicRules1.drl", getClass() ), ResourceType.DRL );        
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newClassPathResource( "test_CollectDynamicRules1.drl",
+                                                            getClass() ),
+                      ResourceType.DRL );
         if ( kbuilder.hasErrors() ) {
-            fail ( kbuilder.getErrors().toString() );
-        }        
+            fail( kbuilder.getErrors().toString() );
+        }
         KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
-        Collection<KnowledgePackage> kpkgs = SerializationHelper.serializeObject( kbuilder.getKnowledgePackages() );        
+        Collection<KnowledgePackage> kpkgs = SerializationHelper.serializeObject( kbuilder.getKnowledgePackages() );
         kbase.addKnowledgePackages( kpkgs );
         kbase = SerializationHelper.serializeObject( kbase );
 
@@ -593,18 +601,22 @@
         ksession.insert( a );
         ksession.insert( b );
         ksession.insert( c );
-        
-        kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();        
-        kbuilder.add( ResourceFactory.newClassPathResource( "test_DynamicNotNode.drl", getClass() ), ResourceType.DRL );        
+
+        kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newClassPathResource( "test_DynamicNotNode.drl",
+                                                            getClass() ),
+                      ResourceType.DRL );
         if ( kbuilder.hasErrors() ) {
-            fail ( kbuilder.getErrors().toString() );
-        }                        
-        kpkgs = SerializationHelper.serializeObject( kbuilder.getKnowledgePackages() );        
+            fail( kbuilder.getErrors().toString() );
+        }
+        kpkgs = SerializationHelper.serializeObject( kbuilder.getKnowledgePackages() );
         kbase.addKnowledgePackages( kpkgs );
-        kbase = SerializationHelper.serializeObject( kbase );    
-        
-        ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession( ksession, MarshallerFactory.newIdentityMarshallingStrategy(), false );
-        
+        kbase = SerializationHelper.serializeObject( kbase );
+
+        ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession( ksession,
+                                                                              MarshallerFactory.newIdentityMarshallingStrategy(),
+                                                                              false );
+
         results = (List) ksession.getGlobal( "results" );
 
         ksession.fireAllRules();
@@ -615,18 +627,22 @@
         kbase.removeKnowledgePackage( "org.drools" );
 
         ksession.retract( ksession.getFactHandle( b ) );
-        
-        kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();        
-        kbuilder.add( ResourceFactory.newClassPathResource( "test_DynamicNotNode.drl", getClass() ), ResourceType.DRL );        
+
+        kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newClassPathResource( "test_DynamicNotNode.drl",
+                                                            getClass() ),
+                      ResourceType.DRL );
         if ( kbuilder.hasErrors() ) {
-            fail ( kbuilder.getErrors().toString() );
-        }                        
-        kpkgs = SerializationHelper.serializeObject( kbuilder.getKnowledgePackages() );        
+            fail( kbuilder.getErrors().toString() );
+        }
+        kpkgs = SerializationHelper.serializeObject( kbuilder.getKnowledgePackages() );
         kbase.addKnowledgePackages( kpkgs );
         kbase = SerializationHelper.serializeObject( kbase );
-        
-        ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession( ksession, MarshallerFactory.newIdentityMarshallingStrategy(), false );
-        
+
+        ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession( ksession,
+                                                                              MarshallerFactory.newIdentityMarshallingStrategy(),
+                                                                              false );
+
         results = (List) ksession.getGlobal( "results" );
         ksession.fireAllRules();
 
@@ -732,7 +748,7 @@
 
         final List list = new ArrayList();
         session.setGlobal( "results",
-                                 list );
+                           list );
 
         Order order = new Order();
 
@@ -947,6 +963,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;

Modified: labs/jbossrules/branches/5.0.x/drools-compiler/src/test/java/org/drools/util/debug/SessionInspectorTest.java
===================================================================
--- labs/jbossrules/branches/5.0.x/drools-compiler/src/test/java/org/drools/util/debug/SessionInspectorTest.java	2009-12-21 14:26:39 UTC (rev 30786)
+++ labs/jbossrules/branches/5.0.x/drools-compiler/src/test/java/org/drools/util/debug/SessionInspectorTest.java	2009-12-21 18:17:34 UTC (rev 30787)
@@ -99,7 +99,8 @@
         
         String report = SessionReporter.generateReport( "simple", info, null );
         
-        System.out.println(report);
+        assertNotNull( report );
+        //System.out.println(report);
         
     }
 

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


Property changes on: labs/jbossrules/branches/5.0.x/drools-compiler/src/test/resources/org/drools/TestEnum.java
___________________________________________________________________
Name: svn:executable
   + *

Added: labs/jbossrules/branches/5.0.x/drools-compiler/src/test/resources/org/drools/integrationtests/test_EnumSerialization.drl
===================================================================
--- labs/jbossrules/branches/5.0.x/drools-compiler/src/test/resources/org/drools/integrationtests/test_EnumSerialization.drl	                        (rev 0)
+++ labs/jbossrules/branches/5.0.x/drools-compiler/src/test/resources/org/drools/integrationtests/test_EnumSerialization.drl	2009-12-21 18:17:34 UTC (rev 30787)
@@ -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  


Property changes on: labs/jbossrules/branches/5.0.x/drools-compiler/src/test/resources/org/drools/integrationtests/test_EnumSerialization.drl
___________________________________________________________________
Name: svn:executable
   + *

Added: labs/jbossrules/branches/5.0.x/drools-compiler/src/test/resources/testEnum.jar
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/branches/5.0.x/drools-compiler/src/test/resources/testEnum.jar
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:mime-type
   + application/octet-stream

Modified: labs/jbossrules/branches/5.0.x/drools-core/src/main/java/org/drools/base/field/ObjectFieldImpl.java
===================================================================
--- labs/jbossrules/branches/5.0.x/drools-core/src/main/java/org/drools/base/field/ObjectFieldImpl.java	2009-12-21 14:26:39 UTC (rev 30786)
+++ labs/jbossrules/branches/5.0.x/drools-core/src/main/java/org/drools/base/field/ObjectFieldImpl.java	2009-12-21 18:17:34 UTC (rev 30787)
@@ -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/branches/5.0.x/drools-core/src/main/java/org/drools/util/DroolsStreamUtils.java
===================================================================
--- labs/jbossrules/branches/5.0.x/drools-core/src/main/java/org/drools/util/DroolsStreamUtils.java	2009-12-21 14:26:39 UTC (rev 30786)
+++ labs/jbossrules/branches/5.0.x/drools-core/src/main/java/org/drools/util/DroolsStreamUtils.java	2009-12-21 18:17:34 UTC (rev 30787)
@@ -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