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.task.app.data.TaskCategory;
41 import info.magnolia.ui.contentapp.DataFilter;
42
43 import java.util.Arrays;
44 import java.util.List;
45 import java.util.Map;
46 import java.util.stream.Collectors;
47 import java.util.stream.Stream;
48
49 import javax.inject.Provider;
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 static final List<Task.Status> ALL_STATUSES = Arrays.asList(Task.Status.values());
62 private static final List<Task.Status> UNCLAIMED_STATUS = Arrays.asList(Task.Status.Created);
63 private static final List<Task.Status> ONGOING_STATUS = Arrays.asList(Task.Status.InProgress);
64 private static final List<Task.Status> DONE_STATUS = Arrays.asList(Task.Status.Resolved);
65 private static final List<Task.Status> FAILED_STATUS = Arrays.asList(Task.Status.Failed);
66 private static final List<Task.Status> SCHEDULED_STATUS = Arrays.asList(Task.Status.Scheduled);
67
68 private final TasksManager tasksManager;
69 private final Provider<Context> contextProvider;
70 private List<Task.Status> displayedTaskStatus = ALL_STATUSES;
71
72 public TasksDataProvider(TasksManager tasksManager, Provider<Context> contextProvider, TaskCategory category) {
73 this.tasksManager = tasksManager;
74 this.contextProvider = contextProvider;
75
76 if (category != null) {
77 switch (category) {
78 case UNCLAIMED:
79 displayedTaskStatus = UNCLAIMED_STATUS;
80 break;
81 case ONGOING:
82 displayedTaskStatus = ONGOING_STATUS;
83 break;
84 case DONE:
85 displayedTaskStatus = DONE_STATUS;
86 break;
87 case FAILED:
88 displayedTaskStatus = FAILED_STATUS;
89 break;
90 case SCHEDULED:
91 displayedTaskStatus = SCHEDULED_STATUS;
92 break;
93 }
94 }
95 }
96
97 long size() {
98 return tasksManager.getTasksAmountByUserAndStatus(contextProvider.get().getUser().getName(), displayedTaskStatus);
99 }
100
101 @Override
102 public Stream<Task> fetch(Query<Task, DataFilter> query) {
103 final Map<String, Boolean> sortCriteria = query.getSortOrders().stream()
104 .collect(Collectors.toMap(QuerySortOrder::getSorted, so -> so.getDirection() == SortDirection.ASCENDING ? Boolean.TRUE : Boolean.FALSE, (a, b) -> b));
105
106
107 if (sortCriteria.isEmpty()) {
108 sortCriteria.put(NodeTypes.LastModified.NAME, true);
109 }
110
111 return tasksManager
112 .findTasksByUserAndStatus(contextProvider.get().getUser().getName(), displayedTaskStatus, sortCriteria, query.getLimit(), query.getOffset())
113 .stream()
114 .filter(task -> query.getFilter()
115 .map(dataFilter -> task.getPath().equals(dataFilter.getPathFilter()))
116 .orElse(true)
117 );
118 }
119
120 @Override
121 public boolean isInMemory() {
122 return true;
123 }
124
125 @Override
126 public int size(Query<Task, DataFilter> query) {
127
128
129 return (int) size();
130 }
131 }