/*
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.xwiki.watchlist.internal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;
import org.apache.commons.collections.ListUtils;
import org.apache.commons.collections.Transformer;
import org.apache.commons.collections.functors.ConstantTransformer;
import org.apache.commons.lang3.StringUtils;
import org.xwiki.component.annotation.Component;
import org.xwiki.localization.ContextualLocalizationManager;
import org.xwiki.watchlist.internal.api.WatchListEventFeedManager;
import org.xwiki.watchlist.internal.api.WatchListStore;
import org.xwiki.watchlist.internal.api.WatchedElementType;
import com.sun.syndication.feed.synd.SyndFeed;
import com.xpn.xwiki.XWikiContext;
import com.xpn.xwiki.XWikiException;
import com.xpn.xwiki.plugin.activitystream.plugin.ActivityEvent;
import com.xpn.xwiki.plugin.activitystream.plugin.ActivityStreamPluginApi;
/**
* Default implementation for {@link WatchListEventFeedManager}.
*
* @version $Id: 2806c84318aee4c18846671edfbca530f3937772 $
*/
@Component
@Singleton
public class DefaultWatchListEventFeedManager implements WatchListEventFeedManager
{
/**
* The watchlist store component instance.
*/
@Inject
private WatchListStore store;
/**
* Used to resolve translations.
*/
@Inject
private ContextualLocalizationManager localization;
/**
* Used to obtain the current context.
*/
@Inject
private Provider<XWikiContext> contextProvider;
@Override
@SuppressWarnings("unchecked")
public SyndFeed getFeed(String user, int entryNumber) throws XWikiException
{
XWikiContext context = contextProvider.get();
Collection<String> wikis = store.getWatchedElements(user, WatchedElementType.WIKI);
Collection<String> spaces = store.getWatchedElements(user, WatchedElementType.SPACE);
Collection<String> documents = store.getWatchedElements(user, WatchedElementType.DOCUMENT);
List<Object> parameters = new ArrayList<Object>();
ActivityStreamPluginApi asApi =
(ActivityStreamPluginApi) context.getWiki().getPluginApi("activitystream", context);
parameters.addAll(wikis);
parameters.addAll(spaces);
parameters.addAll(documents);
Transformer transformer = new ConstantTransformer("?");
List<String> wikisPlaceholders = ListUtils.transformedList(new ArrayList<String>(), transformer);
wikisPlaceholders.addAll(wikis);
List<String> spacesPlaceholders = ListUtils.transformedList(new ArrayList<String>(), transformer);
spacesPlaceholders.addAll(spaces);
List<String> documentsPlaceholders = ListUtils.transformedList(new ArrayList<String>(), transformer);
documentsPlaceholders.addAll(documents);
String listItemsJoint = ",";
String concatWiki = " or concat(act.wiki,'";
String query = "1=0";
if (!wikis.isEmpty()) {
query += " or act.wiki in (" + StringUtils.join(wikisPlaceholders, listItemsJoint) + ')';
}
if (!spaces.isEmpty()) {
query +=
concatWiki + DefaultWatchListStore.WIKI_SPACE_SEP + "',act.space) in ("
+ StringUtils.join(spacesPlaceholders, listItemsJoint) + ')';
}
if (!documents.isEmpty()) {
query +=
concatWiki + DefaultWatchListStore.WIKI_SPACE_SEP + "',act.page) in ("
+ StringUtils.join(documentsPlaceholders, listItemsJoint) + ')';
}
List<ActivityEvent> events = asApi.searchEvents(query, false, true, entryNumber, 0, parameters);
SyndFeed feed = asApi.getFeed(events);
setFeedMetaData(feed, context);
return feed;
}
/**
* Set the standard feed metadata values, based on static translated messages and wiki configuration.
*
* @param feed the feed to configure
* @param context the current request context
* @throws XWikiException if the wiki can't be properly accessed
*/
private void setFeedMetaData(SyndFeed feed, XWikiContext context) throws XWikiException
{
String msgPrefix = DefaultWatchList.APP_RES_PREFIX + "rss.";
feed.setAuthor(localization.getTranslationPlain(msgPrefix + "author"));
feed.setTitle(localization.getTranslationPlain(msgPrefix + "title"));
feed.setDescription(localization.getTranslationPlain(msgPrefix + "description"));
feed.setCopyright(context.getWiki().getXWikiPreference("copyright", context));
feed.setLink(context.getWiki().getExternalURL("xwiki:Main.WebHome", "view", context));
}
}