Author: cbegin
Date: Sun Aug 13 22:48:51 2006
New Revision: 431297

URL: http://svn.apache.org/viewvc?rev=431297&view=rev
Log:
Fixed IBATIS-325 SimpleDateFormat thread safety issue.

Added:
    
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/SimpleDateFormatter.java
Modified:
    ibatis/trunk/java/mapper/mapper2/build/version.properties
    ibatis/trunk/java/mapper/mapper2/doc/release.txt
    
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/sql/dynamic/elements/ConditionalTagHandler.java
    
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/DateOnlyTypeHandler.java
    
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/DateTypeHandler.java
    
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/SqlDateTypeHandler.java
    
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/SqlTimeTypeHandler.java
    
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/SqlTimestampTypeHandler.java
    
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/TimeOnlyTypeHandler.java

Modified: ibatis/trunk/java/mapper/mapper2/build/version.properties
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/build/version.properties?rev=431297&r1=431296&r2=431297&view=diff
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/build/version.properties (original)
+++ ibatis/trunk/java/mapper/mapper2/build/version.properties Sun Aug 13 
22:48:51 2006
@@ -1,5 +1,5 @@
 #Build version info
-#Sun Aug 13 02:50:18 MDT 2006
+#Sun Aug 13 23:45:30 MDT 2006
 version=2.1.7
-buildDate=2006/08/13 02\:50
-buildNum=624
+buildDate=2006/08/13 23\:45
+buildNum=626

Modified: ibatis/trunk/java/mapper/mapper2/doc/release.txt
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/doc/release.txt?rev=431297&r1=431296&r2=431297&view=diff
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/doc/release.txt (original)
+++ ibatis/trunk/java/mapper/mapper2/doc/release.txt Sun Aug 13 22:48:51 2006
@@ -11,6 +11,7 @@
  o Added support for ResultSet OUT params from stored procs (e.g. Oracle Ref 
Cursor)
  o Added support for Multiple ResultSets mapped to corresponding ResultMaps or 
ResultClasses.
 
+ o Fixed IBATIS-325 - DateTypeHandler uses static SimpleDateFormat instance. 
Not thread-safe.
  o Fixed IBATIS-224 - isNotNull node causes typehandler mappings in statement 
to fail
  o Fixed IBATIS-249 - Race conditions in Throttle lead to thread blockage 
popping items from ThrottledPools under stress
  o Fixed IBATIS-250 - CLONE -SELECT statement returns unexpected result when 
'groupBy' and 'nullValue' are specified in resultMaps.

Modified: 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/sql/dynamic/elements/ConditionalTagHandler.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/sql/dynamic/elements/ConditionalTagHandler.java?rev=431297&r1=431296&r2=431297&view=diff
==============================================================================
--- 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/sql/dynamic/elements/ConditionalTagHandler.java
 (original)
+++ 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/sql/dynamic/elements/ConditionalTagHandler.java
 Sun Aug 13 22:48:51 2006
@@ -17,13 +17,10 @@
 
 import com.ibatis.common.beans.Probe;
 import com.ibatis.common.beans.ProbeFactory;
-
+import com.ibatis.sqlmap.engine.type.SimpleDateFormatter;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
 import java.util.Date;
 
 public abstract class ConditionalTagHandler extends BaseTagHandler {
@@ -32,7 +29,6 @@
 
   public static final long NOT_COMPARABLE = Long.MIN_VALUE;
   private static final String DATE_MASK = "yyyy/MM/dd hh:mm:ss";
-  private static final DateFormat DATE_FORMAT = new 
SimpleDateFormat(DATE_MASK);
 
   private static final String START_INDEX = "[";
 
@@ -137,11 +133,7 @@
     } else if (type == Boolean.class || type == boolean.class) {
       return Boolean.valueOf(value);
     } else if (type == Date.class) {
-      try {
-        return DATE_FORMAT.parse(value);
-      } catch (ParseException e) {
-        throw new RuntimeException("Error parsing date.  Cause: " + e, e);
-      }
+      return SimpleDateFormatter.format(DATE_MASK, value);
     } else if (type == BigInteger.class) {
       return new BigInteger(value);
     } else if (type == BigDecimal.class) {
@@ -158,7 +150,6 @@
    * 
    * @param ctx
    * @param tag
-   * @return
    */
   protected String getResolvedProperty(SqlTagContext ctx, SqlTag tag) {
     String prop = tag.getPropertyAttr();

Modified: 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/DateOnlyTypeHandler.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/DateOnlyTypeHandler.java?rev=431297&r1=431296&r2=431297&view=diff
==============================================================================
--- 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/DateOnlyTypeHandler.java
 (original)
+++ 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/DateOnlyTypeHandler.java
 Sun Aug 13 22:48:51 2006
@@ -15,15 +15,10 @@
  */
 package com.ibatis.sqlmap.engine.type;
 
-import com.ibatis.sqlmap.client.SqlMapException;
-
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
 import java.util.Date;
 
 /**
@@ -32,7 +27,6 @@
 public class DateOnlyTypeHandler extends BaseTypeHandler implements 
TypeHandler {
 
   private static final String DATE_FORMAT = "yyyy/MM/dd";
-  private static final DateFormat format = new SimpleDateFormat(DATE_FORMAT);
 
   public void setParameter(PreparedStatement ps, int i, Object parameter, 
String jdbcType)
       throws SQLException {
@@ -70,11 +64,7 @@
   }
 
   public Object valueOf(String s) {
-    try {
-      return format.parse(s);
-    } catch (ParseException e) {
-      throw new SqlMapException("Error parsing default null value date.  
Format must be '" + DATE_FORMAT + "'. Cause: " + e);
-    }
+    return SimpleDateFormatter.format(DATE_FORMAT, s);    
   }
 
 }

Modified: 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/DateTypeHandler.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/DateTypeHandler.java?rev=431297&r1=431296&r2=431297&view=diff
==============================================================================
--- 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/DateTypeHandler.java
 (original)
+++ 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/DateTypeHandler.java
 Sun Aug 13 22:48:51 2006
@@ -15,15 +15,10 @@
  */
 package com.ibatis.sqlmap.engine.type;
 
-import com.ibatis.sqlmap.client.SqlMapException;
-
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
 import java.util.Date;
 
 /**
@@ -32,7 +27,6 @@
 public class DateTypeHandler extends BaseTypeHandler implements TypeHandler {
 
   private static final String DATE_FORMAT = "yyyy/MM/dd hh:mm:ss";
-  private static final DateFormat format = new SimpleDateFormat(DATE_FORMAT);
 
   public void setParameter(PreparedStatement ps, int i, Object parameter, 
String jdbcType)
       throws SQLException {
@@ -70,11 +64,7 @@
   }
 
   public Object valueOf(String s) {
-    try {
-      return format.parse(s);
-    } catch (ParseException e) {
-      throw new SqlMapException("Error parsing default null value date.  
Format must be '" + DATE_FORMAT + "'. Cause: " + e);
-    }
+    return SimpleDateFormatter.format(DATE_FORMAT, s);
   }
 
 }

Added: 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/SimpleDateFormatter.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/SimpleDateFormatter.java?rev=431297&view=auto
==============================================================================
--- 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/SimpleDateFormatter.java
 (added)
+++ 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/SimpleDateFormatter.java
 Sun Aug 13 22:48:51 2006
@@ -0,0 +1,18 @@
+package com.ibatis.sqlmap.engine.type;
+
+import com.ibatis.sqlmap.client.SqlMapException;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+public class SimpleDateFormatter {
+  public static Date format(String format, String datetime) {
+    try {
+      return new SimpleDateFormat(format).parse(datetime);
+    } catch (ParseException e) {
+      throw new SqlMapException("Error parsing default null value date.  
Format must be '" + format + "'. Cause: " + e);
+    }
+  }
+
+}

Modified: 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/SqlDateTypeHandler.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/SqlDateTypeHandler.java?rev=431297&r1=431296&r2=431297&view=diff
==============================================================================
--- 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/SqlDateTypeHandler.java
 (original)
+++ 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/SqlDateTypeHandler.java
 Sun Aug 13 22:48:51 2006
@@ -15,12 +15,10 @@
  */
 package com.ibatis.sqlmap.engine.type;
 
-import com.ibatis.sqlmap.client.SqlMapException;
-
-import java.sql.*;
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
 
 /**
  * SQL Date implementation of TypeHandler
@@ -28,7 +26,6 @@
 public class SqlDateTypeHandler extends BaseTypeHandler implements TypeHandler 
{
 
   private static final String DATE_FORMAT = "yyyy/MM/dd";
-  private static final DateFormat format = new SimpleDateFormat(DATE_FORMAT);
 
   public void setParameter(PreparedStatement ps, int i, Object parameter, 
String jdbcType)
       throws SQLException {
@@ -66,12 +63,7 @@
   }
 
   public Object valueOf(String s) {
-    try {
-      java.util.Date date = format.parse(s);
-      return new Date(date.getTime());
-    } catch (ParseException e) {
-      throw new SqlMapException("Error parsing default null value date.  
Format must be '" + DATE_FORMAT + "'. Cause: " + e);
-    }
+    return SimpleDateFormatter.format(DATE_FORMAT, s);
   }
 
 }

Modified: 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/SqlTimeTypeHandler.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/SqlTimeTypeHandler.java?rev=431297&r1=431296&r2=431297&view=diff
==============================================================================
--- 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/SqlTimeTypeHandler.java
 (original)
+++ 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/SqlTimeTypeHandler.java
 Sun Aug 13 22:48:51 2006
@@ -15,12 +15,10 @@
  */
 package com.ibatis.sqlmap.engine.type;
 
-import com.ibatis.sqlmap.client.SqlMapException;
-
-import java.sql.*;
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
 
 /**
  * SQL time implementation of TypeHandler
@@ -28,7 +26,6 @@
 public class SqlTimeTypeHandler extends BaseTypeHandler implements TypeHandler 
{
 
   private static final String DATE_FORMAT = "hh:mm:ss";
-  private static final DateFormat format = new SimpleDateFormat(DATE_FORMAT);
 
   public void setParameter(PreparedStatement ps, int i, Object parameter, 
String jdbcType)
       throws SQLException {
@@ -66,12 +63,7 @@
   }
 
   public Object valueOf(String s) {
-    try {
-      java.util.Date date = format.parse(s);
-      return new Time(date.getTime());
-    } catch (ParseException e) {
-      throw new SqlMapException("Error parsing default null value date.  
Format must be '" + DATE_FORMAT + "'. Cause: " + e);
-    }
+    return SimpleDateFormatter.format(DATE_FORMAT, s);
   }
 
 }

Modified: 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/SqlTimestampTypeHandler.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/SqlTimestampTypeHandler.java?rev=431297&r1=431296&r2=431297&view=diff
==============================================================================
--- 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/SqlTimestampTypeHandler.java
 (original)
+++ 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/SqlTimestampTypeHandler.java
 Sun Aug 13 22:48:51 2006
@@ -15,12 +15,10 @@
  */
 package com.ibatis.sqlmap.engine.type;
 
-import com.ibatis.sqlmap.client.SqlMapException;
-
-import java.sql.*;
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
 
 /**
  * SQL timestamp implementation of TypeHandler
@@ -28,7 +26,6 @@
 public class SqlTimestampTypeHandler extends BaseTypeHandler implements 
TypeHandler {
 
   private static final String DATE_FORMAT = "yyyy/MM/dd hh:mm:ss";
-  private static final DateFormat format = new SimpleDateFormat(DATE_FORMAT);
 
   public void setParameter(PreparedStatement ps, int i, Object parameter, 
String jdbcType)
       throws SQLException {
@@ -66,12 +63,7 @@
   }
 
   public Object valueOf(String s) {
-    try {
-      java.util.Date date = format.parse(s);
-      return new Timestamp(date.getTime());
-    } catch (ParseException e) {
-      throw new SqlMapException("Error parsing default null value date.  
Format must be '" + DATE_FORMAT + "'. Cause: " + e);
-    }
+    return SimpleDateFormatter.format(DATE_FORMAT, s);
   }
 
 }

Modified: 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/TimeOnlyTypeHandler.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/TimeOnlyTypeHandler.java?rev=431297&r1=431296&r2=431297&view=diff
==============================================================================
--- 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/TimeOnlyTypeHandler.java
 (original)
+++ 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/TimeOnlyTypeHandler.java
 Sun Aug 13 22:48:51 2006
@@ -15,15 +15,10 @@
  */
 package com.ibatis.sqlmap.engine.type;
 
-import com.ibatis.sqlmap.client.SqlMapException;
-
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
 import java.util.Date;
 
 /**
@@ -32,7 +27,6 @@
 public class TimeOnlyTypeHandler extends BaseTypeHandler implements 
TypeHandler {
 
   private static final String DATE_FORMAT = "hh:mm:ss";
-  private static final DateFormat format = new SimpleDateFormat(DATE_FORMAT);
 
   public void setParameter(PreparedStatement ps, int i, Object parameter, 
String jdbcType)
       throws SQLException {
@@ -70,11 +64,7 @@
   }
 
   public Object valueOf(String s) {
-    try {
-      return format.parse(s);
-    } catch (ParseException e) {
-      throw new SqlMapException("Error parsing default null value date.  
Format must be '" + DATE_FORMAT + "'. Cause: " + e);
-    }
+    return SimpleDateFormatter.format(DATE_FORMAT, s);
   }
 
 }


Reply via email to