You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by bv...@apache.org on 2013/01/10 21:48:08 UTC

svn commit: r1431631 - in /camel/branches/camel-2.9.x: ./ camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java camel-core/src/test/java/org/apache/camel/util/ObjectHelperTest.java

Author: bvahdat
Date: Thu Jan 10 20:48:08 2013
New Revision: 1431631

URL: http://svn.apache.org/viewvc?rev=1431631&view=rev
Log:
Merged revisions 1431630 via svnmerge from 
https://svn.apache.org/repos/asf/camel/branches/camel-2.10.x

................
  r1431630 | bvahdat | 2013-01-10 21:46:27 +0100 (Do, 10 Jan 2013) | 9 lines
  
  Merged revisions 1431626 via svnmerge from 
  https://svn.apache.org/repos/asf/camel/trunk
  
  ........
    r1431626 | bvahdat | 2013-01-10 21:44:00 +0100 (Do, 10 Jan 2013) | 1 line
    
    CAMEL-5948: ObjectHelper.createIterator() should properly handle the array of primitive types e.g. int[].
  ........
................

Modified:
    camel/branches/camel-2.9.x/   (props changed)
    camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java
    camel/branches/camel-2.9.x/camel-core/src/test/java/org/apache/camel/util/ObjectHelperTest.java

Propchange: camel/branches/camel-2.9.x/
------------------------------------------------------------------------------
  Merged /camel/trunk:r1431626
  Merged /camel/branches/camel-2.10.x:r1431630

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

Modified: camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java
URL: http://svn.apache.org/viewvc/camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java?rev=1431631&r1=1431630&r2=1431631&view=diff
==============================================================================
--- camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java (original)
+++ camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java Thu Jan 10 20:48:08 2013
@@ -64,6 +64,12 @@ import org.slf4j.LoggerFactory;
 public final class ObjectHelper {
     private static final transient Logger LOG = LoggerFactory.getLogger(ObjectHelper.class);
     private static final String DEFAULT_DELIMITER = ",";
+    @SuppressWarnings("unchecked")
+    private static final List<?> PRIMITIVE_TYPES = Arrays.asList(byte.class, short.class, int.class, long.class,
+                                                                 float.class, double.class, char.class, boolean.class, void.class);
+    @SuppressWarnings("unchecked")
+    private static final List<?> PRIMITIVE_ARRAY_TYPES = Arrays.asList(byte[].class, short[].class, int[].class, long[].class,
+                                                                       float[].class, double[].class, char[].class, boolean[].class);
 
     /**
      * Utility classes should not have a public constructor.
@@ -493,7 +499,12 @@ public final class ObjectHelper {
      * Object[], a String with values separated by the given delimiter,
      * or a primitive type array; otherwise to simplify the caller's
      * code, we just create a singleton collection iterator over a single value
-     *
+     * 
+     * </p> In case of primitive type arrays the returned {@code Iterator} iterates
+     * over the corresponding Java primitive wrapper objects of the given elements
+     * inside the {@code value} array. That's we get an autoboxing of the primitive
+     * types here for free as it's also the case in Java language itself.
+     * 
      * @param value             the value
      * @param delimiter         delimiter for separating String values
      * @param allowEmptyValues  whether to allow empty values
@@ -514,9 +525,79 @@ public final class ObjectHelper {
         } else if (value instanceof Iterable) {
             return ((Iterable<Object>)value).iterator();
         } else if (value.getClass().isArray()) {
-            // TODO we should handle primitive array types?
-            List<Object> list = Arrays.asList((Object[])value);
-            return list.iterator();
+            if (isPrimitiveArrayType(value.getClass())) {
+                final Object array = value;
+                return new Iterator<Object>() {
+                    int idx = -1;
+
+                    public boolean hasNext() {
+                        return (idx + 1) < length();
+                    }
+
+                    public Object next() {
+                        idx++;
+                        return current(idx);
+                    }
+
+                    public void remove() {
+                        throw new UnsupportedOperationException();
+                    }
+
+                    private int length() {
+                        int answer = 0;
+                        if (array instanceof byte[]) {
+                            answer = ((byte[]) array).length;
+                        } else if (array instanceof short[]) {
+                            answer = ((short[]) array).length;
+                        } else if (array instanceof int[]) {
+                            answer = ((int[]) array).length;
+                        } else if (array instanceof long[]) {
+                            answer = ((long[]) array).length;
+                        } else if (array instanceof float[]) {
+                            answer = ((float[]) array).length;
+                        } else if (array instanceof double[]) {
+                            answer = ((double[]) array).length;
+                        } else if (array instanceof char[]) {
+                            answer = ((char[]) array).length;
+                        } else if (array instanceof boolean[]) {
+                            answer = ((boolean[]) array).length;
+                        } else {
+                            throw new IllegalStateException("Unexpected type for " + array);
+                        }
+
+                        return answer;
+                    }
+
+                    private Object current(int index) {
+                        Object answer = 0;
+                        if (array instanceof byte[]) {
+                            answer = Byte.valueOf(((byte[]) array)[index]);
+                        } else if (array instanceof short[]) {
+                            answer = Short.valueOf(((short[]) array)[index]);
+                        } else if (array instanceof int[]) {
+                            answer = Integer.valueOf(((int[]) array)[index]);
+                        } else if (array instanceof long[]) {
+                            answer = Long.valueOf(((long[]) array)[index]);
+                        } else if (array instanceof float[]) {
+                            answer = Float.valueOf(((float[]) array)[index]);
+                        } else if (array instanceof double[]) {
+                            answer = Double.valueOf(((double[]) array)[index]);
+                        } else if (array instanceof char[]) {
+                            answer = Character.valueOf(((char[]) array)[index]);
+                        } else if (array instanceof boolean[]) {
+                            answer = Boolean.valueOf(((boolean[]) array)[index]);
+                        } else {
+                            throw new IllegalStateException("Unexpected type for " + array);
+                        }
+
+                        return answer;
+                    }
+
+                };
+            } else {
+                List<Object> list = Arrays.asList((Object[]) value);
+                return list.iterator();
+            }
         } else if (value instanceof NodeList) {
             // lets iterate through DOM results after performing XPaths
             final NodeList nodeList = (NodeList) value;
@@ -1054,6 +1135,26 @@ public final class ObjectHelper {
     }
 
     /**
+     * Returns if the given {@code clazz} type is a Java primitive type.
+     * 
+     * @param clazz the Java type to be checked
+     * @return {@code true} if the given type is a Java primitive type
+     */
+    public static boolean isPrimitiveType(Class<?> clazz) {
+        return PRIMITIVE_TYPES.contains(clazz);
+    }
+
+    /**
+     * Returns if the given {@code clazz} type is a Java primitive array type.
+     * 
+     * @param clazz the Java type to be checked
+     * @return {@code true} if the given type is a Java primitive array type
+     */
+    public static boolean isPrimitiveArrayType(Class<?> clazz) {
+        return PRIMITIVE_ARRAY_TYPES.contains(clazz);
+    }
+
+    /**
      * Converts primitive types such as int to its wrapper type like
      * {@link Integer}
      */

Modified: camel/branches/camel-2.9.x/camel-core/src/test/java/org/apache/camel/util/ObjectHelperTest.java
URL: http://svn.apache.org/viewvc/camel/branches/camel-2.9.x/camel-core/src/test/java/org/apache/camel/util/ObjectHelperTest.java?rev=1431631&r1=1431630&r2=1431631&view=diff
==============================================================================
--- camel/branches/camel-2.9.x/camel-core/src/test/java/org/apache/camel/util/ObjectHelperTest.java (original)
+++ camel/branches/camel-2.9.x/camel-core/src/test/java/org/apache/camel/util/ObjectHelperTest.java Thu Jan 10 20:48:08 2013
@@ -25,6 +25,8 @@ import java.util.Iterator;
 import java.util.List;
 
 import junit.framework.TestCase;
+
+import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
 import org.apache.camel.component.bean.MyStaticClass;
@@ -184,6 +186,173 @@ public class ObjectHelperTest extends Te
         assertEquals("bean:bar?method=cool('A','Hello,World')", it.next());
     }
 
+    public void testCreateIteratorWithPrimitiveArrayTypes() {
+        Iterator<?> it = ObjectHelper.createIterator(new byte[] {13, Byte.MAX_VALUE, 7, Byte.MIN_VALUE}, null);
+        assertTrue(it.hasNext());
+        assertEquals(Byte.valueOf((byte) 13), it.next());
+        assertTrue(it.hasNext());
+        assertEquals(Byte.MAX_VALUE, it.next());
+        assertTrue(it.hasNext());
+        assertEquals(Byte.valueOf((byte) 7), it.next());
+        assertTrue(it.hasNext());
+        assertEquals(Byte.MIN_VALUE, it.next());
+        assertFalse(it.hasNext());
+
+        it = ObjectHelper.createIterator(new byte[] {}, null);
+        assertFalse(it.hasNext());
+
+        it = ObjectHelper.createIterator(new short[] {13, Short.MAX_VALUE, 7, Short.MIN_VALUE}, null);
+        assertTrue(it.hasNext());
+        assertEquals(Short.valueOf((short) 13), it.next());
+        assertTrue(it.hasNext());
+        assertEquals(Short.MAX_VALUE, it.next());
+        assertTrue(it.hasNext());
+        assertEquals(Short.valueOf((short) 7), it.next());
+        assertTrue(it.hasNext());
+        assertEquals(Short.MIN_VALUE, it.next());
+        assertFalse(it.hasNext());
+
+        it = ObjectHelper.createIterator(new short[] {}, null);
+        assertFalse(it.hasNext());
+
+        it = ObjectHelper.createIterator(new int[] {13, Integer.MAX_VALUE, 7, Integer.MIN_VALUE}, null);
+        assertTrue(it.hasNext());
+        assertEquals(Integer.valueOf(13), it.next());
+        assertTrue(it.hasNext());
+        assertEquals(Integer.MAX_VALUE, it.next());
+        assertTrue(it.hasNext());
+        assertEquals(Integer.valueOf(7), it.next());
+        assertTrue(it.hasNext());
+        assertEquals(Integer.MIN_VALUE, it.next());
+        assertFalse(it.hasNext());
+
+        it = ObjectHelper.createIterator(new int[] {}, null);
+        assertFalse(it.hasNext());
+
+        it = ObjectHelper.createIterator(new long[] {13, Long.MAX_VALUE, 7, Long.MIN_VALUE}, null);
+        assertTrue(it.hasNext());
+        assertEquals(Long.valueOf(13), it.next());
+        assertTrue(it.hasNext());
+        assertEquals(Long.MAX_VALUE, it.next());
+        assertTrue(it.hasNext());
+        assertEquals(Long.valueOf(7), it.next());
+        assertTrue(it.hasNext());
+        assertEquals(Long.MIN_VALUE, it.next());
+        assertFalse(it.hasNext());
+
+        it = ObjectHelper.createIterator(new long[] {}, null);
+        assertFalse(it.hasNext());
+
+        it = ObjectHelper.createIterator(new float[] {13.7F, Float.MAX_VALUE, 7.13F, Float.MIN_VALUE}, null);
+        assertTrue(it.hasNext());
+        assertEquals(Float.valueOf(13.7F), it.next());
+        assertTrue(it.hasNext());
+        assertEquals(Float.MAX_VALUE, it.next());
+        assertTrue(it.hasNext());
+        assertEquals(Float.valueOf(7.13F), it.next());
+        assertTrue(it.hasNext());
+        assertEquals(Float.MIN_VALUE, it.next());
+        assertFalse(it.hasNext());
+
+        it = ObjectHelper.createIterator(new float[] {}, null);
+        assertFalse(it.hasNext());
+
+        it = ObjectHelper.createIterator(new double[] {13.7D, Double.MAX_VALUE, 7.13D, Double.MIN_VALUE}, null);
+        assertTrue(it.hasNext());
+        assertEquals(Double.valueOf(13.7D), it.next());
+        assertTrue(it.hasNext());
+        assertEquals(Double.MAX_VALUE, it.next());
+        assertTrue(it.hasNext());
+        assertEquals(Double.valueOf(7.13D), it.next());
+        assertTrue(it.hasNext());
+        assertEquals(Double.MIN_VALUE, it.next());
+        assertFalse(it.hasNext());
+
+        it = ObjectHelper.createIterator(new double[] {}, null);
+        assertFalse(it.hasNext());
+
+        it = ObjectHelper.createIterator(new char[] {'C', 'a', 'm', 'e', 'l'}, null);
+        assertTrue(it.hasNext());
+        assertEquals(Character.valueOf('C'), it.next());
+        assertTrue(it.hasNext());
+        assertEquals(Character.valueOf('a'), it.next());
+        assertTrue(it.hasNext());
+        assertEquals(Character.valueOf('m'), it.next());
+        assertTrue(it.hasNext());
+        assertEquals(Character.valueOf('e'), it.next());
+        assertTrue(it.hasNext());
+        assertEquals(Character.valueOf('l'), it.next());
+        assertFalse(it.hasNext());
+
+        it = ObjectHelper.createIterator(new char[] {}, null);
+        assertFalse(it.hasNext());
+
+        it = ObjectHelper.createIterator(new boolean[] {false, true, false, true, true}, null);
+        assertTrue(it.hasNext());
+        assertEquals(Boolean.FALSE, it.next());
+        assertTrue(it.hasNext());
+        assertEquals(Boolean.TRUE, it.next());
+        assertTrue(it.hasNext());
+        assertEquals(Boolean.FALSE, it.next());
+        assertTrue(it.hasNext());
+        assertEquals(Boolean.TRUE, it.next());
+        assertTrue(it.hasNext());
+        assertEquals(Boolean.TRUE, it.next());
+        assertFalse(it.hasNext());
+
+        it = ObjectHelper.createIterator(new boolean[] {}, null);
+        assertFalse(it.hasNext());
+    }
+
+    public void testIsPrimitiveType() {
+        assertTrue(ObjectHelper.isPrimitiveType(byte.class));
+        assertTrue(ObjectHelper.isPrimitiveType(short.class));
+        assertTrue(ObjectHelper.isPrimitiveType(int.class));
+        assertTrue(ObjectHelper.isPrimitiveType(long.class));
+        assertTrue(ObjectHelper.isPrimitiveType(float.class));
+        assertTrue(ObjectHelper.isPrimitiveType(double.class));
+        assertTrue(ObjectHelper.isPrimitiveType(char.class));
+        assertTrue(ObjectHelper.isPrimitiveType(boolean.class));
+        assertTrue(ObjectHelper.isPrimitiveType(void.class));
+
+        assertFalse(ObjectHelper.isPrimitiveType(Object.class));
+        assertFalse(ObjectHelper.isPrimitiveType(Byte.class));
+        assertFalse(ObjectHelper.isPrimitiveType(Short.class));
+        assertFalse(ObjectHelper.isPrimitiveType(Integer.class));
+        assertFalse(ObjectHelper.isPrimitiveType(Long.class));
+        assertFalse(ObjectHelper.isPrimitiveType(Float.class));
+        assertFalse(ObjectHelper.isPrimitiveType(Double.class));
+        assertFalse(ObjectHelper.isPrimitiveType(Character.class));
+        assertFalse(ObjectHelper.isPrimitiveType(Boolean.class));
+        assertFalse(ObjectHelper.isPrimitiveType(Void.class));
+        assertFalse(ObjectHelper.isPrimitiveType(CamelContext.class));
+        assertFalse(ObjectHelper.isPrimitiveType(null));
+    }
+
+    public void testIsPrimitiveArrayType() {
+        assertTrue(ObjectHelper.isPrimitiveArrayType(byte[].class));
+        assertTrue(ObjectHelper.isPrimitiveArrayType(short[].class));
+        assertTrue(ObjectHelper.isPrimitiveArrayType(int[].class));
+        assertTrue(ObjectHelper.isPrimitiveArrayType(long[].class));
+        assertTrue(ObjectHelper.isPrimitiveArrayType(float[].class));
+        assertTrue(ObjectHelper.isPrimitiveArrayType(double[].class));
+        assertTrue(ObjectHelper.isPrimitiveArrayType(char[].class));
+        assertTrue(ObjectHelper.isPrimitiveArrayType(boolean[].class));
+
+        assertFalse(ObjectHelper.isPrimitiveArrayType(Object[].class));
+        assertFalse(ObjectHelper.isPrimitiveArrayType(Byte[].class));
+        assertFalse(ObjectHelper.isPrimitiveArrayType(Short[].class));
+        assertFalse(ObjectHelper.isPrimitiveArrayType(Integer[].class));
+        assertFalse(ObjectHelper.isPrimitiveArrayType(Long[].class));
+        assertFalse(ObjectHelper.isPrimitiveArrayType(Float[].class));
+        assertFalse(ObjectHelper.isPrimitiveArrayType(Double[].class));
+        assertFalse(ObjectHelper.isPrimitiveArrayType(Character[].class));
+        assertFalse(ObjectHelper.isPrimitiveArrayType(Boolean[].class));
+        assertFalse(ObjectHelper.isPrimitiveArrayType(Void[].class));
+        assertFalse(ObjectHelper.isPrimitiveArrayType(CamelContext[].class));
+        assertFalse(ObjectHelper.isPrimitiveArrayType(null));
+    }
+
     public void testBefore() {
         assertEquals("Hello ", ObjectHelper.before("Hello World", "World"));
         assertEquals("Hello ", ObjectHelper.before("Hello World Again", "World"));