use of org.xwiki.model.reference.DocumentReference in project xwiki-platform by xwiki.
the class QueryGeneratorTest method generateQueryWithFilters.
@Test
public void generateQueryWithFilters() throws Exception {
// Mocks
NotificationFilter notificationFilter1 = mock(NotificationFilter.class);
NotificationFilter notificationFilter2 = mock(NotificationFilter.class);
when(notificationFilterManager.getFilters(any(DocumentReference.class), any(NotificationPreference.class))).thenReturn(Sets.newSet(notificationFilter1, notificationFilter2));
when(notificationFilter1.filterExpression(any(DocumentReference.class), any(NotificationPreference.class))).thenReturn(new AndNode(new EqualsNode(new PropertyValueNode(EventProperty.PAGE), new StringValueNode("someValue1")), new EqualsNode(new StringValueNode("1"), new StringValueNode("1"))));
when(notificationFilter2.filterExpression(any(DocumentReference.class), any(NotificationPreference.class))).thenReturn(new AndNode(new EqualsNode(new PropertyValueNode(EventProperty.TYPE), new StringValueNode("someValue2")), new EqualsNode(new StringValueNode("2"), new StringValueNode("2"))));
when(notificationFilter1.matchesPreference(any(NotificationPreference.class))).thenReturn(true);
when(notificationFilter2.matchesPreference(any(NotificationPreference.class))).thenReturn(true);
// Test
ExpressionNode node = mocker.getComponentUnderTest().generateQueryExpression(new DocumentReference("xwiki", "XWiki", "UserA"), NotificationFormat.ALERT, null, startDate, Arrays.asList("event1", "event2"));
assertEquals("(((DATE >= \"Thu Jan 01 01:00:00 CET 1970\" " + "AND (((TYPE = \"create\" AND DATE >= \"Fri Jan 02 04:46:40 CET 1970\") " + "AND (PAGE = \"someValue1\" AND \"1\" = \"1\")) " + "AND (TYPE = \"someValue2\" AND \"2\" = \"2\"))) " + "AND NOT (ID IN (\"event1\", \"event2\"))) " + "AND HIDDEN <> true) " + "ORDER BY DATE DESC", node.toString());
}
use of org.xwiki.model.reference.DocumentReference in project xwiki-platform by xwiki.
the class NotificationPreferenceScriptServiceTest method saveNotificationPreferencesWithoutRight.
@Test
public void saveNotificationPreferencesWithoutRight() throws Exception {
DocumentReference userDoc = new DocumentReference("wikiA", "SpaceA", "UserA");
AccessDeniedException e = mock(AccessDeniedException.class);
doThrow(e).when(authorizationManager).checkAccess(Right.EDIT, userDoc);
String json = "";
Exception caughtException = null;
try {
mocker.getComponentUnderTest().saveNotificationPreferences(json, userDoc);
} catch (Exception ex) {
caughtException = ex;
}
assertNotNull(caughtException);
assertEquals(e, caughtException);
}
use of org.xwiki.model.reference.DocumentReference in project xwiki-platform by xwiki.
the class DefaultModelBridge method getNotificationPreferences.
private List<NotificationPreference> getNotificationPreferences(DocumentReference document, String providerHint) throws NotificationException {
XWikiContext context = contextProvider.get();
XWiki xwiki = context.getWiki();
final DocumentReference notificationPreferencesClass = NOTIFICATION_PREFERENCE_CLASS.setWikiReference(document.getWikiReference());
List<NotificationPreference> preferences = new ArrayList<>();
try {
XWikiDocument doc = xwiki.getDocument(document, context);
List<BaseObject> preferencesObj = doc.getXObjects(notificationPreferencesClass);
if (preferencesObj != null) {
for (BaseObject obj : preferencesObj) {
if (obj != null) {
String objFormat = obj.getStringValue(FORMAT_FIELD);
Date objStartDate = obj.getDateValue(START_DATE_FIELD);
Map<NotificationPreferenceProperty, Object> properties = extractNotificationPreferenceProperties(obj);
notificationPreferenceBuilder.prepare();
notificationPreferenceBuilder.setProperties(properties);
notificationPreferenceBuilder.setStartDate((objStartDate != null) ? objStartDate : doc.getCreationDate());
notificationPreferenceBuilder.setFormat(StringUtils.isNotBlank(objFormat) ? NotificationFormat.valueOf(objFormat.toUpperCase()) : NotificationFormat.ALERT);
notificationPreferenceBuilder.setTarget(document);
notificationPreferenceBuilder.setProviderHint(providerHint);
notificationPreferenceBuilder.setEnabled(obj.getIntValue(NOTIFICATION_ENABLED_FIELD, 0) != 0);
notificationPreferenceBuilder.setCategory(NotificationPreferenceCategory.DEFAULT);
preferences.add(notificationPreferenceBuilder.build());
}
}
}
} catch (Exception e) {
throw new NotificationException(String.format("Failed to get the notification preferences from the document [%s].", document), e);
}
return preferences;
}
use of org.xwiki.model.reference.DocumentReference in project xwiki-platform by xwiki.
the class DefaultNotificationManager method getEventsCount.
@Override
public long getEventsCount(String userId, int maxCount) throws NotificationException {
DocumentReference user = documentReferenceResolver.resolve(userId);
List<CompositeEvent> events = getEvents(new ArrayList<>(), new Parameters(user, NotificationFormat.ALERT, maxCount, null, null, new ArrayList<>()));
return events.size();
}
use of org.xwiki.model.reference.DocumentReference in project xwiki-platform by xwiki.
the class DefaultNotificationManager method getEvents.
private List<CompositeEvent> getEvents(List<CompositeEvent> results, Parameters parameters) throws NotificationException {
// Because the user might not be able to see all notifications because of the rights, we take from the database
// more events than expected and we will filter afterwards.
final int batchSize = parameters.expectedCount * 2;
try {
// Create the query
Query query = queryGenerator.generateQuery(parameters.userReference, parameters.format, parameters.endDate, parameters.fromDate, parameters.blackList);
if (query == null) {
return Collections.emptyList();
}
query.setLimit(batchSize);
// Get a batch of events
List<Event> batch = eventStream.searchEvents(query);
// Add to the results the events the user has the right to see
for (Event event : batch) {
DocumentReference document = event.getDocument();
// Don't record events concerning a doc the user cannot see
if (document != null && !authorizationManager.hasAccess(Right.VIEW, parameters.userReference, document)) {
continue;
}
if (filterEvent(event, parameters)) {
continue;
}
// Record this event
recordEvent(results, event);
// If the expected count is reached, stop now
if (results.size() >= parameters.expectedCount) {
return results;
}
}
// If we haven't get the expected number of events, perform a new batch
if (results.size() < parameters.expectedCount && batch.size() == batchSize) {
parameters.blackList.addAll(getEventsIds(batch));
getEvents(results, parameters);
}
return results;
} catch (Exception e) {
throw new NotificationException("Fail to get the list of notifications.", e);
}
}
Aggregations