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 package info.magnolia.objectfactory;
35
36
37
38
39
40
41
42
43
44
45 public class Components {
46
47 private static volatile ComponentProvider componentProvider = new NullComponentProvider();
48 private static ThreadLocal<ComponentProvider> threadLocalHierarchy = new ThreadLocal<ComponentProvider>();
49
50
51
52
53 public static void setComponentProvider(ComponentProvider provider) {
54 componentProvider = provider;
55 }
56
57
58
59
60 public static ComponentProvider getComponentProvider() {
61 ComponentProvider scoped = threadLocalHierarchy.get();
62 if (scoped != null) {
63 return scoped;
64 }
65 return componentProvider;
66 }
67
68 public static void pushProvider(ComponentProvider provider) {
69 if (threadLocalHierarchy.get() != null) {
70 throw new IllegalStateException("Only one additional scope is supported");
71 }
72 threadLocalHierarchy.set(provider);
73 }
74
75 public static void popProvider() {
76 threadLocalHierarchy.remove();
77 }
78
79
80
81
82
83
84
85 public static <T> T getSingleton(Class<T> type) {
86 return getComponent(type);
87 }
88
89 public static <T> T newInstance(Class<T> type, Object... parameters) {
90 return getComponentProvider().newInstance(type, parameters);
91 }
92
93
94
95
96 public static <T> T getComponent(Class<T> type) {
97 return getComponentProvider().getComponent(type);
98 }
99
100 private static class NullComponentProvider implements ComponentProvider {
101
102 @Override
103 public <C> Class<? extends C> getImplementation(Class<C> type) throws ClassNotFoundException {
104 throw new IllegalStateException("No ComponentProvider has been set yet, something must have gone terribly wrong at startup.");
105 }
106
107 @Override
108 public <T> T getComponent(Class<T> type) {
109 throw new IllegalStateException("No ComponentProvider has been set yet, something must have gone terribly wrong at startup.");
110 }
111
112 @Override
113 public <T> T getSingleton(Class<T> type) {
114 throw new IllegalStateException("No ComponentProvider has been set yet, something must have gone terribly wrong at startup.");
115 }
116
117 public <T> T newInstance(Class<T> type) {
118 throw new IllegalStateException("No ComponentProvider has been set yet, something must have gone terribly wrong at startup.");
119 }
120
121 @Override
122 public <T> T newInstance(Class<T> type, Object... parameters) {
123 throw new IllegalStateException("No ComponentProvider has been set yet, something must have gone terribly wrong at startup.");
124 }
125
126 @Override
127 public <T> T newInstanceWithParameterResolvers(Class<T> type, ParameterResolver... parameters) {
128 throw new IllegalStateException("No ComponentProvider has been set yet, something must have gone terribly wrong at startup.");
129 }
130
131 @Override
132 public ComponentProvider getParent() {
133 throw new IllegalStateException("No ComponentProvider has been set yet, something must have gone terribly wrong at startup.");
134 }
135
136 }
137 }