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.Collection;
020 import java.util.Iterator;
021
022 import org.apache.camel.Converter;
023 import org.apache.camel.Exchange;
024 import org.apache.camel.util.ObjectHelper;
025
026 /**
027 * Some core java.lang based <a
028 * href="http://camel.apache.org/type-converter.html">Type Converters</a>
029 *
030 * @version
031 */
032 @Converter
033 public final class ObjectConverter {
034
035 /**
036 * Utility classes should not have a public constructor.
037 */
038 private ObjectConverter() {
039 }
040
041 public static boolean isCollection(Object value) {
042 return value instanceof Collection || (value != null && value.getClass().isArray());
043 }
044
045 /**
046 * Converts the given value to a boolean, handling strings or Boolean
047 * objects; otherwise returning false if the value could not be converted to
048 * a boolean
049 */
050 @Converter
051 public static boolean toBool(Object value) {
052 Boolean answer = toBoolean(value);
053 return answer != null && answer;
054 }
055
056 /**
057 * Converts the given value to a Boolean, handling strings or Boolean
058 * objects; otherwise returning null if the value cannot be converted to a
059 * boolean
060 */
061 @Converter
062 public static Boolean toBoolean(Object value) {
063 return ObjectHelper.toBoolean(value);
064 }
065
066 /**
067 * Creates an iterator over the value
068 */
069 @Converter
070 public static Iterator<?> iterator(Object value) {
071 return ObjectHelper.createIterator(value);
072 }
073
074
075 /**
076 * Returns the converted value, or null if the value is null
077 */
078 @Converter
079 public static Byte toByte(Object value) {
080 if (value instanceof Byte) {
081 return (Byte) value;
082 } else if (value instanceof Number) {
083 Number number = (Number) value;
084 return number.byteValue();
085 } else if (value instanceof String) {
086 return Byte.valueOf((String) value);
087 } else {
088 return null;
089 }
090 }
091
092 @Converter
093 public static char[] toCharArray(String value) {
094 return value.toCharArray();
095 }
096
097 @Converter
098 public static char toChar(String value) {
099 // must be string with the length of 1
100 if (value == null || value.length() != 1) {
101 throw new IllegalArgumentException("String must have exactly a length of 1: " + value);
102 }
103 return value.charAt(0);
104 }
105
106 @Converter
107 public static String fromCharArray(char[] value) {
108 return new String(value);
109 }
110
111 /**
112 * Returns the converted value, or null if the value is null
113 */
114 @Converter
115 public static Class<?> toClass(Object value, Exchange exchange) {
116 if (value instanceof Class) {
117 return (Class<?>) value;
118 } else if (value instanceof String) {
119 // prefer to use class resolver API
120 if (exchange != null) {
121 return exchange.getContext().getClassResolver().resolveClass((String) value);
122 } else {
123 return ObjectHelper.loadClass((String) value);
124 }
125 } else {
126 return null;
127 }
128 }
129
130 /**
131 * Returns the converted value, or null if the value is null
132 */
133 @Converter
134 public static Short toShort(Object value) {
135 if (value instanceof Short) {
136 return (Short) value;
137 } else if (value instanceof Number) {
138 Number number = (Number) value;
139 return number.shortValue();
140 } else if (value instanceof String) {
141 return Short.valueOf((String) value);
142 } else {
143 return null;
144 }
145 }
146
147 /**
148 * Returns the converted value, or null if the value is null
149 */
150 @Converter
151 public static Integer toInteger(Object value) {
152 if (value instanceof Integer) {
153 return (Integer) value;
154 } else if (value instanceof Number) {
155 Number number = (Number) value;
156 return number.intValue();
157 } else if (value instanceof String) {
158 return Integer.valueOf((String) value);
159 } else {
160 return null;
161 }
162 }
163
164 /**
165 * Returns the converted value, or null if the value is null
166 */
167 @Converter
168 public static Long toLong(Object value) {
169 if (value instanceof Long) {
170 return (Long) value;
171 } else if (value instanceof Number) {
172 Number number = (Number) value;
173 return number.longValue();
174 } else if (value instanceof String) {
175 return Long.valueOf((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 Float toFloat(Object value) {
186 if (value instanceof Float) {
187 return (Float) value;
188 } else if (value instanceof Number) {
189 if (ObjectHelper.isNaN(value)) {
190 return Float.NaN;
191 }
192 Number number = (Number) value;
193 return number.floatValue();
194 } else if (value instanceof String) {
195 return Float.valueOf((String) value);
196 } else {
197 return null;
198 }
199 }
200
201 /**
202 * Returns the converted value, or null if the value is null
203 */
204 @Converter
205 public static Double toDouble(Object value) {
206 if (value instanceof Double) {
207 return (Double) value;
208 } else if (value instanceof Number) {
209 if (ObjectHelper.isNaN(value)) {
210 return Double.NaN;
211 }
212 Number number = (Number) value;
213 return number.doubleValue();
214 } else if (value instanceof String) {
215 return Double.valueOf((String) value);
216 } else {
217 return null;
218 }
219 }
220
221 // add fast type converters from most common used
222
223 @Converter
224 public static String toString(Integer value) {
225 return value.toString();
226 }
227
228 @Converter
229 public static String toString(Long value) {
230 return value.toString();
231 }
232
233 @Converter
234 public static String toString(Boolean value) {
235 return value.toString();
236 }
237
238 @Converter
239 public static String toString(StringBuffer value) {
240 return value.toString();
241 }
242
243 @Converter
244 public static String toString(StringBuilder value) {
245 return value.toString();
246 }
247
248 @Converter
249 public static Integer toInteger(String value) {
250 return Integer.valueOf(value);
251 }
252
253 @Converter
254 public static Long toLong(String value) {
255 return Long.valueOf(value);
256 }
257
258 @Converter
259 public static Float toFloat(String value) {
260 return Float.valueOf(value);
261 }
262
263 @Converter
264 public static Double toDouble(String value) {
265 return Double.valueOf(value);
266 }
267
268 @Converter
269 public static Boolean toBoolean(String value) {
270 return Boolean.parseBoolean(value);
271 }
272
273 }