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.guice;
35
36 import info.magnolia.cms.core.SystemProperty;
37 import info.magnolia.objectfactory.ComponentProvider;
38 import info.magnolia.objectfactory.Components;
39 import info.magnolia.objectfactory.configuration.ComponentConfigurer;
40 import info.magnolia.objectfactory.configuration.ComponentProviderConfiguration;
41
42 import java.util.ArrayList;
43 import java.util.List;
44
45 import org.slf4j.Logger;
46 import org.slf4j.LoggerFactory;
47
48 import com.google.inject.AbstractModule;
49 import com.google.inject.CreationException;
50 import com.google.inject.Guice;
51 import com.google.inject.Injector;
52 import com.google.inject.Module;
53 import com.google.inject.Stage;
54 import com.google.inject.util.Modules;
55 import com.mycila.inject.jsr250.Jsr250;
56
57
58
59
60
61
62 public class GuiceComponentProviderBuilder {
63
64 private static final Logger log = LoggerFactory.getLogger(GuiceComponentProviderBuilder.class);
65 private ComponentProviderConfiguration configuration;
66 private boolean exposeGlobally;
67 private GuiceComponentProvider parent;
68 private final List<Module> extraModules = new ArrayList<Module>();
69 private Stage stage;
70
71 public GuiceComponentProviderBuilder exposeGlobally() {
72 this.exposeGlobally = true;
73 return this;
74 }
75
76 public GuiceComponentProviderBuilder withConfiguration(ComponentProviderConfiguration configuration) {
77 this.configuration = configuration;
78 return this;
79 }
80
81 public GuiceComponentProviderBuilder withParent(GuiceComponentProvider parent) {
82 this.parent = parent;
83 return this;
84 }
85
86 public GuiceComponentProviderBuilder inStage(Stage stage) {
87 this.stage = stage;
88 return this;
89 }
90
91 public void addModule(Module module) {
92 this.extraModules.add(module);
93 }
94
95 public GuiceComponentProvider build(ComponentConfigurer... configurers) {
96
97 if (configuration == null) {
98 configuration = new ComponentProviderConfiguration();
99 }
100
101
102 for (ComponentConfigurer configurer : configurers) {
103 configuration.addConfigurer(configurer);
104 }
105
106
107 for (ComponentConfigurer configurer : configuration.getConfigurers()) {
108 configurer.doWithConfiguration(parent, configuration);
109 }
110
111
112 final GuiceComponentProvider componentProvider = new GuiceComponentProvider(configuration.getTypeMapping(), parent);
113 if (exposeGlobally) {
114 Components.setComponentProvider(componentProvider);
115 }
116
117 Module module = new AbstractModule() {
118 @Override
119 protected void configure() {
120
121
122 bind(ComponentProvider.class).toInstance(componentProvider);
123
124
125 if (Boolean.valueOf(SystemProperty.getProperty("magnolia.jsr250.enabled", "true"))) {
126
127 install(Jsr250.newJsr250Module());
128 }
129
130 install(new GuiceComponentConfigurationModule(configuration));
131
132 for (Module extraModule : extraModules) {
133 binder().install(extraModule);
134 }
135 }
136 };
137
138 if (parent != null) {
139 GuiceParentBindingsModule parentBindingsModule = new GuiceParentBindingsModule(parent.getInjector());
140 module = Modules.override(parentBindingsModule).with(module);
141 }
142
143 try {
144 Injector injector = Guice.createInjector(resolveStageToUse(), module);
145 return (GuiceComponentProvider) injector.getInstance(ComponentProvider.class);
146 } catch (CreationException e) {
147 log.error("Magnolia failed to load module configuration. Please ensure you don't have any legacy modules present in your web application.", e);
148 throw e;
149 }
150
151 }
152
153 public GuiceComponentProvider build() {
154 return build(new GuiceContextAndScopesConfigurer(), new GuicePropertyConfigurer());
155 }
156
157 private Stage resolveStageToUse() {
158 if (stage != null) {
159 return stage;
160 }
161 if (parent != null) {
162 return parent.getInjector().getInstance(Stage.class);
163 }
164 return Stage.PRODUCTION;
165 }
166 }