[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