MentaContainer

Rev

Rev 2 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2 Rev 20
Line 6... Line 6...
6
import java.util.Iterator;
6
import java.util.Iterator;
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
10
-
 
11
import org.mentacontainer.Component;
11
import org.mentacontainer.util.FindMethod;
12
import org.mentacontainer.util.FindMethod;
12
13
13
class Component {
-
 
-
 
14
/**
-
 
15
 * A simple implementation of the Component interface.
-
 
16
 *
-
 
17
 * @author sergio.oliveira.jr@gmail.com
-
 
18
 */
-
 
19
public class MentaComponent implements Component {
-
 
20
       
-
 
21
                private final String name;
14
           
22
           
15
            private Class<? extends Object> klass;
-
 
-
 
23
            private final Class<? extends Object> klass;
16
           
24
           
17
            private Map<String, Object> props = null;
25
            private Map<String, Object> props = null;
18
           
26
           
19
            private List<Object> initValues = null;
27
            private List<Object> initValues = null;
20
           
28
           
Line 22... Line 30...
22
           
30
           
23
            private Map<String, Method> cache = null;
31
            private Map<String, Method> cache = null;
24
           
32
           
25
            private final boolean singleton;
33
            private final boolean singleton;
26
34
27
            public Component(Class<? extends Object> klass, boolean singleton) {
-
 
-
 
35
            public MentaComponent(String name, Class<? extends Object> klass, boolean singleton) {
-
 
36
               
-
 
37
                this.name = name;
28
38
29
                this.klass = klass;
39
                this.klass = klass;
30
               
40
               
31
                this.singleton = singleton;
41
                this.singleton = singleton;
-
 
42
            }
-
 
43
           
-
 
44
            public MentaComponent(String name, Class<? extends Object> klass) {
-
 
45
               
-
 
46
                this(name, klass, false);
32
            }
47
            }
33
           
48
           
34
            public boolean isSingleton() { return singleton; }
49
            public boolean isSingleton() { return singleton; }
35
           
50
           
36
            public void addProperty(String name, Object value) {
-
 
-
 
51
            public Component addProperty(String name, Object value) {
37
               
52
               
38
                if (props == null) {
53
                if (props == null) {
39
                       
54
                       
40
                    props = new HashMap<String, Object>();
55
                    props = new HashMap<String, Object>();
41
                   
56
                   
42
                    cache = new HashMap<String, Method>();
57
                    cache = new HashMap<String, Method>();
43
                }
58
                }
44
               
59
               
45
                props.put(name, value);
60
                props.put(name, value);
-
 
61
               
-
 
62
                return this;
46
            }
63
            }
47
           
64
           
48
            public void addInitValue(Object value) {
-
 
-
 
65
            public Component addInitValue(Object value) {
49
               
66
               
50
                if (initValues == null) {
67
                if (initValues == null) {
51
                       
68
                       
52
                    initValues = new LinkedList<Object>();
69
                    initValues = new LinkedList<Object>();
53
                }
70
                }
54
               
71
               
55
                initValues.add(value);
72
                initValues.add(value);
-
 
73
               
-
 
74
                return this;
56
            }
75
            }
57
           
76
           
58
            private Class<? extends Object>[] getClasses(List<Object> values) {
77
            private Class<? extends Object>[] getClasses(List<Object> values) {
59
               
78
               
60
                Class<? extends Object>[] types = (Class<? extends Object>[]) new Class[values.size()];
79
                Class<? extends Object>[] types = (Class<? extends Object>[]) new Class[values.size()];
Line 94... Line 113...
94
                   
113
                   
95
                        array[index++] = obj;
114
                        array[index++] = obj;
96
                }
115
                }
97
               
116
               
98
                return array;
117
                return array;
-
 
118
            }
-
 
119
           
-
 
120
            public String getName() {
-
 
121
               
-
 
122
                return name;
-
 
123
            }
-
 
124
           
-
 
125
            public boolean equals(Object o) {
-
 
126
               
-
 
127
                if (o instanceof MentaComponent) {
-
 
128
                       
-
 
129
                        MentaComponent c = (MentaComponent) o;
-
 
130
                       
-
 
131
                        return c.name.equals(this.name);
-
 
132
                }
-
 
133
               
-
 
134
                return false;
-
 
135
            }
-
 
136
           
-
 
137
            public int hashCode() {
-
 
138
               
-
 
139
                return name.hashCode();
99
            }
140
            }
100
           
141
           
101
                /*
142
                /*
102
                 * Use reflection to set a property in the bean
143
                 * Use reflection to set a property in the bean
103
                 */
144
                 */
104
                private void setValue(Object bean, String name, Object value) throws InstantiationException {
145
                private void setValue(Object bean, String name, Object value) throws InstantiationException {
105
               
146
               
106
                        try {
147
                        try {
-
 
148
                               
107
                                StringBuffer sb = new StringBuffer(30);
149
                                StringBuffer sb = new StringBuffer(30);
108
                                sb.append("set");
150
                                sb.append("set");
109
                                sb.append(name.substring(0,1).toUpperCase());
151
                                sb.append(name.substring(0,1).toUpperCase());
-
 
152
                               
110
                                if (name.length() > 1) sb.append(name.substring(1));
153
                                if (name.length() > 1) sb.append(name.substring(1));
111
                   
154
                   
112
                    String methodName = sb.toString();
155
                    String methodName = sb.toString();
113
                   
156
                   
114
                    if (!cache.containsKey(name)) {
157
                    if (!cache.containsKey(name)) {
-
 
158
                       
115
                        Method m = null;
159
                        Method m = null;
-
 
160
                       
116
                        try {
161
                        try {
-
 
162
                               
117
                            m = FindMethod.getMethod(klass, methodName, new Class[] { value.getClass() });
163
                            m = FindMethod.getMethod(klass, methodName, new Class[] { value.getClass() });
-
 
164
                           
118
                        } catch(Exception e) {
165
                        } catch(Exception e) {
-
 
166
                               
119
                            // try primitive...
167
                            // try primitive...
-
 
168
                               
120
                            Class<? extends Object> primitive = getPrimitiveFrom(value);
169
                            Class<? extends Object> primitive = getPrimitiveFrom(value);
-
 
170
                           
121
                            if (primitive != null) {
171
                            if (primitive != null) {
-
 
172
                               
122
                                try {
173
                                try {
-
 
174
                                       
123
                                    m = klass.getMethod(methodName, new Class[] { primitive });
175
                                    m = klass.getMethod(methodName, new Class[] { primitive });
-
 
176
                                   
124
                                } catch(Exception ex) {
177
                                } catch(Exception ex) {
125
                                        // not found!
178
                                        // not found!
126
                                }
179
                                }
127
                            }
180
                            }
128
                           
181
                           
129
                            if (m == null) {
182
                            if (m == null) {
-
 
183
                               
130
                                throw new InstantiationException("Cannot find method or field for property: " + name);
184
                                throw new InstantiationException("Cannot find method or field for property: " + name);
131
                            }
185
                            }
132
                        }
186
                        }
133
                       
187
                       
134
                        if (m != null) {
188
                        if (m != null) {
-
 
189
                               
135
                            cache.put(name, m);
190
                            cache.put(name, m);
-
 
191
                           
136
                            m.setAccessible(true);
192
                            m.setAccessible(true);
137
                        }
193
                        }
138
                    }    
194
                    }    
139
195
140
                    Method m = cache.get(name);
196
                    Method m = cache.get(name);
-
 
197
                   
141
                    if (m != null) {
198
                    if (m != null) {
-
 
199
                       
142
                        m.invoke(bean, new Object[] { value });
200
                        m.invoke(bean, new Object[] { value });
143
                    }                
201
                    }                
-
 
202
                   
144
                        } catch(Exception e) {
203
                        } catch(Exception e) {
-
 
204
                               
145
                                throw new InstantiationException("Error trying to set a property with reflection: " + name);
205
                                throw new InstantiationException("Error trying to set a property with reflection: " + name);
146
                        }
206
                        }
147
                }
207
                }
148
           
208
           
149
            private static Class<? extends Object> getPrimitiveFrom(Object w) {
209
            private static Class<? extends Object> getPrimitiveFrom(Object w) {
Line 157... Line 217...
157
                else if (w instanceof Double) { return Double.TYPE; }
217
                else if (w instanceof Double) { return Double.TYPE; }
158
                return null;
218
                return null;
159
            }  
219
            }  
160
           
220
           
161
            public Object getInstance() throws InstantiationException {
221
            public Object getInstance() throws InstantiationException {
-
 
222
               
162
                Object obj = null;
223
                Object obj = null;
-
 
224
               
163
                if (initValues != null && initValues.size() > 0) {
225
                if (initValues != null && initValues.size() > 0) {
-
 
226
                       
164
                    if (constructor == null) {
227
                    if (constructor == null) {
-
 
228
                       
165
                        try {
229
                        try {
-
 
230
                               
166
                            constructor = klass.getConstructor(getClasses(initValues));
231
                            constructor = klass.getConstructor(getClasses(initValues));
-
 
232
                           
167
                        } catch(Exception e) {
233
                        } catch(Exception e) {
-
 
234
                               
168
                            throw new InstantiationException("Cannot find a constructor for class: " + klass);
235
                            throw new InstantiationException("Cannot find a constructor for class: " + klass);
169
                        }
236
                        }
170
                    }
237
                    }
-
 
238
                   
171
                    try {
239
                    try {
-
 
240
                       
172
                        obj = constructor.newInstance(getValues(initValues));
241
                        obj = constructor.newInstance(getValues(initValues));
-
 
242
                       
173
                    } catch(Exception e) {
243
                    } catch(Exception e) {
-
 
244
                       
174
                        throw new InstantiationException("Cannot create instance from constructor: " + constructor);
245
                        throw new InstantiationException("Cannot create instance from constructor: " + constructor);
175
                    }
246
                    }
-
 
247
                   
176
                } else {
248
                } else {
-
 
249
                       
177
                    try {
250
                    try {
-
 
251
                       
178
                        obj = klass.newInstance();
252
                        obj = klass.newInstance();
-
 
253
                       
179
                    } catch(Exception e) {
254
                    } catch(Exception e) {
-
 
255
                       
180
                        throw new InstantiationException("Cannot create instance from class: " + klass);
256
                        throw new InstantiationException("Cannot create instance from class: " + klass);
181
                    }
257
                    }
182
                }
258
                }
-
 
259
               
183
                if (props != null && props.size() > 0) {
260
                if (props != null && props.size() > 0) {
-
 
261
                       
184
                    Iterator<String> iter = props.keySet().iterator();
262
                    Iterator<String> iter = props.keySet().iterator();
-
 
263
                   
185
                    while(iter.hasNext()) {
264
                    while(iter.hasNext()) {
-
 
265
                       
186
                        String name = iter.next();
266
                        String name = iter.next();
-
 
267
                       
187
                        Object value = props.get(name);
268
                        Object value = props.get(name);
-
 
269
                       
188
                        setValue(obj, name, value);
270
                        setValue(obj, name, value);
189
                    }
271
                    }
190
                }
272
                }
-
 
273
               
191
                return obj;
274
                return obj;
192
            }
275
            }
193
        }
276
        }