[jboss-svn-commits] JBL Code SVN: r18635 - in labs/jbossrules/trunk: drools-compiler/src/test/java/org/drools/testframework and 3 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Fri Feb 29 07:57:00 EST 2008
Author: tirelli
Date: 2008-02-29 07:57:00 -0500 (Fri, 29 Feb 2008)
New Revision: 18635
Modified:
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MarshallingTest.java
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooStatefulSession.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MapBackedClassLoader.java
Log:
JBRULES-1489: fixing trunk. There was also a regression that I'm fixing now
Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MarshallingTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MarshallingTest.java 2008-02-29 12:02:56 UTC (rev 18634)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MarshallingTest.java 2008-02-29 12:57:00 UTC (rev 18635)
@@ -14,11 +14,14 @@
import java.util.List;
import java.util.Map;
+import org.drools.Cheese;
import org.drools.Person;
import org.drools.RuleBase;
import org.drools.RuleBaseConfiguration;
import org.drools.RuleBaseFactory;
+import org.drools.StatefulSession;
import org.drools.WorkingMemory;
+import org.drools.common.InternalFactHandle;
import org.drools.compiler.PackageBuilder;
import org.drools.rule.Package;
import org.drools.rule.Rule;
@@ -314,6 +317,59 @@
assertTrue( IteratorToList.convert( workingMemory.iterateObjects() ).contains( new Person( "help" ) ) );
}
+ public void testSerializeAdd() throws Exception {
+
+ //Create a rulebase, a session, and test it
+ RuleBase ruleBase = RuleBaseFactory.newRuleBase( );
+ 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
+ ruleBase = (RuleBase) serializeIn( serializedRulebase );
+
+ 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 ));
+
+ session.dispose();
+
+ }
+
protected RuleBase getRuleBase() throws Exception {
return RuleBaseFactory.newRuleBase( RuleBase.RETEOO,
Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java 2008-02-29 12:02:56 UTC (rev 18634)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java 2008-02-29 12:57:00 UTC (rev 18635)
@@ -21,6 +21,7 @@
import org.drools.common.ObjectStore;
import org.drools.common.TruthMaintenanceSystem;
import org.drools.common.WorkingMemoryAction;
+import org.drools.concurrent.ExecutorService;
import org.drools.event.AgendaEventListener;
import org.drools.event.AgendaEventSupport;
import org.drools.event.RuleBaseEventListener;
@@ -478,4 +479,14 @@
return null;
}
+ public ExecutorService getExecutorService() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public void setExecutorService(ExecutorService executor) {
+ // TODO Auto-generated method stub
+
+ }
+
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java 2008-02-29 12:02:56 UTC (rev 18634)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractRuleBase.java 2008-02-29 12:57:00 UTC (rev 18635)
@@ -174,25 +174,31 @@
* The Package uses PackageCompilationData to hold a reference to the generated bytecode. The generated bytecode must be restored before any Rules.
*
*/
- public void doWriteExternal(final ObjectOutput stream) throws IOException {
+ 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[]
- //final ByteArrayOutputStream bos = new ByteArrayOutputStream();
- //final ObjectOutput out = new ObjectOutputStream( bos );
+ final ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ final ObjectOutput out = new ObjectOutputStream( bos );
+ out.writeObject( this.id );
+ out.writeObject( this.processes );
+ out.writeObject( this.agendaGroupRuleTotals );
+ out.writeObject( this.factHandleFactory );
+ out.writeObject( this.globals );
+ out.writeObject( this.config );
- stream.writeObject( this.id );
- stream.writeObject( this.processes );
- stream.writeObject( this.agendaGroupRuleTotals );
- stream.writeObject( this.factHandleFactory );
- stream.writeObject( this.globals );
- stream.writeObject( this.config );
-
this.eventSupport.removeEventListener( RuleBaseEventListener.class );
- stream.writeObject( this.eventSupport );
-
- //stream.writeObject( bos.toByteArray() );
+ out.writeObject( this.eventSupport );
+
+ for ( int i = 0, length = objects.length; i < length; i++ ) {
+ out.writeObject( objects[i] );
+ }
+
+ out.close();
+ stream.writeObject( bos.toByteArray() );
}
/**
@@ -201,19 +207,21 @@
* A custom ObjectInputStream, able to resolve classes against the bytecode in the PackageCompilationData, is used to restore the Rules.
*
*/
- public void doReadExternal(final ObjectInput stream) throws IOException,
- ClassNotFoundException {
- // PackageCompilationData must be restored before Rules as it has the ClassLoader needed to resolve the generated code references in Rules
+ public void doReadExternal(final ObjectInput stream,
+ final Object[] objects) throws IOException,
+ 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 );
@@ -223,20 +231,31 @@
this.packageClassLoader.addClassLoader( ((Package) it.next()).getDialectDatas().getClassLoader() );
}
- this.id = (String) stream.readObject();
- this.processes = (Map) stream.readObject();
- this.agendaGroupRuleTotals = (Map) stream.readObject();
- this.factHandleFactory = (FactHandleFactory) stream.readObject();
- this.globals = (Map) stream.readObject();
+ // Return the rules stored as a byte[]
+ final byte[] bytes = (byte[]) stream.readObject();
- this.config = (RuleBaseConfiguration) stream.readObject();
-
- this.config.setClassLoader( this.packageClassLoader );
-
- this.eventSupport = (RuleBaseEventSupport) stream.readObject();
+ // Use a custom ObjectInputStream that can resolve against a given classLoader
+ final DroolsObjectInputStream childStream = new DroolsObjectInputStream( new ByteArrayInputStream( bytes ),
+ this.packageClassLoader );
+ childStream.setRuleBase( this );
+
+ this.id = (String) childStream.readObject();
+ this.processes = (Map) childStream.readObject();
+ this.agendaGroupRuleTotals = (Map) childStream.readObject();
+ this.factHandleFactory = (FactHandleFactory) childStream.readObject();
+ this.globals = (Map) childStream.readObject();
+
+ this.config = (RuleBaseConfiguration) childStream.readObject();
+ this.config.setClassLoader( childStream.getClassLoader() );
+ this.eventSupport = (RuleBaseEventSupport) childStream.readObject();
this.eventSupport.setRuleBase( this );
this.statefulSessions = new ObjectHashSet();
+
+ for ( int i = 0, length = objects.length; i < length; i++ ) {
+ objects[i] = childStream.readObject();
+ }
+ childStream.close();
}
/**
@@ -706,6 +725,8 @@
ExecutorService executor = ExecutorServiceFactory.createExecutorService( this.config.getExecutorService() );
executor.setCommandExecutor( new CommandExecutor( session ) );
+
+ ((InternalWorkingMemory) session).setExecutorService( executor );
if ( keepReference ) {
addStatefulSession( session );
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java 2008-02-29 12:02:56 UTC (rev 18634)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java 2008-02-29 12:57:00 UTC (rev 18635)
@@ -50,6 +50,7 @@
import org.drools.RuleBaseConfiguration.LogicalOverride;
import org.drools.base.MapGlobalResolver;
import org.drools.base.ShadowProxy;
+import org.drools.concurrent.ExecutorService;
import org.drools.event.AgendaEventListener;
import org.drools.event.AgendaEventSupport;
import org.drools.event.RuleBaseEventListener;
@@ -1625,6 +1626,14 @@
this.timeMachine = timeMachine;
}
+ public ExecutorService getExecutorService() {
+ return null; // no executor service
+ }
+
+ public void setExecutorService(ExecutorService executor) {
+ // no executor service, so nothing to set
+ }
+
/**
* Returns the ObjectTypeConfiguration object for the given object or
* creates a new one if none is found in the cache
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java 2008-02-29 12:02:56 UTC (rev 18634)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java 2008-02-29 12:57:00 UTC (rev 18635)
@@ -6,6 +6,7 @@
import org.drools.FactException;
import org.drools.FactHandle;
import org.drools.WorkingMemory;
+import org.drools.concurrent.ExecutorService;
import org.drools.event.AgendaEventSupport;
import org.drools.event.RuleFlowEventSupport;
import org.drools.event.WorkingMemoryEventSupport;
@@ -19,7 +20,6 @@
import org.drools.spi.Activation;
import org.drools.spi.FactHandleFactory;
import org.drools.spi.PropagationContext;
-import org.drools.util.ObjectHashMap;
public interface InternalWorkingMemory
extends
@@ -106,4 +106,8 @@
* @return
*/
public Map<Object, ObjectTypeConf> getObjectTypeConfMap(EntryPoint entryPoint);
+
+ public ExecutorService getExecutorService();
+
+ public void setExecutorService(ExecutorService executor);
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java 2008-02-29 12:02:56 UTC (rev 18634)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java 2008-02-29 12:57:00 UTC (rev 18635)
@@ -146,7 +146,9 @@
*
*/
public void writeExternal(final ObjectOutput stream) throws IOException {
- doWriteExternal( stream );
+ final Object[] objects = new Object[]{this.rete, this.reteooBuilder};
+ doWriteExternal( stream,
+ objects );
}
/**
@@ -157,18 +159,12 @@
*/
public void readExternal(final ObjectInput stream) throws IOException,
ClassNotFoundException {
- doReadExternal( stream );
+ final Object[] objects = new Object[2];
+ doReadExternal( stream,
+ objects );
- // rebuild the Rete network from the pkg information
- this.reteooBuilder = new ReteooBuilder( this );
- this.rete = new Rete( this );
- synchronized ( this.pkgs ) {
- for ( Package pkg : this.pkgs.values() ) {
- for ( Rule rule : pkg.getRules() ) {
- addRule( rule );
- }
- }
- }
+ this.rete = (Rete) objects[0];
+ this.reteooBuilder = (ReteooBuilder) objects[1];
}
// ------------------------------------------------------------
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooStatefulSession.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooStatefulSession.java 2008-02-29 12:02:56 UTC (rev 18634)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooStatefulSession.java 2008-02-29 12:57:00 UTC (rev 18635)
@@ -102,4 +102,11 @@
return this.ruleBaseListeners;
}
+ public ExecutorService getExecutorService() {
+ return executor;
+ }
+
+ public void setExecutorService(ExecutorService executor) {
+ this.executor = executor;
+ }
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MapBackedClassLoader.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MapBackedClassLoader.java 2008-02-29 12:02:56 UTC (rev 18634)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MapBackedClassLoader.java 2008-02-29 12:57:00 UTC (rev 18635)
@@ -13,41 +13,48 @@
implements
DroolsClassLoader,
Serializable {
-
- private static final long serialVersionUID = 400L;
- private static final ProtectionDomain PROTECTION_DOMAIN;
-
- private Map store;
+ private static final long serialVersionUID = 400L;
+ private static final ProtectionDomain PROTECTION_DOMAIN;
+
+ private Map store;
+
static {
PROTECTION_DOMAIN = (ProtectionDomain) AccessController.doPrivileged( new PrivilegedAction() {
public Object run() {
return MapBackedClassLoader.class.getProtectionDomain();
}
} );
- }
+ }
public MapBackedClassLoader(final ClassLoader parentClassLoader) {
super( parentClassLoader );
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,
- bytes);
+ addClass( className,
+ bytes );
}
-
+
private String convertResourcePathToClassName(final String pName) {
- return pName.replaceAll(".java$|.class$", "").replace('/', '.');
+ return pName.replaceAll( ".java$|.class$",
+ "" ).replace( '/',
+ '.' );
}
-
public void addClass(final String className,
byte[] bytes) {
-
- this.store.put( convertResourcePathToClassName(className),
+
+ this.store.put( convertResourcePathToClassName( className ),
bytes );
}
@@ -115,4 +122,7 @@
}
}
+ public Map getStore() {
+ return this.store;
+ }
}
More information about the jboss-svn-commits
mailing list