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.contenttype.chooser;
35
36 import static info.magnolia.ui.contenttype.AppWithContentType.CONTENT_TYPE_REFERENCE_PREFIX;
37
38 import info.magnolia.config.registry.DefinitionProvider;
39 import info.magnolia.objectfactory.Components;
40 import info.magnolia.ui.api.app.AppDescriptor;
41 import info.magnolia.ui.api.app.registry.AppDescriptorRegistry;
42 import info.magnolia.ui.chooser.definition.AppAwareWorkbenchChooserDefinition;
43 import info.magnolia.ui.contenttype.ContentTypeAppDescriptor;
44
45 import java.util.Optional;
46
47 import org.apache.commons.lang3.StringUtils;
48
49
50
51
52
53
54 public class ContentTypeAppAwareWorkbenchChooserDefinition<T> extends AppAwareWorkbenchChooserDefinition<T> {
55
56 public static final String SELF_APP_REFERENCE = "self";
57
58 private final AppDescriptorRegistry appRegistry;
59
60 public ContentTypeAppAwareWorkbenchChooserDefinition() {
61 this.appRegistry = Components.getComponent(AppDescriptorRegistry.class);
62 }
63
64 @Override
65 public String getAppName() {
66 String appName = super.getAppName();
67 if (SELF_APP_REFERENCE.equalsIgnoreCase(appName)) {
68 appName = resolveCurrentAppName().orElse(appName);
69 } else if (StringUtils.startsWith(appName, CONTENT_TYPE_REFERENCE_PREFIX)) {
70 appName = resolveContentTypeAppName(appName).orElse(appName);
71 }
72 return appName;
73 }
74
75 private Optional<String> resolveCurrentAppName() {
76 return Optional.ofNullable(Components.getComponent(AppDescriptor.class).getName());
77 }
78
79 private Optional<String> resolveContentTypeAppName(String appName) {
80 String contentType = StringUtils.removeStart(appName, CONTENT_TYPE_REFERENCE_PREFIX);
81
82 return appRegistry.getAllProviders().stream()
83 .filter(DefinitionProvider::isValid)
84 .map(DefinitionProvider::get)
85 .filter(ContentTypeAppDescriptor.class::isInstance)
86 .map(ContentTypeAppDescriptor.class::cast)
87 .filter(appDescriptor -> StringUtils.equalsIgnoreCase(contentType, appDescriptor.getContentType()))
88 .findFirst()
89 .map(AppDescriptor::getName);
90 }
91 }