Rev 22 | Rev 139 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
2 | soliveira | 1 | package org.mentacontainer.util; |
2 | |||
3 | import java.lang.reflect.Field; |
||
4 | import java.lang.reflect.InvocationTargetException; |
||
5 | import java.lang.reflect.Method; |
||
6 | import java.util.ArrayList; |
||
7 | import java.util.HashMap; |
||
8 | import java.util.Iterator; |
||
9 | import java.util.List; |
||
10 | import java.util.Map; |
||
11 | |||
12 | public class InjectionUtils { |
||
13 | |||
22 | soliveira | 14 | /** |
15 | * The character used to separate the prefix from the value name when you are using the getObject method with a prefix. You can change the value of this prefix if you want to |
||
16 | * by changing this static variable. |
||
17 | * |
||
18 | * Ex: getObject(User.class, "user") will get all values that begin with "user.". |
||
19 | */ |
||
20 | public static char PREFIX_SEPARATOR = '.'; |
||
2 | soliveira | 21 | |
22 | soliveira | 22 | private static Map<Class<? extends Object>, Map<String, Object>> settersMaps = new HashMap<Class<? extends Object>, Map<String, Object>>(); |
2 | soliveira | 23 | |
22 | soliveira | 24 | private static Map<Class<? extends Object>, Map<String, Object>> fieldsMaps = new HashMap<Class<? extends Object>, Map<String, Object>>(); |
2 | soliveira | 25 | |
22 | soliveira | 26 | public static void prepareForInjection(Class<? extends Object> klass, Map<String, Object> setters, Map<String, Object> fields) { |
2 | soliveira | 27 | |
22 | soliveira | 28 | StringBuffer sb = new StringBuffer(32); |
2 | soliveira | 29 | |
22 | soliveira | 30 | Method[] methods = klass.getMethods(); |
2 | soliveira | 31 | |
22 | soliveira | 32 | for (int i = 0; i < methods.length; i++) { |
2 | soliveira | 33 | |
22 | soliveira | 34 | Method m = methods[i]; |
2 | soliveira | 35 | |
22 | soliveira | 36 | String name = m.getName(); |
2 | soliveira | 37 | |
22 | soliveira | 38 | Class<?>[] types = m.getParameterTypes(); |
2 | soliveira | 39 | |
22 | soliveira | 40 | if (name.startsWith("set") && name.length() > 3 && types.length == 1) { |
2 | soliveira | 41 | |
22 | soliveira | 42 | String var = name.substring(3); |
2 | soliveira | 43 | |
22 | soliveira | 44 | if (var.length() > 1) { |
2 | soliveira | 45 | |
22 | soliveira | 46 | sb.delete(0, sb.length()); |
2 | soliveira | 47 | |
22 | soliveira | 48 | sb.append(var.substring(0, 1).toLowerCase()); |
2 | soliveira | 49 | |
22 | soliveira | 50 | sb.append(var.substring(1)); |
2 | soliveira | 51 | |
22 | soliveira | 52 | var = sb.toString(); |
2 | soliveira | 53 | |
22 | soliveira | 54 | } else { |
2 | soliveira | 55 | |
22 | soliveira | 56 | var = var.toLowerCase(); |
57 | } |
||
2 | soliveira | 58 | |
22 | soliveira | 59 | m.setAccessible(true); |
2 | soliveira | 60 | |
22 | soliveira | 61 | if (setters.containsKey(var)) { |
2 | soliveira | 62 | |
22 | soliveira | 63 | Object obj = setters.get(var); |
2 | soliveira | 64 | |
22 | soliveira | 65 | if (obj instanceof List) { |
2 | soliveira | 66 | |
22 | soliveira | 67 | List<Method> list = (List<Method>) obj; |
2 | soliveira | 68 | |
22 | soliveira | 69 | list.add(m); |
2 | soliveira | 70 | |
22 | soliveira | 71 | } else if (obj instanceof Method) { |
2 | soliveira | 72 | |
22 | soliveira | 73 | List<Method> list = new ArrayList<Method>(); |
2 | soliveira | 74 | |
22 | soliveira | 75 | list.add((Method) obj); |
2 | soliveira | 76 | |
22 | soliveira | 77 | list.add(m); |
2 | soliveira | 78 | |
22 | soliveira | 79 | setters.put(var, list); |
2 | soliveira | 80 | |
22 | soliveira | 81 | } |
2 | soliveira | 82 | |
22 | soliveira | 83 | } else { |
2 | soliveira | 84 | |
22 | soliveira | 85 | setters.put(var, m); |
2 | soliveira | 86 | |
22 | soliveira | 87 | } |
88 | } |
||
2 | soliveira | 89 | } |
90 | |||
22 | soliveira | 91 | if (fields == null) return; |
2 | soliveira | 92 | |
22 | soliveira | 93 | Field[] f = klass.getDeclaredFields(); |
2 | soliveira | 94 | |
22 | soliveira | 95 | for (int i = 0; i < f.length; i++) { |
2 | soliveira | 96 | |
22 | soliveira | 97 | Field field = f[i]; |
2 | soliveira | 98 | |
22 | soliveira | 99 | field.setAccessible(true); |
2 | soliveira | 100 | |
22 | soliveira | 101 | String name = field.getName(); |
2 | soliveira | 102 | |
22 | soliveira | 103 | if (setters.containsKey(name)) { |
2 | soliveira | 104 | |
22 | soliveira | 105 | Object obj = setters.get(name); |
2 | soliveira | 106 | |
22 | soliveira | 107 | if (obj instanceof Method) { |
2 | soliveira | 108 | |
22 | soliveira | 109 | Method m = (Method) obj; |
2 | soliveira | 110 | |
22 | soliveira | 111 | Class<?>[] types = m.getParameterTypes(); |
2 | soliveira | 112 | |
22 | soliveira | 113 | Class<?> type = field.getType(); |
2 | soliveira | 114 | |
22 | soliveira | 115 | if (type.isAssignableFrom(types[0])) continue; |
2 | soliveira | 116 | |
22 | soliveira | 117 | } else if (obj instanceof List) { |
2 | soliveira | 118 | |
22 | soliveira | 119 | List<Method> list = (List<Method>) obj; |
2 | soliveira | 120 | |
22 | soliveira | 121 | Iterator<Method> iter = list.iterator(); |
2 | soliveira | 122 | |
22 | soliveira | 123 | boolean found = false; |
2 | soliveira | 124 | |
22 | soliveira | 125 | while (iter.hasNext()) { |
2 | soliveira | 126 | |
22 | soliveira | 127 | Method m = iter.next(); |
2 | soliveira | 128 | |
22 | soliveira | 129 | Class<?>[] types = m.getParameterTypes(); |
2 | soliveira | 130 | |
22 | soliveira | 131 | Class<?> type = field.getType(); |
2 | soliveira | 132 | |
22 | soliveira | 133 | if (type.isAssignableFrom(types[0])) { |
2 | soliveira | 134 | |
22 | soliveira | 135 | found = true; |
2 | soliveira | 136 | |
22 | soliveira | 137 | break; |
138 | } |
||
139 | } |
||
140 | |||
141 | if (found) continue; |
||
142 | } |
||
4 | soliveira | 143 | } |
2 | soliveira | 144 | |
22 | soliveira | 145 | fields.put(name, field); |
2 | soliveira | 146 | |
4 | soliveira | 147 | } |
22 | soliveira | 148 | } |
2 | soliveira | 149 | |
22 | soliveira | 150 | public static boolean checkPrimitives(Class<? extends Object> target, Class<? extends Object> source) { |
2 | soliveira | 151 | |
22 | soliveira | 152 | if (target.equals(int.class) && source.equals(Integer.class)) return true; |
2 | soliveira | 153 | |
22 | soliveira | 154 | if (target.equals(boolean.class) && source.equals(Boolean.class)) return true; |
2 | soliveira | 155 | |
22 | soliveira | 156 | if (target.equals(byte.class) && source.equals(Byte.class)) return true; |
2 | soliveira | 157 | |
22 | soliveira | 158 | if (target.equals(short.class) && source.equals(Short.class)) return true; |
2 | soliveira | 159 | |
22 | soliveira | 160 | if (target.equals(char.class) && source.equals(Character.class)) return true; |
2 | soliveira | 161 | |
22 | soliveira | 162 | if (target.equals(long.class) && source.equals(Long.class)) return true; |
2 | soliveira | 163 | |
22 | soliveira | 164 | if (target.equals(float.class) && source.equals(Float.class)) return true; |
2 | soliveira | 165 | |
22 | soliveira | 166 | if (target.equals(double.class) && source.equals(Double.class)) return true; |
2 | soliveira | 167 | |
22 | soliveira | 168 | return false; |
2 | soliveira | 169 | |
22 | soliveira | 170 | } |
2 | soliveira | 171 | |
22 | soliveira | 172 | public static Object tryToConvert(Object source, Class<? extends Object> targetType) { |
2 | soliveira | 173 | |
22 | soliveira | 174 | return tryToConvert(source, targetType, false); |
175 | } |
||
2 | soliveira | 176 | |
22 | soliveira | 177 | public static Object tryToConvert(Object source, Class<?> targetType, boolean tryNumber) { |
2 | soliveira | 178 | |
22 | soliveira | 179 | String value = null; |
4 | soliveira | 180 | |
22 | soliveira | 181 | if (source instanceof String) { |
4 | soliveira | 182 | |
22 | soliveira | 183 | value = (String) source; |
4 | soliveira | 184 | |
22 | soliveira | 185 | } else if (tryNumber && source instanceof Number) { |
4 | soliveira | 186 | |
22 | soliveira | 187 | value = source.toString(); |
4 | soliveira | 188 | |
22 | soliveira | 189 | } else { |
4 | soliveira | 190 | |
22 | soliveira | 191 | return null; |
192 | } |
||
4 | soliveira | 193 | |
22 | soliveira | 194 | Object newValue = null; |
4 | soliveira | 195 | |
22 | soliveira | 196 | String className = targetType.getName(); |
2 | soliveira | 197 | |
22 | soliveira | 198 | if (className.equals("int") || className.equals("java.lang.Integer")) { |
199 | int x = -1; |
||
200 | try { |
||
201 | x = Integer.parseInt(value); |
||
202 | } catch (Exception e) { |
||
203 | return null; |
||
204 | } |
||
205 | newValue = new Integer(x); |
||
206 | } else if (className.equals("short") || className.equals("java.lang.Short")) { |
||
207 | short x = -1; |
||
208 | try { |
||
209 | x = Short.parseShort(value); |
||
210 | } catch (Exception e) { |
||
211 | return null; |
||
212 | } |
||
213 | newValue = new Short(x); |
||
2 | soliveira | 214 | |
22 | soliveira | 215 | } else if (className.equals("char") || className.equals("java.lang.Character")) { |
2 | soliveira | 216 | |
22 | soliveira | 217 | if (value.length() != 1) { |
218 | return null; |
||
219 | } |
||
2 | soliveira | 220 | |
22 | soliveira | 221 | newValue = new Character(value.charAt(0)); |
2 | soliveira | 222 | |
22 | soliveira | 223 | } else if (className.equals("long") || className.equals("java.lang.Long")) { |
224 | long x = -1; |
||
225 | try { |
||
226 | x = Long.parseLong(value); |
||
227 | } catch (Exception e) { |
||
228 | return null; |
||
229 | } |
||
230 | newValue = new Long(x); |
||
231 | } else if (className.equals("float") || className.equals("java.lang.Float")) { |
||
232 | float x = -1; |
||
233 | try { |
||
234 | x = Float.parseFloat(value); |
||
235 | } catch (Exception e) { |
||
236 | return null; |
||
237 | } |
||
238 | newValue = new Float(x); |
||
239 | } else if (className.equals("double") || className.equals("java.lang.Double")) { |
||
240 | double x = -1; |
||
241 | try { |
||
242 | x = Double.parseDouble(value); |
||
243 | } catch (Exception e) { |
||
244 | return null; |
||
245 | } |
||
246 | newValue = new Double(x); |
||
247 | } else if (className.equals("boolean") || className.equals("java.lang.Boolean")) { |
||
248 | try { |
||
249 | int x = Integer.parseInt(value); |
||
250 | if (x == 1) { |
||
251 | newValue = Boolean.TRUE; |
||
252 | } else if (x == 0) { |
||
253 | newValue = Boolean.FALSE; |
||
254 | } else { |
||
255 | return null; |
||
256 | } |
||
257 | } catch (Exception e) { |
||
258 | if (value.equalsIgnoreCase("true") || value.equals("on")) { |
||
259 | newValue = Boolean.TRUE; |
||
260 | } else if (value.equalsIgnoreCase("false")) { |
||
261 | newValue = Boolean.FALSE; |
||
262 | } else { |
||
263 | return null; |
||
264 | } |
||
265 | } |
||
266 | } else if (targetType.isEnum()) { |
||
2 | soliveira | 267 | |
22 | soliveira | 268 | try { |
269 | |||
270 | Class k = (Class) targetType; // not sure how to avoid this raw type! |
||
2 | soliveira | 271 | |
22 | soliveira | 272 | newValue = Enum.valueOf(k, value); |
2 | soliveira | 273 | |
22 | soliveira | 274 | } catch (Exception e) { |
2 | soliveira | 275 | |
22 | soliveira | 276 | return null; |
277 | } |
||
2 | soliveira | 278 | |
22 | soliveira | 279 | } |
2 | soliveira | 280 | |
22 | soliveira | 281 | return newValue; |
2 | soliveira | 282 | |
4 | soliveira | 283 | } |
2 | soliveira | 284 | |
22 | soliveira | 285 | public static Object shouldConvertToNull(Object value, Class<? extends Object> targetType) { |
2 | soliveira | 286 | |
22 | soliveira | 287 | if (targetType.equals(String.class)) { |
2 | soliveira | 288 | |
22 | soliveira | 289 | return value; |
2 | soliveira | 290 | |
22 | soliveira | 291 | } else if (targetType.isPrimitive()) { |
2 | soliveira | 292 | |
22 | soliveira | 293 | return value; |
294 | } |
||
2 | soliveira | 295 | |
22 | soliveira | 296 | return null; |
4 | soliveira | 297 | } |
2 | soliveira | 298 | |
22 | soliveira | 299 | public static Class<? extends Object> getPrimitiveFrom(Object w) { |
300 | if (w instanceof Boolean) { |
||
301 | return Boolean.TYPE; |
||
302 | } else if (w instanceof Byte) { |
||
303 | return Byte.TYPE; |
||
304 | } else if (w instanceof Short) { |
||
305 | return Short.TYPE; |
||
306 | } else if (w instanceof Character) { |
||
307 | return Character.TYPE; |
||
308 | } else if (w instanceof Integer) { |
||
309 | return Integer.TYPE; |
||
310 | } else if (w instanceof Long) { |
||
311 | return Long.TYPE; |
||
312 | } else if (w instanceof Float) { |
||
313 | return Float.TYPE; |
||
314 | } else if (w instanceof Double) { |
||
315 | return Double.TYPE; |
||
316 | } |
||
317 | return null; |
||
2 | soliveira | 318 | } |
319 | |||
22 | soliveira | 320 | public static Class<? extends Object> getPrimitiveFrom(Class<? extends Object> klass) { |
2 | soliveira | 321 | |
22 | soliveira | 322 | String s = klass.getName(); |
2 | soliveira | 323 | |
22 | soliveira | 324 | if (s.equals("java.lang.Boolean")) { |
325 | return Boolean.TYPE; |
||
326 | } else if (s.equals("java.lang.Byte")) { |
||
327 | return Byte.TYPE; |
||
328 | } else if (s.equals("java.lang.Short")) { |
||
329 | return Short.TYPE; |
||
330 | } else if (s.equals("java.lang.Character")) { |
||
331 | return Character.TYPE; |
||
332 | } else if (s.equals("java.lang.Integer")) { |
||
333 | return Integer.TYPE; |
||
334 | } else if (s.equals("java.lang.Long")) { |
||
335 | return Long.TYPE; |
||
336 | } else if (s.equals("java.lang.Float")) { |
||
337 | return Float.TYPE; |
||
338 | } else if (s.equals("java.lang.Double")) { |
||
339 | return Double.TYPE; |
||
340 | } |
||
341 | return null; |
||
4 | soliveira | 342 | } |
2 | soliveira | 343 | |
22 | soliveira | 344 | public static Field getField(Object target, String name) { |
345 | return getField(target.getClass(), name); |
||
346 | } |
||
2 | soliveira | 347 | |
22 | soliveira | 348 | public static Field getField(Class<? extends Object> target, String name) { |
349 | Field fields[] = target.getDeclaredFields(); |
||
350 | for (int i = 0; i < fields.length; i++) { |
||
351 | if (name.equals(fields[i].getName())) { |
||
352 | return fields[i]; |
||
353 | } |
||
354 | } |
||
355 | return null; |
||
2 | soliveira | 356 | } |
357 | |||
22 | soliveira | 358 | public static Method findMethodToGet(Class<? extends Object> target, String name) { |
2 | soliveira | 359 | |
22 | soliveira | 360 | StringBuffer sb = new StringBuffer(128); |
2 | soliveira | 361 | |
22 | soliveira | 362 | sb.append("get").append(name.substring(0, 1).toUpperCase()); |
2 | soliveira | 363 | |
22 | soliveira | 364 | if (name.length() > 1) sb.append(name.substring(1)); |
4 | soliveira | 365 | |
22 | soliveira | 366 | try { |
4 | soliveira | 367 | |
22 | soliveira | 368 | return target.getMethod(sb.toString(), (Class[]) null); |
4 | soliveira | 369 | |
22 | soliveira | 370 | } catch (Exception e) { |
4 | soliveira | 371 | |
22 | soliveira | 372 | } |
2 | soliveira | 373 | |
22 | soliveira | 374 | sb.setLength(0); |
4 | soliveira | 375 | |
22 | soliveira | 376 | sb.append("is").append(name.substring(0, 1).toUpperCase()); |
4 | soliveira | 377 | |
22 | soliveira | 378 | if (name.length() > 1) { |
4 | soliveira | 379 | |
22 | soliveira | 380 | sb.append(name.substring(1)); |
381 | } |
||
2 | soliveira | 382 | |
22 | soliveira | 383 | try { |
4 | soliveira | 384 | |
22 | soliveira | 385 | return target.getMethod(sb.toString(), (Class[]) null); |
4 | soliveira | 386 | |
22 | soliveira | 387 | } catch (Exception e) { |
4 | soliveira | 388 | |
22 | soliveira | 389 | } |
390 | |||
391 | return null; |
||
2 | soliveira | 392 | } |
393 | |||
22 | soliveira | 394 | public static Method findMethodToInject(Class<? extends Object> target, String name, Class<? extends Object> source) { |
2 | soliveira | 395 | |
22 | soliveira | 396 | StringBuffer sb = new StringBuffer(128); |
2 | soliveira | 397 | |
22 | soliveira | 398 | sb.append("set").append(name.substring(0, 1).toUpperCase()); |
2 | soliveira | 399 | |
22 | soliveira | 400 | if (name.length() > 1) sb.append(name.substring(1)); |
2 | soliveira | 401 | |
22 | soliveira | 402 | String methodName = sb.toString(); |
2 | soliveira | 403 | |
22 | soliveira | 404 | Method m = null; |
2 | soliveira | 405 | |
406 | try { |
||
407 | |||
22 | soliveira | 408 | m = FindMethod.getMethod(target, methodName, new Class[] { source }); |
2 | soliveira | 409 | |
410 | } catch (Exception e) { |
||
411 | } |
||
412 | |||
22 | soliveira | 413 | if (m == null) { |
2 | soliveira | 414 | |
22 | soliveira | 415 | Class<? extends Object> primitive = getPrimitiveFrom(source); |
2 | soliveira | 416 | |
22 | soliveira | 417 | if (primitive != null) { |
2 | soliveira | 418 | |
22 | soliveira | 419 | try { |
2 | soliveira | 420 | |
22 | soliveira | 421 | m = target.getMethod(methodName, new Class[] { primitive }); |
2 | soliveira | 422 | |
22 | soliveira | 423 | } catch (Exception e) { |
424 | } |
||
2 | soliveira | 425 | |
22 | soliveira | 426 | } |
427 | } |
||
2 | soliveira | 428 | |
22 | soliveira | 429 | if (m != null) { |
430 | m.setAccessible(true); |
||
431 | } |
||
2 | soliveira | 432 | |
22 | soliveira | 433 | return m; |
2 | soliveira | 434 | |
4 | soliveira | 435 | } |
2 | soliveira | 436 | |
22 | soliveira | 437 | public static Field findFieldToInject(Class<? extends Object> target, String name, Class<? extends Object> source) { |
2 | soliveira | 438 | |
22 | soliveira | 439 | Field f = getField(target, name); |
2 | soliveira | 440 | |
22 | soliveira | 441 | if (f != null) { |
2 | soliveira | 442 | |
22 | soliveira | 443 | Class<?> type = f.getType(); |
2 | soliveira | 444 | |
22 | soliveira | 445 | if (type.isAssignableFrom(source) || checkPrimitives(type, source)) { |
2 | soliveira | 446 | |
22 | soliveira | 447 | f.setAccessible(true); |
2 | soliveira | 448 | |
22 | soliveira | 449 | return f; |
450 | } |
||
2 | soliveira | 451 | |
22 | soliveira | 452 | } |
4 | soliveira | 453 | |
22 | soliveira | 454 | return null; |
455 | } |
||
4 | soliveira | 456 | |
22 | soliveira | 457 | private static final boolean isBlank(Object value) { |
4 | soliveira | 458 | |
22 | soliveira | 459 | if (value != null && value instanceof String) { |
4 | soliveira | 460 | |
22 | soliveira | 461 | String s = ((String) value).trim(); |
4 | soliveira | 462 | |
22 | soliveira | 463 | if (s.length() == 0) return true; |
464 | } |
||
4 | soliveira | 465 | |
466 | return false; |
||
2 | soliveira | 467 | } |
468 | |||
22 | soliveira | 469 | public static boolean inject(Method m, Object target, Object value, boolean tryToConvert, boolean tryingToConvertBoolean) throws Exception { |
2 | soliveira | 470 | |
22 | soliveira | 471 | Class<?> type = m.getParameterTypes()[0]; |
2 | soliveira | 472 | |
22 | soliveira | 473 | if (tryingToConvertBoolean) { |
2 | soliveira | 474 | |
22 | soliveira | 475 | if (value == null && (type.equals(Boolean.class) || type.equals(boolean.class))) { |
2 | soliveira | 476 | |
22 | soliveira | 477 | value = Boolean.FALSE; |
2 | soliveira | 478 | |
22 | soliveira | 479 | } else { |
2 | soliveira | 480 | |
22 | soliveira | 481 | // if trying to convert boolean, convert or don't do anything... |
2 | soliveira | 482 | |
22 | soliveira | 483 | return false; |
2 | soliveira | 484 | |
22 | soliveira | 485 | } |
486 | } |
||
2 | soliveira | 487 | |
22 | soliveira | 488 | if (value == null |
489 | || (type.isAssignableFrom(value.getClass()) || checkPrimitives(type, value.getClass()) || (tryToConvert && ((isBlank(value) && (value = shouldConvertToNull(value, |
||
490 | type)) == null) || (value = tryToConvert(value, type)) != null)))) { |
||
2 | soliveira | 491 | |
22 | soliveira | 492 | try { |
2 | soliveira | 493 | |
22 | soliveira | 494 | m.invoke(target, new Object[] { value }); |
2 | soliveira | 495 | |
22 | soliveira | 496 | return true; |
2 | soliveira | 497 | |
22 | soliveira | 498 | } catch (Exception e) { |
4 | soliveira | 499 | |
22 | soliveira | 500 | System.err.println("Error injecting by method: " + value + " in " + target + " thru " + m); |
4 | soliveira | 501 | |
22 | soliveira | 502 | e.printStackTrace(); |
2 | soliveira | 503 | |
22 | soliveira | 504 | throw e; |
2 | soliveira | 505 | |
22 | soliveira | 506 | } |
507 | } |
||
2 | soliveira | 508 | |
22 | soliveira | 509 | return false; |
2 | soliveira | 510 | |
4 | soliveira | 511 | } |
2 | soliveira | 512 | |
22 | soliveira | 513 | public static boolean hasDefaultConstructor(Class<? extends Object> klass) { |
2 | soliveira | 514 | |
22 | soliveira | 515 | try { |
2 | soliveira | 516 | |
22 | soliveira | 517 | return klass.getConstructor((Class[]) null) != null; |
2 | soliveira | 518 | |
22 | soliveira | 519 | } catch (Exception e) { |
520 | |||
521 | return false; |
||
522 | } |
||
4 | soliveira | 523 | } |
2 | soliveira | 524 | |
22 | soliveira | 525 | /** |
526 | * Extract the value of a property of a bean! |
||
527 | * |
||
528 | * @param bean |
||
529 | * the target bean |
||
530 | * @param nameProperty |
||
531 | * the property name |
||
532 | * @return they value as String. The method toString is always called to every property! |
||
533 | * @throws Exception |
||
534 | */ |
||
535 | public static String getProperty(Object bean, String nameProperty) throws Exception { |
||
2 | soliveira | 536 | |
22 | soliveira | 537 | if (nameProperty == null || nameProperty.equals("")) return null; |
2 | soliveira | 538 | |
22 | soliveira | 539 | String methodName = getter(nameProperty); |
2 | soliveira | 540 | |
22 | soliveira | 541 | Class<? extends Object> clazz = bean.getClass(); |
542 | Method[] methods = clazz.getMethods(); |
||
543 | for (Method method : methods) { |
||
544 | if (method.getName().equals(methodName) && method.getParameterTypes().length == 0) { |
||
545 | Object value = method.invoke(bean, (Object[]) null); |
||
546 | if (value == null) return null; |
||
547 | return value.toString(); |
||
548 | } |
||
549 | } |
||
2 | soliveira | 550 | |
22 | soliveira | 551 | Field[] fields = clazz.getDeclaredFields(); |
552 | for (Field field : fields) { |
||
553 | field.setAccessible(true); |
||
554 | if (field.getName().equals(nameProperty)) { |
||
555 | Object value = field.get(bean); |
||
556 | if (value == null) return null; |
||
557 | return value.toString(); |
||
558 | } |
||
559 | } |
||
2 | soliveira | 560 | |
22 | soliveira | 561 | return null; |
4 | soliveira | 562 | } |
563 | |||
22 | soliveira | 564 | private static String getter(String name) { |
565 | StringBuilder sb = new StringBuilder(name.length() + 3); |
||
4 | soliveira | 566 | |
22 | soliveira | 567 | sb.append("get").append(name.substring(0, 1).toUpperCase()); |
4 | soliveira | 568 | |
22 | soliveira | 569 | if (name.length() > 1) sb.append(name.substring(1)); |
570 | return sb.toString(); |
||
571 | } |
||
4 | soliveira | 572 | |
22 | soliveira | 573 | public static void beanToMap(Object bean, Map<String, String> map) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { |
574 | if (bean != null) { |
||
4 | soliveira | 575 | |
22 | soliveira | 576 | for (Method method : bean.getClass().getMethods()) { |
577 | String name = method.getName(); |
||
4 | soliveira | 578 | |
22 | soliveira | 579 | if (name.length() > 3 && name.startsWith("get") && !name.equals("getClass") && method.getParameterTypes().length == 0) { |
4 | soliveira | 580 | |
22 | soliveira | 581 | method.setAccessible(true); |
582 | Object value = method.invoke(bean, new Object[0]); |
||
583 | map.put(name, value.toString()); |
||
584 | } |
||
585 | } |
||
2 | soliveira | 586 | } |
4 | soliveira | 587 | } |
22 | soliveira | 588 | |
589 | public static interface Provider { |
||
590 | |||
591 | public Object get(String key); |
||
592 | |||
58 | soliveira | 593 | public boolean hasValue(String key); |
22 | soliveira | 594 | } |
2 | soliveira | 595 | |
22 | soliveira | 596 | public static void getObject(Object target, Provider provider, boolean tryField, String prefix, boolean tryToConvert, boolean convertBoolean, boolean allowRecursion) |
597 | throws Exception { |
||
2 | soliveira | 598 | |
22 | soliveira | 599 | Class<? extends Object> targetClass = target.getClass(); |
4 | soliveira | 600 | |
22 | soliveira | 601 | Map<String, Object> setters, fields; |
4 | soliveira | 602 | |
22 | soliveira | 603 | // see if we have these in cache... |
4 | soliveira | 604 | |
22 | soliveira | 605 | synchronized (settersMaps) { |
4 | soliveira | 606 | |
22 | soliveira | 607 | setters = settersMaps.get(targetClass); |
4 | soliveira | 608 | |
22 | soliveira | 609 | fields = fieldsMaps.get(targetClass); |
4 | soliveira | 610 | |
22 | soliveira | 611 | } |
2 | soliveira | 612 | |
22 | soliveira | 613 | // if not in cache, prepare maps for injection... |
2 | soliveira | 614 | |
22 | soliveira | 615 | if (setters == null) { |
2 | soliveira | 616 | |
22 | soliveira | 617 | setters = new HashMap<String, Object>(); |
2 | soliveira | 618 | |
22 | soliveira | 619 | fields = null; |
2 | soliveira | 620 | |
22 | soliveira | 621 | if (tryField) { |
4 | soliveira | 622 | |
22 | soliveira | 623 | fields = new HashMap<String, Object>(); |
4 | soliveira | 624 | |
22 | soliveira | 625 | } |
4 | soliveira | 626 | |
22 | soliveira | 627 | prepareForInjection(targetClass, setters, fields); |
4 | soliveira | 628 | |
22 | soliveira | 629 | synchronized (settersMaps) { |
4 | soliveira | 630 | |
22 | soliveira | 631 | settersMaps.put(targetClass, setters); |
4 | soliveira | 632 | |
22 | soliveira | 633 | fieldsMaps.put(targetClass, fields); |
4 | soliveira | 634 | |
22 | soliveira | 635 | } |
636 | } |
||
2 | soliveira | 637 | |
22 | soliveira | 638 | Iterator<String> iter = setters.keySet().iterator(); |
2 | soliveira | 639 | |
22 | soliveira | 640 | while (iter.hasNext()) { |
2 | soliveira | 641 | |
22 | soliveira | 642 | String var = iter.next(); |
2 | soliveira | 643 | |
58 | soliveira | 644 | boolean hasValue = provider.hasValue(var); |
2 | soliveira | 645 | |
22 | soliveira | 646 | Object value = provider.get(var); |
2 | soliveira | 647 | |
22 | soliveira | 648 | boolean tryingToConvertBoolean = false; |
2 | soliveira | 649 | |
22 | soliveira | 650 | if (value == null && !hasValue) { |
4 | soliveira | 651 | |
22 | soliveira | 652 | if (!convertBoolean) { |
4 | soliveira | 653 | |
22 | soliveira | 654 | continue; |
4 | soliveira | 655 | |
22 | soliveira | 656 | } else { |
2 | soliveira | 657 | |
22 | soliveira | 658 | tryingToConvertBoolean = true; |
659 | } |
||
2 | soliveira | 660 | |
22 | soliveira | 661 | } |
2 | soliveira | 662 | |
22 | soliveira | 663 | // if (value == null) continue; |
2 | soliveira | 664 | |
22 | soliveira | 665 | Object obj = setters.get(var); |
2 | soliveira | 666 | |
22 | soliveira | 667 | // we may have a list of overloaded methods... |
4 | soliveira | 668 | |
22 | soliveira | 669 | List<Method> list = null; |
4 | soliveira | 670 | |
22 | soliveira | 671 | Method m = null; |
4 | soliveira | 672 | |
22 | soliveira | 673 | if (obj instanceof List) { |
4 | soliveira | 674 | |
22 | soliveira | 675 | list = (List<Method>) obj; |
4 | soliveira | 676 | |
22 | soliveira | 677 | } else { |
4 | soliveira | 678 | |
22 | soliveira | 679 | m = (Method) setters.get(var); |
4 | soliveira | 680 | |
22 | soliveira | 681 | } |
4 | soliveira | 682 | |
22 | soliveira | 683 | if (m != null) { |
4 | soliveira | 684 | |
22 | soliveira | 685 | if (!inject(m, target, value, tryToConvert, tryingToConvertBoolean) && allowRecursion) { |
4 | soliveira | 686 | |
22 | soliveira | 687 | // i did not inject... how about a VO object for this |
688 | // setter? |
||
4 | soliveira | 689 | |
22 | soliveira | 690 | Class<?> type = m.getParameterTypes()[0]; |
4 | soliveira | 691 | |
22 | soliveira | 692 | if (!type.getName().startsWith("java.") && !type.isPrimitive() && hasDefaultConstructor(type)) { |
4 | soliveira | 693 | |
22 | soliveira | 694 | Object param = type.newInstance(); |
4 | soliveira | 695 | |
22 | soliveira | 696 | InjectionUtils.getObject(param, provider, true, prefix, true, true, false); // no |
697 | // recursion... |
||
4 | soliveira | 698 | |
22 | soliveira | 699 | inject(m, target, param, false, false); |
700 | } |
||
701 | } |
||
2 | soliveira | 702 | |
22 | soliveira | 703 | } else { |
2 | soliveira | 704 | |
22 | soliveira | 705 | Iterator<Method> it = list.iterator(); |
2 | soliveira | 706 | |
22 | soliveira | 707 | boolean injected = false; |
2 | soliveira | 708 | |
22 | soliveira | 709 | while (it.hasNext()) { |
4 | soliveira | 710 | |
22 | soliveira | 711 | m = it.next(); |
4 | soliveira | 712 | |
22 | soliveira | 713 | if (inject(m, target, value, tryToConvert, tryingToConvertBoolean)) { |
4 | soliveira | 714 | |
22 | soliveira | 715 | injected = true; |
4 | soliveira | 716 | |
22 | soliveira | 717 | break; |
718 | } |
||
719 | } |
||
2 | soliveira | 720 | |
22 | soliveira | 721 | if (!injected && allowRecursion) { |
4 | soliveira | 722 | |
22 | soliveira | 723 | // i could not inject anything... how about a VO object for |
724 | // this setter... |
||
4 | soliveira | 725 | |
22 | soliveira | 726 | it = list.iterator(); |
4 | soliveira | 727 | |
22 | soliveira | 728 | while (it.hasNext()) { |
4 | soliveira | 729 | |
22 | soliveira | 730 | m = (Method) it.next(); |
4 | soliveira | 731 | |
22 | soliveira | 732 | Class<?> type = m.getParameterTypes()[0]; |
4 | soliveira | 733 | |
22 | soliveira | 734 | if (!type.getName().startsWith("java.") && !type.isPrimitive() && hasDefaultConstructor(type)) { |
4 | soliveira | 735 | |
22 | soliveira | 736 | Object param = type.newInstance(); |
4 | soliveira | 737 | |
22 | soliveira | 738 | InjectionUtils.getObject(param, provider, true, prefix, true, true, false); // no |
739 | // recursion... |
||
4 | soliveira | 740 | |
22 | soliveira | 741 | if (inject(m, target, param, false, false)) { |
4 | soliveira | 742 | |
22 | soliveira | 743 | break; // done... |
744 | } |
||
745 | } |
||
746 | } |
||
747 | } |
||
2 | soliveira | 748 | } |
749 | } |
||
750 | |||
22 | soliveira | 751 | if (fields != null) { |
2 | soliveira | 752 | |
22 | soliveira | 753 | iter = fields.keySet().iterator(); |
2 | soliveira | 754 | |
22 | soliveira | 755 | while (iter.hasNext()) { |
2 | soliveira | 756 | |
22 | soliveira | 757 | String var = iter.next(); |
2 | soliveira | 758 | |
58 | soliveira | 759 | boolean hasValue = provider.hasValue(var); |
2 | soliveira | 760 | |
22 | soliveira | 761 | Object value = provider.get(var); |
2 | soliveira | 762 | |
22 | soliveira | 763 | Field f = (Field) fields.get(var); |
4 | soliveira | 764 | |
22 | soliveira | 765 | Class<?> type = f.getType(); |
4 | soliveira | 766 | |
22 | soliveira | 767 | // If there is no value in the action input, assume false for |
768 | // booleans... |
||
769 | // (checkboxes and radio buttons are not send when not |
||
770 | // marked...) |
||
4 | soliveira | 771 | |
22 | soliveira | 772 | if (convertBoolean && value == null && !hasValue) { |
4 | soliveira | 773 | |
22 | soliveira | 774 | if (type.equals(Boolean.class) || type.equals(boolean.class)) { |
4 | soliveira | 775 | |
22 | soliveira | 776 | value = Boolean.FALSE; |
777 | } |
||
4 | soliveira | 778 | |
22 | soliveira | 779 | } |
4 | soliveira | 780 | |
22 | soliveira | 781 | if (value == null && !hasValue) continue; |
4 | soliveira | 782 | |
22 | soliveira | 783 | // if (value == null) continue; |
4 | soliveira | 784 | |
22 | soliveira | 785 | if (value == null |
786 | || (type.isAssignableFrom(value.getClass()) || checkPrimitives(type, value.getClass()) || (tryToConvert && ((isBlank(value) && (value = shouldConvertToNull( |
||
787 | value, type)) == null) || (value = tryToConvert(value, type)) != null)))) { |
||
4 | soliveira | 788 | |
22 | soliveira | 789 | try { |
4 | soliveira | 790 | |
22 | soliveira | 791 | f.set(target, value); |
4 | soliveira | 792 | |
22 | soliveira | 793 | } catch (Exception e) { |
4 | soliveira | 794 | |
22 | soliveira | 795 | System.err.println("Error injecting by field: " + value + " in " + target); |
4 | soliveira | 796 | |
22 | soliveira | 797 | e.printStackTrace(); |
4 | soliveira | 798 | |
22 | soliveira | 799 | throw e; |
4 | soliveira | 800 | |
22 | soliveira | 801 | } |
802 | } |
||
803 | } |
||
4 | soliveira | 804 | } |
2 | soliveira | 805 | } |
806 | } |