blob: e3e1874b1e14d4989775e61ef676c2ee77318104 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
package org.apache.tuscany.core.injection;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Collections;
import java.util.List;
import org.apache.tuscany.core.builder.ObjectFactory;
/**
* Creates new instances of a Java class, calling a given set of injectors to configure the instance
*
* @version $Rev$ $Date$
* @see Injector
*/
public class PojoObjectFactory<T> implements ObjectFactory<T> {
// ----------------------------------
// Constants
// ----------------------------------
private static final ObjectFactory[] NO_INIT_PARAM = {};
private static final List<Injector> NO_SETTER_PARAM = Collections.EMPTY_LIST;
// ----------------------------------
// Fields
// ----------------------------------
private final Constructor<T> ctr;
private final ObjectFactory<?>[] initParamsArray;
private final List<Injector> setters;
// ----------------------------------
// Constructors
// ----------------------------------
public PojoObjectFactory(Constructor<T> ctr, List<ObjectFactory> initParams, List<Injector> setters) {
this.ctr = ctr;
if (initParams != null && initParams.size() > 0) {
initParamsArray = initParams.toArray(new ObjectFactory[initParams.size()]);
} else {
initParamsArray = NO_INIT_PARAM;
}
this.setters = setters != null ? setters : NO_SETTER_PARAM;
} // ----------------------------------
// Methods
// ----------------------------------
public T getInstance() throws ObjectCreationException {
Object[] initargs = new Object[initParamsArray.length];
// create the constructor arg array
for (int i = 0; i < initParamsArray.length; i++) {
ObjectFactory<?> objectFactory = initParamsArray[i];
initargs[i] = objectFactory.getInstance();
}
try {
T instance = ctr.newInstance(initargs);
// interate through the injectors and inject the instance
for (Injector setter : setters) {
setter.inject(instance);
}
return instance;
} catch (InstantiationException e) {
throw new AssertionError("Class is not instantiable [" + ctr.getDeclaringClass().getName() + "]");
} catch (IllegalAccessException e) {
throw new AssertionError("Constructor is not accessible [" + ctr + "]");
} catch (InvocationTargetException e) {
throw new ObjectCreationException("Exception thrown by constructor [" + ctr + "]", e);
}
}
}
|