You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by oh...@apache.org on 2013/10/30 21:17:51 UTC

svn commit: r1537267 - in /commons/proper/beanutils/branches/java5/src: main/java/org/apache/commons/beanutils/locale/ test/java/org/apache/commons/beanutils/locale/converters/

Author: oheger
Date: Wed Oct 30 20:17:50 2013
New Revision: 1537267

URL: http://svn.apache.org/r1537267
Log:
Generified locale converters.

The locale converters now provide a convert method with a type parameter
defining the target conversion type. This commit also fixes
[BEANUTILS-448] and [BEANUTILS-449] because the conversion result is now
explicitly checked whether it is compatible with the desired target type.
This is a change in the behavior of the locale converters; therefore some tests
had to be adapted.

Modified:
    commons/proper/beanutils/branches/java5/src/main/java/org/apache/commons/beanutils/locale/BaseLocaleConverter.java
    commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/BigDecimalLocaleConverterTestCase.java
    commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/BigIntegerLocaleConverterTestCase.java
    commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/ByteLocaleConverterTestCase.java
    commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/DateLocaleConverterTestCase.java
    commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/DoubleLocaleConverterTestCase.java
    commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/FloatLocaleConverterTestCase.java
    commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/IntegerLocaleConverterTestCase.java
    commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/LongLocaleConverterTestCase.java
    commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/ShortLocaleConverterTestCase.java

Modified: commons/proper/beanutils/branches/java5/src/main/java/org/apache/commons/beanutils/locale/BaseLocaleConverter.java
URL: http://svn.apache.org/viewvc/commons/proper/beanutils/branches/java5/src/main/java/org/apache/commons/beanutils/locale/BaseLocaleConverter.java?rev=1537267&r1=1537266&r2=1537267&view=diff
==============================================================================
--- commons/proper/beanutils/branches/java5/src/main/java/org/apache/commons/beanutils/locale/BaseLocaleConverter.java (original)
+++ commons/proper/beanutils/branches/java5/src/main/java/org/apache/commons/beanutils/locale/BaseLocaleConverter.java Wed Oct 30 20:17:50 2013
@@ -17,13 +17,14 @@
 
 package org.apache.commons.beanutils.locale;
 
+import java.text.ParseException;
+import java.util.Locale;
+
 import org.apache.commons.beanutils.ConversionException;
+import org.apache.commons.beanutils.ConvertUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
-import java.text.ParseException;
-import java.util.Locale;
-
 
 /**
  * <p>The base class for all standart type locale-sensitive converters.
@@ -158,7 +159,7 @@ public abstract class BaseLocaleConverte
 
     /**
      * Convert the specified locale-sensitive input object into an output object.
-     * The default pattern is used for the convertion.
+     * The default pattern is used for the conversion.
      *
      * @param value The input object to be converted
      * @return The converted value
@@ -174,7 +175,7 @@ public abstract class BaseLocaleConverte
      * Convert the specified locale-sensitive input object into an output object.
      *
      * @param value The input object to be converted
-     * @param pattern The pattern is used for the convertion
+     * @param pattern The pattern is used for the conversion
      * @return The converted value
      *
      * @exception ConversionException if conversion cannot be performed
@@ -188,6 +189,7 @@ public abstract class BaseLocaleConverte
      * Convert the specified locale-sensitive input object into an output object of the
      * specified type. The default pattern is used for the convertion.
      *
+     * @param <T> The desired target type of the conversion
      * @param type Data type to which this value should be converted
      * @param value The input object to be converted
      * @return The converted value
@@ -195,7 +197,7 @@ public abstract class BaseLocaleConverte
      * @exception ConversionException if conversion cannot be performed
      *  successfully
      */
-    public Object convert(Class type, Object value) {
+    public <T> T convert(Class<T> type, Object value) {
         return convert(type, value, null);
     }
 
@@ -203,6 +205,7 @@ public abstract class BaseLocaleConverte
      * Convert the specified locale-sensitive input object into an output object of the
      * specified type.
      *
+     * @param <T> The desired target type of the conversion
      * @param type Data is type to which this value should be converted
      * @param value is the input object to be converted
      * @param pattern is the pattern is used for the conversion; if null is
@@ -213,10 +216,11 @@ public abstract class BaseLocaleConverte
      * @exception ConversionException if conversion cannot be performed
      *  successfully
      */
-    public Object convert(Class type, Object value, String pattern) {
+    public <T> T convert(Class<T> type, Object value, String pattern) {
+        Class<T> targetType = ConvertUtils.primitiveToWrapper(type);
         if (value == null) {
             if (useDefault) {
-                return (defaultValue);
+                return getDefaultAs(targetType);
             } else {
                 // symmetric beanutils function allows null
                 // so do not: throw new ConversionException("No value specified");
@@ -227,13 +231,13 @@ public abstract class BaseLocaleConverte
 
         try {
             if (pattern != null) {
-                return parse(value, pattern);
+                return checkConversionResult(targetType, parse(value, pattern));
             } else {
-                return parse(value, this.pattern);
+                return checkConversionResult(targetType, parse(value, this.pattern));
             }
         } catch (Exception e) {
             if (useDefault) {
-                return (defaultValue);
+                return getDefaultAs(targetType);
             } else {
                 if (e instanceof ConversionException) {
                     throw (ConversionException)e;
@@ -242,4 +246,44 @@ public abstract class BaseLocaleConverte
             }
         }
     }
+
+    /**
+     * Returns the default object specified for this converter cast for the
+     * given target type. If the default value is not conform to the given type,
+     * an exception is thrown.
+     *
+     * @param <T> the desired target type
+     * @param type the target class of the conversion
+     * @return the default value in the given target type
+     * @throws ConversionException if the default object is not compatible with
+     *         the target type
+     */
+    private <T> T getDefaultAs(Class<T> type) {
+        return checkConversionResult(type, defaultValue);
+    }
+
+    /**
+     * Checks whether the result of a conversion is conform to the specified
+     * target type. If this is the case, the passed in result object is cast to
+     * the correct target type. Otherwise, an exception is thrown.
+     *
+     * @param <T> the desired result type
+     * @param type the target class of the conversion
+     * @param result the conversion result object
+     * @return the result cast to the target class
+     * @throws ConversionException if the result object is not compatible with
+     *         the target type
+     */
+    private static <T> T checkConversionResult(Class<T> type, Object result) {
+        if (type == null) {
+            // in this case we cannot do much; the result object is returned
+            @SuppressWarnings("unchecked")
+            T temp = (T) result;
+            return temp;
+        }
+        if (type.isInstance(result)) {
+            return type.cast(result);
+        }
+        throw new ConversionException("Unsupported target type: " + type);
+    }
 }

Modified: commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/BigDecimalLocaleConverterTestCase.java
URL: http://svn.apache.org/viewvc/commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/BigDecimalLocaleConverterTestCase.java?rev=1537267&r1=1537266&r2=1537267&view=diff
==============================================================================
--- commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/BigDecimalLocaleConverterTestCase.java (original)
+++ commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/BigDecimalLocaleConverterTestCase.java Wed Oct 30 20:17:50 2013
@@ -103,9 +103,9 @@ public class BigDecimalLocaleConverterTe
         //
         // BaseLocaleConverter completely ignores the type - so even if we specify
         // Double.class here it still returns a BigDecimal.
-        //  **** SHOULD IMPLEMENT THIS BEHAVIOUR ****
+        //  **** This has been changed due to BEANUTILS-449 ****
         // **************************************************************************
-        convertValueToType(converter, "(B)", Double.class, localizedDecimalValue, localizedDecimalPattern, expectedValue);
+        //convertValueToType(converter, "(B)", Double.class, localizedDecimalValue, localizedDecimalPattern, expectedValue);
 
 
         // ------------- Construct with non-localized pattern ------------

Modified: commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/BigIntegerLocaleConverterTestCase.java
URL: http://svn.apache.org/viewvc/commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/BigIntegerLocaleConverterTestCase.java?rev=1537267&r1=1537266&r2=1537267&view=diff
==============================================================================
--- commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/BigIntegerLocaleConverterTestCase.java (original)
+++ commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/BigIntegerLocaleConverterTestCase.java Wed Oct 30 20:17:50 2013
@@ -19,6 +19,8 @@ package org.apache.commons.beanutils.loc
 
 import java.math.BigInteger;
 
+import org.apache.commons.beanutils.ConversionException;
+
 /**
  * Test Case for the BigIntegerLocaleConverter class.
  *
@@ -102,9 +104,9 @@ public class BigIntegerLocaleConverterTe
         //
         // BaseLocaleConverter completely ignores the type - so even if we specify
         // Double.class here it still returns a BigInteger.
-        //  **** SHOULD IMPLEMENT THIS BEHAVIOUR ****
+        //  **** This has been changed due to BEANUTILS-449 ****
         // **************************************************************************
-        convertValueToType(converter, "(B)", Double.class, localizedIntegerValue, localizedIntegerPattern, expectedValue);
+        //convertValueToType(converter, "(B)", Double.class, localizedIntegerValue, localizedIntegerPattern, expectedValue);
 
 
         // ------------- Construct with non-localized pattern ------------
@@ -259,7 +261,19 @@ public class BigIntegerLocaleConverterTe
 
     }
 
-
+    /**
+     * Tries to convert to an unsupported type. This tests behavior of the base
+     * class. All locale converters should react in the same way.
+     */
+    public void testUnsupportedType() {
+        converter = new BigIntegerLocaleConverter();
+        try {
+            converter.convert(getClass(), "test", null);
+            fail("Unsupported type not detected!");
+        } catch (ConversionException cex) {
+            // expected result
+        }
+    }
 
 }
 

Modified: commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/ByteLocaleConverterTestCase.java
URL: http://svn.apache.org/viewvc/commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/ByteLocaleConverterTestCase.java?rev=1537267&r1=1537266&r2=1537267&view=diff
==============================================================================
--- commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/ByteLocaleConverterTestCase.java (original)
+++ commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/ByteLocaleConverterTestCase.java Wed Oct 30 20:17:50 2013
@@ -108,9 +108,9 @@ public class ByteLocaleConverterTestCase
         //
         // BaseLocaleConverter completely ignores the type - so even if we specify
         // Double.class here it still returns a Byte.
-        //  **** SHOULD IMPLEMENT THIS BEHAVIOUR ****
+        //  **** This has been changed due to BEANUTILS-449 ****
         // **************************************************************************
-        convertValueToType(converter, "(B)", Double.class, localizedIntegerValue, localizedIntegerPattern, expectedValue);
+        //convertValueToType(converter, "(B)", Double.class, localizedIntegerValue, localizedIntegerPattern, expectedValue);
 
 
         // ------------- Construct with non-localized pattern ------------

Modified: commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/DateLocaleConverterTestCase.java
URL: http://svn.apache.org/viewvc/commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/DateLocaleConverterTestCase.java?rev=1537267&r1=1537266&r2=1537267&view=diff
==============================================================================
--- commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/DateLocaleConverterTestCase.java (original)
+++ commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/DateLocaleConverterTestCase.java Wed Oct 30 20:17:50 2013
@@ -17,15 +17,14 @@
 
 package org.apache.commons.beanutils.locale.converters;
 
-import java.text.SimpleDateFormat;
-import java.text.ParseException;
 import java.text.DateFormatSymbols;
-
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.Locale;
 
 import org.apache.commons.beanutils.ConversionException;
-import org.apache.commons.logging.LogFactory;
 import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 
 /**
  * Test Case for the DateLocaleConverter class.
@@ -239,9 +238,9 @@ public class DateLocaleConverterTestCase
         //
         // BaseLocaleConverter completely ignores the type - so even if we specify
         // Double.class here it still returns a Date.
-        //  **** SHOULD IMPLEMENT THIS BEHAVIOUR ****
+        //  **** This has been changed due to BEANUTILS-449 ****
         // **************************************************************************
-        convertValueToType(converter, "(B)", String.class, localizedDateValue, localizedDatePattern, expectedValue);
+        //convertValueToType(converter, "(B)", String.class, localizedDateValue, localizedDatePattern, expectedValue);
 
 
         // ------------- Construct with non-localized pattern ------------

Modified: commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/DoubleLocaleConverterTestCase.java
URL: http://svn.apache.org/viewvc/commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/DoubleLocaleConverterTestCase.java?rev=1537267&r1=1537266&r2=1537267&view=diff
==============================================================================
--- commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/DoubleLocaleConverterTestCase.java (original)
+++ commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/DoubleLocaleConverterTestCase.java Wed Oct 30 20:17:50 2013
@@ -102,9 +102,9 @@ public class DoubleLocaleConverterTestCa
         //
         // BaseLocaleConverter completely ignores the type - so even if we specify
         // Double.class here it still returns a Double.
-        //  **** SHOULD IMPLEMENT THIS BEHAVIOUR ****
+        //  **** This has been changed due to BEANUTILS-449 ****
         // **************************************************************************
-        convertValueToType(converter, "(B)", Integer.class, localizedDecimalValue, localizedDecimalPattern, expectedValue);
+        //convertValueToType(converter, "(B)", Integer.class, localizedDecimalValue, localizedDecimalPattern, expectedValue);
 
 
         // ------------- Construct with non-localized pattern ------------

Modified: commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/FloatLocaleConverterTestCase.java
URL: http://svn.apache.org/viewvc/commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/FloatLocaleConverterTestCase.java?rev=1537267&r1=1537266&r2=1537267&view=diff
==============================================================================
--- commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/FloatLocaleConverterTestCase.java (original)
+++ commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/FloatLocaleConverterTestCase.java Wed Oct 30 20:17:50 2013
@@ -107,9 +107,9 @@ public class FloatLocaleConverterTestCas
         //
         // BaseLocaleConverter completely ignores the type - so even if we specify
         // Float.class here it still returns a Float.
-        //  **** SHOULD IMPLEMENT THIS BEHAVIOUR ****
+        //  **** This has been changed due to BEANUTILS-449 ****
         // **************************************************************************
-        convertValueToType(converter, "(B)", Integer.class, localizedDecimalValue, localizedDecimalPattern, expectedValue);
+        //convertValueToType(converter, "(B)", Integer.class, localizedDecimalValue, localizedDecimalPattern, expectedValue);
 
 
         // ------------- Construct with non-localized pattern ------------

Modified: commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/IntegerLocaleConverterTestCase.java
URL: http://svn.apache.org/viewvc/commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/IntegerLocaleConverterTestCase.java?rev=1537267&r1=1537266&r2=1537267&view=diff
==============================================================================
--- commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/IntegerLocaleConverterTestCase.java (original)
+++ commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/IntegerLocaleConverterTestCase.java Wed Oct 30 20:17:50 2013
@@ -101,9 +101,9 @@ public class IntegerLocaleConverterTestC
         //
         // BaseLocaleConverter completely ignores the type - so even if we specify
         // Double.class here it still returns a Integer.
-        //  **** SHOULD IMPLEMENT THIS BEHAVIOUR ****
+        //  **** This has been changed due to BEANUTILS-449 ****
         // **************************************************************************
-        convertValueToType(converter, "(B)", Double.class, localizedIntegerValue, localizedIntegerPattern, expectedValue);
+        //convertValueToType(converter, "(B)", Double.class, localizedIntegerValue, localizedIntegerPattern, expectedValue);
 
 
         // ------------- Construct with non-localized pattern ------------
@@ -272,6 +272,15 @@ public class IntegerLocaleConverterTestC
         assertEquals("Convert Long",    value, converter.convert(new Long(value.intValue())));
     }
 
-
+    /**
+     * Tests whether a conversion to a primitive type can be performed.
+     */
+    public void testToPrimitiveType() {
+        converter = new IntegerLocaleConverter();
+        Integer value = 20131028;
+        Class<Integer> target = Integer.TYPE;
+        int result = converter.convert(target, (Object) value.toString());
+        assertEquals("Wrong result", value.intValue(), result);
+    }
 }
 

Modified: commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/LongLocaleConverterTestCase.java
URL: http://svn.apache.org/viewvc/commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/LongLocaleConverterTestCase.java?rev=1537267&r1=1537266&r2=1537267&view=diff
==============================================================================
--- commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/LongLocaleConverterTestCase.java (original)
+++ commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/LongLocaleConverterTestCase.java Wed Oct 30 20:17:50 2013
@@ -101,9 +101,9 @@ public class LongLocaleConverterTestCase
         //
         // BaseLocaleConverter completely ignores the type - so even if we specify
         // Double.class here it still returns a Long.
-        //  **** SHOULD IMPLEMENT THIS BEHAVIOUR ****
+        //  **** This has been changed due to BEANUTILS-449 ****
         // **************************************************************************
-        convertValueToType(converter, "(B)", Double.class, localizedIntegerValue, localizedIntegerPattern, expectedValue);
+        //convertValueToType(converter, "(B)", Double.class, localizedIntegerValue, localizedIntegerPattern, expectedValue);
 
 
         // ------------- Construct with non-localized pattern ------------

Modified: commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/ShortLocaleConverterTestCase.java
URL: http://svn.apache.org/viewvc/commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/ShortLocaleConverterTestCase.java?rev=1537267&r1=1537266&r2=1537267&view=diff
==============================================================================
--- commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/ShortLocaleConverterTestCase.java (original)
+++ commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/locale/converters/ShortLocaleConverterTestCase.java Wed Oct 30 20:17:50 2013
@@ -101,9 +101,9 @@ public class ShortLocaleConverterTestCas
         //
         // BaseLocaleConverter completely ignores the type - so even if we specify
         // Double.class here it still returns a Short.
-        //  **** SHOULD IMPLEMENT THIS BEHAVIOUR ****
+        //  **** This has been changed due to BEANUTILS-449 ****
         // **************************************************************************
-        convertValueToType(converter, "(B)", Double.class, localizedIntegerValue, localizedIntegerPattern, expectedValue);
+        //convertValueToType(converter, "(B)", Double.class, localizedIntegerValue, localizedIntegerPattern, expectedValue);
 
 
         // ------------- Construct with non-localized pattern ------------