MentaContainer

Rev

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