Search in sources :

Example 1 with NotificationException

use of org.xwiki.notifications.NotificationException 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;
}
Also used : StringValueNode(org.xwiki.notifications.filters.expression.StringValueNode) BooleanValueNode(org.xwiki.notifications.filters.expression.BooleanValueNode) QueryException(org.xwiki.query.QueryException) Query(org.xwiki.query.Query) Date(java.util.Date) Component(org.xwiki.component.annotation.Component) NotificationFilterManager(org.xwiki.notifications.filters.NotificationFilterManager) GreaterThanNode(org.xwiki.notifications.filters.expression.GreaterThanNode) NotificationFilterType(org.xwiki.notifications.filters.NotificationFilterType) NotificationFormat(org.xwiki.notifications.NotificationFormat) Singleton(javax.inject.Singleton) ArrayList(java.util.ArrayList) NotificationFilterPreference(org.xwiki.notifications.filters.NotificationFilterPreference) Inject(javax.inject.Inject) Map(java.util.Map) ExpressionNode(org.xwiki.notifications.filters.expression.ExpressionNode) Named(javax.inject.Named) NotificationException(org.xwiki.notifications.NotificationException) AbstractOperatorNode(org.xwiki.notifications.filters.expression.generics.AbstractOperatorNode) NotificationFilter(org.xwiki.notifications.filters.NotificationFilter) InNode(org.xwiki.notifications.filters.expression.InNode) Iterator(java.util.Iterator) EventProperty(org.xwiki.notifications.filters.expression.EventProperty) NotNode(org.xwiki.notifications.filters.expression.NotNode) Collection(java.util.Collection) NotificationPreferenceManager(org.xwiki.notifications.preferences.NotificationPreferenceManager) LesserThanNode(org.xwiki.notifications.filters.expression.LesserThanNode) AndNode(org.xwiki.notifications.filters.expression.AndNode) QueryManager(org.xwiki.query.QueryManager) EqualsNode(org.xwiki.notifications.filters.expression.EqualsNode) NotificationPreferenceProperty(org.xwiki.notifications.preferences.NotificationPreferenceProperty) ExpressionBuilder.value(org.xwiki.notifications.filters.expression.generics.ExpressionBuilder.value) List(java.util.List) PropertyValueNode(org.xwiki.notifications.filters.expression.PropertyValueNode) NotificationPreference(org.xwiki.notifications.preferences.NotificationPreference) AbstractValueNode(org.xwiki.notifications.filters.expression.generics.AbstractValueNode) DocumentReference(org.xwiki.model.reference.DocumentReference) NotEqualsNode(org.xwiki.notifications.filters.expression.NotEqualsNode) ConfigurationSource(org.xwiki.configuration.ConfigurationSource) DateValueNode(org.xwiki.notifications.filters.expression.DateValueNode) EntityReferenceNode(org.xwiki.notifications.filters.expression.EntityReferenceNode) WikiDescriptorManager(org.xwiki.wiki.descriptor.WikiDescriptorManager) NotificationPreference(org.xwiki.notifications.preferences.NotificationPreference) AbstractOperatorNode(org.xwiki.notifications.filters.expression.generics.AbstractOperatorNode) ExpressionNode(org.xwiki.notifications.filters.expression.ExpressionNode) AndNode(org.xwiki.notifications.filters.expression.AndNode) EqualsNode(org.xwiki.notifications.filters.expression.EqualsNode) NotEqualsNode(org.xwiki.notifications.filters.expression.NotEqualsNode) GreaterThanNode(org.xwiki.notifications.filters.expression.GreaterThanNode) NotificationFilter(org.xwiki.notifications.filters.NotificationFilter)

Example 2 with NotificationException

use of org.xwiki.notifications.NotificationException in project xwiki-platform by xwiki.

the class DefaultNotificationManagerTest method getEventsWhenException.

@Test
public void getEventsWhenException() throws Exception {
    // Mocks
    NotificationException exception = new NotificationException("Error");
    when(queryGenerator.generateQuery(eq(userReference), any(NotificationFormat.class), isNull(), isNull(), any(List.class))).thenThrow(exception);
    // Test
    NotificationException caughtException = null;
    try {
        mocker.getComponentUnderTest().getEvents("xwiki:XWiki.UserA", 2);
    } catch (NotificationException e) {
        caughtException = e;
    }
    // Verify
    assertNotNull(caughtException);
    assertEquals("Fail to get the list of notifications.", caughtException.getMessage());
    assertEquals(exception, caughtException.getCause());
}
Also used : NotificationFormat(org.xwiki.notifications.NotificationFormat) NotificationException(org.xwiki.notifications.NotificationException) ComponentList(org.xwiki.test.annotation.ComponentList) List(java.util.List) Test(org.junit.Test)

Example 3 with NotificationException

use of org.xwiki.notifications.NotificationException in project xwiki-platform by xwiki.

the class DefaultModelBridge method setStartDateForUser.

@Override
public void setStartDateForUser(DocumentReference userReference, Date startDate) throws NotificationException {
    try {
        XWikiContext context = contextProvider.get();
        XWiki xwiki = context.getWiki();
        XWikiDocument document = xwiki.getDocument(userReference, context);
        List<BaseObject> objects = document.getXObjects(NOTIFICATION_PREFERENCE_CLASS);
        if (objects != null) {
            for (BaseObject object : objects) {
                if (object != null) {
                    object.setDateValue(START_DATE_FIELD, startDate);
                }
            }
        }
        // Make this change a minor edit so it's not displayed, by default, in notifications
        xwiki.saveDocument(document, NOTIFICATION_START_DATE_UPDATE_COMMENT, true, context);
    } catch (Exception e) {
        throw new NotificationException(String.format(SET_USER_START_DATE_ERROR_MESSAGE, userReference), e);
    }
}
Also used : XWikiDocument(com.xpn.xwiki.doc.XWikiDocument) NotificationException(org.xwiki.notifications.NotificationException) XWikiContext(com.xpn.xwiki.XWikiContext) XWiki(com.xpn.xwiki.XWiki) XWikiException(com.xpn.xwiki.XWikiException) NotificationException(org.xwiki.notifications.NotificationException) BaseObject(com.xpn.xwiki.objects.BaseObject)

Example 4 with NotificationException

use of org.xwiki.notifications.NotificationException 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;
}
Also used : ArrayList(java.util.ArrayList) NotificationException(org.xwiki.notifications.NotificationException) XWikiContext(com.xpn.xwiki.XWikiContext) XWiki(com.xpn.xwiki.XWiki) NotificationPreferenceProperty(org.xwiki.notifications.preferences.NotificationPreferenceProperty) Date(java.util.Date) XWikiException(com.xpn.xwiki.XWikiException) NotificationException(org.xwiki.notifications.NotificationException) BaseObject(com.xpn.xwiki.objects.BaseObject) NotificationPreference(org.xwiki.notifications.preferences.NotificationPreference) XWikiDocument(com.xpn.xwiki.doc.XWikiDocument) BaseObject(com.xpn.xwiki.objects.BaseObject) LocalDocumentReference(org.xwiki.model.reference.LocalDocumentReference) DocumentReference(org.xwiki.model.reference.DocumentReference)

Example 5 with NotificationException

use of org.xwiki.notifications.NotificationException 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);
    }
}
Also used : Query(org.xwiki.query.Query) NotificationException(org.xwiki.notifications.NotificationException) CompositeEvent(org.xwiki.notifications.CompositeEvent) Event(org.xwiki.eventstream.Event) DocumentReference(org.xwiki.model.reference.DocumentReference) NotificationException(org.xwiki.notifications.NotificationException)

Aggregations

NotificationException (org.xwiki.notifications.NotificationException)24 DocumentReference (org.xwiki.model.reference.DocumentReference)14 XWikiContext (com.xpn.xwiki.XWikiContext)10 XWikiException (com.xpn.xwiki.XWikiException)9 XWikiDocument (com.xpn.xwiki.doc.XWikiDocument)9 XWiki (com.xpn.xwiki.XWiki)8 BaseObject (com.xpn.xwiki.objects.BaseObject)8 ArrayList (java.util.ArrayList)6 List (java.util.List)4 NotificationFormat (org.xwiki.notifications.NotificationFormat)4 NotificationFilterPreference (org.xwiki.notifications.filters.NotificationFilterPreference)4 NotificationPreference (org.xwiki.notifications.preferences.NotificationPreference)4 Date (java.util.Date)3 HashMap (java.util.HashMap)3 HashSet (java.util.HashSet)3 ComponentLookupException (org.xwiki.component.manager.ComponentLookupException)3 NotificationFilter (org.xwiki.notifications.filters.NotificationFilter)3 SyndEntry (com.rometools.rome.feed.synd.SyndEntry)2 Map (java.util.Map)2 CompositeEvent (org.xwiki.notifications.CompositeEvent)2