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.rest.registry;
35
36 import static info.magnolia.rest.registry.EndpointDefinitionRegistryEventType.*;
37
38 import info.magnolia.config.registry.AbstractRegistry;
39 import info.magnolia.config.registry.DefinitionMetadata;
40 import info.magnolia.config.registry.DefinitionMetadataBuilder;
41 import info.magnolia.config.registry.DefinitionProvider;
42 import info.magnolia.config.registry.DefinitionType;
43 import info.magnolia.config.registry.decoration.DefinitionDecorator;
44 import info.magnolia.event.EventBus;
45 import info.magnolia.event.SystemEventBus;
46 import info.magnolia.module.ModuleRegistry;
47 import info.magnolia.objectfactory.Components;
48 import info.magnolia.registry.RegistrationException;
49 import info.magnolia.rest.EndpointDefinition;
50
51 import java.util.Collection;
52 import java.util.List;
53 import java.util.Optional;
54 import java.util.Set;
55
56 import javax.inject.Inject;
57 import javax.inject.Named;
58 import javax.inject.Singleton;
59
60
61
62
63 @Singleton
64 public class EndpointDefinitionRegistry extends AbstractRegistry<EndpointDefinition> {
65 static final DefinitionType TYPE = new DefinitionType() {
66 @Override
67 public String name() {
68 return "restEndpoint";
69 }
70
71 @Override
72 public Class baseClass() {
73 return EndpointDefinition.class;
74 }
75 };
76
77 private EventBus systemEventBus;
78
79 @Inject
80 public EndpointDefinitionRegistry(ModuleRegistry moduleRegistry, @Named(SystemEventBus.NAME) EventBus systemEventBus) {
81 super(moduleRegistry);
82 this.systemEventBus = systemEventBus;
83 }
84
85
86
87
88 @Deprecated
89 public EndpointDefinitionRegistry(@Named(SystemEventBus.NAME) EventBus systemEventBus) {
90 this(Components.getComponent(ModuleRegistry.class), systemEventBus);
91 }
92
93 @Override
94 public DefinitionType type() {
95 return TYPE;
96 }
97
98 @Override
99 public DefinitionMetadataBuilder newMetadataBuilder() {
100 return DefinitionMetadataBuilder.usingNameAsId();
101 }
102
103 @Override
104 public void register(DefinitionProvider<EndpointDefinition> provider) {
105 super.register(provider);
106 systemEventBus.fireEvent(new EndpointDefinitionRegistryEvent(REGISTERED, provider));
107 }
108
109 @Override
110 public Set<DefinitionMetadata> unregisterAndRegister(Collection<DefinitionMetadata> toRemoveIds, Collection<DefinitionProvider<EndpointDefinition>> definitionProviders) {
111 Set<DefinitionMetadata> registeredIds = super.unregisterAndRegister(toRemoveIds, definitionProviders);
112
113 toRemoveIds.stream()
114 .filter(metadata -> !registeredIds.contains(metadata))
115 .map(DefinitionMetadata::getReferenceId)
116 .forEach(referenceId -> systemEventBus.fireEvent(new EndpointDefinitionRegistryEvent(UNREGISTERED, referenceId)));
117
118 definitionProviders.stream()
119 .filter(provider -> toRemoveIds.contains(provider.getMetadata()))
120 .filter(provider -> registeredIds.contains(provider.getMetadata()))
121 .forEach(provider -> systemEventBus.fireEvent(new EndpointDefinitionRegistryEvent(REREGISTERED, provider)));
122
123 definitionProviders.stream()
124 .filter(provider -> !toRemoveIds.contains(provider.getMetadata()))
125 .filter(provider -> registeredIds.contains(provider.getMetadata()))
126 .forEach(provider -> systemEventBus.fireEvent(new EndpointDefinitionRegistryEvent(REGISTERED, provider)));
127
128 return registeredIds;
129 }
130
131 @Override
132 public void addDecorator(DefinitionDecorator<EndpointDefinition> decorator) {
133 Optional<DefinitionProvider<EndpointDefinition>> targetProvider = getAllProviders().stream()
134 .filter(decorator::appliesTo)
135 .findFirst();
136 super.addDecorator(decorator);
137 targetProvider.ifPresent(provider -> systemEventBus.fireEvent(new EndpointDefinitionRegistryEvent(REREGISTERED, provider)));
138 }
139
140 @Override
141 public void removeDecorator(DefinitionDecorator<EndpointDefinition> decorator) {
142 Optional<DefinitionProvider<EndpointDefinition>> targetProvider = getAllProviders().stream()
143 .filter(decorator::appliesTo)
144 .findFirst();
145 super.removeDecorator(decorator);
146 targetProvider.ifPresent(provider -> systemEventBus.fireEvent(new EndpointDefinitionRegistryEvent(REREGISTERED, provider)));
147 }
148
149
150
151
152 @Deprecated
153 public EndpointDefinition getEndpointDefinition(String name) throws RegistrationException {
154 final EndpointDefinition endpointDefinition;
155 try {
156 endpointDefinition = getProvider(name).get();
157 } catch (NoSuchDefinitionException | InvalidDefinitionException e) {
158 throw new RegistrationException(e.getMessage(), e);
159 }
160 return endpointDefinition;
161 }
162
163
164
165
166 @Deprecated
167 public Set<String> unregisterAndRegister(Set<String> registeredNames, List<EndpointDefinitionProvider> providers) {
168 return null;
169 }
170
171
172
173
174 @Deprecated
175 public boolean isEndpointDefinitionRegistered(String name) {
176 try {
177 return getProvider(name).isValid();
178 } catch (NoSuchDefinitionException e) {
179 return false;
180 }
181 }
182
183
184
185
186 @Deprecated
187 public Collection<EndpointDefinition> getAllEndpointDefinitions() {
188 return getAllDefinitions();
189 }
190 }