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.ui.framework.ioc;
35
36 import static java.util.stream.Collectors.toList;
37
38 import info.magnolia.event.EventBus;
39 import info.magnolia.event.SystemEventBus;
40 import info.magnolia.module.ModuleRegistry;
41 import info.magnolia.objectfactory.ComponentProvider;
42 import info.magnolia.objectfactory.Components;
43 import info.magnolia.objectfactory.configuration.ComponentConfigurer;
44 import info.magnolia.objectfactory.configuration.ComponentProviderConfiguration;
45 import info.magnolia.objectfactory.guice.GuiceComponentConfigurationModule;
46 import info.magnolia.objectfactory.guice.GuiceComponentProvider;
47 import info.magnolia.objectfactory.guice.GuiceComponentProviderBuilder;
48 import info.magnolia.objectfactory.guice.GuiceContextAndScopesConfigurer;
49 import info.magnolia.ui.api.app.AppDescriptor;
50 import info.magnolia.ui.api.app.registry.AppDescriptorRegistry;
51
52 import java.util.List;
53 import java.util.function.Supplier;
54
55 import javax.inject.Inject;
56 import javax.inject.Named;
57 import javax.inject.Singleton;
58
59 import com.google.inject.Module;
60 import com.google.inject.util.Modules;
61 import com.vaadin.server.VaadinServlet;
62
63
64
65
66
67
68
69
70
71
72
73
74
75 @Singleton
76 public class MagnoliaUiGuiceComponentProviderFactory {
77
78 private final EventBus systemEventBus;
79 private final ModuleRegistry moduleRegistry;
80 private final Supplier<List<String>> appNameListSupplier;
81
82
83 private GuiceComponentProvider instance;
84
85 @Inject
86 MagnoliaUiGuiceComponentProviderFactory(@Named(SystemEventBus.NAME) EventBus systemEventBus, ModuleRegistry moduleRegistry, AppDescriptorRegistry appDescriptorRegistry) {
87 this(systemEventBus, moduleRegistry, () -> appDescriptorRegistry.getAllDefinitions().stream().map(AppDescriptor::getName).collect(toList()));
88 }
89
90 public MagnoliaUiGuiceComponentProviderFactory(EventBus systemEventBus, ModuleRegistry moduleRegistry, Supplier<List<String>> appNameListSupplier) {
91 this.systemEventBus = systemEventBus;
92 this.moduleRegistry = moduleRegistry;
93 this.appNameListSupplier = appNameListSupplier;
94 }
95
96
97
98
99
100
101
102
103
104
105
106 public GuiceComponentProvider create(ComponentConfigurer... additionalModules) {
107 if (instance != null) {
108 return instance;
109 }
110
111 final ComponentProvider parentComponentProvider = Components.getComponentProvider();
112
113
114
115
116
117
118 final ComponentProviderConfiguration collectedComponentBindings =
119 new UiComponentConfigurationAggregator(moduleRegistry.getModuleDefinitions(), appNameListSupplier.get()).aggregate();
120
121
122 for (ComponentConfigurer configurer : additionalModules) {
123 collectedComponentBindings.addConfigurer(configurer);
124 }
125
126
127 for (ComponentConfigurer configurer : collectedComponentBindings.getConfigurers()) {
128 configurer.doWithConfiguration(parentComponentProvider, collectedComponentBindings);
129 }
130
131
132 final Module uiGuiceModule =
133 Modules.combine(
134 new UiBaseModule(systemEventBus),
135 new DeflateUiContextDependentBindings(
136 new ProduceNewInstancesWithComponentProvider(
137 new EliminateRedundantSingletonAnnotations(
138 new RebindUiComponentScopes(
139 new GuiceComponentConfigurationModule(collectedComponentBindings))))));
140
141 final GuiceComponentProviderBuilder guiceComponentProviderBuilder = new GuiceComponentProviderBuilder();
142
143 if (parentComponentProvider instanceof GuiceComponentProvider) {
144 guiceComponentProviderBuilder.withParent((GuiceComponentProvider) parentComponentProvider);
145 }
146
147
148 final ComponentProviderConfiguration componentProviderConfig = new ComponentProviderConfiguration();
149
150
151 collectedComponentBindings.getAnnotatedTypeMappings().forEach(componentProviderConfig::addTypeMapping);
152 guiceComponentProviderBuilder.withConfiguration(componentProviderConfig);
153
154
155 guiceComponentProviderBuilder.addModule(uiGuiceModule);
156
157 this.instance = guiceComponentProviderBuilder.build(new GuiceContextAndScopesConfigurer());
158
159 return instance;
160 }
161 }