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.task.app;
35
36 import info.magnolia.context.Context;
37 import info.magnolia.jcr.util.NodeTypes;
38 import info.magnolia.task.Task;
39 import info.magnolia.task.TasksManager;
40 import info.magnolia.ui.contentapp.DataFilter;
41
42 import java.util.List;
43 import java.util.Map;
44 import java.util.stream.Collectors;
45 import java.util.stream.Stream;
46
47 import javax.inject.Provider;
48
49 import org.apache.commons.lang3.StringUtils;
50
51 import com.vaadin.data.provider.AbstractDataProvider;
52 import com.vaadin.data.provider.Query;
53 import com.vaadin.data.provider.QuerySortOrder;
54 import com.vaadin.shared.data.sort.SortDirection;
55
56
57
58
59 public class TasksDataProvider extends AbstractDataProvider<Task, DataFilter> {
60
61 private final TasksManager tasksManager;
62 private final Provider<Context> contextProvider;
63 private final List<Task.Status> displayedTaskStatus;
64
65 public TasksDataProvider(TasksManager tasksManager, Provider<Context> contextProvider, TasksDataSourceDefinition tasksDataSourceDefinition) {
66 this.tasksManager = tasksManager;
67 this.contextProvider = contextProvider;
68 this.displayedTaskStatus = tasksDataSourceDefinition.getRelevantStatuses();
69 }
70
71 long size() {
72 return tasksManager.getTasksAmountByUserAndStatus(contextProvider.get().getUser().getName(), displayedTaskStatus);
73 }
74
75 @Override
76 public Stream<Task> fetch(Query<Task, DataFilter> query) {
77 final Map<String, Boolean> sortCriteria = query.getSortOrders().stream()
78 .collect(Collectors.toMap(QuerySortOrder::getSorted, so -> so.getDirection() == SortDirection.ASCENDING, (a, b) -> b));
79
80
81 if (sortCriteria.isEmpty()) {
82 sortCriteria.put(NodeTypes.LastModified.NAME, true);
83 }
84
85 return tasksManager
86 .findTasksByUserAndStatus(contextProvider.get().getUser().getName(), displayedTaskStatus, sortCriteria, query.getLimit(), query.getOffset())
87 .stream()
88 .filter(task -> pathFilterIsEmptyOrEqualsTaskPath(query, task));
89 }
90
91 private boolean pathFilterIsEmptyOrEqualsTaskPath(Query<Task, DataFilter> query, Task task) {
92 return query.getFilter()
93 .map(DataFilter::getPathFilter)
94 .filter(StringUtils::isNotEmpty)
95 .map(pathFilter -> task.getPath().equals(pathFilter))
96 .orElse(true);
97 }
98
99 @Override
100 public boolean isInMemory() {
101 return true;
102 }
103
104 @Override
105 public int size(Query<Task, DataFilter> query) {
106
107
108 return (int) size();
109 }
110 }