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.admincentral.findbar;
35
36 import info.magnolia.config.registry.DefinitionProvider;
37 import info.magnolia.config.registry.Registry;
38 import info.magnolia.ui.api.app.AppDescriptor;
39 import info.magnolia.ui.api.app.SubAppDescriptor;
40 import info.magnolia.ui.api.app.registry.AppDescriptorRegistry;
41 import info.magnolia.ui.contentapp.definition.ContentSubAppDescriptor;
42 import info.magnolia.ui.vaadin.integration.contentconnector.ContentConnectorDefinition;
43 import info.magnolia.ui.vaadin.integration.contentconnector.JcrContentConnectorDefinition;
44 import info.magnolia.ui.vaadin.integration.contentconnector.NodeTypeDefinition;
45
46 import java.util.Collection;
47 import java.util.Map;
48 import java.util.Optional;
49 import java.util.Set;
50 import java.util.stream.Collectors;
51
52 import javax.inject.Inject;
53 import javax.inject.Singleton;
54
55 import org.apache.commons.lang3.StringUtils;
56 import org.atteo.evo.inflector.English;
57
58 import lombok.AllArgsConstructor;
59 import lombok.Getter;
60 import lombok.Setter;
61
62
63
64
65
66
67
68 @Singleton
69 public class PeriscopeAppDetailCreator {
70
71 private final AppDescriptorRegistry appDescriptorRegistry;
72
73 private final Map<String, AppDetail> appDetails;
74
75 @Inject
76 PeriscopeAppDetailCreator(AppDescriptorRegistry appDescriptorRegistry, PeriscopeConfiguration periscopeConfiguration) {
77 this.appDescriptorRegistry = appDescriptorRegistry;
78 this.appDetails = periscopeConfiguration.getAppDetails();
79 }
80
81
82
83
84
85
86
87
88 public Optional<AppDetail> createAppDetail(String appName) {
89
90 if (appDetails != null) {
91 Optional<AppDetail> matchingAppDetail = appDetails.entrySet().stream()
92 .filter(entry -> entry.getKey().equalsIgnoreCase(appName) || English.plural(entry.getKey()).equalsIgnoreCase(appName))
93 .map(Map.Entry::getValue)
94 .filter(this::appIsValid)
95 .findFirst();
96 if (matchingAppDetail.isPresent()) {
97 return matchingAppDetail;
98 }
99 }
100
101 Collection<DefinitionProvider<AppDescriptor>> providers = appDescriptorRegistry.getAllProviders();
102 for (DefinitionProvider<AppDescriptor> provider : providers) {
103 if (!provider.isValid()) {
104 continue;
105 }
106
107 final AppDescriptor descriptor = provider.get();
108 String providerName = descriptor.getName();
109
110
111
112 if (providerName.length() - appName.length() > 2) {
113 continue;
114 }
115
116 if (providerName.startsWith(appName) || providerName.startsWith(English.plural(appName))) {
117 Collection<SubAppDescriptor> subAppDescriptors = descriptor.getSubApps().values();
118 for (SubAppDescriptor subAppDescriptor : subAppDescriptors) {
119 if (subAppDescriptor instanceof ContentSubAppDescriptor) {
120 ContentConnectorDefinition contentConnector = ((ContentSubAppDescriptor) subAppDescriptor).getContentConnector();
121 if (contentConnector instanceof JcrContentConnectorDefinition) {
122 String subAppName = descriptor.getSubApps().keySet().iterator().next();
123 JcrContentConnectorDefinition jcrContentConnectorDefinition = (JcrContentConnectorDefinition) contentConnector;
124 String workspaceName = jcrContentConnectorDefinition.getWorkspace();
125 String rootPath = jcrContentConnectorDefinition.getRootPath();
126 if (StringUtils.isBlank(workspaceName)) {
127 continue;
128 }
129 Set<String> nodeTypes = jcrContentConnectorDefinition.getNodeTypes().stream()
130 .map(NodeTypeDefinition::getName)
131 .collect(Collectors.toSet());
132 return Optional.of(new AppDetail(descriptor.getName(), subAppName, workspaceName, rootPath, nodeTypes));
133 }
134 }
135 }
136 }
137 }
138
139 return Optional.empty();
140 }
141
142
143
144
145
146
147
148
149 public Optional<AppDetail> createAppDetailForWorkspace(String workspace) {
150
151 if (appDetails != null) {
152 Optional<AppDetail> matchingAppDetail = appDetails.values().stream()
153 .filter(appDetail -> appDetail.getWorkspace().equalsIgnoreCase(workspace))
154 .filter(this::appIsValid)
155 .findFirst();
156 if (matchingAppDetail.isPresent()) {
157 return matchingAppDetail;
158 }
159 }
160
161 Collection<DefinitionProvider<AppDescriptor>> providers = appDescriptorRegistry.getAllProviders();
162 for (DefinitionProvider<AppDescriptor> provider : providers) {
163 if (!provider.isValid()) {
164 continue;
165 }
166 final AppDescriptor descriptor = provider.get();
167 Collection<SubAppDescriptor> subAppDescriptors = descriptor.getSubApps().values();
168
169 for (SubAppDescriptor subAppDescriptor : subAppDescriptors) {
170 if (subAppDescriptor instanceof ContentSubAppDescriptor) {
171 ContentConnectorDefinition contentConnector = ((ContentSubAppDescriptor) subAppDescriptor).getContentConnector();
172 if (contentConnector instanceof JcrContentConnectorDefinition) {
173 JcrContentConnectorDefinition jcrContentConnectorDefinition = (JcrContentConnectorDefinition) contentConnector;
174 String workspaceName = jcrContentConnectorDefinition.getWorkspace();
175 String rootPath = jcrContentConnectorDefinition.getRootPath();
176 Set<String> nodeTypes = jcrContentConnectorDefinition.getNodeTypes().stream()
177 .map(NodeTypeDefinition::getName)
178 .collect(Collectors.toSet());
179 if (StringUtils.isNotBlank(workspaceName) && workspace.equals(workspaceName)) {
180 final String subAppName = descriptor.getSubApps().keySet().iterator().next();
181 return Optional.of(new AppDetail(descriptor.getName(), subAppName, workspaceName, rootPath, nodeTypes));
182 }
183 }
184 }
185 }
186 }
187
188 return Optional.empty();
189 }
190
191 private boolean appIsValid(AppDetail appDetail) {
192 try {
193 DefinitionProvider<AppDescriptor> provider = appDescriptorRegistry.getProvider(appDetail.getAppName());
194 return provider.isValid();
195 } catch (Registry.NoSuchDefinitionException e) {
196 return false;
197 }
198 }
199
200 private Optional<AppDescriptor> getDescriptor(String appName) {
201 try {
202 DefinitionProvider<AppDescriptor> provider = appDescriptorRegistry.getProvider(appName);
203 return provider.isValid() ? Optional.of(provider.get()) : Optional.empty();
204 } catch (Registry.NoSuchDefinitionException e) {
205 return Optional.empty();
206 }
207 }
208
209
210
211
212
213 @AllArgsConstructor
214 @Setter
215 @Getter
216 public static class AppDetail {
217 private String appName;
218 private String subAppName;
219 private String workspace;
220 private String rootPath;
221 private Set<String> nodeTypes;
222 }
223 }