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.framework.chooser.definition;
35
36 import info.magnolia.config.MutableWrapper;
37 import info.magnolia.config.Mutator;
38 import info.magnolia.ui.api.app.registry.AppDescriptorRegistry;
39 import info.magnolia.ui.contentapp.configuration.BrowserDescriptor;
40 import info.magnolia.ui.contentapp.configuration.ContentViewDefinition;
41 import info.magnolia.ui.contentapp.configuration.WorkbenchDefinition;
42
43 import java.util.Optional;
44
45 import javax.inject.Inject;
46
47 import lombok.AccessLevel;
48 import lombok.Getter;
49 import lombok.Setter;
50
51
52
53
54
55
56
57 @Getter
58 @Setter
59 public class AppAwareWorkbenchChooserDefinition<DD, T> extends WorkbenchChooserDefinition<DD, T> {
60
61 private String title;
62 private String appName;
63 private WorkbenchDefinition<T> workbenchDefinition;
64
65 @Getter(AccessLevel.PRIVATE)
66 @Setter(AccessLevel.PRIVATE)
67 private AppDescriptorRegistry appDescriptorRegistry;
68
69 @Inject
70 public AppAwareWorkbenchChooserDefinition(AppDescriptorRegistry appDescriptorRegistry) {
71 super();
72 this.appDescriptorRegistry = appDescriptorRegistry;
73 }
74
75
76
77
78
79
80
81 @Override
82 public DD getDatasource() {
83 return Optional.ofNullable(super.getDatasource()).orElseGet(() -> resolveDatasourceFromAppName()
84 .orElseThrow(() -> new IllegalStateException("Could not resolve datasource from chooser definition")));
85 }
86
87 @SuppressWarnings("unchecked")
88 private Optional<DD> resolveDatasourceFromAppName() {
89 return (Optional<DD>) resolveBrowserDescriptorFromAppName().map(BrowserDescriptor::getDatasource);
90 }
91
92 @Override
93 public WorkbenchDefinition<T> getWorkbench() {
94 WorkbenchDefinition<T> workbenchFromAppOrDefault = resolveWorkbenchDefinitionFromAppName().orElse(super.getWorkbench());
95 final WorkbenchDefinition<T> workbenchDefinition = Optional.ofNullable(this.workbenchDefinition).orElse(workbenchFromAppOrDefault);
96 final WorkbenchDefinition<T> wrapped = MutableWrapper.wrap(workbenchDefinition);
97 wrapped.getContentViews().forEach(this::applySingleSelectAndReadOnly);
98 return wrapped;
99 }
100
101 private void applySingleSelectAndReadOnly(ContentViewDefinition<T> viewDefinition) {
102 final TabularViewMutator tabularViewMutator = new TabularViewMutator<>(MutableWrapper.asMutable(viewDefinition));
103 if (!this.isMultiSelect()) {
104 tabularViewMutator.setSingleSelectMode();
105 }
106 tabularViewMutator.setReadOnly();
107 }
108
109 private Optional<WorkbenchDefinition<T>> resolveWorkbenchDefinitionFromAppName() {
110 return resolveBrowserDescriptorFromAppName().map(BrowserDescriptor::getWorkbench);
111 }
112
113 private Optional<BrowserDescriptor> resolveBrowserDescriptorFromAppName() {
114 return Optional.ofNullable(getAppName())
115 .map(getAppDescriptorRegistry()::getProvider)
116 .map(provider -> provider.get().getSubApps().values()
117 .stream()
118 .filter(BrowserDescriptor.class::isInstance)
119 .map(BrowserDescriptor.class::cast)
120 .findFirst()
121 .orElseThrow(() -> new IllegalStateException("Could not resolve browser descriptor from app " + getAppName())));
122 }
123
124 private static class TabularViewMutator<T> extends Mutator<ContentViewDefinition<T>> {
125
126 TabularViewMutator(MutableWrapper.Mutable<ContentViewDefinition<T>> mutableObject) {
127 super(mutableObject);
128 }
129
130 void setSingleSelectMode() {
131 setProperty("multiSelect", false);
132 }
133
134 void setReadOnly() {
135 setProperty("readOnly", true);
136 }
137 }
138 }