Author: cbrisson
Date: Tue Dec  3 16:57:12 2019
New Revision: 1870761

URL: http://svn.apache.org/viewvc?rev=1870761&view=rev
Log:
[core] Added implicit conversions from/to BigInteger and BigDecimal

Modified:
    
velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/Converter.java
    
velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/TypeConversionHandlerImpl.java
    
velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/UberspectImpl.java
    
velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/util/introspection/ConversionHandlerTestCase.java
    
velocity/engine/trunk/velocity-engine-core/src/test/resources/conversion/compare/matrix.cmp
    
velocity/engine/trunk/velocity-engine-core/src/test/resources/conversion/compare/test_conv_with_handler.cmp
    
velocity/engine/trunk/velocity-engine-core/src/test/resources/conversion/compare/test_conv_without_handler.cmp
    
velocity/engine/trunk/velocity-engine-core/src/test/resources/conversion/matrix.vhtml
    
velocity/engine/trunk/velocity-engine-core/src/test/resources/conversion/test_conv.vtl

Modified: 
velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/Converter.java
URL: 
http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/Converter.java?rev=1870761&r1=1870760&r2=1870761&view=diff
==============================================================================
--- 
velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/Converter.java
 (original)
+++ 
velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/Converter.java
 Tue Dec  3 16:57:12 2019
@@ -27,6 +27,7 @@ package org.apache.velocity.util.introsp
  * @version $Id$
  */
 
+@FunctionalInterface
 public interface Converter<T>
 {
     /**

Modified: 
velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/TypeConversionHandlerImpl.java
URL: 
http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/TypeConversionHandlerImpl.java?rev=1870761&r1=1870760&r2=1870761&view=diff
==============================================================================
--- 
velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/TypeConversionHandlerImpl.java
 (original)
+++ 
velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/TypeConversionHandlerImpl.java
 Tue Dec  3 16:57:12 2019
@@ -24,9 +24,12 @@ import org.apache.commons.lang3.reflect.
 import org.apache.commons.lang3.tuple.Pair;
 
 import java.lang.reflect.Type;
+import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.util.HashMap;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
 
 /**
@@ -57,18 +60,6 @@ public class TypeConversionHandlerImpl i
     static Converter cacheMiss;
 
     /**
-     * min/max byte/short/int values as long
-     */
-    static final long minByte = Byte.MIN_VALUE, maxByte = Byte.MAX_VALUE,
-        minShort = Short.MIN_VALUE, maxShort = Short.MAX_VALUE,
-        minInt = Integer.MIN_VALUE, maxInt = Integer.MAX_VALUE;
-
-    /**
-     * min/max long values as double
-     */
-    static final double minLong = Long.MIN_VALUE, maxLong = Long.MAX_VALUE;
-
-    /**
      * a converters cache map, initialized with the standard narrowing and 
string parsing conversions.
      */
     Map<Pair<String, String>, Converter> converterCacheMap;
@@ -86,41 +77,53 @@ public class TypeConversionHandlerImpl i
     static final String SHORT_CLASS = "java.lang.Short";
     static final String INTEGER_CLASS = "java.lang.Integer";
     static final String LONG_CLASS = "java.lang.Long";
+    static final String BIG_INTEGER_CLASS = "java.math.BigInteger";
     static final String FLOAT_CLASS = "java.lang.Float";
     static final String DOUBLE_CLASS = "java.lang.Double";
+    static final String BIG_DECIMAL_CLASS = "java.math.BigDecimal";
     static final String NUMBER_CLASS = "java.lang.Number";
     static final String CHARACTER_CLASS = "java.lang.Character";
     static final String STRING_CLASS = "java.lang.String";
     static final String LOCALE_CLASS = "java.util.Locale";
 
+    /*
+     * Bounds checking helper
+     */
+
+    static boolean checkBounds(Number n, double min, double max)
+    {
+        double d = n.doubleValue();
+        if (d < min || d > max)
+        {
+            throw new NumberFormatException("value out of range: " + n);
+        }
+        return true;
+    }
+
     static
     {
         standardConverterMap = new HashMap<>();
 
-        cacheMiss = new Converter<Object>()
-        {
-            @Override
-            public Object convert(Object o)
-            {
-                return o;
-            }
-        };
+        cacheMiss = o -> o;
+
+        /*
+         * Conversions towards boolean
+         */
 
         /* number -> boolean */
-        Converter<Boolean> numberToBool = new Converter<Boolean>()
-        {
-            @Override
-            public Boolean convert(Object o)
-            {
-                return o == null ? null : ((Number) o).intValue() != 0;
-            }
-        };
+
+        Converter<Boolean> numberToBool = o -> 
Optional.ofNullable((Number)o).map(n -> Double.compare(n.doubleValue(), 0.0) != 
0).orElse(null);
+        Converter<Boolean> bigIntegerToBool = o -> 
Optional.ofNullable((BigInteger)o).map(bi -> bi.signum() != 0).orElse(null);
+        Converter<Boolean> bigDecimalToBool = o -> 
Optional.ofNullable((BigDecimal)o).map(bi -> bi.signum() != 0).orElse(null);
+
         standardConverterMap.put(Pair.of(BOOLEAN_CLASS, BYTE_CLASS), 
numberToBool);
         standardConverterMap.put(Pair.of(BOOLEAN_CLASS, SHORT_CLASS), 
numberToBool);
         standardConverterMap.put(Pair.of(BOOLEAN_CLASS, INTEGER_CLASS), 
numberToBool);
         standardConverterMap.put(Pair.of(BOOLEAN_CLASS, LONG_CLASS), 
numberToBool);
+        standardConverterMap.put(Pair.of(BOOLEAN_CLASS, BIG_INTEGER_CLASS), 
bigIntegerToBool);
         standardConverterMap.put(Pair.of(BOOLEAN_CLASS, FLOAT_CLASS), 
numberToBool);
         standardConverterMap.put(Pair.of(BOOLEAN_CLASS, DOUBLE_CLASS), 
numberToBool);
+        standardConverterMap.put(Pair.of(BOOLEAN_CLASS, BIG_DECIMAL_CLASS), 
bigDecimalToBool);
         standardConverterMap.put(Pair.of(BOOLEAN_CLASS, NUMBER_CLASS), 
numberToBool);
         standardConverterMap.put(Pair.of(BOOLEAN_CLASS, BYTE_TYPE), 
numberToBool);
         standardConverterMap.put(Pair.of(BOOLEAN_CLASS, SHORT_TYPE), 
numberToBool);
@@ -131,9 +134,11 @@ public class TypeConversionHandlerImpl i
         standardConverterMap.put(Pair.of(BOOLEAN_TYPE, BYTE_CLASS), 
numberToBool);
         standardConverterMap.put(Pair.of(BOOLEAN_TYPE, SHORT_CLASS), 
numberToBool);
         standardConverterMap.put(Pair.of(BOOLEAN_TYPE, INTEGER_CLASS), 
numberToBool);
+        standardConverterMap.put(Pair.of(BOOLEAN_TYPE, BIG_INTEGER_CLASS), 
bigIntegerToBool);
         standardConverterMap.put(Pair.of(BOOLEAN_TYPE, LONG_CLASS), 
numberToBool);
         standardConverterMap.put(Pair.of(BOOLEAN_TYPE, FLOAT_CLASS), 
numberToBool);
         standardConverterMap.put(Pair.of(BOOLEAN_TYPE, DOUBLE_CLASS), 
numberToBool);
+        standardConverterMap.put(Pair.of(BOOLEAN_TYPE, BIG_DECIMAL_CLASS), 
bigDecimalToBool);
         standardConverterMap.put(Pair.of(BOOLEAN_TYPE, NUMBER_CLASS), 
numberToBool);
         standardConverterMap.put(Pair.of(BOOLEAN_TYPE, BYTE_TYPE), 
numberToBool);
         standardConverterMap.put(Pair.of(BOOLEAN_TYPE, SHORT_TYPE), 
numberToBool);
@@ -143,51 +148,47 @@ public class TypeConversionHandlerImpl i
         standardConverterMap.put(Pair.of(BOOLEAN_TYPE, DOUBLE_TYPE), 
numberToBool);
 
         /* character -> boolean */
-        Converter<Boolean> charToBoolean = new Converter<Boolean>()
-        {
-            @Override
-            public Boolean convert(Object o)
-            {
-                return o == null ? null : (Character) o != 0;
-            }
-        };
+
+        Converter<Boolean> charToBoolean = o -> 
Optional.ofNullable((Character)o).map(c -> c != 0).orElse(null);
+
         standardConverterMap.put(Pair.of(BOOLEAN_CLASS, CHARACTER_CLASS), 
charToBoolean);
         standardConverterMap.put(Pair.of(BOOLEAN_CLASS, CHARACTER_TYPE), 
charToBoolean);
         standardConverterMap.put(Pair.of(BOOLEAN_TYPE, CHARACTER_CLASS), 
charToBoolean);
         standardConverterMap.put(Pair.of(BOOLEAN_TYPE, CHARACTER_TYPE), 
charToBoolean);
 
         /* string -> boolean */
-        Converter<Boolean> stringToBoolean = new Converter<Boolean>()
-        {
-            @Override
-            public Boolean convert(Object o)
-            {
-                return Boolean.valueOf(String.valueOf(o));
-            }
-        };
+
+        Converter<Boolean> stringToBoolean = o -> 
Boolean.valueOf(String.valueOf(o));
+
         standardConverterMap.put(Pair.of(BOOLEAN_CLASS, STRING_CLASS), 
stringToBoolean);
         standardConverterMap.put(Pair.of(BOOLEAN_TYPE, STRING_CLASS), 
stringToBoolean);
 
+        /*
+         * Conversions towards byte
+         */
+
         /* narrowing towards byte */
-        Converter<Byte> narrowingToByte = new Converter<Byte>()
-        {
-            @Override
-            public Byte convert(Object o)
-            {
-                if (o == null) return null;
-                long l = ((Number)o).longValue();
-                if (l < minByte || l > maxByte)
-                {
-                    throw new NumberFormatException("value out of range for 
byte type: " + l);
-                }
-                return ((Number) o).byteValue();
-            }
-        };
+
+        Converter<Byte> narrowingToByte = o -> Optional.ofNullable((Number)o)
+            .filter(n -> checkBounds(n, Byte.MIN_VALUE, Byte.MAX_VALUE))
+            .map(Number::byteValue)
+            .orElse(null);
+
+        Converter<Byte> narrowingBigIntegerToByte = o -> 
Optional.ofNullable((BigInteger)o)
+            .map(BigInteger::byteValueExact)
+            .orElse(null);
+
+        Converter<Byte> narrowingBigDecimalToByte = o -> 
Optional.ofNullable((BigDecimal)o)
+            .map(BigDecimal::byteValueExact)
+            .orElse(null);
+
         standardConverterMap.put(Pair.of(BYTE_CLASS, SHORT_CLASS), 
narrowingToByte);
         standardConverterMap.put(Pair.of(BYTE_CLASS, INTEGER_CLASS), 
narrowingToByte);
         standardConverterMap.put(Pair.of(BYTE_CLASS, LONG_CLASS), 
narrowingToByte);
+        standardConverterMap.put(Pair.of(BYTE_CLASS, BIG_INTEGER_CLASS), 
narrowingBigIntegerToByte);
         standardConverterMap.put(Pair.of(BYTE_CLASS, FLOAT_CLASS), 
narrowingToByte);
         standardConverterMap.put(Pair.of(BYTE_CLASS, DOUBLE_CLASS), 
narrowingToByte);
+        standardConverterMap.put(Pair.of(BYTE_CLASS, BIG_DECIMAL_CLASS), 
narrowingBigDecimalToByte);
         standardConverterMap.put(Pair.of(BYTE_CLASS, NUMBER_CLASS), 
narrowingToByte);
         standardConverterMap.put(Pair.of(BYTE_CLASS, SHORT_TYPE), 
narrowingToByte);
         standardConverterMap.put(Pair.of(BYTE_CLASS, INTEGER_TYPE), 
narrowingToByte);
@@ -197,8 +198,10 @@ public class TypeConversionHandlerImpl i
         standardConverterMap.put(Pair.of(BYTE_TYPE, SHORT_CLASS), 
narrowingToByte);
         standardConverterMap.put(Pair.of(BYTE_TYPE, INTEGER_CLASS), 
narrowingToByte);
         standardConverterMap.put(Pair.of(BYTE_TYPE, LONG_CLASS), 
narrowingToByte);
+        standardConverterMap.put(Pair.of(BYTE_TYPE, BIG_INTEGER_CLASS), 
narrowingBigIntegerToByte);
         standardConverterMap.put(Pair.of(BYTE_TYPE, FLOAT_CLASS), 
narrowingToByte);
         standardConverterMap.put(Pair.of(BYTE_TYPE, DOUBLE_CLASS), 
narrowingToByte);
+        standardConverterMap.put(Pair.of(BYTE_TYPE, BIG_DECIMAL_CLASS), 
narrowingBigDecimalToByte);
         standardConverterMap.put(Pair.of(BYTE_TYPE, NUMBER_CLASS), 
narrowingToByte);
         standardConverterMap.put(Pair.of(BYTE_TYPE, SHORT_TYPE), 
narrowingToByte);
         standardConverterMap.put(Pair.of(BYTE_TYPE, INTEGER_TYPE), 
narrowingToByte);
@@ -207,36 +210,37 @@ public class TypeConversionHandlerImpl i
         standardConverterMap.put(Pair.of(BYTE_TYPE, DOUBLE_TYPE), 
narrowingToByte);
 
         /* string to byte */
-        Converter<Byte> stringToByte = new Converter<Byte>()
-        {
-            @Override
-            public Byte convert(Object o)
-            {
-                return Byte.valueOf(String.valueOf(o));
-            }
-        };
+
+        Converter<Byte> stringToByte = o -> Byte.valueOf(String.valueOf(o));
+
         standardConverterMap.put(Pair.of(BYTE_CLASS, STRING_CLASS), 
stringToByte);
         standardConverterMap.put(Pair.of(BYTE_TYPE, STRING_CLASS), 
stringToByte);
 
+        /*
+         * Conversions towards short
+         */
+
         /* narrowing towards short */
-        Converter<Short> narrowingToShort = new Converter<Short>()
-        {
-            @Override
-            public Short convert(Object o)
-            {
-                if (o == null) return null;
-                long l = ((Number)o).longValue();
-                if (l < minShort || l > maxShort)
-                {
-                    throw new NumberFormatException("value out of range for 
short type: " + l);
-                }
-                return ((Number) o).shortValue();
-            }
-        };
+
+        Converter<Short> narrowingToShort = o -> Optional.ofNullable((Number)o)
+            .filter(n -> checkBounds(n, Short.MIN_VALUE, Short.MAX_VALUE))
+            .map(Number::shortValue)
+            .orElse(null);
+
+        Converter<Short> narrowingBigIntegerToShort = o -> 
Optional.ofNullable((BigInteger)o)
+            .map(BigInteger::shortValueExact)
+            .orElse(null);
+
+        Converter<Short> narrowingBigDecimalToShort = o -> 
Optional.ofNullable((BigDecimal)o)
+            .map(BigDecimal::shortValueExact)
+            .orElse(null);
+
         standardConverterMap.put(Pair.of(SHORT_CLASS, INTEGER_CLASS), 
narrowingToShort);
         standardConverterMap.put(Pair.of(SHORT_CLASS, LONG_CLASS), 
narrowingToShort);
+        standardConverterMap.put(Pair.of(SHORT_CLASS, BIG_INTEGER_CLASS), 
narrowingBigIntegerToShort);
         standardConverterMap.put(Pair.of(SHORT_CLASS, FLOAT_CLASS), 
narrowingToShort);
         standardConverterMap.put(Pair.of(SHORT_CLASS, DOUBLE_CLASS), 
narrowingToShort);
+        standardConverterMap.put(Pair.of(SHORT_CLASS, BIG_DECIMAL_CLASS), 
narrowingBigDecimalToShort);
         standardConverterMap.put(Pair.of(SHORT_CLASS, NUMBER_CLASS), 
narrowingToShort);
         standardConverterMap.put(Pair.of(SHORT_CLASS, INTEGER_TYPE), 
narrowingToShort);
         standardConverterMap.put(Pair.of(SHORT_CLASS, LONG_TYPE), 
narrowingToShort);
@@ -244,194 +248,244 @@ public class TypeConversionHandlerImpl i
         standardConverterMap.put(Pair.of(SHORT_CLASS, DOUBLE_TYPE), 
narrowingToShort);
         standardConverterMap.put(Pair.of(SHORT_TYPE, INTEGER_CLASS), 
narrowingToShort);
         standardConverterMap.put(Pair.of(SHORT_TYPE, LONG_CLASS), 
narrowingToShort);
+        standardConverterMap.put(Pair.of(SHORT_TYPE, BIG_INTEGER_CLASS), 
narrowingBigIntegerToShort);
         standardConverterMap.put(Pair.of(SHORT_TYPE, FLOAT_CLASS), 
narrowingToShort);
         standardConverterMap.put(Pair.of(SHORT_TYPE, DOUBLE_CLASS), 
narrowingToShort);
+        standardConverterMap.put(Pair.of(SHORT_TYPE, BIG_DECIMAL_CLASS), 
narrowingBigDecimalToShort);
         standardConverterMap.put(Pair.of(SHORT_TYPE, NUMBER_CLASS), 
narrowingToShort);
         standardConverterMap.put(Pair.of(SHORT_TYPE, INTEGER_TYPE), 
narrowingToShort);
         standardConverterMap.put(Pair.of(SHORT_TYPE, LONG_TYPE), 
narrowingToShort);
         standardConverterMap.put(Pair.of(SHORT_TYPE, FLOAT_TYPE), 
narrowingToShort);
         standardConverterMap.put(Pair.of(SHORT_TYPE, DOUBLE_TYPE), 
narrowingToShort);
 
+        /* widening towards short */
+
+        Converter<Short> wideningToShort = o -> Optional.ofNullable((Number)o)
+            .map(Number::shortValue)
+            .orElse(null);
+
+        standardConverterMap.put(Pair.of(SHORT_CLASS, BYTE_CLASS), 
wideningToShort);
+        standardConverterMap.put(Pair.of(SHORT_CLASS, BYTE_TYPE), 
wideningToShort);
+
         /* string to short */
-        Converter<Short> stringToShort = new Converter<Short>()
-        {
-            @Override
-            public Short convert(Object o)
-            {
-                return Short.valueOf(String.valueOf(o));
-            }
-        };
+
+        Converter<Short> stringToShort = o -> Short.valueOf(String.valueOf(o));
+
         standardConverterMap.put(Pair.of(SHORT_CLASS, STRING_CLASS), 
stringToShort);
         standardConverterMap.put(Pair.of(SHORT_TYPE, STRING_CLASS), 
stringToShort);
 
+        /*
+         * Conversions towards int
+         */
+
         /* narrowing towards int */
-        Converter<Integer> narrowingToInteger = new Converter<Integer>()
-        {
-            @Override
-            public Integer convert(Object o)
-            {
-                if (o == null) return null;
-                long l = ((Number)o).longValue();
-                if (l < minInt || l > maxInt)
-                {
-                    throw new NumberFormatException("value out of range for 
integer type: " + l);
-                }
-                return ((Number) o).intValue();
-            }
-        };
+
+        Converter<Integer> narrowingToInteger = o -> 
Optional.ofNullable((Number)o)
+            .filter(n -> checkBounds(n, Integer.MIN_VALUE, Integer.MAX_VALUE))
+            .map(Number::intValue)
+            .orElse(null);
+
+        Converter<Integer> narrowingBigIntegerToInteger = o -> 
Optional.ofNullable((BigInteger)o)
+            .map(BigInteger::intValueExact)
+            .orElse(null);
+
+        Converter<Integer> narrowingBigDecimalToInteger = o -> 
Optional.ofNullable((BigDecimal)o)
+            .map(BigDecimal::intValueExact)
+            .orElse(null);
+
         standardConverterMap.put(Pair.of(INTEGER_CLASS, LONG_CLASS), 
narrowingToInteger);
+        standardConverterMap.put(Pair.of(INTEGER_CLASS, BIG_INTEGER_CLASS), 
narrowingBigIntegerToInteger);
         standardConverterMap.put(Pair.of(INTEGER_CLASS, FLOAT_CLASS), 
narrowingToInteger);
         standardConverterMap.put(Pair.of(INTEGER_CLASS, DOUBLE_CLASS), 
narrowingToInteger);
+        standardConverterMap.put(Pair.of(INTEGER_CLASS, BIG_DECIMAL_CLASS), 
narrowingBigDecimalToInteger);
         standardConverterMap.put(Pair.of(INTEGER_CLASS, NUMBER_CLASS), 
narrowingToInteger);
         standardConverterMap.put(Pair.of(INTEGER_CLASS, LONG_TYPE), 
narrowingToInteger);
         standardConverterMap.put(Pair.of(INTEGER_CLASS, FLOAT_TYPE), 
narrowingToInteger);
         standardConverterMap.put(Pair.of(INTEGER_CLASS, DOUBLE_TYPE), 
narrowingToInteger);
         standardConverterMap.put(Pair.of(INTEGER_TYPE, LONG_CLASS), 
narrowingToInteger);
+        standardConverterMap.put(Pair.of(INTEGER_TYPE, BIG_INTEGER_CLASS), 
narrowingBigIntegerToInteger);
         standardConverterMap.put(Pair.of(INTEGER_TYPE, FLOAT_CLASS), 
narrowingToInteger);
         standardConverterMap.put(Pair.of(INTEGER_TYPE, DOUBLE_CLASS), 
narrowingToInteger);
+        standardConverterMap.put(Pair.of(INTEGER_TYPE, BIG_DECIMAL_CLASS), 
narrowingBigDecimalToInteger);
         standardConverterMap.put(Pair.of(INTEGER_TYPE, NUMBER_CLASS), 
narrowingToInteger);
         standardConverterMap.put(Pair.of(INTEGER_TYPE, LONG_TYPE), 
narrowingToInteger);
         standardConverterMap.put(Pair.of(INTEGER_TYPE, FLOAT_TYPE), 
narrowingToInteger);
         standardConverterMap.put(Pair.of(INTEGER_TYPE, DOUBLE_TYPE), 
narrowingToInteger);
 
-        /* widening towards Integer */
-        Converter<Integer> wideningToInteger = new Converter<Integer>()
-        {
-            @Override
-            public Integer convert(Object o)
-            {
-                if (o == null) return null;
-                return ((Number) o).intValue();
-            }
-        };
+        /* widening towards int */
+
+        Converter<Integer> wideningToInteger = o -> 
Optional.ofNullable((Number)o)
+            .map(Number::intValue)
+            .orElse(null);
+
+        standardConverterMap.put(Pair.of(INTEGER_CLASS, BYTE_CLASS), 
wideningToInteger);
         standardConverterMap.put(Pair.of(INTEGER_CLASS, SHORT_CLASS), 
wideningToInteger);
+        standardConverterMap.put(Pair.of(INTEGER_CLASS, BYTE_TYPE), 
wideningToInteger);
         standardConverterMap.put(Pair.of(INTEGER_CLASS, SHORT_TYPE), 
wideningToInteger);
 
         /* string to int */
-        Converter<Integer> stringToInteger = new Converter<Integer>()
-        {
-            @Override
-            public Integer convert(Object o)
-            {
-                return Integer.valueOf(String.valueOf(o));
-            }
-        };
+
+        Converter<Integer> stringToInteger = o -> 
Integer.valueOf(String.valueOf(o));
+
         standardConverterMap.put(Pair.of(INTEGER_CLASS, STRING_CLASS), 
stringToInteger);
         standardConverterMap.put(Pair.of(INTEGER_TYPE, STRING_CLASS), 
stringToInteger);
 
+        /*
+         * Conversions towards long
+         */
+
         /* narrowing towards long */
-        Converter<Long> narrowingToLong = new Converter<Long>()
-        {
-            @Override
-            public Long convert(Object o)
-            {
-                if (o == null) return null;
-                double d = ((Number)o).doubleValue();
-                if (d < minLong || d > maxLong)
-                {
-                    throw new NumberFormatException("value out of range for 
long type: " + d);
-                }
-                return ((Number) o).longValue();
-            }
-        };
+
+        Converter<Long> narrowingToLong = o -> Optional.ofNullable((Number)o)
+            .filter(n -> checkBounds(n, Long.MIN_VALUE, Long.MAX_VALUE))
+            .map(Number::longValue)
+            .orElse(null);
+
+        Converter<Long> narrowingBigIntegerToLong = o -> 
Optional.ofNullable((BigInteger)o)
+            .map(BigInteger::longValueExact)
+            .orElse(null);
+
+        Converter<Long> narrowingBigDecimalToLong = o -> 
Optional.ofNullable((BigDecimal)o)
+            .map(BigDecimal::longValueExact)
+            .orElse(null);
+
+        standardConverterMap.put(Pair.of(LONG_CLASS, BIG_INTEGER_CLASS), 
narrowingBigIntegerToLong);
         standardConverterMap.put(Pair.of(LONG_CLASS, FLOAT_CLASS), 
narrowingToLong);
         standardConverterMap.put(Pair.of(LONG_CLASS, DOUBLE_CLASS), 
narrowingToLong);
+        standardConverterMap.put(Pair.of(LONG_CLASS, BIG_DECIMAL_CLASS), 
narrowingBigDecimalToLong);
         standardConverterMap.put(Pair.of(LONG_CLASS, NUMBER_CLASS), 
narrowingToLong);
         standardConverterMap.put(Pair.of(LONG_CLASS, FLOAT_TYPE), 
narrowingToLong);
         standardConverterMap.put(Pair.of(LONG_CLASS, DOUBLE_TYPE), 
narrowingToLong);
+        standardConverterMap.put(Pair.of(LONG_TYPE, BIG_INTEGER_CLASS), 
narrowingBigIntegerToLong);
         standardConverterMap.put(Pair.of(LONG_TYPE, FLOAT_CLASS), 
narrowingToLong);
         standardConverterMap.put(Pair.of(LONG_TYPE, DOUBLE_CLASS), 
narrowingToLong);
+        standardConverterMap.put(Pair.of(LONG_TYPE, BIG_DECIMAL_CLASS), 
narrowingBigDecimalToLong);
         standardConverterMap.put(Pair.of(LONG_TYPE, NUMBER_CLASS), 
narrowingToLong);
         standardConverterMap.put(Pair.of(LONG_TYPE, FLOAT_TYPE), 
narrowingToLong);
         standardConverterMap.put(Pair.of(LONG_TYPE, DOUBLE_TYPE), 
narrowingToLong);
 
-        /* widening towards Long */
-        Converter<Long> wideningToLong = new Converter<Long>()
-        {
-            @Override
-            public Long convert(Object o)
-            {
-                if (o == null) return null;
-                return ((Number) o).longValue();
-            }
-        };
+        /* widening towards long */
+
+        Converter<Long> wideningToLong = o -> Optional.ofNullable((Number)o)
+            .map(Number::longValue)
+            .orElse(null);
+
+        standardConverterMap.put(Pair.of(LONG_CLASS, BYTE_CLASS), 
wideningToLong);
         standardConverterMap.put(Pair.of(LONG_CLASS, SHORT_CLASS), 
wideningToLong);
         standardConverterMap.put(Pair.of(LONG_CLASS, INTEGER_CLASS), 
wideningToLong);
+        standardConverterMap.put(Pair.of(LONG_CLASS, BYTE_TYPE), 
wideningToLong);
         standardConverterMap.put(Pair.of(LONG_CLASS, SHORT_TYPE), 
wideningToLong);
         standardConverterMap.put(Pair.of(LONG_CLASS, INTEGER_TYPE), 
wideningToLong);
 
         /* string to long */
-        Converter<Long> stringToLong = new Converter<Long>()
-        {
-            @Override
-            public Long convert(Object o)
-            {
-                return Long.valueOf(String.valueOf(o));
-            }
-        };
+
+        Converter<Long> stringToLong = o -> Long.valueOf(String.valueOf(o));
+
         standardConverterMap.put(Pair.of(LONG_CLASS, STRING_CLASS), 
stringToLong);
         standardConverterMap.put(Pair.of(LONG_TYPE, STRING_CLASS), 
stringToLong);
 
+        /*
+         * Conversions towards BigInteger
+         */
+
+        /* exact types towards BigInteger */
+
+        Converter<BigInteger> toBigInteger = o -> 
Optional.ofNullable((Number)o)
+            .map(n -> BigInteger.valueOf(n.longValue()))
+            .orElse(null);
+
+        standardConverterMap.put(Pair.of(BIG_INTEGER_CLASS, BYTE_CLASS), 
toBigInteger);
+        standardConverterMap.put(Pair.of(BIG_INTEGER_CLASS, SHORT_CLASS), 
toBigInteger);
+        standardConverterMap.put(Pair.of(BIG_INTEGER_CLASS, INTEGER_CLASS), 
toBigInteger);
+        standardConverterMap.put(Pair.of(BIG_INTEGER_CLASS, LONG_CLASS), 
toBigInteger);
+        standardConverterMap.put(Pair.of(BIG_INTEGER_CLASS, BYTE_TYPE), 
toBigInteger);
+        standardConverterMap.put(Pair.of(BIG_INTEGER_CLASS, SHORT_TYPE), 
toBigInteger);
+        standardConverterMap.put(Pair.of(BIG_INTEGER_CLASS, INTEGER_TYPE), 
toBigInteger);
+        standardConverterMap.put(Pair.of(BIG_INTEGER_CLASS, LONG_TYPE), 
toBigInteger);
+        
+        /* approximate types towards BigInteger */
+
+        /* It makes no sense trying to convert from float or double towards 
BigInteger
+           if we do care about precision loss..
+         */
+
+        Converter<BigInteger> bigDecimalToBigInteger = o -> 
Optional.ofNullable((BigDecimal)o)
+            .map(BigDecimal::toBigIntegerExact)
+            .orElse(null);
+
+        standardConverterMap.put(Pair.of(BIG_INTEGER_CLASS, 
BIG_DECIMAL_CLASS), bigDecimalToBigInteger);
+
+        /* string to BigInteger */
+
+        Converter<BigInteger> stringToBigInteger = o -> Optional.ofNullable(o)
+            .map(s -> new BigInteger(String.valueOf(s)))
+            .orElse(null);
+
+        standardConverterMap.put(Pair.of(BIG_INTEGER_CLASS, STRING_CLASS), 
stringToBigInteger);
+
+        /*
+         * Conversions towards float
+         */
+        
+        Converter<Float> toFloat = o -> Optional.ofNullable((Number)o)
+            .map(Number::floatValue)
+            .orElse(null);
+
         /* narrowing towards float */
-        Converter<Float> narrowingToFloat = new Converter<Float>()
-        {
-            @Override
-            public Float convert(Object o)
-            {
-                return o == null ? null : ((Number) o).floatValue();
-            }
-        };
-        standardConverterMap.put(Pair.of(FLOAT_CLASS, DOUBLE_CLASS), 
narrowingToFloat);
-        standardConverterMap.put(Pair.of(FLOAT_CLASS, NUMBER_CLASS), 
narrowingToFloat);
-        standardConverterMap.put(Pair.of(FLOAT_CLASS, DOUBLE_TYPE), 
narrowingToFloat);
-        standardConverterMap.put(Pair.of(FLOAT_TYPE, DOUBLE_CLASS), 
narrowingToFloat);
-        standardConverterMap.put(Pair.of(FLOAT_TYPE, NUMBER_CLASS), 
narrowingToFloat);
-        standardConverterMap.put(Pair.of(FLOAT_TYPE, DOUBLE_TYPE), 
narrowingToFloat);
 
-        /* exact towards Float */
-        Converter<Float> toFloat = new Converter<Float>()
-        {
-            @Override
-            public Float convert(Object o)
-            {
-                if (o == null) return null;
-                return ((Number) o).floatValue();
-            }
-        };
+        standardConverterMap.put(Pair.of(FLOAT_CLASS, BIG_INTEGER_CLASS), 
toFloat);
+        standardConverterMap.put(Pair.of(FLOAT_CLASS, DOUBLE_CLASS), toFloat);
+        standardConverterMap.put(Pair.of(FLOAT_CLASS, BIG_DECIMAL_CLASS), 
toFloat);
+        standardConverterMap.put(Pair.of(FLOAT_CLASS, NUMBER_CLASS), toFloat);
+        standardConverterMap.put(Pair.of(FLOAT_CLASS, DOUBLE_TYPE), toFloat);
+        standardConverterMap.put(Pair.of(FLOAT_TYPE, BIG_INTEGER_CLASS), 
toFloat);
+        standardConverterMap.put(Pair.of(FLOAT_TYPE, DOUBLE_CLASS), toFloat);
+        standardConverterMap.put(Pair.of(FLOAT_TYPE, BIG_DECIMAL_CLASS), 
toFloat);
+        standardConverterMap.put(Pair.of(FLOAT_TYPE, NUMBER_CLASS), toFloat);
+        standardConverterMap.put(Pair.of(FLOAT_TYPE, DOUBLE_TYPE), toFloat);
+
+        /* exact types towards float */
+
+        standardConverterMap.put(Pair.of(FLOAT_CLASS, BYTE_CLASS), toFloat);
         standardConverterMap.put(Pair.of(FLOAT_CLASS, SHORT_CLASS), toFloat);
         standardConverterMap.put(Pair.of(FLOAT_CLASS, INTEGER_CLASS), toFloat);
         standardConverterMap.put(Pair.of(FLOAT_CLASS, LONG_CLASS), toFloat);
+        standardConverterMap.put(Pair.of(FLOAT_CLASS, BYTE_TYPE), toFloat);
         standardConverterMap.put(Pair.of(FLOAT_CLASS, SHORT_TYPE), toFloat);
         standardConverterMap.put(Pair.of(FLOAT_CLASS, INTEGER_TYPE), toFloat);
         standardConverterMap.put(Pair.of(FLOAT_CLASS, LONG_TYPE), toFloat);
 
         /* string to float */
-        Converter<Float> stringToFloat = new Converter<Float>()
-        {
-            @Override
-            public Float convert(Object o)
-            {
-                return Float.valueOf(String.valueOf(o));
-            }
-        };
+
+        Converter<Float> stringToFloat = o -> Float.valueOf(String.valueOf(o));
+
         standardConverterMap.put(Pair.of(FLOAT_CLASS, STRING_CLASS), 
stringToFloat);
         standardConverterMap.put(Pair.of(FLOAT_TYPE, STRING_CLASS), 
stringToFloat);
 
-        /* exact or widening towards Double */
-        Converter<Double> toDouble = new Converter<Double>()
-        {
-            @Override
-            public Double convert(Object o)
-            {
-                if (o == null) return null;
-                return ((Number) o).doubleValue();
-            }
-        };
+        /*
+         * Conversions towards double
+         */
+
+        Converter<Double> toDouble = o -> Optional.ofNullable((Number)o)
+            .map(Number::doubleValue)
+            .orElse(null);
+
+        /* narrowing towards double */
+
+        standardConverterMap.put(Pair.of(DOUBLE_CLASS, BIG_INTEGER_CLASS), 
toDouble);
+        standardConverterMap.put(Pair.of(DOUBLE_CLASS, BIG_DECIMAL_CLASS), 
toDouble);
+        standardConverterMap.put(Pair.of(DOUBLE_TYPE, BIG_INTEGER_CLASS), 
toDouble);
+        standardConverterMap.put(Pair.of(DOUBLE_TYPE, BIG_DECIMAL_CLASS), 
toDouble);
+        
+        /* exact types or widening towards double */
+
+        standardConverterMap.put(Pair.of(DOUBLE_CLASS, BYTE_CLASS), toDouble);
         standardConverterMap.put(Pair.of(DOUBLE_CLASS, SHORT_CLASS), toDouble);
         standardConverterMap.put(Pair.of(DOUBLE_CLASS, INTEGER_CLASS), 
toDouble);
         standardConverterMap.put(Pair.of(DOUBLE_CLASS, LONG_CLASS), toDouble);
         standardConverterMap.put(Pair.of(DOUBLE_CLASS, FLOAT_CLASS), toDouble);
         standardConverterMap.put(Pair.of(DOUBLE_CLASS, NUMBER_CLASS), 
toDouble);
+        standardConverterMap.put(Pair.of(DOUBLE_CLASS, BYTE_TYPE), toDouble);
         standardConverterMap.put(Pair.of(DOUBLE_CLASS, SHORT_TYPE), toDouble);
         standardConverterMap.put(Pair.of(DOUBLE_CLASS, INTEGER_TYPE), 
toDouble);
         standardConverterMap.put(Pair.of(DOUBLE_CLASS, LONG_TYPE), toDouble);
@@ -439,92 +493,112 @@ public class TypeConversionHandlerImpl i
         standardConverterMap.put(Pair.of(DOUBLE_TYPE, NUMBER_CLASS), toDouble);
 
         /* string to double */
-        Converter<Double> stringToDouble = new Converter<Double>()
-        {
-            @Override
-            public Double convert(Object o)
-            {
-                return Double.valueOf(String.valueOf(o));
-            }
-        };
+
+        Converter<Double> stringToDouble = o -> 
Double.valueOf(String.valueOf(o));
+
         standardConverterMap.put(Pair.of(DOUBLE_CLASS, STRING_CLASS), 
stringToDouble);
         standardConverterMap.put(Pair.of(DOUBLE_TYPE, STRING_CLASS), 
stringToDouble);
 
+        /*
+         * Conversions towards BigDecimal
+         */
+
+        /* exact types towards BigDecimal */
+
+        Converter<BigDecimal> exactToBigDecimal = o -> 
Optional.ofNullable((Number)o)
+            .map(n -> BigDecimal.valueOf(n.longValue()))
+            .orElse(null);
+
+        Converter<BigDecimal> bigIntegerToBigDecimal = o -> 
Optional.ofNullable((BigInteger)o)
+            .map(bi -> new BigDecimal(bi))
+            .orElse(null);
+
+        standardConverterMap.put(Pair.of(BIG_DECIMAL_CLASS, BYTE_CLASS), 
exactToBigDecimal);
+        standardConverterMap.put(Pair.of(BIG_DECIMAL_CLASS, SHORT_CLASS), 
exactToBigDecimal);
+        standardConverterMap.put(Pair.of(BIG_DECIMAL_CLASS, INTEGER_CLASS), 
exactToBigDecimal);
+        standardConverterMap.put(Pair.of(BIG_DECIMAL_CLASS, LONG_CLASS), 
exactToBigDecimal);
+        standardConverterMap.put(Pair.of(BIG_DECIMAL_CLASS, 
BIG_INTEGER_CLASS), bigIntegerToBigDecimal);
+        standardConverterMap.put(Pair.of(BIG_DECIMAL_CLASS, BYTE_TYPE), 
exactToBigDecimal);
+        standardConverterMap.put(Pair.of(BIG_DECIMAL_CLASS, SHORT_TYPE), 
exactToBigDecimal);
+        standardConverterMap.put(Pair.of(BIG_DECIMAL_CLASS, INTEGER_TYPE), 
exactToBigDecimal);
+        standardConverterMap.put(Pair.of(BIG_DECIMAL_CLASS, LONG_TYPE), 
exactToBigDecimal);
+
+        /* approximate types towards BigDecimal */
+
+        Converter<BigDecimal> approxToBigDecimal = o -> 
Optional.ofNullable((Number)o)
+            .map(n -> BigDecimal.valueOf(n.doubleValue()))
+            .orElse(null);
+
+        standardConverterMap.put(Pair.of(BIG_DECIMAL_CLASS, FLOAT_CLASS), 
approxToBigDecimal);
+        standardConverterMap.put(Pair.of(BIG_DECIMAL_CLASS, DOUBLE_CLASS), 
approxToBigDecimal);
+        standardConverterMap.put(Pair.of(BIG_DECIMAL_CLASS, FLOAT_TYPE), 
approxToBigDecimal);
+        standardConverterMap.put(Pair.of(BIG_DECIMAL_CLASS, DOUBLE_TYPE), 
approxToBigDecimal);
+
+        /* string to BigDecimal */
+
+        Converter<BigDecimal> stringToBigDecimal = o -> Optional.ofNullable(o)
+            .map(s -> new BigDecimal(String.valueOf(s)))
+            .orElse(null);
+
+        standardConverterMap.put(Pair.of(BIG_DECIMAL_CLASS, STRING_CLASS), 
stringToBigDecimal);
+
+        /*
+         * Conversions from boolean to numeric type
+         */
+
         /* boolean to byte */
-        Converter<Byte> booleanToByte = new Converter<Byte>()
-        {
-            @Override
-            public Byte convert(Object o)
-            {
-                return o == null ? null : (Boolean) o ? (byte)1 : (byte)0;
-            }
-        };
+
+        Converter<Byte> booleanToByte = o -> Optional.ofNullable((Boolean)o)
+            .map(b -> b ? (byte)1 : (byte)0)
+            .orElse(null);
+
         standardConverterMap.put(Pair.of(BYTE_CLASS, BOOLEAN_CLASS), 
booleanToByte);
         standardConverterMap.put(Pair.of(BYTE_CLASS, BOOLEAN_TYPE), 
booleanToByte);
         standardConverterMap.put(Pair.of(BYTE_TYPE, BOOLEAN_CLASS), 
booleanToByte);
         standardConverterMap.put(Pair.of(BYTE_TYPE, BOOLEAN_TYPE), 
booleanToByte);
 
         /* boolean to short */
-        Converter<Short> booleanToShort = new Converter<Short>()
-        {
-            @Override
-            public Short convert(Object o)
-            {
-                return o == null ? null : (Boolean) o ? (short)1 : (short)0;
-            }
-        };
+
+        Converter<Short> booleanToShort = o -> Optional.ofNullable((Boolean)o)
+            .map(b -> b ? (short)1 : (short)0)
+            .orElse(null);
+
         standardConverterMap.put(Pair.of(SHORT_CLASS, BOOLEAN_CLASS), 
booleanToShort);
         standardConverterMap.put(Pair.of(SHORT_CLASS, BOOLEAN_TYPE), 
booleanToShort);
         standardConverterMap.put(Pair.of(SHORT_TYPE, BOOLEAN_CLASS), 
booleanToShort);
         standardConverterMap.put(Pair.of(SHORT_TYPE, BOOLEAN_TYPE), 
booleanToShort);
 
         /* boolean to integer */
-        Converter<Integer> booleanToInteger = new Converter<Integer>()
-        {
-            @Override
-            public Integer convert(Object o)
-            {
-                return o == null ? null : (Boolean) o ? (Integer)1 : 
(Integer)0;
-            }
-        };
+
+        Converter<Integer> booleanToInteger = o -> 
Optional.ofNullable((Boolean)o)
+            .map(b -> b ? (int)1 : (int)0)
+            .orElse(null);
+
         standardConverterMap.put(Pair.of(INTEGER_CLASS, BOOLEAN_CLASS), 
booleanToInteger);
         standardConverterMap.put(Pair.of(INTEGER_CLASS, BOOLEAN_TYPE), 
booleanToInteger);
         standardConverterMap.put(Pair.of(INTEGER_TYPE, BOOLEAN_CLASS), 
booleanToInteger);
         standardConverterMap.put(Pair.of(INTEGER_TYPE, BOOLEAN_TYPE), 
booleanToInteger);
 
-        /* boolean to lonf */
-        Converter<Long> booleanToLong = new Converter<Long>()
-        {
-            @Override
-            public Long convert(Object o)
-            {
-                return o == null ? null : (Boolean) o ? 1L : 0L;
-            }
-        };
+        /* boolean to long */
+
+        Converter<Long> booleanToLong = o -> Optional.ofNullable((Boolean)o)
+            .map(b -> b ? 1l : 0l)
+            .orElse(null);
+
         standardConverterMap.put(Pair.of(LONG_CLASS, BOOLEAN_CLASS), 
booleanToLong);
         standardConverterMap.put(Pair.of(LONG_CLASS, BOOLEAN_TYPE), 
booleanToLong);
         standardConverterMap.put(Pair.of(LONG_TYPE, BOOLEAN_CLASS), 
booleanToLong);
         standardConverterMap.put(Pair.of(LONG_TYPE, BOOLEAN_TYPE), 
booleanToLong);
 
         /* to string */
-        toString = new Converter<String>()
-        {
-            @Override
-            public String convert(Object o)
-            {
-                return String.valueOf(o);
-            }
-        };
+
+        toString = o -> String.valueOf(o);
 
         /* string to locale */
-        Converter<Locale> stringToLocale = new Converter<Locale>()
-        {
-            @Override
-            public Locale convert(Object o)
-            {
-                return o == null ? null : LocaleUtils.toLocale((String)o);
-            }
-        };
+        Converter<Locale> stringToLocale = o -> Optional.ofNullable(o)
+            .map(l -> LocaleUtils.toLocale(String.valueOf(l)))
+            .orElse(null);
+
         standardConverterMap.put(Pair.of(LOCALE_CLASS, STRING_CLASS), 
stringToLocale);
     }
 
@@ -607,14 +681,7 @@ public class TypeConversionHandlerImpl i
                 else if (formalClass != null && formalClass.isEnum() && actual 
== String.class)
                 {
                     final Class<Enum> enumClass = (Class<Enum>)formalClass;
-                    converter = new Converter()
-                    {
-                        @Override
-                        public Object convert(Object o)
-                        {
-                            return Enum.valueOf(enumClass, (String) o);
-                        }
-                    };
+                    converter = o -> Enum.valueOf(enumClass, (String)o);
                 }
 
                 converterCacheMap.put(key, converter == null ? cacheMiss : 
converter);

Modified: 
velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/UberspectImpl.java
URL: 
http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/UberspectImpl.java?rev=1870761&r1=1870760&r2=1870761&view=diff
==============================================================================
--- 
velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/UberspectImpl.java
 (original)
+++ 
velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/UberspectImpl.java
 Tue Dec  3 16:57:12 2019
@@ -526,13 +526,22 @@ public class UberspectImpl implements Ub
 
             if (converters != null)
             {
-                for (int i = 0; i < actual.length; ++i)
+                // some converters may throw an ArithmeticException
+                // which we want to wrap into an IllegalArgumentException
+                try
                 {
-                    if (converters[i] != null)
+                    for (int i = 0; i < actual.length; ++i)
                     {
-                        actual[i] = converters[i].convert(actual[i]);
+                        if (converters[i] != null)
+                        {
+                            actual[i] = converters[i].convert(actual[i]);
+                        }
                     }
                 }
+                catch (ArithmeticException ae)
+                {
+                    throw new IllegalArgumentException(ae);
+                }
             }
 
             // call extension point invocation

Modified: 
velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/util/introspection/ConversionHandlerTestCase.java
URL: 
http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/util/introspection/ConversionHandlerTestCase.java?rev=1870761&r1=1870760&r2=1870761&view=diff
==============================================================================
--- 
velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/util/introspection/ConversionHandlerTestCase.java
 (original)
+++ 
velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/util/introspection/ConversionHandlerTestCase.java
 Tue Dec  3 16:57:12 2019
@@ -45,6 +45,8 @@ import java.io.OutputStreamWriter;
 import java.io.StringWriter;
 import java.io.Writer;
 import java.lang.reflect.Type;
+import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Locale;
@@ -331,6 +333,14 @@ public class ConversionHandlerTestCase e
         map.put("T. string-floating", new String("123.345"));
         map.put("U. null", null);
         map.put("V. locale", "fr_FR");
+        map.put("W. BigInteger zero", BigInteger.ZERO);
+        map.put("X. BigInteger one", BigInteger.ONE);
+        map.put("Y. BigInteger ten", BigInteger.TEN);
+        map.put("Y. BigInteger bigint", new 
BigInteger("12345678901234567890"));
+        map.put("Z. BigDecimal zero", BigDecimal.ZERO);
+        map.put("ZA. BigDecimal one", BigDecimal.ONE);
+        map.put("ZB. BigDecimal ten", BigDecimal.TEN);
+        map.put("ZC. BigDecimal bigdec", new 
BigDecimal("12345678901234567890.01234567890123456789"));
         context.put("map", map);
         context.put("target", new Obj());
         Class[] types =
@@ -349,8 +359,10 @@ public class ConversionHandlerTestCase e
                         Short.class,
                         Integer.class,
                         Long.class,
+                        BigInteger.class,
                         Float.class,
                         Double.class,
+                        BigDecimal.class,
                         Number.class,
                         String.class,
                         Object.class
@@ -378,8 +390,10 @@ public class ConversionHandlerTestCase e
         public String objectShort(Short s) { return "Short ok: " + s; }
         public String objectInt(Integer i) { return "Integer ok: " + i; }
         public String objectLong(Long l) { return "Long ok: " + l; }
+        public String objectBigInteger(BigInteger bi) { return "BigInteger ok: 
" + bi; }
         public String objectFloat(Float f) { return "Float ok: " + f; }
         public String objectDouble(Double d) { return "Double ok: " + d; }
+        public String objectBigDecimal(BigDecimal bd) { return "BigDecimal ok: 
" + bd; }
         public String objectCharacter(Character c) { return "Character ok: " + 
c; }
         public String objectNumber(Number b) { return "Number ok: " + b; }
         public String objectObject(Object o) { return "Object ok: " + o; }

Modified: 
velocity/engine/trunk/velocity-engine-core/src/test/resources/conversion/compare/matrix.cmp
URL: 
http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/test/resources/conversion/compare/matrix.cmp?rev=1870761&r1=1870760&r2=1870761&view=diff
==============================================================================
--- 
velocity/engine/trunk/velocity-engine-core/src/test/resources/conversion/compare/matrix.cmp
 (original)
+++ 
velocity/engine/trunk/velocity-engine-core/src/test/resources/conversion/compare/matrix.cmp
 Tue Dec  3 16:57:12 2019
@@ -1,3 +1,5 @@
+<!doctype html>
+
 
 
 
@@ -54,8 +56,10 @@
           <th>Short</th>
           <th>Integer</th>
           <th>Long</th>
+          <th>BigInteger</th>
           <th>Float</th>
           <th>Double</th>
+          <th>BigDecimal</th>
           <th>Number</th>
           <th>String</th>
           <th>Object</th>
@@ -81,6 +85,8 @@
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
           <td><span class="none">none</span></td>
           <td><span class="none">none</span></td>
         </tr>
@@ -106,6 +112,8 @@
           <td><span class="none">none</span></td>
           <td><span class="none">none</span></td>
           <td><span class="none">none</span></td>
+          <td><span class="none">none</span></td>
+          <td><span class="none">none</span></td>
         </tr>
         <tr>
           <th>byte</th>
@@ -127,6 +135,8 @@
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
           <td><span class="none">none</span></td>
           <td><span class="none">none</span></td>
         </tr>
@@ -150,6 +160,8 @@
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
           <td><span class="none">none</span></td>
           <td><span class="none">none</span></td>
         </tr>
@@ -173,6 +185,8 @@
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
           <td><span class="none">none</span></td>
           <td><span class="none">none</span></td>
         </tr>
@@ -196,6 +210,8 @@
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
           <td><span class="none">none</span></td>
           <td><span class="none">none</span></td>
         </tr>
@@ -215,10 +231,12 @@
           <td><span class="implicit">implicit</span></td>
           <td><span class="implicit">implicit</span></td>
           <td><span class="implicit">implicit</span></td>
+          <td><span class="explicit">explicit</span></td>
           <td><span class="implicit">implicit</span></td>
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
           <td><span class="none">none</span></td>
           <td><span class="none">none</span></td>
         </tr>
@@ -238,10 +256,12 @@
           <td><span class="implicit">implicit</span></td>
           <td><span class="implicit">implicit</span></td>
           <td><span class="implicit">implicit</span></td>
+          <td><span class="explicit">explicit</span></td>
           <td><span class="implicit">implicit</span></td>
           <td><span class="implicit">implicit</span></td>
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
           <td><span class="none">none</span></td>
           <td><span class="none">none</span></td>
         </tr>
@@ -265,6 +285,8 @@
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
           <td><span class="none">none</span></td>
           <td><span class="strict">strict</span></td>
         </tr>
@@ -289,6 +311,8 @@
           <td><span class="none">none</span></td>
           <td><span class="none">none</span></td>
           <td><span class="none">none</span></td>
+          <td><span class="none">none</span></td>
+          <td><span class="none">none</span></td>
           <td><span class="strict">strict</span></td>
         </tr>
         <tr>
@@ -311,6 +335,8 @@
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
           <td><span class="none">none</span></td>
           <td><span class="strict">strict</span></td>
         </tr>
@@ -318,7 +344,7 @@
           <th>Short</th>
           <td><span class="explicit">explicit</span></td>
           <td><span class="none">none</span></td>
-          <td><span class="none">none</span></td>
+          <td><span class="explicit">explicit</span></td>
           <td><span class="implicit">implicit</span></td>
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
@@ -326,7 +352,7 @@
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
           <td><span class="none">none</span></td>
-          <td><span class="none">none</span></td>
+          <td><span class="explicit">explicit</span></td>
           <td><span class="strict">strict</span></td>
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
@@ -334,6 +360,8 @@
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
           <td><span class="none">none</span></td>
           <td><span class="strict">strict</span></td>
         </tr>
@@ -341,7 +369,7 @@
           <th>Integer</th>
           <td><span class="explicit">explicit</span></td>
           <td><span class="none">none</span></td>
-          <td><span class="none">none</span></td>
+          <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
           <td><span class="implicit">implicit</span></td>
           <td><span class="explicit">explicit</span></td>
@@ -349,7 +377,7 @@
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
           <td><span class="none">none</span></td>
-          <td><span class="none">none</span></td>
+          <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
           <td><span class="strict">strict</span></td>
           <td><span class="explicit">explicit</span></td>
@@ -357,6 +385,8 @@
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
           <td><span class="none">none</span></td>
           <td><span class="strict">strict</span></td>
         </tr>
@@ -364,7 +394,7 @@
           <th>Long</th>
           <td><span class="explicit">explicit</span></td>
           <td><span class="none">none</span></td>
-          <td><span class="none">none</span></td>
+          <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
           <td><span class="implicit">implicit</span></td>
@@ -372,7 +402,7 @@
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
           <td><span class="none">none</span></td>
-          <td><span class="none">none</span></td>
+          <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
           <td><span class="strict">strict</span></td>
@@ -380,29 +410,58 @@
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
           <td><span class="none">none</span></td>
           <td><span class="strict">strict</span></td>
         </tr>
         <tr>
-          <th>Float</th>
+          <th>BigInteger</th>
+          <td><span class="none">none</span></td>
+          <td><span class="none">none</span></td>
+          <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
+          <td><span class="none">none</span></td>
           <td><span class="none">none</span></td>
           <td><span class="none">none</span></td>
           <td><span class="none">none</span></td>
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
-          <td><span class="implicit">implicit</span></td>
           <td><span class="explicit">explicit</span></td>
+          <td><span class="strict">strict</span></td>
           <td><span class="none">none</span></td>
           <td><span class="none">none</span></td>
+          <td><span class="explicit">explicit</span></td>
+          <td><span class="none">none</span></td>
+          <td><span class="explicit">explicit</span></td>
+          <td><span class="none">none</span></td>
+          <td><span class="strict">strict</span></td>
+        </tr>
+        <tr>
+          <th>Float</th>
+          <td><span class="none">none</span></td>
+          <td><span class="none">none</span></td>
+          <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
+          <td><span class="implicit">implicit</span></td>
+          <td><span class="explicit">explicit</span></td>
+          <td><span class="none">none</span></td>
           <td><span class="none">none</span></td>
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
           <td><span class="strict">strict</span></td>
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
           <td><span class="none">none</span></td>
           <td><span class="strict">strict</span></td>
         </tr>
@@ -410,7 +469,7 @@
           <th>Double</th>
           <td><span class="none">none</span></td>
           <td><span class="none">none</span></td>
-          <td><span class="none">none</span></td>
+          <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
@@ -418,7 +477,8 @@
           <td><span class="implicit">implicit</span></td>
           <td><span class="none">none</span></td>
           <td><span class="none">none</span></td>
-          <td><span class="none">none</span></td>
+          <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
@@ -426,6 +486,32 @@
           <td><span class="strict">strict</span></td>
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
+          <td><span class="none">none</span></td>
+          <td><span class="strict">strict</span></td>
+        </tr>
+        <tr>
+          <th>BigDecimal</th>
+          <td><span class="none">none</span></td>
+          <td><span class="none">none</span></td>
+          <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
+          <td><span class="none">none</span></td>
+          <td><span class="none">none</span></td>
+          <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
+          <td><span class="strict">strict</span></td>
+          <td><span class="none">none</span></td>
+          <td><span class="explicit">explicit</span></td>
           <td><span class="none">none</span></td>
           <td><span class="strict">strict</span></td>
         </tr>
@@ -448,6 +534,8 @@
           <td><span class="strict">strict</span></td>
           <td><span class="strict">strict</span></td>
           <td><span class="strict">strict</span></td>
+          <td><span class="strict">strict</span></td>
+          <td><span class="strict">strict</span></td>
           <td><span class="none">none</span></td>
           <td><span class="none">none</span></td>
           <td><span class="strict">strict</span></td>
@@ -471,6 +559,8 @@
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
           <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
+          <td><span class="explicit">explicit</span></td>
           <td><span class="strict">strict</span></td>
           <td><span class="explicit">explicit</span></td>
           <td><span class="strict">strict</span></td>
@@ -488,6 +578,8 @@
           <td><span class="strict">strict</span></td>
           <td><span class="strict">strict</span></td>
           <td><span class="strict">strict</span></td>
+          <td><span class="strict">strict</span></td>
+          <td><span class="strict">strict</span></td>
           <td><span class="strict">strict</span></td>
           <td><span class="strict">strict</span></td>
           <td><span class="strict">strict</span></td>

Modified: 
velocity/engine/trunk/velocity-engine-core/src/test/resources/conversion/compare/test_conv_with_handler.cmp
URL: 
http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/test/resources/conversion/compare/test_conv_with_handler.cmp?rev=1870761&r1=1870760&r2=1870761&view=diff
==============================================================================
--- 
velocity/engine/trunk/velocity-engine-core/src/test/resources/conversion/compare/test_conv_with_handler.cmp
 (original)
+++ 
velocity/engine/trunk/velocity-engine-core/src/test/resources/conversion/compare/test_conv_with_handler.cmp
 Tue Dec  3 16:57:12 2019
@@ -12,8 +12,10 @@ A. bool-true Value java.lang.Boolean tru
   Short ok: 1
   Integer ok: 1
   Long ok: 1
+  $target.objectBigInteger($value)
   $target.objectFloat($value)
   $target.objectDouble($value)
+  $target.objectBigDecimal($value)
   $target.objectCharacter($value)
   $target.objectNumber($value)
   Object ok: true
@@ -42,8 +44,10 @@ B. bool-false Value java.lang.Boolean fa
   Short ok: 0
   Integer ok: 0
   Long ok: 0
+  $target.objectBigInteger($value)
   $target.objectFloat($value)
   $target.objectDouble($value)
+  $target.objectBigDecimal($value)
   $target.objectCharacter($value)
   $target.objectNumber($value)
   Object ok: false
@@ -69,11 +73,13 @@ C. byte-0 Value java.lang.Byte 0
   $target.integralChar($value)
   Boolean ok: false
   Byte ok: 0
-  $target.objectShort($value)
-  $target.objectInt($value)
-  $target.objectLong($value)
-  $target.objectFloat($value)
-  $target.objectDouble($value)
+  Short ok: 0
+  Integer ok: 0
+  Long ok: 0
+  BigInteger ok: 0
+  Float ok: 0.0
+  Double ok: 0.0
+  BigDecimal ok: 0
   $target.objectCharacter($value)
   Number ok: 0
   Object ok: 0
@@ -99,11 +105,13 @@ D. byte-1 Value java.lang.Byte 1
   $target.integralChar($value)
   Boolean ok: true
   Byte ok: 1
-  $target.objectShort($value)
-  $target.objectInt($value)
-  $target.objectLong($value)
-  $target.objectFloat($value)
-  $target.objectDouble($value)
+  Short ok: 1
+  Integer ok: 1
+  Long ok: 1
+  BigInteger ok: 1
+  Float ok: 1.0
+  Double ok: 1.0
+  BigDecimal ok: 1
   $target.objectCharacter($value)
   Number ok: 1
   Object ok: 1
@@ -132,8 +140,10 @@ E. short Value java.lang.Short 125
   Short ok: 125
   Integer ok: 125
   Long ok: 125
+  BigInteger ok: 125
   Float ok: 125.0
   Double ok: 125.0
+  BigDecimal ok: 125
   $target.objectCharacter($value)
   Number ok: 125
   Object ok: 125
@@ -150,7 +160,7 @@ E. short Value java.lang.Short 125
   $target.locale($value)
 F. int Value java.lang.Integer 24323
   boolean ok: true
-  integralByte -> NumberFormatException: value out of range for byte type: 
24323
+  integralByte -> NumberFormatException: value out of range: 24323
   short ok: 24323
   int ok: 24323
   long ok: 24323
@@ -158,12 +168,14 @@ F. int Value java.lang.Integer 24323
   double ok: 24323.0
   $target.integralChar($value)
   Boolean ok: true
-  objectByte -> NumberFormatException: value out of range for byte type: 24323
+  objectByte -> NumberFormatException: value out of range: 24323
   Short ok: 24323
   Integer ok: 24323
   Long ok: 24323
+  BigInteger ok: 24323
   Float ok: 24323.0
   Double ok: 24323.0
+  BigDecimal ok: 24323
   $target.objectCharacter($value)
   Number ok: 24323
   Object ok: 24323
@@ -180,20 +192,22 @@ F. int Value java.lang.Integer 24323
   $target.locale($value)
 G. long Value java.lang.Long 5235235
   boolean ok: true
-  integralByte -> NumberFormatException: value out of range for byte type: 
5235235
-  integralShort -> NumberFormatException: value out of range for short type: 
5235235
+  integralByte -> NumberFormatException: value out of range: 5235235
+  integralShort -> NumberFormatException: value out of range: 5235235
   int ok: 5235235
   long ok: 5235235
   float ok: 5235235.0
   double ok: 5235235.0
   $target.integralChar($value)
   Boolean ok: true
-  objectByte -> NumberFormatException: value out of range for byte type: 
5235235
-  objectShort -> NumberFormatException: value out of range for short type: 
5235235
+  objectByte -> NumberFormatException: value out of range: 5235235
+  objectShort -> NumberFormatException: value out of range: 5235235
   Integer ok: 5235235
   Long ok: 5235235
+  BigInteger ok: 5235235
   Float ok: 5235235.0
   Double ok: 5235235.0
+  BigDecimal ok: 5235235
   $target.objectCharacter($value)
   Number ok: 5235235
   Object ok: 5235235
@@ -210,20 +224,22 @@ G. long Value java.lang.Long 5235235
   $target.locale($value)
 H. float Value java.lang.Float 34523.344
   boolean ok: true
-  integralByte -> NumberFormatException: value out of range for byte type: 
34523
-  integralShort -> NumberFormatException: value out of range for short type: 
34523
+  integralByte -> NumberFormatException: value out of range: 34523.344
+  integralShort -> NumberFormatException: value out of range: 34523.344
   int ok: 34523
   long ok: 34523
   float ok: 34523.344
   double ok: 34523.34375
   $target.integralChar($value)
   Boolean ok: true
-  objectByte -> NumberFormatException: value out of range for byte type: 34523
-  objectShort -> NumberFormatException: value out of range for short type: 
34523
+  objectByte -> NumberFormatException: value out of range: 34523.344
+  objectShort -> NumberFormatException: value out of range: 34523.344
   Integer ok: 34523
   Long ok: 34523
+  $target.objectBigInteger($value)
   Float ok: 34523.344
   Double ok: 34523.34375
+  BigDecimal ok: 34523.34375
   $target.objectCharacter($value)
   Number ok: 34523.344
   Object ok: 34523.344
@@ -240,20 +256,22 @@ H. float Value java.lang.Float 34523.344
   $target.locale($value)
 I. double Value java.lang.Double 54235.3253
   boolean ok: true
-  integralByte -> NumberFormatException: value out of range for byte type: 
54235
-  integralShort -> NumberFormatException: value out of range for short type: 
54235
+  integralByte -> NumberFormatException: value out of range: 54235.3253
+  integralShort -> NumberFormatException: value out of range: 54235.3253
   int ok: 54235
   long ok: 54235
   float ok: 54235.324
   double ok: 54235.3253
   $target.integralChar($value)
   Boolean ok: true
-  objectByte -> NumberFormatException: value out of range for byte type: 54235
-  objectShort -> NumberFormatException: value out of range for short type: 
54235
+  objectByte -> NumberFormatException: value out of range: 54235.3253
+  objectShort -> NumberFormatException: value out of range: 54235.3253
   Integer ok: 54235
   Long ok: 54235
+  $target.objectBigInteger($value)
   Float ok: 54235.324
   Double ok: 54235.3253
+  BigDecimal ok: 54235.3253
   $target.objectCharacter($value)
   Number ok: 54235.3253
   Object ok: 54235.3253
@@ -282,8 +300,10 @@ J. char Value java.lang.Character @
   $target.objectShort($value)
   $target.objectInt($value)
   $target.objectLong($value)
+  $target.objectBigInteger($value)
   $target.objectFloat($value)
   $target.objectDouble($value)
+  $target.objectBigDecimal($value)
   Character ok: @
   $target.objectNumber($value)
   Object ok: @
@@ -312,8 +332,10 @@ K. object Value org.apache.velocity.test
   $target.objectShort($value)
   $target.objectInt($value)
   $target.objectLong($value)
+  $target.objectBigInteger($value)
   $target.objectFloat($value)
   $target.objectDouble($value)
+  $target.objectBigDecimal($value)
   $target.objectCharacter($value)
   $target.objectNumber($value)
   Object ok: instance of Obj
@@ -342,8 +364,10 @@ L. enum Value org.apache.velocity.test.u
   $target.objectShort($value)
   $target.objectInt($value)
   $target.objectLong($value)
+  $target.objectBigInteger($value)
   $target.objectFloat($value)
   $target.objectDouble($value)
+  $target.objectBigDecimal($value)
   $target.objectCharacter($value)
   $target.objectNumber($value)
   Object ok: GREEN
@@ -372,8 +396,10 @@ M. string Value java.lang.String foo
   objectShort -> NumberFormatException: For input string: "foo"
   objectInt -> NumberFormatException: For input string: "foo"
   objectLong -> NumberFormatException: For input string: "foo"
+  objectBigInteger -> NumberFormatException: For input string: "foo"
   objectFloat -> NumberFormatException: For input string: "foo"
   objectDouble -> NumberFormatException: For input string: "foo"
+  objectBigDecimal -> NumberFormatException: null
   $target.objectCharacter($value)
   $target.objectNumber($value)
   Object ok: foo
@@ -402,8 +428,10 @@ M. string-green Value java.lang.String g
   objectShort -> NumberFormatException: For input string: "green"
   objectInt -> NumberFormatException: For input string: "green"
   objectLong -> NumberFormatException: For input string: "green"
+  objectBigInteger -> NumberFormatException: For input string: "green"
   objectFloat -> NumberFormatException: For input string: "green"
   objectDouble -> NumberFormatException: For input string: "green"
+  objectBigDecimal -> NumberFormatException: null
   $target.objectCharacter($value)
   $target.objectNumber($value)
   Object ok: green
@@ -432,8 +460,10 @@ N. string-empty Value java.lang.String
   objectShort -> NumberFormatException: For input string: ""
   objectInt -> NumberFormatException: For input string: ""
   objectLong -> NumberFormatException: For input string: ""
+  objectBigInteger -> NumberFormatException: Zero length BigInteger
   objectFloat -> NumberFormatException: empty String
   objectDouble -> NumberFormatException: empty String
+  objectBigDecimal -> NumberFormatException: null
   $target.objectCharacter($value)
   $target.objectNumber($value)
   Object ok: 
@@ -462,8 +492,10 @@ O. string-false Value java.lang.String f
   objectShort -> NumberFormatException: For input string: "false"
   objectInt -> NumberFormatException: For input string: "false"
   objectLong -> NumberFormatException: For input string: "false"
+  objectBigInteger -> NumberFormatException: For input string: "false"
   objectFloat -> NumberFormatException: For input string: "false"
   objectDouble -> NumberFormatException: For input string: "false"
+  objectBigDecimal -> NumberFormatException: null
   $target.objectCharacter($value)
   $target.objectNumber($value)
   Object ok: false
@@ -492,8 +524,10 @@ P. string-true Value java.lang.String tr
   objectShort -> NumberFormatException: For input string: "true"
   objectInt -> NumberFormatException: For input string: "true"
   objectLong -> NumberFormatException: For input string: "true"
+  objectBigInteger -> NumberFormatException: For input string: "true"
   objectFloat -> NumberFormatException: For input string: "true"
   objectDouble -> NumberFormatException: For input string: "true"
+  objectBigDecimal -> NumberFormatException: null
   $target.objectCharacter($value)
   $target.objectNumber($value)
   Object ok: true
@@ -522,8 +556,10 @@ Q. string-zero Value java.lang.String 0
   Short ok: 0
   Integer ok: 0
   Long ok: 0
+  BigInteger ok: 0
   Float ok: 0.0
   Double ok: 0.0
+  BigDecimal ok: 0
   $target.objectCharacter($value)
   $target.objectNumber($value)
   Object ok: 0
@@ -552,8 +588,10 @@ R. string-integral Value java.lang.Strin
   Short ok: 123
   Integer ok: 123
   Long ok: 123
+  BigInteger ok: 123
   Float ok: 123.0
   Double ok: 123.0
+  BigDecimal ok: 123
   $target.objectCharacter($value)
   $target.objectNumber($value)
   Object ok: 123
@@ -582,8 +620,10 @@ S. string-big-integral Value java.lang.S
   objectShort -> NumberFormatException: Value out of range. Value:"12345678" 
Radix:10
   Integer ok: 12345678
   Long ok: 12345678
+  BigInteger ok: 12345678
   Float ok: 1.2345678E7
   Double ok: 1.2345678E7
+  BigDecimal ok: 12345678
   $target.objectCharacter($value)
   $target.objectNumber($value)
   Object ok: 12345678
@@ -612,8 +652,10 @@ T. string-floating Value java.lang.Strin
   objectShort -> NumberFormatException: For input string: "123.345"
   objectInt -> NumberFormatException: For input string: "123.345"
   objectLong -> NumberFormatException: For input string: "123.345"
+  objectBigInteger -> NumberFormatException: For input string: "123.345"
   Float ok: 123.345
   Double ok: 123.345
+  BigDecimal ok: 123.345
   $target.objectCharacter($value)
   $target.objectNumber($value)
   Object ok: 123.345
@@ -642,8 +684,10 @@ U. null Value $value.class.name $value
   Short ok: null
   Integer ok: null
   Long ok: null
+  BigInteger ok: null
   Float ok: null
   Double ok: null
+  BigDecimal ok: null
   Character ok: null
   Number ok: null
   Object ok: null
@@ -672,8 +716,10 @@ V. locale Value java.lang.String fr_FR
   objectShort -> NumberFormatException: For input string: "fr_FR"
   objectInt -> NumberFormatException: For input string: "fr_FR"
   objectLong -> NumberFormatException: For input string: "fr_FR"
+  objectBigInteger -> NumberFormatException: For input string: "fr_FR"
   objectFloat -> NumberFormatException: For input string: "fr_FR"
   objectDouble -> NumberFormatException: For input string: "fr_FR"
+  objectBigDecimal -> NumberFormatException: null
   $target.objectCharacter($value)
   $target.objectNumber($value)
   Object ok: fr_FR
@@ -688,3 +734,259 @@ V. locale Value java.lang.String fr_FR
   $target.valueOfDouble($value)
   $target.valueOfString($value)
   Locale ok: fr_FR
+W. BigInteger zero Value java.math.BigInteger 0
+  boolean ok: false
+  byte ok: 0
+  short ok: 0
+  int ok: 0
+  long ok: 0
+  float ok: 0.0
+  double ok: 0.0
+  $target.integralChar($value)
+  Boolean ok: false
+  Byte ok: 0
+  Short ok: 0
+  Integer ok: 0
+  Long ok: 0
+  BigInteger ok: 0
+  Float ok: 0.0
+  Double ok: 0.0
+  BigDecimal ok: 0
+  $target.objectCharacter($value)
+  Number ok: 0
+  Object ok: 0
+  $target.objectEnum($value)
+  String ok: 0
+  $target.valueOfBoolean($value)
+  $target.valueOfShort($value)
+  $target.valueOfByte($value)
+  $target.valueOfInt($value)
+  $target.valueOfLong($value)
+  $target.valueOfFloat($value)
+  $target.valueOfDouble($value)
+  $target.valueOfString($value)
+  $target.locale($value)
+X. BigInteger one Value java.math.BigInteger 1
+  boolean ok: true
+  byte ok: 1
+  short ok: 1
+  int ok: 1
+  long ok: 1
+  float ok: 1.0
+  double ok: 1.0
+  $target.integralChar($value)
+  Boolean ok: true
+  Byte ok: 1
+  Short ok: 1
+  Integer ok: 1
+  Long ok: 1
+  BigInteger ok: 1
+  Float ok: 1.0
+  Double ok: 1.0
+  BigDecimal ok: 1
+  $target.objectCharacter($value)
+  Number ok: 1
+  Object ok: 1
+  $target.objectEnum($value)
+  String ok: 1
+  $target.valueOfBoolean($value)
+  $target.valueOfShort($value)
+  $target.valueOfByte($value)
+  $target.valueOfInt($value)
+  $target.valueOfLong($value)
+  $target.valueOfFloat($value)
+  $target.valueOfDouble($value)
+  $target.valueOfString($value)
+  $target.locale($value)
+Y. BigInteger bigint Value java.math.BigInteger 12345678901234567890
+  boolean ok: true
+  integralByte -> IllegalArgumentException: java.lang.ArithmeticException: 
BigInteger out of byte range
+  integralShort -> IllegalArgumentException: java.lang.ArithmeticException: 
BigInteger out of short range
+  integralInt -> IllegalArgumentException: java.lang.ArithmeticException: 
BigInteger out of int range
+  integralLong -> IllegalArgumentException: java.lang.ArithmeticException: 
BigInteger out of long range
+  float ok: 1.2345679E19
+  double ok: 1.2345678901234567E19
+  $target.integralChar($value)
+  Boolean ok: true
+  objectByte -> IllegalArgumentException: java.lang.ArithmeticException: 
BigInteger out of byte range
+  objectShort -> IllegalArgumentException: java.lang.ArithmeticException: 
BigInteger out of short range
+  objectInt -> IllegalArgumentException: java.lang.ArithmeticException: 
BigInteger out of int range
+  objectLong -> IllegalArgumentException: java.lang.ArithmeticException: 
BigInteger out of long range
+  BigInteger ok: 12345678901234567890
+  Float ok: 1.2345679E19
+  Double ok: 1.2345678901234567E19
+  BigDecimal ok: 12345678901234567890
+  $target.objectCharacter($value)
+  Number ok: 12345678901234567890
+  Object ok: 12345678901234567890
+  $target.objectEnum($value)
+  String ok: 12345678901234567890
+  $target.valueOfBoolean($value)
+  $target.valueOfShort($value)
+  $target.valueOfByte($value)
+  $target.valueOfInt($value)
+  $target.valueOfLong($value)
+  $target.valueOfFloat($value)
+  $target.valueOfDouble($value)
+  $target.valueOfString($value)
+  $target.locale($value)
+Y. BigInteger ten Value java.math.BigInteger 10
+  boolean ok: true
+  byte ok: 10
+  short ok: 10
+  int ok: 10
+  long ok: 10
+  float ok: 10.0
+  double ok: 10.0
+  $target.integralChar($value)
+  Boolean ok: true
+  Byte ok: 10
+  Short ok: 10
+  Integer ok: 10
+  Long ok: 10
+  BigInteger ok: 10
+  Float ok: 10.0
+  Double ok: 10.0
+  BigDecimal ok: 10
+  $target.objectCharacter($value)
+  Number ok: 10
+  Object ok: 10
+  $target.objectEnum($value)
+  String ok: 10
+  $target.valueOfBoolean($value)
+  $target.valueOfShort($value)
+  $target.valueOfByte($value)
+  $target.valueOfInt($value)
+  $target.valueOfLong($value)
+  $target.valueOfFloat($value)
+  $target.valueOfDouble($value)
+  $target.valueOfString($value)
+  $target.locale($value)
+Z. BigDecimal zero Value java.math.BigDecimal 0
+  boolean ok: false
+  byte ok: 0
+  short ok: 0
+  int ok: 0
+  long ok: 0
+  float ok: 0.0
+  double ok: 0.0
+  $target.integralChar($value)
+  Boolean ok: false
+  Byte ok: 0
+  Short ok: 0
+  Integer ok: 0
+  Long ok: 0
+  BigInteger ok: 0
+  Float ok: 0.0
+  Double ok: 0.0
+  BigDecimal ok: 0
+  $target.objectCharacter($value)
+  Number ok: 0
+  Object ok: 0
+  $target.objectEnum($value)
+  String ok: 0
+  $target.valueOfBoolean($value)
+  $target.valueOfShort($value)
+  $target.valueOfByte($value)
+  $target.valueOfInt($value)
+  $target.valueOfLong($value)
+  $target.valueOfFloat($value)
+  $target.valueOfDouble($value)
+  $target.valueOfString($value)
+  $target.locale($value)
+ZA. BigDecimal one Value java.math.BigDecimal 1
+  boolean ok: true
+  byte ok: 1
+  short ok: 1
+  int ok: 1
+  long ok: 1
+  float ok: 1.0
+  double ok: 1.0
+  $target.integralChar($value)
+  Boolean ok: true
+  Byte ok: 1
+  Short ok: 1
+  Integer ok: 1
+  Long ok: 1
+  BigInteger ok: 1
+  Float ok: 1.0
+  Double ok: 1.0
+  BigDecimal ok: 1
+  $target.objectCharacter($value)
+  Number ok: 1
+  Object ok: 1
+  $target.objectEnum($value)
+  String ok: 1
+  $target.valueOfBoolean($value)
+  $target.valueOfShort($value)
+  $target.valueOfByte($value)
+  $target.valueOfInt($value)
+  $target.valueOfLong($value)
+  $target.valueOfFloat($value)
+  $target.valueOfDouble($value)
+  $target.valueOfString($value)
+  $target.locale($value)
+ZB. BigDecimal ten Value java.math.BigDecimal 10
+  boolean ok: true
+  byte ok: 10
+  short ok: 10
+  int ok: 10
+  long ok: 10
+  float ok: 10.0
+  double ok: 10.0
+  $target.integralChar($value)
+  Boolean ok: true
+  Byte ok: 10
+  Short ok: 10
+  Integer ok: 10
+  Long ok: 10
+  BigInteger ok: 10
+  Float ok: 10.0
+  Double ok: 10.0
+  BigDecimal ok: 10
+  $target.objectCharacter($value)
+  Number ok: 10
+  Object ok: 10
+  $target.objectEnum($value)
+  String ok: 10
+  $target.valueOfBoolean($value)
+  $target.valueOfShort($value)
+  $target.valueOfByte($value)
+  $target.valueOfInt($value)
+  $target.valueOfLong($value)
+  $target.valueOfFloat($value)
+  $target.valueOfDouble($value)
+  $target.valueOfString($value)
+  $target.locale($value)
+ZC. BigDecimal bigdec Value java.math.BigDecimal 
12345678901234567890.01234567890123456789
+  boolean ok: true
+  integralByte -> IllegalArgumentException: java.lang.ArithmeticException: 
Overflow
+  integralShort -> IllegalArgumentException: java.lang.ArithmeticException: 
Overflow
+  integralInt -> IllegalArgumentException: java.lang.ArithmeticException: 
Overflow
+  integralLong -> IllegalArgumentException: java.lang.ArithmeticException: 
Overflow
+  float ok: 1.2345679E19
+  double ok: 1.2345678901234567E19
+  $target.integralChar($value)
+  Boolean ok: true
+  objectByte -> IllegalArgumentException: java.lang.ArithmeticException: 
Overflow
+  objectShort -> IllegalArgumentException: java.lang.ArithmeticException: 
Overflow
+  objectInt -> IllegalArgumentException: java.lang.ArithmeticException: 
Overflow
+  objectLong -> IllegalArgumentException: java.lang.ArithmeticException: 
Overflow
+  objectBigInteger -> IllegalArgumentException: java.lang.ArithmeticException: 
Rounding necessary
+  Float ok: 1.2345679E19
+  Double ok: 1.2345678901234567E19
+  BigDecimal ok: 12345678901234567890.01234567890123456789
+  $target.objectCharacter($value)
+  Number ok: 12345678901234567890.01234567890123456789
+  Object ok: 12345678901234567890.01234567890123456789
+  $target.objectEnum($value)
+  String ok: 12345678901234567890.01234567890123456789
+  $target.valueOfBoolean($value)
+  $target.valueOfShort($value)
+  $target.valueOfByte($value)
+  $target.valueOfInt($value)
+  $target.valueOfLong($value)
+  $target.valueOfFloat($value)
+  $target.valueOfDouble($value)
+  $target.valueOfString($value)
+  $target.locale($value)


Reply via email to