MentaContainer

Rev

Rev 4 | Rev 58 | 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
 
593
                public boolean contains(String key);
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
 
22 soliveira 644
                        boolean hasValue = provider.contains(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
 
22 soliveira 759
                                boolean hasValue = provider.contains(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
}