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); } }