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.admincentral.apps.notifications;
35
36 import static java.util.stream.Collectors.toMap;
37
38 import info.magnolia.cms.security.User;
39 import info.magnolia.context.Context;
40 import info.magnolia.context.MgnlContext;
41 import info.magnolia.objectfactory.Components;
42 import info.magnolia.ui.api.message.Message;
43 import info.magnolia.ui.filter.DataFilter;
44 import info.magnolia.ui.framework.message.MessagesManager;
45
46 import java.util.Map;
47 import java.util.stream.Stream;
48
49 import javax.inject.Inject;
50
51 import com.vaadin.data.provider.AbstractBackEndDataProvider;
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 NotificationDataProvider extends AbstractBackEndDataProvider<Message, DataFilter> {
60
61 private final MessagesManager messagesManager;
62 private final NotificationDataSourceDefinition definition;
63 private final NotificationDataSourceObservation datasourceObservation;
64 private final User user;
65
66 @Inject
67 NotificationDataProvider(MessagesManager messagesManager, NotificationDataSourceDefinition definition, NotificationDataSourceObservation datasourceObservation, Context context) {
68 this.messagesManager = messagesManager;
69 this.definition = definition;
70 this.datasourceObservation = datasourceObservation;
71 this.user = context.getUser();
72 }
73
74
75
76
77 @Deprecated
78 public NotificationDataProvider(MessagesManager messagesManager, NotificationDataSourceDefinition definition) {
79 this(messagesManager, definition, Components.getComponent(NotificationDataSourceObservation.class), Components.getComponent(Context.class));
80 }
81
82 @Override
83 public boolean isInMemory() {
84 return false;
85 }
86
87 @Override
88 public int sizeInBackEnd(Query<Message, DataFilter> query) {
89 Long size = messagesManager.getMessagesAmount(MgnlContext.getUser().getName(), this.definition.getRelevantMessageTypes());
90 return size.intValue();
91 }
92
93 @Override
94 public Stream<Message> fetchFromBackEnd(Query<Message, DataFilter> query) {
95
96 final Map<String, Boolean> sortCriteria = query.getSortOrders().stream()
97 .collect(toMap(
98 QuerySortOrder::getSorted,
99 so -> so.getDirection() == SortDirection.ASCENDING,
100 (a, b) -> b));
101
102
103 if (sortCriteria.isEmpty()) {
104 sortCriteria.put("timestamp", true);
105 }
106 int limit = query.getLimit();
107 int offset = query.getOffset();
108
109 try {
110 return messagesManager.getMessageBatch(MgnlContext.getUser().getName(), this.definition.getRelevantMessageTypes(), sortCriteria, limit, offset).stream();
111 } catch (Exception e) {
112
113
114 datasourceObservation.destroy();
115 throw e;
116 }
117 }
118 }
119