[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