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.api.app.registry;
35
36 import info.magnolia.config.registry.AbstractRegistry;
37 import info.magnolia.config.registry.DefinitionMetadata;
38 import info.magnolia.config.registry.DefinitionMetadataBuilder;
39 import info.magnolia.config.registry.DefinitionProvider;
40 import info.magnolia.config.registry.DefinitionType;
41 import info.magnolia.event.EventBus;
42 import info.magnolia.event.SystemEventBus;
43 import info.magnolia.module.ModuleRegistry;
44 import info.magnolia.objectfactory.Components;
45 import info.magnolia.ui.api.app.AppDescriptor;
46
47 import java.util.ArrayList;
48 import java.util.Collection;
49 import java.util.Collections;
50 import java.util.List;
51 import java.util.Set;
52
53 import javax.inject.Inject;
54 import javax.inject.Named;
55 import javax.inject.Singleton;
56
57 import org.apache.commons.collections4.CollectionUtils;
58
59
60
61
62
63
64
65 @Singleton
66 public class AppDescriptorRegistry extends AbstractRegistry<AppDescriptor> {
67
68 private EventBus systemEventBus;
69
70 @Inject
71 public AppDescriptorRegistry(@Named(SystemEventBus.NAME) EventBus systemEventBus, ModuleRegistry moduleRegistry) {
72 super(moduleRegistry);
73 this.systemEventBus = systemEventBus;
74 }
75
76
77
78
79 @Deprecated
80 public AppDescriptorRegistry(@Named(SystemEventBus.NAME) EventBus systemEventBus) {
81 this(systemEventBus, Components.getComponent(ModuleRegistry.class));
82 }
83
84 @Override
85 public void register(DefinitionProvider<AppDescriptor> provider) {
86 super.register(provider);
87 sendEvent(AppRegistryEventType.REGISTERED, Collections.singleton(provider.getMetadata()));
88 }
89
90
91 public void unregister(String name) {
92 DefinitionProvider<AppDescriptor> toRemove = getProvider(name);
93 getRegistryMap().remove(toRemove.getMetadata());
94 sendEvent(AppRegistryEventType.UNREGISTERED, Collections.singleton(toRemove.getMetadata()));
95 }
96
97
98
99
100 @Deprecated
101 public AppDescriptor getAppDescriptor(String name) {
102 return getProvider(name).get();
103 }
104
105
106
107
108 @Deprecated
109 public boolean isAppDescriptorRegistered(String name) {
110 try {
111 getProvider(name);
112 } catch (NoSuchDefinitionException | IllegalStateException e) {
113 return false;
114 }
115 return true;
116 }
117
118 @SuppressWarnings("unchecked")
119 @Override
120 public Set<DefinitionMetadata> unregisterAndRegister(Collection<DefinitionMetadata> metaDataToUnregister, Collection<DefinitionProvider<AppDescriptor>> providersToRegister) {
121
122 Collection<DefinitionMetadata> metadataBefore = getRegistryMap().keySet();
123 Collection<DefinitionProvider<AppDescriptor>> providersBefore = getRegistryMap().values();
124
125 Set<DefinitionMetadata> registeredMetaData = super.unregisterAndRegister(metaDataToUnregister, providersToRegister);
126
127 Collection<DefinitionMetadata> metadataAfter = getRegistryMap().keySet();
128
129 Collection<DefinitionMetadata> added = CollectionUtils.subtract(metadataAfter, metadataBefore);
130 Collection<DefinitionMetadata> removed = CollectionUtils.subtract(metadataBefore, metadataAfter);
131 Collection<DefinitionMetadata> kept = CollectionUtils.subtract(metadataBefore, removed);
132 Collection<DefinitionMetadata> changed = getAppsThatHaveChanged(kept, providersBefore, providersToRegister);
133
134 sendEvent(AppRegistryEventType.REGISTERED, added);
135 sendEvent(AppRegistryEventType.UNREGISTERED, removed);
136 sendEvent(AppRegistryEventType.REREGISTERED, changed);
137
138 return registeredMetaData;
139 }
140
141 @Override
142 public DefinitionType type() {
143 return DefinitionTypes.APP;
144 }
145
146 @Override
147 public DefinitionMetadataBuilder newMetadataBuilder() {
148 return DefinitionMetadataBuilder.usingNameAsId();
149 }
150
151 private Collection<DefinitionMetadata> getAppsThatHaveChanged(Collection<DefinitionMetadata> kept, Collection<DefinitionProvider<AppDescriptor>> providersBefore, Collection<DefinitionProvider<AppDescriptor>> providersToRegister) {
152 final List<DefinitionMetadata> changed = new ArrayList<>();
153 for (DefinitionMetadata metadata : kept) {
154 if (!getAppDescriptor(metadata, providersBefore).equals(getAppDescriptor(metadata, providersToRegister))) {
155 changed.add(metadata);
156 }
157 }
158 return changed;
159 }
160
161 private AppDescriptor getAppDescriptor(DefinitionMetadata metadata, Collection<DefinitionProvider<AppDescriptor>> providers) {
162 for (DefinitionProvider<AppDescriptor> provider : providers) {
163 if (provider.getMetadata().equals(metadata)) {
164 return provider.get();
165 }
166 }
167 return null;
168 }
169
170
171
172
173 private void sendEvent(AppRegistryEventType eventType, Collection<DefinitionMetadata> appDescriptors) {
174 for (DefinitionMetadata appMetadata : appDescriptors) {
175 systemEventBus.fireEvent(new AppRegistryEvent(appMetadata, eventType));
176 }
177 }
178 }