MentaContainer

Rev

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