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 import info.magnolia.objectfactory.guice.GuiceComponentProvider;
37 import info.magnolia.objectfactory.guice.GuiceUtils;
38
39 import java.lang.annotation.Annotation;
40
41 import javax.inject.Named;
42
43 import com.google.inject.Injector;
44 import com.google.inject.Key;
45
46
47
48
49
50
51
52
53
54 public class Components {
55
56 private static volatile ComponentProvider componentProvider = new NullComponentProvider();
57 private static ThreadLocal<ComponentProvider> threadLocalHierarchy = new ThreadLocal<ComponentProvider>();
58
59
60
61
62 public static void setComponentProvider(ComponentProvider provider) {
63 componentProvider = provider;
64 }
65
66
67
68
69 public static ComponentProvider getComponentProvider() {
70 ComponentProvider scoped = threadLocalHierarchy.get();
71 if (scoped != null) {
72 return scoped;
73 }
74 return componentProvider;
75 }
76
77 public static void pushProvider(ComponentProvider provider) {
78 if (threadLocalHierarchy.get() != null) {
79 throw new IllegalStateException("Only one additional scope is supported");
80 }
81 threadLocalHierarchy.set(provider);
82 }
83
84 public static void popProvider() {
85 threadLocalHierarchy.remove();
86 }
87
88
89
90
91
92
93
94 @Deprecated
95 public static <T> T getSingleton(Class<T> type) {
96 return getComponent(type);
97 }
98
99 public static <T> T newInstance(Class<T> type, Object... parameters) {
100 return getComponentProvider().newInstance(type, parameters);
101 }
102
103
104
105
106 public static <T> T getComponent(Class<T> type) {
107 return getComponentProvider().getComponent(type);
108 }
109
110 public static <T> T getComponentWithAnnotation(Class<T> type, Annotation annotation) {
111 ComponentProvider componentProvider = getComponentProvider();
112 if (!(componentProvider instanceof GuiceComponentProvider)) {
113 throw new NoSuchComponentException("Component provider does not support resolving of components by annotation.");
114 }
115 Injector injector = ((GuiceComponentProvider) componentProvider).getInjector();
116 Key<T> key = Key.get(type, annotation);
117 if (!GuiceUtils.hasExplicitBindingFor(injector, key)) {
118 throw new NoSuchComponentException("No component configuration for type [" + type.getName() + "] with annotation [" + annotation + "] found. Please add a configuration to your module descriptor.");
119 }
120 return injector.getInstance(key);
121 }
122
123 public static Named named(String name) {
124 return new NamedImpl(name);
125 }
126
127 private static class NullComponentProvider implements ComponentProvider {
128
129 @Override
130 public <C> Class<? extends C> getImplementation(Class<C> type) throws ClassNotFoundException {
131 throw new IllegalStateException("No ComponentProvider has been set yet, something must have gone terribly wrong at startup.");
132 }
133
134 @Override
135 public <T> T getComponent(Class<T> type) {
136 throw new IllegalStateException("No ComponentProvider has been set yet, something must have gone terribly wrong at startup.");
137 }
138
139 @Override
140 public <T> T getSingleton(Class<T> type) {
141 throw new IllegalStateException("No ComponentProvider has been set yet, something must have gone terribly wrong at startup.");
142 }
143
144 public <T> T newInstance(Class<T> type) {
145 throw new IllegalStateException("No ComponentProvider has been set yet, something must have gone terribly wrong at startup.");
146 }
147
148 @Override
149 public <T> T newInstance(Class<T> type, Object... parameters) {
150 throw new IllegalStateException("No ComponentProvider has been set yet, something must have gone terribly wrong at startup.");
151 }
152
153 @Override
154 public <T> T newInstanceWithParameterResolvers(Class<T> type, ParameterResolver... parameters) {
155 throw new IllegalStateException("No ComponentProvider has been set yet, something must have gone terribly wrong at startup.");
156 }
157
158 @Override
159 public ComponentProvider getParent() {
160 throw new IllegalStateException("No ComponentProvider has been set yet, something must have gone terribly wrong at startup.");
161 }
162
163 }
164 }