use of org.xwiki.notifications.preferences.NotificationPreference in project xwiki-platform by xwiki.
the class QueryGenerator method handleEventPreferences.
/**
* For each notification preference of the given user, add a constraint on the events to
* - have one of the notification types that have been subscribed by the user;
* - have a date superior to the start date corresponding to this type;
* - match the custom defined user filters.
*
* @param user the current user
* @param preferences a list of the user preferences
* @return a list of maps that contains query parameters
* @throws NotificationException if an error occurred
*/
private AbstractOperatorNode handleEventPreferences(DocumentReference user, List<NotificationPreference> preferences) throws NotificationException {
AbstractOperatorNode preferencesNode = null;
// Filter the notification preferences that are not bound to a specific EVENT_TYPE
Iterator<NotificationPreference> it = preferences.stream().filter(pref -> pref.getProperties().containsKey(NotificationPreferenceProperty.EVENT_TYPE)).iterator();
while (it.hasNext()) {
NotificationPreference preference = it.next();
AbstractOperatorNode preferenceTypeNode = new AndNode(new EqualsNode(value(EventProperty.TYPE), value((String) preference.getProperties().get(NotificationPreferenceProperty.EVENT_TYPE))), new GreaterThanNode(value(EventProperty.DATE), value(preference.getStartDate())));
// Get the notification filters that can be applied to the current preference
Collection<NotificationFilter> filters = notificationFilterManager.getFilters(user, preference);
for (NotificationFilter filter : filters) {
ExpressionNode node = filter.filterExpression(user, preference);
if (node != null && node instanceof AbstractOperatorNode) {
preferenceTypeNode = preferenceTypeNode.and((AbstractOperatorNode) node);
}
}
if (preferencesNode == null) {
preferencesNode = preferenceTypeNode;
} else {
preferencesNode = preferencesNode.or(preferenceTypeNode);
}
}
return preferencesNode;
}
use of org.xwiki.notifications.preferences.NotificationPreference in project xwiki-platform by xwiki.
the class QueryGeneratorTest method setUp.
@Before
public void setUp() throws Exception {
queryManager = mocker.getInstance(QueryManager.class);
notificationPreferenceManager = mocker.getInstance(NotificationPreferenceManager.class);
serializer = mocker.getInstance(EntityReferenceSerializer.TYPE_STRING);
userPreferencesSource = mocker.getInstance(ConfigurationSource.class, "user");
wikiDescriptorManager = mocker.getInstance(WikiDescriptorManager.class);
notificationFilterManager = mocker.getInstance(NotificationFilterManager.class);
startDate = new Date(10);
query = mock(Query.class);
when(queryManager.createQuery(anyString(), anyString())).thenReturn(query);
pref1StartDate = new Date(100000000);
NotificationPreference pref1 = mock(NotificationPreference.class);
when(pref1.getProperties()).thenReturn(Collections.singletonMap(NotificationPreferenceProperty.EVENT_TYPE, "create"));
when(pref1.getFormat()).thenReturn(NotificationFormat.ALERT);
when(pref1.getStartDate()).thenReturn(pref1StartDate);
when(pref1.isNotificationEnabled()).thenReturn(true);
when(notificationPreferenceManager.getPreferences(userReference, true, NotificationFormat.ALERT)).thenReturn(Arrays.asList(pref1));
NotificationFilterPreference fakeFilterPreference = mock(NotificationFilterPreference.class);
when(fakeFilterPreference.isActive()).thenReturn(true);
when(notificationFilterManager.getFilterPreferences(any(DocumentReference.class))).thenReturn(Sets.newSet(fakeFilterPreference));
when(userPreferencesSource.getProperty("displayHiddenDocuments", 0)).thenReturn(0);
when(wikiDescriptorManager.getMainWikiId()).thenReturn("xwiki");
}
use of org.xwiki.notifications.preferences.NotificationPreference in project xwiki-platform by xwiki.
the class NotificationPreferenceScriptServiceTest method isEventTypeEnabledForWiki.
@Test
public void isEventTypeEnabledForWiki() throws Exception {
WikiReference wiki = new WikiReference("whatever");
when(notificationPreferenceManager.getAllPreferences(wiki)).thenReturn(Collections.emptyList());
assertFalse(mocker.getComponentUnderTest().isEventTypeEnabled("update", NotificationFormat.ALERT, wiki.getName()));
NotificationPreference pref1 = mock(NotificationPreference.class);
NotificationPreference pref2 = mock(NotificationPreference.class);
when(pref1.getFormat()).thenReturn(NotificationFormat.EMAIL);
Map<NotificationPreferenceProperty, Object> properties1 = new HashMap<>();
properties1.put(NotificationPreferenceProperty.EVENT_TYPE, "update");
when(pref1.getProperties()).thenReturn(properties1);
when(pref2.getFormat()).thenReturn(NotificationFormat.ALERT);
Map<NotificationPreferenceProperty, Object> properties2 = new HashMap<>();
properties2.put(NotificationPreferenceProperty.EVENT_TYPE, "update");
when(pref2.getProperties()).thenReturn(properties2);
when(pref2.isNotificationEnabled()).thenReturn(true);
when(notificationPreferenceManager.getAllPreferences(wiki)).thenReturn(Arrays.asList(pref1, pref2));
assertTrue(mocker.getComponentUnderTest().isEventTypeEnabled("update", NotificationFormat.ALERT, wiki.getName()));
assertFalse(mocker.getComponentUnderTest().isEventTypeEnabled("update", NotificationFormat.EMAIL, wiki.getName()));
}
use of org.xwiki.notifications.preferences.NotificationPreference 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.notifications.preferences.NotificationPreference in project xwiki-platform by xwiki.
the class DefaultNotificationPreferenceManagerTest method getNotificationPreferences.
@Test
public void getNotificationPreferences() throws Exception {
DocumentReference user = new DocumentReference("xwiki", "test", "user");
mockPreferenceProviders(user);
List<NotificationPreference> preferences = mocker.getComponentUnderTest().getAllPreferences(user);
assertEquals(4, preferences.size());
assertTrue(preferences.contains(mockPreference11));
assertTrue(preferences.contains(mockPreference12));
assertTrue(preferences.contains(mockPreference21));
assertTrue(preferences.contains(mockPreference22));
}
Aggregations