[jboss-svn-commits] JBL Code SVN: r23501 - in labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base: mvel and 1 other directory.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Oct 17 17:51:44 EDT 2008


Author: tirelli
Date: 2008-10-17 17:51:44 -0400 (Fri, 17 Oct 2008)
New Revision: 23501

Added:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/EnabledBoolean.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELEnabledExpression.java
Modified:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELSalienceExpression.java
Log:
JBRULES-1805: fixing multithread bug

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/EnabledBoolean.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/EnabledBoolean.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/EnabledBoolean.java	2008-10-17 21:51:44 UTC (rev 23501)
@@ -0,0 +1,52 @@
+package org.drools.base;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+import org.drools.WorkingMemory;
+import org.drools.spi.Enabled;
+import org.drools.spi.Tuple;
+
+public class EnabledBoolean
+    implements
+    Enabled,
+    Externalizable {
+
+    /**
+     *
+     */
+    private static final long   serialVersionUID = 400L;
+
+    public static final Enabled ENABLED_TRUE  = new EnabledBoolean( true );
+    public static final Enabled ENABLED_FALSE  = new EnabledBoolean( false );
+
+    private boolean             value;
+
+    public EnabledBoolean() {
+    }
+
+    public EnabledBoolean(boolean value) {
+        this.value = value;
+    }
+
+    public void readExternal(ObjectInput in) throws IOException,
+                                            ClassNotFoundException {
+        value = in.readBoolean();
+    }
+
+    public void writeExternal(ObjectOutput out) throws IOException {
+        out.writeBoolean( value );
+    }
+
+    public boolean getValue(final Tuple tuple,
+                            final WorkingMemory workingMemory) {
+        return this.value;
+    }
+
+    public String toString() {
+        return String.valueOf( this.value );
+    }
+
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELEnabledExpression.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELEnabledExpression.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELEnabledExpression.java	2008-10-17 21:51:44 UTC (rev 23501)
@@ -0,0 +1,76 @@
+package org.drools.base.mvel;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.io.Serializable;
+
+import org.drools.WorkingMemory;
+import org.drools.rule.MVELDialectRuntimeData;
+import org.drools.rule.Package;
+import org.drools.spi.Enabled;
+import org.drools.spi.Tuple;
+import org.mvel.MVEL;
+
+public class MVELEnabledExpression
+    implements
+    Enabled,
+    MVELCompileable,
+    Externalizable {
+
+    private static final long   serialVersionUID = 400L;
+
+    private MVELCompilationUnit unit;
+    private String              id;
+
+    private Serializable        expr;
+    private DroolsMVELFactory   prototype;
+
+    public MVELEnabledExpression() {
+    }
+
+    public MVELEnabledExpression(final MVELCompilationUnit unit,
+                                 final String id) {
+        this.unit = unit;
+        this.id = id;
+    }
+
+    public void readExternal(ObjectInput in) throws IOException,
+                                            ClassNotFoundException {
+        unit = (MVELCompilationUnit) in.readObject();
+        id = in.readUTF();
+    }
+
+    public void writeExternal(ObjectOutput out) throws IOException {
+        out.writeObject( unit );
+        out.writeUTF( id );
+    }
+
+    public void compile(ClassLoader classLoader) {
+        expr = unit.getCompiledExpression( classLoader );
+        prototype = unit.getFactory();
+    }
+
+    public boolean getValue(final Tuple tuple,
+                            final WorkingMemory workingMemory) {
+        // it must be cloned for multi-thread safety
+        DroolsMVELFactory factory = (DroolsMVELFactory) this.prototype.clone();
+        factory.setContext( tuple,
+                            null,
+                            null,
+                            workingMemory,
+                            null );
+
+        // do we have any functions for this namespace?
+        Package pkg = workingMemory.getRuleBase().getPackage( "MAIN" );
+        if ( pkg != null ) {
+            MVELDialectRuntimeData data = (MVELDialectRuntimeData) pkg.getDialectRuntimeRegistry().getDialectData( this.id );
+            factory.setNextFactory( data.getFunctionFactory() );
+        }
+
+        return ((Boolean) MVEL.executeExpression( this.expr,
+                                                  factory )).booleanValue();
+    }
+
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELSalienceExpression.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELSalienceExpression.java	2008-10-17 19:12:30 UTC (rev 23500)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/mvel/MVELSalienceExpression.java	2008-10-17 21:51:44 UTC (rev 23501)
@@ -1,10 +1,10 @@
 package org.drools.base.mvel;
 
-import java.io.Serializable;
 import java.io.Externalizable;
 import java.io.IOException;
+import java.io.ObjectInput;
 import java.io.ObjectOutput;
-import java.io.ObjectInput;
+import java.io.Serializable;
 
 import org.drools.WorkingMemory;
 import org.drools.rule.MVELDialectRuntimeData;
@@ -25,8 +25,7 @@
     private String              id;
 
     private Serializable        expr;
-    // @FIXME this factory is not threadsave for rulebases
-    private DroolsMVELFactory   factory;
+    private DroolsMVELFactory   prototype;
 
     public MVELSalienceExpression() {
     }
@@ -50,16 +49,17 @@
 
     public void compile(ClassLoader classLoader) {
         expr = unit.getCompiledExpression( classLoader );
-        factory = unit.getFactory();
+        prototype = unit.getFactory();
     }
 
     public int getValue(final Tuple tuple,
                         final WorkingMemory workingMemory) {
-        this.factory.setContext( tuple,
-                                 null,
-                                 null,
-                                 workingMemory,
-                                 null );
+        DroolsMVELFactory factory = (DroolsMVELFactory) this.prototype.clone();
+        factory.setContext( tuple,
+                            null,
+                            null,
+                            workingMemory,
+                            null );
 
         // do we have any functions for this namespace?
         Package pkg = workingMemory.getRuleBase().getPackage( "MAIN" );
@@ -69,7 +69,7 @@
         }
 
         return ((Number) MVEL.executeExpression( this.expr,
-                                                 this.factory )).intValue();
+                                                 factory )).intValue();
     }
 
 }




More information about the jboss-svn-commits mailing list