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