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