[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