Am 10.01.13 21:54 schrieb "Daniel Kulp" unter <[email protected]>:
> >Any particular reason for not just doing: > >java.lang.reflect.Array.getLength(array) > >to get the length and: > >java.lang.reflect.Array.get(array, index); > >to avoid all the casting, instanceofs, etcŠ.? The "get" method will >automatically handle the boxing as well. Yeah that would indeed make it shorter. Thanks for the hint! Babak > > > >Dan > > >On Jan 10, 2013, at 3:44 PM, [email protected] wrote: > >> Author: bvahdat >> Date: Thu Jan 10 20:44:00 2013 >> New Revision: 1431626 >> >> URL: http://svn.apache.org/viewvc?rev=1431626&view=rev >> Log: >> CAMEL-5948: ObjectHelper.createIterator() should properly handle the >>array of primitive types e.g. int[]. >> >> Modified: >> >>camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.j >>ava >> >>camel/trunk/camel-core/src/test/java/org/apache/camel/util/ObjectHelperTe >>st.java >> >> Modified: >>camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.j >>ava >> URL: >>http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apa >>che/camel/util/ObjectHelper.java?rev=1431626&r1=1431625&r2=1431626&view=d >>iff >> >>========================================================================= >>===== >> --- >>camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.j >>ava (original) >> +++ >>camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.j >>ava Thu Jan 10 20:44:00 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/trunk/camel-core/src/test/java/org/apache/camel/util/ObjectHelperTe >>st.java >> URL: >>http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apa >>che/camel/util/ObjectHelperTest.java?rev=1431626&r1=1431625&r2=1431626&vi >>ew=diff >> >>========================================================================= >>===== >> --- >>camel/trunk/camel-core/src/test/java/org/apache/camel/util/ObjectHelperTe >>st.java (original) >> +++ >>camel/trunk/camel-core/src/test/java/org/apache/camel/util/ObjectHelperTe >>st.java Thu Jan 10 20:44:00 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")); >> >> > >-- >Daniel Kulp >[email protected] - http://dankulp.com/blog >Talend Community Coder - http://coders.talend.com >
