[jboss-svn-commits] JBL Code SVN: r18495 - in labs/jbossrules/trunk: 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
Mon Feb 18 08:52:41 EST 2008


Author: tirelli
Date: 2008-02-18 08:52:40 -0500 (Mon, 18 Feb 2008)
New Revision: 18495

Added:
   labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_MultithreadDateStringConstraints.drl
Modified:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Order.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MultithreadTest.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/DateUtils.java
Log:
JBRULES-1467: fixing concurrency problems when parsing Strings to Dates

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Order.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Order.java	2008-02-18 12:18:07 UTC (rev 18494)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Order.java	2008-02-18 13:52:40 UTC (rev 18495)
@@ -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/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MultithreadTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MultithreadTest.java	2008-02-18 12:18:07 UTC (rev 18494)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MultithreadTest.java	2008-02-18 13:52:40 UTC (rev 18495)
@@ -24,12 +24,14 @@
 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;
@@ -207,4 +209,53 @@
         }
     }
 
+    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/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_MultithreadDateStringConstraints.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_MultithreadDateStringConstraints.drl	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_MultithreadDateStringConstraints.drl	2008-02-18 13:52:40 UTC (rev 18495)
@@ -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/trunk/drools-core/src/main/java/org/drools/util/DateUtils.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/DateUtils.java	2008-02-18 12:18:07 UTC (rev 18494)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/DateUtils.java	2008-02-18 13:52:40 UTC (rev 18495)
@@ -30,13 +30,17 @@
     private static final long       serialVersionUID    = 400L;
     private static final String     DEFAULT_FORMAT_MASK = "dd-MMM-yyyy";
     private static final String     DATE_FORMAT_MASK    = getDateFormatMask();
-    private static SimpleDateFormat df = new SimpleDateFormat( DATE_FORMAT_MASK );
+    private static ThreadLocal<SimpleDateFormat> df = new ThreadLocal<SimpleDateFormat>() {
+        protected SimpleDateFormat initialValue() {
+            return new SimpleDateFormat( DATE_FORMAT_MASK );
+        };
+    };
     
     
     /** 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 df.get().parse( input );
         } catch ( final ParseException e ) {
             throw new IllegalArgumentException( "Invalid date input format: [" + input + "] it should follow: [" + DATE_FORMAT_MASK + "]" );
         }




More information about the jboss-svn-commits mailing list