[jboss-svn-commits] JBL Code SVN: r18481 - in labs/jbossrules/branches/4.0.x: drools-compiler/src/test/java/org/drools/integrationtests and 2 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Feb 14 10:31:46 EST 2008


Author: tirelli
Date: 2008-02-14 10:31:45 -0500 (Thu, 14 Feb 2008)
New Revision: 18481

Added:
   labs/jbossrules/branches/4.0.x/drools-compiler/src/test/resources/org/drools/integrationtests/test_MultithreadDateStringConstraints.drl
Modified:
   labs/jbossrules/branches/4.0.x/drools-compiler/src/test/java/org/drools/Order.java
   labs/jbossrules/branches/4.0.x/drools-compiler/src/test/java/org/drools/integrationtests/MultithreadTest.java
   labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/base/evaluators/DateFactory.java
Log:
JBRULES-1467: fixing concurrency problems

Modified: labs/jbossrules/branches/4.0.x/drools-compiler/src/test/java/org/drools/Order.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-compiler/src/test/java/org/drools/Order.java	2008-02-14 06:17:20 UTC (rev 18480)
+++ labs/jbossrules/branches/4.0.x/drools-compiler/src/test/java/org/drools/Order.java	2008-02-14 15:31:45 UTC (rev 18481)
@@ -17,6 +17,7 @@
 package org.drools;
 
 import java.util.Collection;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -33,6 +34,8 @@
     private Map items;
 
     private OrderStatus status;
+    
+    private Date date;
 
     public Order() {
         this( 0, "Bob" );
@@ -42,6 +45,7 @@
         this.number = number;
         this.items = new HashMap();
         this.customer = customer;
+        this.date = new Date();
     }
 
     /**
@@ -139,4 +143,18 @@
         }
     }
 
+    /**
+     * @return the date
+     */
+    public Date getDate() {
+        return date;
+    }
+
+    /**
+     * @param date the date to set
+     */
+    public void setDate(Date date) {
+        this.date = date;
+    }
+
 }

Modified: labs/jbossrules/branches/4.0.x/drools-compiler/src/test/java/org/drools/integrationtests/MultithreadTest.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-compiler/src/test/java/org/drools/integrationtests/MultithreadTest.java	2008-02-14 06:17:20 UTC (rev 18480)
+++ labs/jbossrules/branches/4.0.x/drools-compiler/src/test/java/org/drools/integrationtests/MultithreadTest.java	2008-02-14 15:31:45 UTC (rev 18481)
@@ -19,24 +19,22 @@
 package org.drools.integrationtests;
 
 import java.io.InputStreamReader;
-import java.io.StringReader;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.Queue;
+import java.util.Vector;
 import java.util.concurrent.ConcurrentLinkedQueue;
 
 import junit.framework.TestCase;
 
 import org.drools.Child;
 import org.drools.GrandParent;
+import org.drools.Order;
 import org.drools.Parent;
 import org.drools.RuleBase;
-import org.drools.RuleBaseConfiguration;
 import org.drools.RuleBaseFactory;
 import org.drools.StatefulSession;
 import org.drools.compiler.PackageBuilder;
-import org.drools.compiler.PackageBuilderConfiguration;
 
 /**
  * This is a test case for multi-thred issues
@@ -207,5 +205,56 @@
             fail( "No exception should have been raised: "+e.getMessage());
         }
     }
+    
+    public void testMultithreadDateStringConstraints() {
+        try {
+            final int THREAD_COUNT = 10;
+            final PackageBuilder packageBuilder = new PackageBuilder();
+            packageBuilder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_MultithreadDateStringConstraints.drl" ) ) );
+            final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+            ruleBase.addPackage( packageBuilder.getPackage() );
+            final Vector errors = new Vector();
+            
+            final Thread t[] = new Thread[THREAD_COUNT];
+            for(int j=0;j<10;j++)
+            {
+                for (int i = 0; i < t.length; i++) {
+                    t[i] = new Thread() {
+                        public void run() {
+                            try {
+                                final int ITERATIONS = 300;
+                                StatefulSession session = ruleBase.newStatefulSession();
+                                List results = new ArrayList();
+                                session.setGlobal( "results", results );
+                                for( int k = 0; k < ITERATIONS; k++ ) {
+                                    session.insert( new Order() );
+                                }
+                                session.fireAllRules();
+                                session.dispose();
+                                if( results.size() != ITERATIONS ) {
+                                    errors.add( "Rules did not fired correctly. Expected: "+ITERATIONS+". Actual: "+results.size() );
+                                }
+                            } catch( Exception ex ) {
+                                ex.printStackTrace();
+                                errors.add( ex );
+                            }
+                        }
+                        
+                    };
+                    t[i].start();
+                }
+                for (int i = 0; i < t.length; i++) {
+                    t[i].join();
+                }
+            }
+            if( !errors.isEmpty() ) {
+                fail(" Errors occured during execution ");
+            }
+        } catch ( Exception e ) {
+            e.printStackTrace();
+            fail( "Should not raise exception" );
+        }
+    }
+    
 
 }

Added: labs/jbossrules/branches/4.0.x/drools-compiler/src/test/resources/org/drools/integrationtests/test_MultithreadDateStringConstraints.drl
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-compiler/src/test/resources/org/drools/integrationtests/test_MultithreadDateStringConstraints.drl	                        (rev 0)
+++ labs/jbossrules/branches/4.0.x/drools-compiler/src/test/resources/org/drools/integrationtests/test_MultithreadDateStringConstraints.drl	2008-02-14 15:31:45 UTC (rev 18481)
@@ -0,0 +1,10 @@
+package org.drools;
+
+global java.util.List results;
+
+rule "Should fire"
+when
+    $d : Order( date > "12-SEP-1978", number > "-1" )
+then
+    results.add( $d );
+end

Modified: labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/base/evaluators/DateFactory.java
===================================================================
--- labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/base/evaluators/DateFactory.java	2008-02-14 06:17:20 UTC (rev 18480)
+++ labs/jbossrules/branches/4.0.x/drools-core/src/main/java/org/drools/base/evaluators/DateFactory.java	2008-02-14 15:31:45 UTC (rev 18481)
@@ -50,10 +50,13 @@
     private static final String     DATE_FORMAT_MASK    = getDateFormatMask();
 
     private static EvaluatorFactory INSTANCE            = new DateFactory();
-    private static SimpleDateFormat df;
-
+    private static ThreadLocal df = new ThreadLocal() {
+        protected Object initialValue() {
+            return new SimpleDateFormat( DateFactory.DATE_FORMAT_MASK ); 
+        };
+    };
+    
     private DateFactory() {
-        df = new SimpleDateFormat( DateFactory.DATE_FORMAT_MASK );
     }
 
     public static EvaluatorFactory getInstance() {
@@ -503,7 +506,7 @@
     /** Use the simple date formatter to read the date from a string */
     public static Date parseDate(final String input) {
         try {
-            return df.parse( input );
+            return ((SimpleDateFormat)df.get()).parse( input );
         } catch ( final ParseException e ) {
             throw new IllegalArgumentException( "Invalid date input format: [" + input + "] it should follow: [" + DateFactory.DATE_FORMAT_MASK + "]" );
         }




More information about the jboss-svn-commits mailing list