MentaContainer

Rev

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

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