MentaContainer

Rev

Rev 148 | 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
 
148 soliveira 22
        private static Map<Class<?>, Map<String, Object>> settersMaps = new HashMap<Class<?>, Map<String, Object>>();
2 soliveira 23
 
148 soliveira 24
        private static Map<Class<?>, Map<String, Object>> fieldsMaps = new HashMap<Class<?>, Map<String, Object>>();
2 soliveira 25
 
148 soliveira 26
        public static void prepareForInjection(Class<?> 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
 
148 soliveira 150
        public static boolean checkPrimitives(Class<?> target, Class<?> 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
 
148 soliveira 172
        public static Object tryToConvert(Object source, Class<?> 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
 
146 soliveira 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
 
148 soliveira 285
        public static Object shouldConvertToNull(Object value, Class<?> 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
 
148 soliveira 299
        public static Class<?> getPrimitiveFrom(Object w) {
22 soliveira 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
 
148 soliveira 320
        public static Class<?> getPrimitiveFrom(Class<?> 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
 
148 soliveira 348
        public static Field getField(Class<?> target, String name) {
22 soliveira 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
        }
139 soliveira 357
 
358
        public static String getKeyName(Object obj) {
359
                if (obj instanceof Class<?>) {
360
                        Class<?> k = (Class<?>) obj;
158 soliveira 361
                        return k.getName();
139 soliveira 362
                }
363
                return obj.toString();
364
        }
2 soliveira 365
 
148 soliveira 366
        public static Method findMethodToGet(Class<?> target, String name) {
2 soliveira 367
 
22 soliveira 368
                StringBuffer sb = new StringBuffer(128);
2 soliveira 369
 
22 soliveira 370
                sb.append("get").append(name.substring(0, 1).toUpperCase());
2 soliveira 371
 
22 soliveira 372
                if (name.length() > 1) sb.append(name.substring(1));
4 soliveira 373
 
22 soliveira 374
                try {
4 soliveira 375
 
22 soliveira 376
                        return target.getMethod(sb.toString(), (Class[]) null);
4 soliveira 377
 
22 soliveira 378
                } catch (Exception e) {
4 soliveira 379
 
22 soliveira 380
                }
2 soliveira 381
 
22 soliveira 382
                sb.setLength(0);
4 soliveira 383
 
22 soliveira 384
                sb.append("is").append(name.substring(0, 1).toUpperCase());
4 soliveira 385
 
22 soliveira 386
                if (name.length() > 1) {
4 soliveira 387
 
22 soliveira 388
                        sb.append(name.substring(1));
389
                }
2 soliveira 390
 
22 soliveira 391
                try {
4 soliveira 392
 
22 soliveira 393
                        return target.getMethod(sb.toString(), (Class[]) null);
4 soliveira 394
 
22 soliveira 395
                } catch (Exception e) {
4 soliveira 396
 
22 soliveira 397
                }
398
 
399
                return null;
2 soliveira 400
        }
401
 
148 soliveira 402
        public static Method findMethodToInject(Class<?> target, String name, Class<?> source) {
2 soliveira 403
 
22 soliveira 404
                StringBuffer sb = new StringBuffer(128);
2 soliveira 405
 
22 soliveira 406
                sb.append("set").append(name.substring(0, 1).toUpperCase());
2 soliveira 407
 
22 soliveira 408
                if (name.length() > 1) sb.append(name.substring(1));
2 soliveira 409
 
22 soliveira 410
                String methodName = sb.toString();
2 soliveira 411
 
22 soliveira 412
                Method m = null;
2 soliveira 413
 
414
                try {
415
 
22 soliveira 416
                        m = FindMethod.getMethod(target, methodName, new Class[] { source });
2 soliveira 417
 
418
                } catch (Exception e) {
419
                }
420
 
22 soliveira 421
                if (m == null) {
2 soliveira 422
 
148 soliveira 423
                        Class<?> primitive = getPrimitiveFrom(source);
2 soliveira 424
 
22 soliveira 425
                        if (primitive != null) {
2 soliveira 426
 
22 soliveira 427
                                try {
2 soliveira 428
 
22 soliveira 429
                                        m = target.getMethod(methodName, new Class[] { primitive });
2 soliveira 430
 
22 soliveira 431
                                } catch (Exception e) {
432
                                }
2 soliveira 433
 
22 soliveira 434
                        }
435
                }
2 soliveira 436
 
22 soliveira 437
                if (m != null) {
438
                        m.setAccessible(true);
439
                }
2 soliveira 440
 
22 soliveira 441
                return m;
2 soliveira 442
 
4 soliveira 443
        }
2 soliveira 444
 
148 soliveira 445
        public static Field findFieldToInject(Class<?> target, String name, Class<?> source) {
2 soliveira 446
 
22 soliveira 447
                Field f = getField(target, name);
2 soliveira 448
 
22 soliveira 449
                if (f != null) {
2 soliveira 450
 
22 soliveira 451
                        Class<?> type = f.getType();
2 soliveira 452
 
22 soliveira 453
                        if (type.isAssignableFrom(source) || checkPrimitives(type, source)) {
2 soliveira 454
 
22 soliveira 455
                                f.setAccessible(true);
2 soliveira 456
 
22 soliveira 457
                                return f;
458
                        }
2 soliveira 459
 
22 soliveira 460
                }
4 soliveira 461
 
22 soliveira 462
                return null;
463
        }
4 soliveira 464
 
22 soliveira 465
        private static final boolean isBlank(Object value) {
4 soliveira 466
 
22 soliveira 467
                if (value != null && value instanceof String) {
4 soliveira 468
 
22 soliveira 469
                        String s = ((String) value).trim();
4 soliveira 470
 
22 soliveira 471
                        if (s.length() == 0) return true;
472
                }
4 soliveira 473
 
474
                return false;
2 soliveira 475
        }
476
 
22 soliveira 477
        public static boolean inject(Method m, Object target, Object value, boolean tryToConvert, boolean tryingToConvertBoolean) throws Exception {
2 soliveira 478
 
22 soliveira 479
                Class<?> type = m.getParameterTypes()[0];
2 soliveira 480
 
22 soliveira 481
                if (tryingToConvertBoolean) {
2 soliveira 482
 
22 soliveira 483
                        if (value == null && (type.equals(Boolean.class) || type.equals(boolean.class))) {
2 soliveira 484
 
22 soliveira 485
                                value = Boolean.FALSE;
2 soliveira 486
 
22 soliveira 487
                        } else {
2 soliveira 488
 
22 soliveira 489
                                // if trying to convert boolean, convert or don't do anything...
2 soliveira 490
 
22 soliveira 491
                                return false;
2 soliveira 492
 
22 soliveira 493
                        }
494
                }
2 soliveira 495
 
22 soliveira 496
                if (value == null
497
                        || (type.isAssignableFrom(value.getClass()) || checkPrimitives(type, value.getClass()) || (tryToConvert && ((isBlank(value) && (value = shouldConvertToNull(value,
498
                                type)) == null) || (value = tryToConvert(value, type)) != null)))) {
2 soliveira 499
 
22 soliveira 500
                        try {
2 soliveira 501
 
22 soliveira 502
                                m.invoke(target, new Object[] { value });
2 soliveira 503
 
22 soliveira 504
                                return true;
2 soliveira 505
 
22 soliveira 506
                        } catch (Exception e) {
4 soliveira 507
 
22 soliveira 508
                                System.err.println("Error injecting by method: " + value + " in " + target + " thru " + m);
4 soliveira 509
 
22 soliveira 510
                                e.printStackTrace();
2 soliveira 511
 
22 soliveira 512
                                throw e;
2 soliveira 513
 
22 soliveira 514
                        }
515
                }
2 soliveira 516
 
22 soliveira 517
                return false;
2 soliveira 518
 
4 soliveira 519
        }
2 soliveira 520
 
148 soliveira 521
        public static boolean hasDefaultConstructor(Class<?> klass) {
2 soliveira 522
 
22 soliveira 523
                try {
2 soliveira 524
 
22 soliveira 525
                        return klass.getConstructor((Class[]) null) != null;
2 soliveira 526
 
22 soliveira 527
                } catch (Exception e) {
528
 
529
                        return false;
530
                }
4 soliveira 531
        }
2 soliveira 532
 
22 soliveira 533
        /**
534
         * Extract the value of a property of a bean!
535
         *
536
         * @param bean
537
         *            the target bean
538
         * @param nameProperty
539
         *            the property name
540
         * @return they value as String. The method toString is always called to every property!
541
         * @throws Exception
542
         */
543
        public static String getProperty(Object bean, String nameProperty) throws Exception {
2 soliveira 544
 
22 soliveira 545
                if (nameProperty == null || nameProperty.equals("")) return null;
2 soliveira 546
 
22 soliveira 547
                String methodName = getter(nameProperty);
2 soliveira 548
 
148 soliveira 549
                Class<?> clazz = bean.getClass();
22 soliveira 550
                Method[] methods = clazz.getMethods();
551
                for (Method method : methods) {
552
                        if (method.getName().equals(methodName) && method.getParameterTypes().length == 0) {
553
                                Object value = method.invoke(bean, (Object[]) null);
554
                                if (value == null) return null;
555
                                return value.toString();
556
                        }
557
                }
2 soliveira 558
 
22 soliveira 559
                Field[] fields = clazz.getDeclaredFields();
560
                for (Field field : fields) {
561
                        field.setAccessible(true);
562
                        if (field.getName().equals(nameProperty)) {
563
                                Object value = field.get(bean);
564
                                if (value == null) return null;
565
                                return value.toString();
566
                        }
567
                }
2 soliveira 568
 
22 soliveira 569
                return null;
4 soliveira 570
        }
571
 
22 soliveira 572
        private static String getter(String name) {
573
                StringBuilder sb = new StringBuilder(name.length() + 3);
4 soliveira 574
 
22 soliveira 575
                sb.append("get").append(name.substring(0, 1).toUpperCase());
4 soliveira 576
 
22 soliveira 577
                if (name.length() > 1) sb.append(name.substring(1));
578
                return sb.toString();
579
        }
4 soliveira 580
 
22 soliveira 581
        public static void beanToMap(Object bean, Map<String, String> map) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
582
                if (bean != null) {
4 soliveira 583
 
22 soliveira 584
                        for (Method method : bean.getClass().getMethods()) {
585
                                String name = method.getName();
4 soliveira 586
 
22 soliveira 587
                                if (name.length() > 3 && name.startsWith("get") && !name.equals("getClass") && method.getParameterTypes().length == 0) {
4 soliveira 588
 
22 soliveira 589
                                        method.setAccessible(true);
590
                                        Object value = method.invoke(bean, new Object[0]);
591
                                        map.put(name, value.toString());
592
                                }
593
                        }
2 soliveira 594
                }
4 soliveira 595
        }
22 soliveira 596
 
597
        public static interface Provider {
598
 
599
                public Object get(String key);
600
 
58 soliveira 601
                public boolean hasValue(String key);
22 soliveira 602
        }
2 soliveira 603
 
22 soliveira 604
        public static void getObject(Object target, Provider provider, boolean tryField, String prefix, boolean tryToConvert, boolean convertBoolean, boolean allowRecursion)
605
                throws Exception {
2 soliveira 606
 
148 soliveira 607
                Class<?> targetClass = target.getClass();
4 soliveira 608
 
22 soliveira 609
                Map<String, Object> setters, fields;
4 soliveira 610
 
22 soliveira 611
                // see if we have these in cache...
4 soliveira 612
 
22 soliveira 613
                synchronized (settersMaps) {
4 soliveira 614
 
22 soliveira 615
                        setters = settersMaps.get(targetClass);
4 soliveira 616
 
22 soliveira 617
                        fields = fieldsMaps.get(targetClass);
4 soliveira 618
 
22 soliveira 619
                }
2 soliveira 620
 
22 soliveira 621
                // if not in cache, prepare maps for injection...
2 soliveira 622
 
22 soliveira 623
                if (setters == null) {
2 soliveira 624
 
22 soliveira 625
                        setters = new HashMap<String, Object>();
2 soliveira 626
 
22 soliveira 627
                        fields = null;
2 soliveira 628
 
22 soliveira 629
                        if (tryField) {
4 soliveira 630
 
22 soliveira 631
                                fields = new HashMap<String, Object>();
4 soliveira 632
 
22 soliveira 633
                        }
4 soliveira 634
 
22 soliveira 635
                        prepareForInjection(targetClass, setters, fields);
4 soliveira 636
 
22 soliveira 637
                        synchronized (settersMaps) {
4 soliveira 638
 
22 soliveira 639
                                settersMaps.put(targetClass, setters);
4 soliveira 640
 
22 soliveira 641
                                fieldsMaps.put(targetClass, fields);
4 soliveira 642
 
22 soliveira 643
                        }
644
                }
2 soliveira 645
 
22 soliveira 646
                Iterator<String> iter = setters.keySet().iterator();
2 soliveira 647
 
22 soliveira 648
                while (iter.hasNext()) {
2 soliveira 649
 
22 soliveira 650
                        String var = iter.next();
2 soliveira 651
 
58 soliveira 652
                        boolean hasValue = provider.hasValue(var);
2 soliveira 653
 
22 soliveira 654
                        Object value = provider.get(var);
2 soliveira 655
 
22 soliveira 656
                        boolean tryingToConvertBoolean = false;
2 soliveira 657
 
22 soliveira 658
                        if (value == null && !hasValue) {
4 soliveira 659
 
22 soliveira 660
                                if (!convertBoolean) {
4 soliveira 661
 
22 soliveira 662
                                        continue;
4 soliveira 663
 
22 soliveira 664
                                } else {
2 soliveira 665
 
22 soliveira 666
                                        tryingToConvertBoolean = true;
667
                                }
2 soliveira 668
 
22 soliveira 669
                        }
2 soliveira 670
 
22 soliveira 671
                        // if (value == null) continue;
2 soliveira 672
 
22 soliveira 673
                        Object obj = setters.get(var);
2 soliveira 674
 
22 soliveira 675
                        // we may have a list of overloaded methods...
4 soliveira 676
 
22 soliveira 677
                        List<Method> list = null;
4 soliveira 678
 
22 soliveira 679
                        Method m = null;
4 soliveira 680
 
22 soliveira 681
                        if (obj instanceof List) {
4 soliveira 682
 
22 soliveira 683
                                list = (List<Method>) obj;
4 soliveira 684
 
22 soliveira 685
                        } else {
4 soliveira 686
 
22 soliveira 687
                                m = (Method) setters.get(var);
4 soliveira 688
 
22 soliveira 689
                        }
4 soliveira 690
 
22 soliveira 691
                        if (m != null) {
4 soliveira 692
 
22 soliveira 693
                                if (!inject(m, target, value, tryToConvert, tryingToConvertBoolean) && allowRecursion) {
4 soliveira 694
 
22 soliveira 695
                                        // i did not inject... how about a VO object for this
696
                                        // setter?
4 soliveira 697
 
22 soliveira 698
                                        Class<?> type = m.getParameterTypes()[0];
4 soliveira 699
 
22 soliveira 700
                                        if (!type.getName().startsWith("java.") && !type.isPrimitive() && hasDefaultConstructor(type)) {
4 soliveira 701
 
22 soliveira 702
                                                Object param = type.newInstance();
4 soliveira 703
 
22 soliveira 704
                                                InjectionUtils.getObject(param, provider, true, prefix, true, true, false); // no
705
                                                // recursion...
4 soliveira 706
 
22 soliveira 707
                                                inject(m, target, param, false, false);
708
                                        }
709
                                }
2 soliveira 710
 
22 soliveira 711
                        } else {
2 soliveira 712
 
22 soliveira 713
                                Iterator<Method> it = list.iterator();
2 soliveira 714
 
22 soliveira 715
                                boolean injected = false;
2 soliveira 716
 
22 soliveira 717
                                while (it.hasNext()) {
4 soliveira 718
 
22 soliveira 719
                                        m = it.next();
4 soliveira 720
 
22 soliveira 721
                                        if (inject(m, target, value, tryToConvert, tryingToConvertBoolean)) {
4 soliveira 722
 
22 soliveira 723
                                                injected = true;
4 soliveira 724
 
22 soliveira 725
                                                break;
726
                                        }
727
                                }
2 soliveira 728
 
22 soliveira 729
                                if (!injected && allowRecursion) {
4 soliveira 730
 
22 soliveira 731
                                        // i could not inject anything... how about a VO object for
732
                                        // this setter...
4 soliveira 733
 
22 soliveira 734
                                        it = list.iterator();
4 soliveira 735
 
22 soliveira 736
                                        while (it.hasNext()) {
4 soliveira 737
 
22 soliveira 738
                                                m = (Method) it.next();
4 soliveira 739
 
22 soliveira 740
                                                Class<?> type = m.getParameterTypes()[0];
4 soliveira 741
 
22 soliveira 742
                                                if (!type.getName().startsWith("java.") && !type.isPrimitive() && hasDefaultConstructor(type)) {
4 soliveira 743
 
22 soliveira 744
                                                        Object param = type.newInstance();
4 soliveira 745
 
22 soliveira 746
                                                        InjectionUtils.getObject(param, provider, true, prefix, true, true, false); // no
747
                                                        // recursion...
4 soliveira 748
 
22 soliveira 749
                                                        if (inject(m, target, param, false, false)) {
4 soliveira 750
 
22 soliveira 751
                                                                break; // done...
752
                                                        }
753
                                                }
754
                                        }
755
                                }
2 soliveira 756
                        }
757
                }
758
 
22 soliveira 759
                if (fields != null) {
2 soliveira 760
 
22 soliveira 761
                        iter = fields.keySet().iterator();
2 soliveira 762
 
22 soliveira 763
                        while (iter.hasNext()) {
2 soliveira 764
 
22 soliveira 765
                                String var = iter.next();
2 soliveira 766
 
58 soliveira 767
                                boolean hasValue = provider.hasValue(var);
2 soliveira 768
 
22 soliveira 769
                                Object value = provider.get(var);
2 soliveira 770
 
22 soliveira 771
                                Field f = (Field) fields.get(var);
4 soliveira 772
 
22 soliveira 773
                                Class<?> type = f.getType();
4 soliveira 774
 
22 soliveira 775
                                // If there is no value in the action input, assume false for
776
                                // booleans...
777
                                // (checkboxes and radio buttons are not send when not
778
                                // marked...)
4 soliveira 779
 
22 soliveira 780
                                if (convertBoolean && value == null && !hasValue) {
4 soliveira 781
 
22 soliveira 782
                                        if (type.equals(Boolean.class) || type.equals(boolean.class)) {
4 soliveira 783
 
22 soliveira 784
                                                value = Boolean.FALSE;
785
                                        }
4 soliveira 786
 
22 soliveira 787
                                }
4 soliveira 788
 
22 soliveira 789
                                if (value == null && !hasValue) continue;
4 soliveira 790
 
22 soliveira 791
                                // if (value == null) continue;
4 soliveira 792
 
22 soliveira 793
                                if (value == null
794
                                        || (type.isAssignableFrom(value.getClass()) || checkPrimitives(type, value.getClass()) || (tryToConvert && ((isBlank(value) && (value = shouldConvertToNull(
795
                                                value, type)) == null) || (value = tryToConvert(value, type)) != null)))) {
4 soliveira 796
 
22 soliveira 797
                                        try {
4 soliveira 798
 
22 soliveira 799
                                                f.set(target, value);
4 soliveira 800
 
22 soliveira 801
                                        } catch (Exception e) {
4 soliveira 802
 
22 soliveira 803
                                                System.err.println("Error injecting by field: " + value + " in " + target);
4 soliveira 804
 
22 soliveira 805
                                                e.printStackTrace();
4 soliveira 806
 
22 soliveira 807
                                                throw e;
4 soliveira 808
 
22 soliveira 809
                                        }
810
                                }
811
                        }
4 soliveira 812
                }
2 soliveira 813
        }
814
}