You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2012/02/28 12:35:06 UTC

svn commit: r1294591 - in /camel/branches/camel-2.8.x: ./ camel-core/src/main/java/org/apache/camel/converter/ camel-core/src/main/java/org/apache/camel/impl/converter/ camel-core/src/main/java/org/apache/camel/util/ camel-core/src/test/java/org/apache...

Author: davsclaus
Date: Tue Feb 28 11:35:06 2012
New Revision: 1294591

URL: http://svn.apache.org/viewvc?rev=1294591&view=rev
Log:
CAMEL-4959: Type convertion with NaN numbers requires a bit special handling.

Modified:
    camel/branches/camel-2.8.x/   (props changed)
    camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/converter/ObjectConverter.java
    camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java
    camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java
    camel/branches/camel-2.8.x/camel-core/src/test/java/org/apache/camel/builder/xml/ExtractXPathWithNamespaceTest.java
    camel/branches/camel-2.8.x/camel-core/src/test/java/org/apache/camel/converter/ObjectConverterNaNTest.java

Propchange: camel/branches/camel-2.8.x/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Feb 28 11:35:06 2012
@@ -1,2 +1,2 @@
-/camel/branches/camel-2.9.x:1227549,1228229,1229567,1234054,1236672,1238942,1240157,1241006,1241489,1243052,1243058,1244875,1244877,1291871,1292116,1292389,1292726,1292769,1293082,1293935,1294044
-/camel/trunk:1226860,1227540,1228223,1229565,1234043,1236667,1238937,1240025,1240950,1240967,1241482,1243046,1243057,1244870,1244872,1291848,1292114,1292384,1292725,1292767,1293079,1293828,1293855
+/camel/branches/camel-2.9.x:1227549,1228229,1229567,1234054,1236672,1238942,1240157,1241006,1241489,1243052,1243058,1244875,1244877,1291871,1292116,1292389,1292726,1292769,1293082,1293935,1294044,1294589
+/camel/trunk:1226860,1227540,1228223,1229565,1234043,1236667,1238937,1240025,1240950,1240967,1241482,1243046,1243057,1244870,1244872,1291848,1292114,1292384,1292725,1292767,1293079,1293828,1293855,1294588

Propchange: camel/branches/camel-2.8.x/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.

Modified: camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/converter/ObjectConverter.java
URL: http://svn.apache.org/viewvc/camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/converter/ObjectConverter.java?rev=1294591&r1=1294590&r2=1294591&view=diff
==============================================================================
--- camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/converter/ObjectConverter.java (original)
+++ camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/converter/ObjectConverter.java Tue Feb 28 11:35:06 2012
@@ -80,10 +80,6 @@ public final class ObjectConverter {
         if (value instanceof Byte) {
             return (Byte) value;
         } else if (value instanceof Number) {
-            if (isNaN(value)) {
-                // return zero for a NaN value
-                return Byte.valueOf((byte) 0);
-            }
             Number number = (Number) value;
             return number.byteValue();
         } else if (value instanceof String) {
@@ -139,10 +135,6 @@ public final class ObjectConverter {
         if (value instanceof Short) {
             return (Short) value;
         } else if (value instanceof Number) {
-            if (isNaN(value)) {
-                // return zero for a NaN value
-                return Short.valueOf((short) 0);
-            }
             Number number = (Number) value;
             return number.shortValue();
         } else if (value instanceof String) {
@@ -160,10 +152,6 @@ public final class ObjectConverter {
         if (value instanceof Integer) {
             return (Integer) value;
         } else if (value instanceof Number) {
-            if (isNaN(value)) {
-                // return zero for a NaN value
-                return Integer.valueOf(0);
-            }
             Number number = (Number) value;
             return number.intValue();
         } else if (value instanceof String) {
@@ -181,10 +169,6 @@ public final class ObjectConverter {
         if (value instanceof Long) {
             return (Long) value;
         } else if (value instanceof Number) {
-            if (isNaN(value)) {
-                // return zero for a NaN value
-                return Long.valueOf(0);
-            }
             Number number = (Number) value;
             return number.longValue();
         } else if (value instanceof String) {
@@ -202,7 +186,7 @@ public final class ObjectConverter {
         if (value instanceof Float) {
             return (Float) value;
         } else if (value instanceof Number) {
-            if (isNaN(value)) {
+            if (ObjectHelper.isNaN(value)) {
                 return Float.NaN;
             }
             Number number = (Number) value;
@@ -222,7 +206,7 @@ public final class ObjectConverter {
         if (value instanceof Double) {
             return (Double) value;
         } else if (value instanceof Number) {
-            if (isNaN(value)) {
+            if (ObjectHelper.isNaN(value)) {
                 return Double.NaN;
             }
             Number number = (Number) value;
@@ -234,11 +218,6 @@ public final class ObjectConverter {
         }
     }
 
-    private static boolean isNaN(Object value) {
-        // 'value' should have been already checked to be 'instanceof Number', that's 'value != null'
-        return value.equals(Float.NaN) || value.equals(Double.NaN);
-    }
-
     // add fast type converters from most common used
 
     @Converter

Modified: camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java
URL: http://svn.apache.org/viewvc/camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java?rev=1294591&r1=1294590&r2=1294591&view=diff
==============================================================================
--- camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java (original)
+++ camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java Tue Feb 28 11:35:06 2012
@@ -176,6 +176,18 @@ public abstract class BaseTypeConverterR
             // we have tried before but we cannot convert this one
             return Void.TYPE;
         }
+        
+        // special for NaN numbers, which we can only convert for flating numbers
+        if (ObjectHelper.isNaN(value)) {
+            if (Float.class.isAssignableFrom(type)) {
+                return Float.NaN;
+            } else if (Double.class.isAssignableFrom(type)) {
+                return Double.NaN;
+            } else {
+                // we cannot convert the NaN
+                return Void.TYPE;
+            }
+        }
 
         // try to find a suitable type converter
         TypeConverter converter = getOrFindTypeConverter(type, value);

Modified: camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java
URL: http://svn.apache.org/viewvc/camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java?rev=1294591&r1=1294590&r2=1294591&view=diff
==============================================================================
--- camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java (original)
+++ camel/branches/camel-2.8.x/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java Tue Feb 28 11:35:06 2012
@@ -1319,6 +1319,19 @@ public final class ObjectHelper {
         return null;
     }
 
+    /**
+     * Is the given value a numeric NaN type
+     * 
+     * @param value the value
+     * @return <tt>true</tt> if its a {@link Float#NaN} or {@link Double#NaN}.
+     */
+    public static boolean isNaN(Object value) {
+        if (value == null) {
+            return false;
+        }
+        return value.equals(Float.NaN) || value.equals(Double.NaN);
+    }
+
     private static final class ExceptionIterator implements Iterator<Throwable> {
         private List<Throwable> tree = new ArrayList<Throwable>();
         private Iterator<Throwable> it;

Modified: camel/branches/camel-2.8.x/camel-core/src/test/java/org/apache/camel/builder/xml/ExtractXPathWithNamespaceTest.java
URL: http://svn.apache.org/viewvc/camel/branches/camel-2.8.x/camel-core/src/test/java/org/apache/camel/builder/xml/ExtractXPathWithNamespaceTest.java?rev=1294591&r1=1294590&r2=1294591&view=diff
==============================================================================
--- camel/branches/camel-2.8.x/camel-core/src/test/java/org/apache/camel/builder/xml/ExtractXPathWithNamespaceTest.java (original)
+++ camel/branches/camel-2.8.x/camel-core/src/test/java/org/apache/camel/builder/xml/ExtractXPathWithNamespaceTest.java Tue Feb 28 11:35:06 2012
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.builder.xml;
 
+import junit.framework.Assert;
+
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
 import org.apache.camel.builder.RouteBuilder;
@@ -49,11 +51,11 @@ public class ExtractXPathWithNamespaceTe
     public void testXPathWithNamespaceDifferentNamespace() throws Exception {
         MockEndpoint mock = getMockEndpoint("mock:result");
         mock.expectedBodiesReceived("<number xmlns=\"http://acme.com/cake\">55</number>");
-        mock.expectedHeaderReceived("foo", 0);
-        
+
         template.sendBody("direct:in", "<number xmlns=\"http://acme.com/cake\">55</number>");
 
         mock.assertIsSatisfied();
+        Assert.assertNull(mock.getExchanges().get(0).getIn().getHeader("foo"));
     }
 
     protected RouteBuilder createRouteBuilder() throws Exception {

Modified: camel/branches/camel-2.8.x/camel-core/src/test/java/org/apache/camel/converter/ObjectConverterNaNTest.java
URL: http://svn.apache.org/viewvc/camel/branches/camel-2.8.x/camel-core/src/test/java/org/apache/camel/converter/ObjectConverterNaNTest.java?rev=1294591&r1=1294590&r2=1294591&view=diff
==============================================================================
--- camel/branches/camel-2.8.x/camel-core/src/test/java/org/apache/camel/converter/ObjectConverterNaNTest.java (original)
+++ camel/branches/camel-2.8.x/camel-core/src/test/java/org/apache/camel/converter/ObjectConverterNaNTest.java Tue Feb 28 11:35:06 2012
@@ -30,50 +30,61 @@ public class ObjectConverterNaNTest exte
 
     public void testDoubleToLongWithNaN() throws Exception {
         assertEquals(Long.valueOf("4"), context.getTypeConverter().convertTo(Long.class, Double.valueOf("4")));
-        assertEquals(Long.valueOf("0"), context.getTypeConverter().convertTo(Long.class, Double.NaN));
+        assertEquals(null, context.getTypeConverter().convertTo(Long.class, Double.NaN));
         assertEquals(Long.valueOf("3"), context.getTypeConverter().convertTo(Long.class, Double.valueOf("3")));
     }
 
     public void testFloatToLongWithNaN() throws Exception {
         assertEquals(Long.valueOf("4"), context.getTypeConverter().convertTo(Long.class, Float.valueOf("4")));
-        assertEquals(Long.valueOf("0"), context.getTypeConverter().convertTo(Long.class, Float.NaN));
+        assertEquals(null, context.getTypeConverter().convertTo(Long.class, Float.NaN));
         assertEquals(Long.valueOf("3"), context.getTypeConverter().convertTo(Long.class, Float.valueOf("3")));
     }
 
     public void testDoubleToIntegerWithNaN() throws Exception {
         assertEquals(Integer.valueOf("4"), context.getTypeConverter().convertTo(Integer.class, Double.valueOf("4")));
-        assertEquals(Integer.valueOf("0"), context.getTypeConverter().convertTo(Integer.class, Double.NaN));
+        assertEquals(null, context.getTypeConverter().convertTo(Integer.class, Double.NaN));
         assertEquals(Integer.valueOf("3"), context.getTypeConverter().convertTo(Integer.class, Double.valueOf("3")));
     }
 
     public void testFloatToIntegerWithNaN() throws Exception {
         assertEquals(Integer.valueOf("4"), context.getTypeConverter().convertTo(Integer.class, Float.valueOf("4")));
-        assertEquals(Integer.valueOf("0"), context.getTypeConverter().convertTo(Integer.class, Float.NaN));
+        assertEquals(null, context.getTypeConverter().convertTo(Integer.class, Float.NaN));
         assertEquals(Integer.valueOf("3"), context.getTypeConverter().convertTo(Integer.class, Float.valueOf("3")));
     }
 
     public void testDoubleToShortWithNaN() throws Exception {
         assertEquals(Short.valueOf("4"), context.getTypeConverter().convertTo(Short.class, Double.valueOf("4")));
-        assertEquals(Short.valueOf("0"), context.getTypeConverter().convertTo(Short.class, Double.NaN));
+        assertEquals(null, context.getTypeConverter().convertTo(Short.class, Double.NaN));
         assertEquals(Short.valueOf("3"), context.getTypeConverter().convertTo(Short.class, Double.valueOf("3")));
     }
 
     public void testFloatToShortWithNaN() throws Exception {
         assertEquals(Short.valueOf("4"), context.getTypeConverter().convertTo(Short.class, Float.valueOf("4")));
-        assertEquals(Short.valueOf("0"), context.getTypeConverter().convertTo(Short.class, Float.NaN));
+        assertEquals(null, context.getTypeConverter().convertTo(Short.class, Float.NaN));
         assertEquals(Short.valueOf("3"), context.getTypeConverter().convertTo(Short.class, Float.valueOf("3")));
     }
 
     public void testDoubleToByteWithNaN() throws Exception {
         assertEquals(Byte.valueOf("4"), context.getTypeConverter().convertTo(Byte.class, Double.valueOf("4")));
-        assertEquals(Byte.valueOf("0"), context.getTypeConverter().convertTo(Byte.class, Double.NaN));
+        assertEquals(null, context.getTypeConverter().convertTo(Byte.class, Double.NaN));
         assertEquals(Byte.valueOf("3"), context.getTypeConverter().convertTo(Byte.class, Double.valueOf("3")));
     }
 
     public void testFloatToByteWithNaN() throws Exception {
         assertEquals(Byte.valueOf("4"), context.getTypeConverter().convertTo(Byte.class, Float.valueOf("4")));
-        assertEquals(Byte.valueOf("0"), context.getTypeConverter().convertTo(Byte.class, Float.NaN));
+        assertEquals(null, context.getTypeConverter().convertTo(Byte.class, Float.NaN));
         assertEquals(Byte.valueOf("3"), context.getTypeConverter().convertTo(Byte.class, Float.valueOf("3")));
     }
 
+    public void testDoubleToFloatWithNaN() throws Exception {
+        assertEquals(Float.valueOf("4"), context.getTypeConverter().convertTo(Float.class, Double.valueOf("4")));
+        assertEquals(Float.NaN, context.getTypeConverter().convertTo(Float.class, Double.NaN));
+        assertEquals(Float.valueOf("3"), context.getTypeConverter().convertTo(Float.class, Double.valueOf("3")));
+    }
+
+    public void testFloatToDoubleWithNaN() throws Exception {
+        assertEquals(Double.valueOf("4"), context.getTypeConverter().convertTo(Double.class, Float.valueOf("4")));
+        assertEquals(Double.NaN, context.getTypeConverter().convertTo(Double.class, Float.NaN));
+        assertEquals(Double.valueOf("3"), context.getTypeConverter().convertTo(Double.class, Float.valueOf("3")));
+    }
 }