MentaContainer

Rev

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

Rev 4 Rev 20
Line 4... Line 4...
4
import java.util.HashMap;
4
import java.util.HashMap;
5
import java.util.HashSet;
5
import java.util.HashSet;
6
import java.util.Map;
6
import java.util.Map;
7
import java.util.Set;
7
import java.util.Set;
8
8
-
 
9
import org.mentacontainer.Component;
9
import org.mentacontainer.Container;
10
import org.mentacontainer.Container;
-
 
11
import org.mentacontainer.Dependency;
10
import org.mentacontainer.util.InjectionUtils;
12
import org.mentacontainer.util.InjectionUtils;
11
13
-
 
14
/**
-
 
15
 * The implementation of the IoC container.
-
 
16
 *
-
 
17
 * @author sergio.oliveira.jr@gmail.com
-
 
18
 */
12
public class MentaContainer implements Container {
19
public class MentaContainer implements Container {
13
20
14
    private Map<String, Component> beans = new HashMap<String, Component>();
-
 
-
 
21
        private Map<String, Component> beans = new HashMap<String, Component>();
15
22
16
    private Map<String, Object> singletons = new HashMap<String, Object>();
-
 
-
 
23
        private Map<String, Object> singletons = new HashMap<String, Object>();
17
24
18
    private Set<Dependency> dependencies = new HashSet<Dependency>();
-
 
-
 
25
        private Set<Dependency> dependencies = new HashSet<Dependency>();
19
26
20
    public Object get(String key) {
-
 
-
 
27
        public Object get(String key) {
21
28
22
        if (!beans.containsKey(key)) throw new RuntimeException("Container does not have this bean set: " + key);
-
 
-
 
29
                if (!beans.containsKey(key)) throw new RuntimeException("Container does not have this bean set: " + key);
23
30
24
        Component c = beans.get(key);
-
 
-
 
31
                Component c = beans.get(key);
25
32
26
        Object target = null;
-
 
-
 
33
                Object target = null;
27
34
28
        try {
-
 
-
 
35
                try {
29
36
30
            if (c.isSingleton()) {
-
 
-
 
37
                        if (c.isSingleton()) {
31
38
32
                if (singletons.containsKey(key)) {
-
 
-
 
39
                                if (singletons.containsKey(key)) {
33
40
34
                    target = singletons.get(key);
-
 
-
 
41
                                        target = singletons.get(key);
35
42
36
                    return target;
-
 
-
 
43
                                        return target;
37
44
38
                } else {
-
 
-
 
45
                                } else {
39
46
40
                    target = c.getInstance();
-
 
-
 
47
                                        target = c.getInstance();
41
48
42
                    singletons.put(key, target);
-
 
43
                }
-
 
-
 
49
                                        singletons.put(key, target);
-
 
50
                                }
44
51
45
            } else {
-
 
-
 
52
                        } else {
46
53
47
                target = c.getInstance();
-
 
-
 
54
                                target = c.getInstance();
48
55
49
            }
-
 
-
 
56
                        }
50
57
51
            if (target != null) {
-
 
-
 
58
                        if (target != null) {
52
59
53
                for (Dependency d : dependencies) {
-
 
-
 
60
                                for (Dependency d : dependencies) {
54
61
55
                    // has dependency ?
-
 
56
                    Method m = d.getMethod(target.getClass());
-
 
-
 
62
                                        // has dependency ?
-
 
63
                                        Method m = d.check(target.getClass());
57
64
58
                    if (m != null) {
-
 
-
 
65
                                        if (m != null) {
59
66
60
                        String sourceKey = d.getSource();
-
 
-
 
67
                                                String sourceKey = d.getSource();
61
68
62
                        if (sourceKey.equals(key)) {
-
 
-
 
69
                                                if (sourceKey.equals(key)) {
63
70
64
                            // cannot depend on itself...
-
 
65
                            // also avoid recursive StackOverflow...
-
 
-
 
71
                                                        // cannot depend on itself... also avoid recursive StackOverflow...
66
72
67
                            continue;
-
 
-
 
73
                                                        continue;
68
74
69
                        }
-
 
-
 
75
                                                }
70
76
71
                        Object source = get(sourceKey);
-
 
-
 
77
                                                Object source = get(sourceKey);
72
78
73
                        boolean isAssignable = source != null && d.getDependencyClass().isAssignableFrom(source.getClass());
-
 
-
 
79
                                                boolean isAssignable = source != null && d.getType().isAssignableFrom(source.getClass());
74
80
75
                        // check if we can find the dependency and if it is
-
 
76
                        // assignable to the target dependency
-
 
77
                        if (isAssignable) {
-
 
-
 
81
                                                // check if we can find the dependency and if it is
-
 
82
                                                // assignable to the target dependency
-
 
83
                                                if (isAssignable) {
78
84
79
                            try {
-
 
-
 
85
                                                        try {
80
86
81
                                // inject
-
 
82
                                m.invoke(target, source);
-
 
-
 
87
                                                                // inject
-
 
88
                                                                m.invoke(target, source);
83
89
84
                            } catch (Exception e) {
-
 
-
 
90
                                                        } catch (Exception e) {
85
91
86
                                throw new RuntimeException("Cannot inject dependency: method = " + (m != null ? m.getName() : "NULL") + " / source = "
-
 
87
                                        + (source != null ? source : "NULL") + " / target = " + target, e);
-
 
-
 
92
                                                                throw new RuntimeException("Cannot inject dependency: method = " + (m != null ? m.getName() : "NULL") + " / source = "
-
 
93
                                                                        + (source != null ? source : "NULL") + " / target = " + target, e);
88
94
89
                            }
-
 
-
 
95
                                                        }
90
96
-
 
97
                                                }
-
 
98
                                        }
-
 
99
                                }
91
                        }
100
                        }
92
                    }
-
 
93
                }
-
 
94
            }
-
 
95
101
96
            return target; // return target nicely with all the dependencies
-
 
97
                           // injected
-
 
-
 
102
                        return target; // return target nicely with all the dependencies
98
103
99
        } catch (Exception e) {
-
 
-
 
104
                } catch (Exception e) {
100
105
101
            throw new RuntimeException(e);
-
 
-
 
106
                        throw new RuntimeException(e);
-
 
107
                }
102
        }
108
        }
103
    }
-
 
104
109
105
    public Container ioc(String key, Class<? extends Object> klass, boolean singleton) {
-
 
-
 
110
        public Component ioc(Component component) {
-
 
111
               
-
 
112
                String key = component.getName();
106
113
107
        if (beans.containsKey(key)) throw new RuntimeException("Container already set for the bean key: " + key);
-
 
-
 
114
                if (beans.containsKey(key)) throw new RuntimeException("Container already set for the bean key: " + key);
108
115
109
        Component c = new Component(klass, singleton);
-
 
-
 
116
                beans.put(key, component);
110
117
111
        beans.put(key, c);
-
 
-
 
118
                return component;
-
 
119
        }
-
 
120
       
-
 
121
        public Component ioc(String key, Class<? extends Object> klass) {
-
 
122
               
-
 
123
                return ioc(new MentaComponent(key, klass));
-
 
124
        }
-
 
125
       
-
 
126
        public Component ioc(String key, Class<? extends Object> klass, boolean singleton) {
-
 
127
               
-
 
128
                return ioc(new MentaComponent(key, klass, singleton));
-
 
129
        }
112
130
113
        return this;
-
 
114
    }
-
 
-
 
131
        public Dependency autowire(Dependency d) {
115
132
116
    public Container ioc(String key, Class<? extends Object> klass) {
-
 
-
 
133
                if (dependencies.contains(d)) throw new RuntimeException("Dependency is already set: " + d.getTarget());
117
134
118
        return ioc(key, klass, false);
-
 
119
    }
-
 
-
 
135
                dependencies.add(d);
120
136
121
    public Container autowire(String property, Class<? extends Object> klass, String source) {
-
 
-
 
137
                return d;
-
 
138
        }
122
139
123
        Dependency d = new Dependency(property, klass, source);
-
 
124
-
 
125
        if (dependencies.contains(d)) throw new RuntimeException("Dependency is already set: " + property);
-
 
-
 
140
        public Dependency autowire(String property, Class<? extends Object> klass) {
-
 
141
               
-
 
142
                return autowire(property, klass, property);
-
 
143
        }
126
       
144
       
127
        if (!klass.isInterface()) throw new RuntimeException("Dependency must be an interface!");
-
 
-
 
145
        public Dependency autowire(String property, Class<? extends Object> klass, String source) {
-
 
146
               
-
 
147
                return autowire(new MentaDependency(property, klass, source));
-
 
148
        }
128
149
129
        dependencies.add(d);
-
 
-
 
150
        public Container populate(Object bean) throws Exception {
130
151
131
        return this;
-
 
132
    }
-
 
-
 
152
                InjectionUtils.getObject(bean, this, false, null, true, false, true);
133
153
134
    public Container autowire(String property, Class<? extends Object> klass) {
-
 
135
        return autowire(property, klass, property);
-
 
136
    }
-
 
-
 
154
                return this;
-
 
155
        }
137
156
138
    public Container init(String key, Object value) {
-
 
-
 
157
        public boolean contains(String key) {
139
158
140
        if (!beans.containsKey(key)) throw new RuntimeException("Container does not have this bean set: " + key);
-
 
141
-
 
142
        Component c = beans.get(key);
-
 
143
-
 
144
        c.addInitValue(value);
-
 
145
-
 
146
        return this;
-
 
147
    }
-
 
148
-
 
149
    public Container set(String key, String name, Object value) {
-
 
150
-
 
151
        if (!beans.containsKey(key)) throw new RuntimeException("Container does not have this bean set: " + key);
-
 
152
-
 
153
        Component c = beans.get(key);
-
 
154
-
 
155
        c.addProperty(name, value);
-
 
156
-
 
157
        return this;
-
 
158
    }
-
 
159
-
 
160
    public Container populate(Object bean) throws Exception {
-
 
161
-
 
162
        InjectionUtils.getObject(bean, this, false, null, true, false, true);
-
 
163
       
-
 
164
        return this;
-
 
165
    }
-
 
166
   
-
 
167
    public boolean contains(String key) {
-
 
168
       
-
 
169
        return beans.containsKey(key);
-
 
170
    }
-
 
-
 
159
                return beans.containsKey(key);
-
 
160
        }
171
}
161
}