Author: davsclaus Date: Tue Feb 28 11:28:34 2012 New Revision: 1294588 URL: http://svn.apache.org/viewvc?rev=1294588&view=rev Log: CAMEL-4959: Type convertion with NaN numbers requires a bit special handling.
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/converter/ObjectConverter.java camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java camel/trunk/camel-core/src/test/java/org/apache/camel/builder/xml/ExtractXPathWithNamespaceTest.java camel/trunk/camel-core/src/test/java/org/apache/camel/converter/ObjectConverterNaNTest.java Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/converter/ObjectConverter.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/converter/ObjectConverter.java?rev=1294588&r1=1294587&r2=1294588&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/converter/ObjectConverter.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/converter/ObjectConverter.java Tue Feb 28 11:28:34 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/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java?rev=1294588&r1=1294587&r2=1294588&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java Tue Feb 28 11:28:34 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/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java?rev=1294588&r1=1294587&r2=1294588&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java Tue Feb 28 11:28:34 2012 @@ -1377,6 +1377,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/trunk/camel-core/src/test/java/org/apache/camel/builder/xml/ExtractXPathWithNamespaceTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/builder/xml/ExtractXPathWithNamespaceTest.java?rev=1294588&r1=1294587&r2=1294588&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/builder/xml/ExtractXPathWithNamespaceTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/builder/xml/ExtractXPathWithNamespaceTest.java Tue Feb 28 11:28:34 2012 @@ -16,6 +16,8 @@ */ package org.apache.camel.builder.xml; +import junit.framework.Assert; + import org.apache.camel.ContextTestSupport; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; @@ -48,11 +50,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/trunk/camel-core/src/test/java/org/apache/camel/converter/ObjectConverterNaNTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/converter/ObjectConverterNaNTest.java?rev=1294588&r1=1294587&r2=1294588&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/converter/ObjectConverterNaNTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/converter/ObjectConverterNaNTest.java Tue Feb 28 11:28:34 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"))); + } }