MentaContainer

Rev

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