You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by sv...@apache.org on 2015/03/21 15:32:34 UTC

wicket git commit: WICKET-5853 and WICKET-5861: number converters are based on BigDecimals now

Repository: wicket
Updated Branches:
  refs/heads/master 673a01e43 -> b80f6640b


WICKET-5853 and WICKET-5861: number converters are based on BigDecimals now


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/b80f6640
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/b80f6640
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/b80f6640

Branch: refs/heads/master
Commit: b80f6640b7a7c4645876cc2ce86552cb7144e48b
Parents: 673a01e
Author: Sven Meier <sv...@apache.org>
Authored: Sat Mar 21 15:32:09 2015 +0100
Committer: Sven Meier <sv...@apache.org>
Committed: Sat Mar 21 15:32:09 2015 +0100

----------------------------------------------------------------------
 .../converter/AbstractDecimalConverter.java     |  41 +------
 .../converter/AbstractIntegerConverter.java     |  30 ++----
 .../converter/AbstractNumberConverter.java      |  70 ++++++++++--
 .../convert/converter/BigDecimalConverter.java  |  29 +----
 .../convert/converter/BigIntegerConverter.java  |  21 ++--
 .../util/convert/converter/ByteConverter.java   |   6 +-
 .../util/convert/converter/DoubleConverter.java |  10 +-
 .../util/convert/converter/FloatConverter.java  |   8 +-
 .../convert/converter/IntegerConverter.java     |   6 +-
 .../util/convert/converter/LongConverter.java   |   6 +-
 .../util/convert/converter/ShortConverter.java  |   6 +-
 .../converter/ZeroPaddingIntegerConverter.java  |  29 +----
 .../util/convert/converters/ConvertersTest.java | 107 +++++++++++++++++--
 13 files changed, 211 insertions(+), 158 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/b80f6640/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/AbstractDecimalConverter.java
----------------------------------------------------------------------
diff --git a/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/AbstractDecimalConverter.java b/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/AbstractDecimalConverter.java
index 09485fa..f16ad92 100644
--- a/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/AbstractDecimalConverter.java
+++ b/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/AbstractDecimalConverter.java
@@ -16,14 +16,11 @@
  */
 package org.apache.wicket.util.convert.converter;
 
-import java.text.DecimalFormat;
 import java.text.NumberFormat;
 import java.util.Locale;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
 
 /**
- * Base class for all number converters.
+ * Base class for all converters of decimal numbers.
  * 
  * @author Jonathan Locke
  * @param <N>
@@ -32,25 +29,6 @@ public abstract class AbstractDecimalConverter<N extends Number> extends Abstrac
 {
 	private static final long serialVersionUID = 1L;
 
-	/** The date format to use */
-	private final Map<Locale, NumberFormat> numberFormats = new ConcurrentHashMap<>();
-
-	/**
-	 * @param locale
-	 * @return Returns the numberFormat.
-	 */
-	@Override
-	public NumberFormat getNumberFormat(final Locale locale)
-	{
-		NumberFormat numberFormat = numberFormats.get(locale);
-		if (numberFormat == null)
-		{
-			numberFormat = newNumberFormat(locale);
-			setNumberFormat(locale, numberFormat);
-		}
-		return (NumberFormat)numberFormat.clone();
-	}
-
 	/**
 	 * Creates a new {@link NumberFormat} for the given locale. The instance is later cached and is
 	 * accessible through {@link #getNumberFormat(Locale)}
@@ -58,24 +36,9 @@ public abstract class AbstractDecimalConverter<N extends Number> extends Abstrac
 	 * @param locale
 	 * @return number format
 	 */
+	@Override
 	protected NumberFormat newNumberFormat(final Locale locale)
 	{
 		return NumberFormat.getInstance(locale);
 	}
-
-	/**
-	 * @param locale
-	 *            The Locale that was used for this NumberFormat
-	 * @param numberFormat
-	 *            The numberFormat to set.
-	 */
-	public final void setNumberFormat(final Locale locale, final NumberFormat numberFormat)
-	{
-		if (numberFormat instanceof DecimalFormat)
-		{
-			((DecimalFormat)numberFormat).setParseBigDecimal(true);
-		}
-
-		numberFormats.put(locale, numberFormat);
-	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/b80f6640/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/AbstractIntegerConverter.java
----------------------------------------------------------------------
diff --git a/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/AbstractIntegerConverter.java b/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/AbstractIntegerConverter.java
index 88639c0..0499814 100644
--- a/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/AbstractIntegerConverter.java
+++ b/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/AbstractIntegerConverter.java
@@ -18,10 +18,9 @@ package org.apache.wicket.util.convert.converter;
 
 import java.text.NumberFormat;
 import java.util.Locale;
-import java.util.concurrent.ConcurrentHashMap;
 
 /**
- * Base class for all number converters.
+ * Base class for all converters of integer numbers.
  * 
  * @author Jonathan Locke
  * @param <I>
@@ -30,29 +29,12 @@ public abstract class AbstractIntegerConverter<I extends Number> extends Abstrac
 {
 	private static final long serialVersionUID = 1L;
 
-	/** The date format to use */
-	private final ConcurrentHashMap<Locale, NumberFormat> numberFormats = new ConcurrentHashMap<>();
-
-	/**
-	 * @param locale
-	 *            The locale
-	 * @return Returns the numberFormat.
-	 */
 	@Override
-	public NumberFormat getNumberFormat(final Locale locale)
+	protected NumberFormat newNumberFormat(Locale locale)
 	{
-		NumberFormat numberFormat = numberFormats.get(locale);
-		if (numberFormat == null)
-		{
-			numberFormat = NumberFormat.getIntegerInstance(locale);
-			numberFormat.setParseIntegerOnly(true);
-			numberFormat.setGroupingUsed(false);
-			NumberFormat tmpNumberFormat = numberFormats.putIfAbsent(locale, numberFormat);
-			if (tmpNumberFormat != null)
-			{
-				numberFormat = tmpNumberFormat;
-			}
-		}
-		return (NumberFormat)numberFormat.clone();
+		NumberFormat numberFormat  = NumberFormat.getIntegerInstance(locale);
+		numberFormat.setParseIntegerOnly(true);
+		numberFormat.setGroupingUsed(false);
+		return numberFormat;
 	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/b80f6640/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/AbstractNumberConverter.java
----------------------------------------------------------------------
diff --git a/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/AbstractNumberConverter.java b/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/AbstractNumberConverter.java
index 5c448c0..da3df42 100644
--- a/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/AbstractNumberConverter.java
+++ b/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/AbstractNumberConverter.java
@@ -16,8 +16,11 @@
  */
 package org.apache.wicket.util.convert.converter;
 
+import java.math.BigDecimal;
+import java.text.DecimalFormat;
 import java.text.NumberFormat;
 import java.util.Locale;
+import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.wicket.util.convert.ConversionException;
 
@@ -32,11 +35,45 @@ public abstract class AbstractNumberConverter<N extends Number> extends Abstract
 {
 	private static final long serialVersionUID = 1L;
 
+	/** The date format to use */
+	private final ConcurrentHashMap<Locale, NumberFormat> numberFormats = new ConcurrentHashMap<>();
+
 	/**
 	 * @param locale
+	 *            The locale
 	 * @return Returns the numberFormat.
 	 */
-	public abstract NumberFormat getNumberFormat(Locale locale);
+	public NumberFormat getNumberFormat(final Locale locale)
+	{
+		NumberFormat numberFormat = numberFormats.get(locale);
+		if (numberFormat == null)
+		{
+			numberFormat = newNumberFormat(locale);
+
+			if (numberFormat instanceof DecimalFormat)
+			{
+				// always try to parse BigDecimals
+				((DecimalFormat)numberFormat).setParseBigDecimal(true);
+			}
+
+			NumberFormat tmpNumberFormat = numberFormats.putIfAbsent(locale, numberFormat);
+			if (tmpNumberFormat != null)
+			{
+				numberFormat = tmpNumberFormat;
+			}
+		}
+		// return a clone because NumberFormat.get..Instance use a pool
+		return (NumberFormat)numberFormat.clone();
+	}
+
+	/**
+	 * Creates a new {@link NumberFormat} for the given locale. The instance is later cached and is
+	 * accessible through {@link #getNumberFormat(Locale)}
+	 *
+	 * @param locale
+	 * @return number format
+	 */
+	protected abstract NumberFormat newNumberFormat(final Locale locale);
 
 	/**
 	 * Parses a value as a String and returns a Number.
@@ -44,15 +81,15 @@ public abstract class AbstractNumberConverter<N extends Number> extends Abstract
 	 * @param value
 	 *            The object to parse (after converting with toString())
 	 * @param min
-	 *            The minimum allowed value
+	 *            The minimum allowed value or {@code null} if none
 	 * @param max
-	 *            The maximum allowed value
+	 *            The maximum allowed value or {@code null} if none
 	 * @param locale
 	 * @return The number
 	 * @throws ConversionException
 	 *             if value is unparsable or out of range
 	 */
-	protected N parse(Object value, final double min, final double max, Locale locale)
+	protected BigDecimal parse(Object value, final BigDecimal min, final BigDecimal max, Locale locale)
 	{
 		if (locale == null)
 		{
@@ -78,19 +115,30 @@ public abstract class AbstractNumberConverter<N extends Number> extends Abstract
 			return null;
 		}
 
-		if (number.doubleValue() < min)
+		BigDecimal bigDecimal;
+		if (number instanceof BigDecimal)
+		{
+			bigDecimal = (BigDecimal)number;
+		}
+		else
+		{
+			// should occur rarely, see #getNumberFormat(Locale)
+			bigDecimal = new BigDecimal(number.toString());
+		}
+
+		if (min != null && bigDecimal.compareTo(min) < 0)
 		{
-			throw newConversionException("Value cannot be less than " + min, value, locale).setFormat(
-				numberFormat);
+			throw newConversionException("Value cannot be less than " + min, value, locale)
+					.setFormat(numberFormat);
 		}
 
-		if (number.doubleValue() > max)
+		if (max != null && bigDecimal.compareTo(max) > 0)
 		{
-			throw newConversionException("Value cannot be greater than " + max, value, locale).setFormat(
-				numberFormat);
+			throw newConversionException("Value cannot be greater than " + max, value, locale)
+					.setFormat(numberFormat);
 		}
 
-		return number;
+		return bigDecimal;
 	}
 
 	@Override

http://git-wip-us.apache.org/repos/asf/wicket/blob/b80f6640/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/BigDecimalConverter.java
----------------------------------------------------------------------
diff --git a/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/BigDecimalConverter.java b/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/BigDecimalConverter.java
index dd6e0ba..162a6de 100644
--- a/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/BigDecimalConverter.java
+++ b/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/BigDecimalConverter.java
@@ -44,33 +44,6 @@ public class BigDecimalConverter extends AbstractDecimalConverter<BigDecimal>
 			return null;
 		}
 
-		final Number number = parse(value, -Double.MAX_VALUE, Double.MAX_VALUE, locale);
-
-		if (number instanceof BigDecimal)
-		{
-			return (BigDecimal)number;
-		}
-		else if (number instanceof Double)
-		{
-			// See link why the String is preferred for doubles
-			// http://java.sun.com/j2se/1.4.2/docs/api/java/math/BigDecimal.html#BigDecimal%28double%29
-			return new BigDecimal(Double.toString(number.doubleValue()));
-		}
-		else if (number instanceof Long)
-		{
-			return new BigDecimal(number.longValue());
-		}
-		else if (number instanceof Float)
-		{
-			return new BigDecimal(number.floatValue());
-		}
-		else if (number instanceof Integer)
-		{
-			return new BigDecimal(number.intValue());
-		}
-		else
-		{
-			return new BigDecimal(value);
-		}
+		return parse(value, null, null, locale);
 	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/b80f6640/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/BigIntegerConverter.java
----------------------------------------------------------------------
diff --git a/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/BigIntegerConverter.java b/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/BigIntegerConverter.java
index 22077be..5da0034 100644
--- a/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/BigIntegerConverter.java
+++ b/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/BigIntegerConverter.java
@@ -16,6 +16,7 @@
  */
 package org.apache.wicket.util.convert.converter;
 
+import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.util.Locale;
 
@@ -44,23 +45,13 @@ public class BigIntegerConverter extends AbstractIntegerConverter<BigInteger>
 			return null;
 		}
 
-		final Number number = parse(value, -Double.MAX_VALUE, Double.MAX_VALUE, locale);
+		final BigDecimal number = parse(value, null, null, locale);
 
-		if (number instanceof BigInteger)
+		if (number == null)
 		{
-			return (BigInteger)number;
-		}
-		else if (number instanceof Long)
-		{
-			return BigInteger.valueOf(number.longValue());
-		}
-		else if (number instanceof Integer)
-		{
-			return BigInteger.valueOf(number.intValue());
-		}
-		else
-		{
-			return new BigInteger(value);
+			return null;
 		}
+
+		return new BigInteger(number.toString());
 	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/b80f6640/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/ByteConverter.java
----------------------------------------------------------------------
diff --git a/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/ByteConverter.java b/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/ByteConverter.java
index 8c351e4..8850165 100644
--- a/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/ByteConverter.java
+++ b/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/ByteConverter.java
@@ -16,6 +16,7 @@
  */
 package org.apache.wicket.util.convert.converter;
 
+import java.math.BigDecimal;
 import java.util.Locale;
 
 import org.apache.wicket.util.convert.IConverter;
@@ -31,6 +32,9 @@ public class ByteConverter extends AbstractIntegerConverter<Byte>
 {
 	private static final long serialVersionUID = 1L;
 
+	private static final BigDecimal MIN_VALUE = new BigDecimal(Byte.MIN_VALUE);
+	private static final BigDecimal MAX_VALUE = new BigDecimal(Byte.MAX_VALUE);
+
 	/**
 	 * The singleton instance for a byte converter
 	 */
@@ -42,7 +46,7 @@ public class ByteConverter extends AbstractIntegerConverter<Byte>
 	@Override
 	public Byte convertToObject(final String value, final Locale locale)
 	{
-		final Number number = parse(value, Byte.MIN_VALUE, Byte.MAX_VALUE, locale);
+		final BigDecimal number = parse(value, MIN_VALUE, MAX_VALUE, locale);
 
 		if (number == null)
 		{

http://git-wip-us.apache.org/repos/asf/wicket/blob/b80f6640/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/DoubleConverter.java
----------------------------------------------------------------------
diff --git a/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/DoubleConverter.java b/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/DoubleConverter.java
index fbf5862..ce2ca99 100644
--- a/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/DoubleConverter.java
+++ b/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/DoubleConverter.java
@@ -16,6 +16,7 @@
  */
 package org.apache.wicket.util.convert.converter;
 
+import java.math.BigDecimal;
 import java.util.Locale;
 
 import org.apache.wicket.util.convert.IConverter;
@@ -31,6 +32,11 @@ public class DoubleConverter extends AbstractDecimalConverter<Double>
 {
 	private static final long serialVersionUID = 1L;
 
+	// Double.MIN is the smallest nonzero positive number, not the largest
+	// negative number
+	private static final BigDecimal MIN_VALUE = new BigDecimal(-Double.MAX_VALUE);
+	private static final BigDecimal MAX_VALUE = new BigDecimal(Double.MAX_VALUE);
+
 	/**
 	 * The singleton instance for a double converter
 	 */
@@ -42,9 +48,7 @@ public class DoubleConverter extends AbstractDecimalConverter<Double>
 	@Override
 	public Double convertToObject(final String value, final Locale locale)
 	{
-		final Number number = parse(value, -Double.MAX_VALUE, Double.MAX_VALUE, locale);
-		// Double.MIN is the smallest nonzero positive number, not the largest
-		// negative number
+		final BigDecimal number = parse(value, MIN_VALUE, MAX_VALUE, locale);
 
 		if (number == null)
 		{

http://git-wip-us.apache.org/repos/asf/wicket/blob/b80f6640/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/FloatConverter.java
----------------------------------------------------------------------
diff --git a/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/FloatConverter.java b/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/FloatConverter.java
index bc1562a..c4b2b79 100644
--- a/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/FloatConverter.java
+++ b/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/FloatConverter.java
@@ -16,6 +16,7 @@
  */
 package org.apache.wicket.util.convert.converter;
 
+import java.math.BigDecimal;
 import java.util.Locale;
 
 import org.apache.wicket.util.convert.IConverter;
@@ -31,6 +32,11 @@ public class FloatConverter extends AbstractDecimalConverter<Float>
 {
 	private static final long serialVersionUID = 1L;
 
+	// Float.MIN is the smallest nonzero positive number, not the largest
+	// negative number
+	private static final BigDecimal MIN_VALUE = new BigDecimal(-Float.MAX_VALUE);
+	private static final BigDecimal MAX_VALUE = new BigDecimal(Float.MAX_VALUE);
+
 	/**
 	 * The singleton instance for a float converter
 	 */
@@ -42,7 +48,7 @@ public class FloatConverter extends AbstractDecimalConverter<Float>
 	@Override
 	public Float convertToObject(final String value, final Locale locale)
 	{
-		final Number number = parse(value, -Float.MAX_VALUE, Float.MAX_VALUE, locale);
+		final BigDecimal number = parse(value, MIN_VALUE, MAX_VALUE, locale);
 
 		if (number == null)
 		{

http://git-wip-us.apache.org/repos/asf/wicket/blob/b80f6640/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/IntegerConverter.java
----------------------------------------------------------------------
diff --git a/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/IntegerConverter.java b/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/IntegerConverter.java
index 8fd1edf..5055d4a 100644
--- a/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/IntegerConverter.java
+++ b/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/IntegerConverter.java
@@ -16,6 +16,7 @@
  */
 package org.apache.wicket.util.convert.converter;
 
+import java.math.BigDecimal;
 import java.util.Locale;
 
 import org.apache.wicket.util.convert.IConverter;
@@ -31,6 +32,9 @@ public class IntegerConverter extends AbstractIntegerConverter<Integer>
 {
 	private static final long serialVersionUID = 1L;
 
+	private static final BigDecimal MIN_VALUE = new BigDecimal(Integer.MIN_VALUE);
+	private static final BigDecimal MAX_VALUE = new BigDecimal(Integer.MAX_VALUE);
+
 	/**
 	 * The singleton instance for a integer converter
 	 */
@@ -42,7 +46,7 @@ public class IntegerConverter extends AbstractIntegerConverter<Integer>
 	@Override
 	public Integer convertToObject(final String value, final Locale locale)
 	{
-		final Number number = parse(value, Integer.MIN_VALUE, Integer.MAX_VALUE, locale);
+		final BigDecimal number = parse(value, MIN_VALUE, MAX_VALUE, locale);
 
 		if (number == null)
 		{

http://git-wip-us.apache.org/repos/asf/wicket/blob/b80f6640/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/LongConverter.java
----------------------------------------------------------------------
diff --git a/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/LongConverter.java b/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/LongConverter.java
index 67401b2..0cf8db6 100644
--- a/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/LongConverter.java
+++ b/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/LongConverter.java
@@ -16,6 +16,7 @@
  */
 package org.apache.wicket.util.convert.converter;
 
+import java.math.BigDecimal;
 import java.util.Locale;
 
 import org.apache.wicket.util.convert.IConverter;
@@ -31,6 +32,9 @@ public class LongConverter extends AbstractIntegerConverter<Long>
 {
 	private static final long serialVersionUID = 1L;
 
+	private static final BigDecimal MIN_VALUE = new BigDecimal(Long.MIN_VALUE);
+	private static final BigDecimal MAX_VALUE = new BigDecimal(Long.MAX_VALUE);
+
 	/**
 	 * The singleton instance for a long converter
 	 */
@@ -42,7 +46,7 @@ public class LongConverter extends AbstractIntegerConverter<Long>
 	@Override
 	public Long convertToObject(final String value, final Locale locale)
 	{
-		final Number number = parse(value, Long.MIN_VALUE, Long.MAX_VALUE, locale);
+		final BigDecimal number = parse(value, MIN_VALUE, MAX_VALUE, locale);
 
 		if (number == null)
 		{

http://git-wip-us.apache.org/repos/asf/wicket/blob/b80f6640/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/ShortConverter.java
----------------------------------------------------------------------
diff --git a/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/ShortConverter.java b/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/ShortConverter.java
index 4d2a2fa..30aa1b7 100644
--- a/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/ShortConverter.java
+++ b/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/ShortConverter.java
@@ -16,6 +16,7 @@
  */
 package org.apache.wicket.util.convert.converter;
 
+import java.math.BigDecimal;
 import java.util.Locale;
 
 import org.apache.wicket.util.convert.IConverter;
@@ -31,6 +32,9 @@ public class ShortConverter extends AbstractIntegerConverter<Short>
 {
 	private static final long serialVersionUID = 1L;
 
+	private static final BigDecimal MIN_VALUE = new BigDecimal(Short.MIN_VALUE);
+	private static final BigDecimal MAX_VALUE = new BigDecimal(Short.MAX_VALUE);
+
 	/**
 	 * The singleton instance for a short converter
 	 */
@@ -42,7 +46,7 @@ public class ShortConverter extends AbstractIntegerConverter<Short>
 	@Override
 	public Short convertToObject(final String value, final Locale locale)
 	{
-		final Number number = parse(value, Short.MIN_VALUE, Short.MAX_VALUE, locale);
+		final BigDecimal number = parse(value, MIN_VALUE, MAX_VALUE, locale);
 
 		if (number == null)
 		{

http://git-wip-us.apache.org/repos/asf/wicket/blob/b80f6640/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/ZeroPaddingIntegerConverter.java
----------------------------------------------------------------------
diff --git a/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/ZeroPaddingIntegerConverter.java b/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/ZeroPaddingIntegerConverter.java
index 84c4f62..181be0b 100644
--- a/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/ZeroPaddingIntegerConverter.java
+++ b/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/ZeroPaddingIntegerConverter.java
@@ -24,8 +24,10 @@ import java.util.Locale;
  * @author Eelco Hillenius
  * @author Jonathan Locke
  * @author Al Maw
+ * 
+ * @deprecated use an {@link IntegerConverter} with suitable format string instead
  */
-public class ZeroPaddingIntegerConverter extends AbstractIntegerConverter<Integer>
+public class ZeroPaddingIntegerConverter extends IntegerConverter
 {
 	private static final long serialVersionUID = 1L;
 
@@ -58,29 +60,4 @@ public class ZeroPaddingIntegerConverter extends AbstractIntegerConverter<Intege
 
 		return result;
 	}
-
-	/**
-	 * @see org.apache.wicket.util.convert.IConverter#convertToObject(java.lang.String,Locale)
-	 */
-	@Override
-	public Integer convertToObject(final String value, final Locale locale)
-	{
-		final Number number = parse(value, Integer.MIN_VALUE, Integer.MAX_VALUE, locale);
-
-		if (number == null)
-		{
-			return null;
-		}
-
-		return number.intValue();
-	}
-
-	/**
-	 * @see org.apache.wicket.util.convert.converter.AbstractConverter#getTargetType()
-	 */
-	@Override
-	protected Class<Integer> getTargetType()
-	{
-		return Integer.class;
-	}
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/wicket/blob/b80f6640/wicket-util/src/test/java/org/apache/wicket/util/convert/converters/ConvertersTest.java
----------------------------------------------------------------------
diff --git a/wicket-util/src/test/java/org/apache/wicket/util/convert/converters/ConvertersTest.java b/wicket-util/src/test/java/org/apache/wicket/util/convert/converters/ConvertersTest.java
index e2c173d..fd2bc14 100644
--- a/wicket-util/src/test/java/org/apache/wicket/util/convert/converters/ConvertersTest.java
+++ b/wicket-util/src/test/java/org/apache/wicket/util/convert/converters/ConvertersTest.java
@@ -17,6 +17,7 @@
 package org.apache.wicket.util.convert.converters;
 
 import java.math.BigDecimal;
+import java.text.ChoiceFormat;
 import java.text.NumberFormat;
 import java.util.Calendar;
 import java.util.Date;
@@ -184,6 +185,16 @@ public final class ConvertersTest extends Assert
 		{
 			// this is correct
 		}
+
+		try
+		{
+			converter.convertToObject("1" + Double.MAX_VALUE, Locale.US);
+			fail("Conversion should have thrown an exception");
+		}
+		catch (ConversionException e)
+		{
+			// This is correct
+		}
 	}
 
 	/**
@@ -214,6 +225,17 @@ public final class ConvertersTest extends Assert
 		{
 			// this is correct
 		}
+
+
+		try
+		{
+			converter.convertToObject("1" + Float.MAX_VALUE, Locale.US);
+			fail("Conversion should have thrown an exception");
+		}
+		catch (ConversionException e)
+		{
+			// This is correct
+		}
 	}
 
 	/**
@@ -245,9 +267,20 @@ public final class ConvertersTest extends Assert
 		{
 			// This is correct
 		}
+
 		try
 		{
-			converter.convertToObject("" + ((long)Integer.MAX_VALUE + 1), Locale.US);
+			converter.convertToObject("1.0", Locale.US);
+			fail("Conversion should have thrown an exception");
+		}
+		catch (ConversionException e)
+		{
+			// This is correct
+		}
+
+		try
+		{
+			converter.convertToObject("1" + Integer.MAX_VALUE, Locale.US);
 			fail("Conversion should have thrown an exception");
 		}
 		catch (ConversionException e)
@@ -286,7 +319,35 @@ public final class ConvertersTest extends Assert
 		}
 		try
 		{
-			converter.convertToObject("" + Long.MAX_VALUE + "0", Locale.US);
+			converter.convertToObject("1" + Long.MAX_VALUE, Locale.US);
+			fail("Conversion should have thrown an exception");
+		}
+		catch (ConversionException e)
+		{
+			// This is correct
+		}
+
+		try
+		{
+			// WICKET-5853 assert that the compared number is out of range of Long
+			final String biggerThanLong = "9223372036854776833";
+			assertEquals(1,
+					new BigDecimal(biggerThanLong).compareTo(BigDecimal.valueOf(Long.MAX_VALUE)));
+			converter.convertToObject(biggerThanLong, Locale.US);
+			fail("Conversion should have thrown an exception");
+		}
+		catch (ConversionException e)
+		{
+			// This is correct
+		}
+
+		try
+		{
+			// WICKET-5853 assert that the compared number is out of range of Long
+			final String biggerThanLong = "9223372036854776832";
+			assertEquals(1,
+					new BigDecimal(biggerThanLong).compareTo(BigDecimal.valueOf(Long.MAX_VALUE)));
+			converter.convertToObject(biggerThanLong, Locale.US);
 			fail("Conversion should have thrown an exception");
 		}
 		catch (ConversionException e)
@@ -323,6 +384,7 @@ public final class ConvertersTest extends Assert
 		{
 			// This is correct
 		}
+
 		try
 		{
 			converter.convertToObject("" + (Short.MAX_VALUE + 1), Locale.US);
@@ -428,6 +490,7 @@ public final class ConvertersTest extends Assert
 		{
 			// this is correct
 		}
+
 		try
 		{
 			converter.convertToObject("5/1/11whatever", Locale.US);
@@ -441,16 +504,46 @@ public final class ConvertersTest extends Assert
 
 	/**
 	 * See WICKET-2878 and
-	 * http://java.sun.com/j2se/1.4.2/docs/api/java/math/BigDecimal
-	 * .html#BigDecimal%28double%29
+	 * http://java.sun.com/j2se/1.4.2/docs/api/java/math/BigDecimal.html#BigDecimal%28double%29
 	 */
 	@Test
-	public void bigDecimalsDoubles()
+	public void bigDecimalConverter()
 	{
 		BigDecimal bd = new BigDecimalConverter().convertToObject("0.1", Locale.US);
-		assertTrue(bd.doubleValue() == 0.1d);
+		assertEquals(new BigDecimal("0.1"), bd);
 
 		bd = new BigDecimalConverter().convertToObject("0,1", Locale.GERMAN);
-		assertTrue(bd.doubleValue() == 0.1d);
+		assertEquals(new BigDecimal("0.1"), bd);
+
+		String max = "1" + Double.MAX_VALUE;
+		bd = new BigDecimalConverter().convertToObject(max, Locale.US);
+		assertEquals(new BigDecimal(max), bd);
+	}
+
+	@Test
+	public void customFormat()
+	{
+		IntegerConverter converter = new IntegerConverter()
+		{
+			protected NumberFormat newNumberFormat(Locale locale)
+			{
+				return new ChoiceFormat(new double[] { 1, 2, 3 }, new String[] { "one", "two",
+						"three" });
+			}
+		};
+
+		Integer integer = converter.convertToObject("two", Locale.US);
+
+		assertEquals(new Integer(2), integer);
+
+		try
+		{
+			converter.convertToObject("four", Locale.US);
+			fail("Conversion should have thrown an exception");
+		}
+		catch (ConversionException e)
+		{
+			// this is correct
+		}
 	}
 }
\ No newline at end of file