001 /** 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 package org.apache.camel.converter; 018 019 import java.util.Arrays; 020 import java.util.Collection; 021 import java.util.Collections; 022 import java.util.Iterator; 023 import java.util.List; 024 import org.w3c.dom.Node; 025 import org.w3c.dom.NodeList; 026 027 import org.apache.camel.Converter; 028 029 030 031 /** 032 * Some core java.lang based <a 033 * href="http://activemq.apache.org/camel/type-converter.html">Type Converters</a> 034 * 035 * @version $Revision: 36321 $ 036 */ 037 @Converter 038 public final class ObjectConverter { 039 040 /** 041 * Utility classes should not have a public constructor. 042 */ 043 private ObjectConverter() { 044 } 045 046 public static boolean isCollection(Object value) { 047 // TODO we should handle primitive array types? 048 return value instanceof Collection || (value != null && value.getClass().isArray()); 049 } 050 051 /** 052 * Creates an iterator over the value if the value is a collection, an 053 * Object[] or a primitive type array; otherwise to simplify the caller's 054 * code, we just create a singleton collection iterator over a single value 055 */ 056 @Converter 057 public static Iterator iterator(Object value) { 058 if (value == null) { 059 return Collections.EMPTY_LIST.iterator(); 060 } else if (value instanceof Collection) { 061 Collection collection = (Collection)value; 062 return collection.iterator(); 063 } else if (value.getClass().isArray()) { 064 // TODO we should handle primitive array types? 065 List<Object> list = Arrays.asList((Object[]) value); 066 return list.iterator(); 067 } else if (value instanceof NodeList) { 068 // lets iterate through DOM results after performing XPaths 069 final NodeList nodeList = (NodeList) value; 070 return new Iterator<Node>() { 071 int idx = -1; 072 073 public boolean hasNext() { 074 return ++idx < nodeList.getLength(); 075 } 076 077 public Node next() { 078 return nodeList.item(idx); 079 } 080 081 public void remove() { 082 throw new UnsupportedOperationException(); 083 } 084 }; 085 } else { 086 return Collections.singletonList(value).iterator(); 087 } 088 } 089 090 /** 091 * Converts the given value to a boolean, handling strings or Boolean 092 * objects; otherwise returning false if the value could not be converted to 093 * a boolean 094 */ 095 @Converter 096 public static boolean toBool(Object value) { 097 Boolean answer = toBoolean(value); 098 if (answer != null) { 099 return answer.booleanValue(); 100 } 101 return false; 102 } 103 104 /** 105 * Converts the given value to a Boolean, handling strings or Boolean 106 * objects; otherwise returning null if the value cannot be converted to a 107 * boolean 108 */ 109 @Converter 110 public static Boolean toBoolean(Object value) { 111 if (value instanceof Boolean) { 112 return (Boolean)value; 113 } 114 if (value instanceof String) { 115 return "true".equalsIgnoreCase(value.toString()) ? Boolean.TRUE : Boolean.FALSE; 116 } 117 return null; 118 } 119 120 /** 121 * Returns the boolean value, or null if the value is null 122 */ 123 @Converter 124 public static Boolean toBoolean(Boolean value) { 125 if (value != null) { 126 return value.booleanValue(); 127 } 128 return false; 129 } 130 131 132 /** 133 * Returns the converted value, or null if the value is null 134 */ 135 @Converter 136 public static Byte toByte(Object value) { 137 if (value instanceof Byte) { 138 return (Byte) value; 139 } else if (value instanceof Number) { 140 Number number = (Number) value; 141 return number.byteValue(); 142 } else if (value instanceof String) { 143 return Byte.parseByte((String) value); 144 } else { 145 return null; 146 } 147 } 148 149 @Converter 150 public static byte[] toByteArray(String value) { 151 return value.getBytes(); 152 } 153 154 @Converter 155 public static char[] toCharArray(String value) { 156 return value.toCharArray(); 157 } 158 159 @Converter 160 public static String fromCharArray(char[] value) { 161 return new String(value); 162 } 163 164 /** 165 * Returns the converted value, or null if the value is null 166 */ 167 @Converter 168 public static Short toShort(Object value) { 169 if (value instanceof Short) { 170 return (Short) value; 171 } else if (value instanceof Number) { 172 Number number = (Number) value; 173 return number.shortValue(); 174 } else if (value instanceof String) { 175 return Short.parseShort((String) value); 176 } else { 177 return null; 178 } 179 } 180 181 /** 182 * Returns the converted value, or null if the value is null 183 */ 184 @Converter 185 public static Integer toInteger(Object value) { 186 if (value instanceof Integer) { 187 return (Integer) value; 188 } else if (value instanceof Number) { 189 Number number = (Number) value; 190 return number.intValue(); 191 } else if (value instanceof String) { 192 return Integer.parseInt((String) value); 193 } else { 194 return null; 195 } 196 } 197 198 /** 199 * Returns the converted value, or null if the value is null 200 */ 201 @Converter 202 public static Long toLong(Object value) { 203 if (value instanceof Long) { 204 return (Long) value; 205 } else if (value instanceof Number) { 206 Number number = (Number) value; 207 return number.longValue(); 208 } else if (value instanceof String) { 209 return Long.parseLong((String) value); 210 } else { 211 return null; 212 } 213 } 214 215 /** 216 * Returns the converted value, or null if the value is null 217 */ 218 @Converter 219 public static Float toFloat(Object value) { 220 if (value instanceof Float) { 221 return (Float) value; 222 } else if (value instanceof Number) { 223 Number number = (Number) value; 224 return number.floatValue(); 225 } else if (value instanceof String) { 226 return Float.parseFloat((String) value); 227 } else { 228 return null; 229 } 230 } 231 232 /** 233 * Returns the converted value, or null if the value is null 234 */ 235 @Converter 236 public static Double toDouble(Object value) { 237 if (value instanceof Double) { 238 return (Double) value; 239 } else if (value instanceof Number) { 240 Number number = (Number) value; 241 return number.doubleValue(); 242 } else if (value instanceof String) { 243 return Double.parseDouble((String) value); 244 } else { 245 return null; 246 } 247 } 248 249 250 251 }