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.contentapp;
35
36 import static java.util.stream.Collectors.*;
37
38 import info.magnolia.objectfactory.ComponentProvider;
39 import info.magnolia.objectfactory.Components;
40 import info.magnolia.ui.api.i18n.I18NAuthoringSupport;
41 import info.magnolia.ui.availability.AvailabilityChecker;
42 import info.magnolia.ui.contentapp.browser.TreePresenter;
43 import info.magnolia.ui.contentapp.browser.TreeView;
44 import info.magnolia.ui.contentapp.configuration.TreeViewDefinition;
45 import info.magnolia.ui.contentapp.configuration.column.ColumnDefinition;
46 import info.magnolia.ui.contentapp.observation.JcrDataSourceObservation;
47 import info.magnolia.ui.datasource.DatasourceDefinition;
48 import info.magnolia.ui.datasource.jcr.JcrDatasource;
49 import info.magnolia.ui.datasource.jcr.JcrDatasourceDefinition;
50 import info.magnolia.ui.editor.JcrItemPropertySet;
51 import info.magnolia.ui.filter.DataFilter;
52
53 import java.util.ArrayList;
54 import java.util.List;
55 import java.util.Optional;
56 import java.util.stream.Stream;
57
58 import javax.inject.Inject;
59 import javax.jcr.Item;
60 import javax.jcr.Node;
61
62 import com.machinezoo.noexception.Exceptions;
63 import com.vaadin.data.PropertySet;
64 import com.vaadin.data.provider.DataProvider;
65
66
67
68
69
70 public class JcrTreePresenter extends TreePresenter<Item> {
71
72 private final JcrItemInteractionAvailability interactionAvailability;
73 private final I18NAuthoringSupport<Item> i18NAuthoringSupport;
74 private final JcrDatasourceDefinition datasourceDefinition;
75
76 @Inject
77 JcrTreePresenter(
78 TreeViewDefinition<Item> definition,
79 ComponentProvider componentProvider,
80 AvailabilityChecker<Node> availabilityChecker,
81 JcrDatasource datasource,
82 JcrDataSourceObservation datasourceObservation, I18NAuthoringSupport<Item> i18NAuthoringSupport, JcrDatasourceDefinition datasourceDefinition) {
83 super(definition, componentProvider, availabilityChecker, datasource, datasourceObservation);
84 this.interactionAvailability = new JcrItemInteractionAvailability(datasource);
85 this.i18NAuthoringSupport = i18NAuthoringSupport;
86 this.datasourceDefinition = datasourceDefinition;
87 }
88
89
90
91
92 @Deprecated
93 public JcrTreePresenter(TreeViewDefinition<Item> definition, ComponentProvider componentProvider, AvailabilityChecker availabilityChecker, JcrDatasource datasource, JcrDataSourceObservation datasourceObservation) {
94 this(definition, componentProvider, availabilityChecker, datasource, datasourceObservation, Components.getComponent(I18NAuthoringSupport.class), (JcrDatasourceDefinition) Components.getComponent(DatasourceDefinition.class));
95 }
96
97 @Override
98 public Stream<Item> getParents(Item item) {
99 final List<Item> parents = new ArrayList<>();
100 Optional<Item> parent = getDirectParent(item);
101 while (parent.isPresent()) {
102 parents.add(parent.get());
103 parent = getDirectParent(parent.get());
104 }
105 return parents.stream();
106 }
107
108 @Override
109 public FilterableHierarchicalDataProvider<Item> createDataProvider() {
110 final DataProvider<Item, DataFilter> filteringDataProvider = (DataProvider) componentProvider.newInstance(JcrDataProvider.class);
111 return FilterableHierarchicalDataProvider.wrap(componentProvider.newInstance(HierarchicalJcrDataProvider.class), filteringDataProvider);
112 }
113
114 private Optional<Item> getDirectParent(Item item) {
115 return Exceptions.wrap().get(() -> {
116 if (item.isNode() && item.getDepth() == 0) {
117 return Optional.empty();
118 }
119 return Optional.of(item.getParent());
120 });
121 }
122
123 @Override
124 protected PropertySet<Item> createPropertySet() {
125 final List<JcrItemPropertySet.JcrPropertyDescriptor> propertyDescriptors = definition.getColumns().stream().collect(toMap(ColumnDefinition::getName, ColumnDefinition::getType))
126 .entrySet().stream()
127 .map(entry -> JcrItemPropertySet.JcrPropertyDescriptor.builder()
128 .type((Class) entry.getValue())
129 .name(entry.getKey())
130 .nodeNameProperty(datasourceDefinition.getNodeNameProperty())
131 .build())
132 .collect(toList());
133 return new JcrItemPropertySet(propertyDescriptors, i18NAuthoringSupport);
134 }
135
136 @Override
137 public boolean isItemAvailable(Item item) {
138 return this.interactionAvailability.isItemAvailable(item);
139 }
140 }