MentaContainer

Rev

Rev 91 | Rev 95 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 91 Rev 94
Line 7... Line 7...
7
import java.util.LinkedList;
7
import java.util.LinkedList;
8
import java.util.List;
8
import java.util.List;
9
import java.util.Map;
9
import java.util.Map;
10
import java.util.Set;
10
import java.util.Set;
11
11
12
import org.mentacontainer.Interceptable;
-
 
13
import org.mentacontainer.Factory;
-
 
14
import org.mentacontainer.ConfigurableFactory;
12
import org.mentacontainer.ConfigurableFactory;
15
import org.mentacontainer.Container;
13
import org.mentacontainer.Container;
16
import org.mentacontainer.Dependency;
-
 
-
 
14
import org.mentacontainer.Factory;
-
 
15
import org.mentacontainer.Interceptable;
17
import org.mentacontainer.Scope;
16
import org.mentacontainer.Scope;
-
 
17
import org.mentacontainer.SetterDependency;
18
import org.mentacontainer.util.InjectionUtils;
18
import org.mentacontainer.util.InjectionUtils;
19
import org.mentacontainer.util.InjectionUtils.Provider;
19
import org.mentacontainer.util.InjectionUtils.Provider;
20
20
21
/**
21
/**
22
 * The implementation of the IoC container.
22
 * The implementation of the IoC container.
Line 33... Line 33...
33
       
33
       
34
        private Map<String, Object> singletonsCache = new Hashtable<String, Object>();
34
        private Map<String, Object> singletonsCache = new Hashtable<String, Object>();
35
       
35
       
36
        private Map<String, ThreadLocal<Object>> threadLocalsCache = new Hashtable<String, ThreadLocal<Object>>();
36
        private Map<String, ThreadLocal<Object>> threadLocalsCache = new Hashtable<String, ThreadLocal<Object>>();
37
       
37
       
38
        private Set<Dependency> dependencies = Collections.synchronizedSet(new HashSet<Dependency>());
-
 
-
 
38
        private Set<SetterDependency> dependencies = Collections.synchronizedSet(new HashSet<SetterDependency>());
39
       
39
       
40
        @Override
40
        @Override
41
       
-
 
42
        public Class<? extends Object> getType(String key) {
41
        public Class<? extends Object> getType(String key) {
43
               
42
               
44
                Factory factory = factoriesByName.get(key);
43
                Factory factory = factoriesByName.get(key);
45
               
44
               
46
                if (factory == null) return null;
45
                if (factory == null) return null;
Line 307... Line 306...
307
                                throw new UnsupportedOperationException("Don't know how to handle scope: " + scope);
306
                                throw new UnsupportedOperationException("Don't know how to handle scope: " + scope);
308
                        }
307
                        }
309
308
310
                        if (target != null) {
309
                        if (target != null) {
311
310
312
                                for (Dependency d : dependencies) {
-
 
-
 
311
                                for (SetterDependency d : dependencies) {
313
312
314
                                        // has dependency ?
313
                                        // has dependency ?
315
                                        Method m = d.check(target.getClass());
314
                                        Method m = d.check(target.getClass());
316
315
317
                                        if (m != null) {
316
                                        if (m != null) {
Line 326... Line 325...
326
325
327
                                                }
326
                                                }
328
327
329
                                                Object source = get(sourceKey);
328
                                                Object source = get(sourceKey);
330
329
331
                                                boolean isAssignable = source != null && d.getType().isAssignableFrom(source.getClass());
-
 
-
 
330
                                                try {
332
331
333
                                                // check if we can find the dependency and if it is
-
 
334
                                                // assignable to the target dependency
-
 
335
                                                if (isAssignable) {
-
 
-
 
332
                                                        // inject
-
 
333
                                                        m.invoke(target, source);
336
334
337
                                                        try {
-
 
-
 
335
                                                } catch (Exception e) {
338
336
339
                                                                // inject
-
 
340
                                                                m.invoke(target, source);
-
 
341
-
 
342
                                                        } catch (Exception e) {
-
 
343
-
 
344
                                                                throw new RuntimeException("Cannot inject dependency: method = " + (m != null ? m.getName() : "NULL") + " / source = "
-
 
345
                                                                        + (source != null ? source : "NULL") + " / target = " + target, e);
-
 
346
-
 
347
                                                        }
-
 
-
 
337
                                                        throw new RuntimeException("Cannot inject dependency: method = " + (m != null ? m.getName() : "NULL") + " / source = "
-
 
338
                                                                + (source != null ? source : "NULL") + " / target = " + target, e);
348
339
349
                                                }
340
                                                }
350
                                        }
341
                                        }
351
                                }
342
                                }
352
                        }
343
                        }
Line 429... Line 420...
429
               
420
               
430
                return cc;
421
                return cc;
431
        }
422
        }
432
423
433
        @Override
424
        @Override
434
        public Dependency wire(Dependency d) {
-
 
-
 
425
        public SetterDependency autowireBySetter(String targetProperty, String sourceFromContainer) {
-
 
426
               
-
 
427
                Class<? extends Object> sourceType = getType(sourceFromContainer);
435
428
-
 
429
                SetterDependency d = new SetterDependency(targetProperty, sourceFromContainer, sourceType);
-
 
430
               
436
                dependencies.add(d);
431
                dependencies.add(d);
437
432
438
                return d;
433
                return d;
439
        }
-
 
440
-
 
441
        @Override
-
 
442
        public Dependency wire(String property, Class<? extends Object> klass) {
-
 
443
               
-
 
444
                return wire(property, klass, property);
-
 
445
        }
434
        }
446
       
435
       
447
        @Override
436
        @Override
448
        public Dependency wire(String property, Class<? extends Object> klass, String source) {
-
 
-
 
437
        public SetterDependency autowireBySetter(String targetProperty) {
449
               
438
               
450
                return wire(new Dependency(property, klass, source));
-
 
-
 
439
                return autowireBySetter(targetProperty, targetProperty);
451
        }
440
        }
452
441
453
        @Override
442
        @Override
454
        public Container populate(Object bean) {
443
        public Container populate(Object bean) {
455
               
444