/*
* ====================================================================
* Copyright (c) 2005-2012 sventon project. All rights reserved.
*
* This software is licensed as described in the file LICENSE, which
* you should have received as part of this distribution. The terms
* are also available at http://www.sventon.org.
* If newer versions of this license are posted there, you may use a
* newer version instead, at your option.
* ====================================================================
*/
package org.sventon.rss;
import com.sun.syndication.feed.synd.*;
import com.sun.syndication.io.SyndFeedOutput;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sventon.appl.RepositoryConfiguration;
import org.sventon.model.LogEntry;
import org.sventon.model.RepositoryName;
import org.sventon.util.HTMLCreator;
import org.sventon.util.WebUtils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
/**
* Class to generate <code>RSS</code> feeds from Subversion log information.
* Uses the <a href="https://rome.dev.java.net/">ROME</a> library.
*
* @author jesper@sventon.org
*/
public final class DefaultRssFeedGenerator implements RssFeedGenerator {
/**
* The generated feed type, default set to <tt>rss_2.0</tt>.
*/
private String feedType = "rss_2.0";
/**
* Number of characters in the abbreviated log message, default set to 40.
*/
private int logMessageLength = 40;
/**
* Logging instance.
*/
private final Log logger = LogFactory.getLog(getClass());
/**
* The date formatter instance.
*/
private DateFormat dateFormat;
@Override
public void outputFeed(final RepositoryConfiguration configuration, final List<LogEntry> logEntries,
final HttpServletRequest request, final HttpServletResponse response) throws Exception {
final SyndFeed feed = new SyndFeedImpl();
final String baseURL = WebUtils.extractBaseURLFromRequest(request);
final RepositoryName repositoryName = configuration.getName();
feed.setTitle(repositoryName + " sventon feed - " + baseURL);
feed.setLink(baseURL);
feed.setDescription("sventon feed for " + repositoryName + " - " + logEntries.size() + " latest repository changes");
feed.setEntries(createEntries(configuration, logEntries, baseURL, response));
feed.setFeedType(feedType);
new SyndFeedOutput().output(feed, response.getWriter());
}
/**
* Create the entries, one for each revision.
*
* @param configuration Repository name.
* @param logEntries List of log entries (revisions)
* @param baseURL Application base URL
* @param response Response
* @return List of RSS feed items
* @throws IOException if unable to produce feed items.
*/
private List<SyndEntry> createEntries(final RepositoryConfiguration configuration, final List<LogEntry> logEntries,
final String baseURL, final HttpServletResponse response) throws IOException {
final List<SyndEntry> entries = new ArrayList<SyndEntry>();
final RepositoryName repositoryName = configuration.getName();
SyndEntry entry;
SyndContent description;
logger.debug("Generating [" + logEntries.size() + "] RSS feed items for repository [" + repositoryName + "]");
// One logEntry is one commit (or revision)
for (final LogEntry logEntry : logEntries) {
if (logEntry.isAccessible()) {
entry = new SyndEntryImpl();
entry.setTitle("Revision " + logEntry.getRevision() + " - " + StringUtils.trimToEmpty(getAbbreviatedLogMessage(
StringEscapeUtils.escapeHtml(logEntry.getMessage()), logMessageLength)));
entry.setAuthor(logEntry.getAuthor());
entry.setLink(baseURL + "repos/" + repositoryName + "/info?revision=" + logEntry.getRevision());
entry.setPublishedDate(logEntry.getDate());
description = new SyndContentImpl();
description.setType("text/html");
description.setValue(HTMLCreator.createRevisionDetailBody(configuration.getRssTemplate(), logEntry, baseURL,
configuration.getName(), dateFormat, response));
entry.setDescription(description);
entries.add(entry);
}
}
return entries;
}
/**
* Sets the date format.
*
* @param dateFormat Date format.
*/
public void setDateFormat(final String dateFormat) {
this.dateFormat = new SimpleDateFormat(dateFormat);
}
/**
* Gets the abbreviated version of given log message.
*
* @param message The original log message
* @param length Length, shortened string length
* @return The abbreviated log message
*/
protected String getAbbreviatedLogMessage(final String message, final int length) {
if (message != null && message.length() <= length) {
return message;
} else {
return StringUtils.abbreviate(message, length);
}
}
/**
* Sets the feed type. For available types check ROME documentation.
*
* @param feedType The feed type.
* @link https://rome.dev.java.net/
*/
public void setFeedType(final String feedType) {
this.feedType = feedType;
}
/**
* Sets the length of the log message to be displayed.
*
* @param length The length.
*/
public void setLogMessageLength(final int length) {
this.logMessageLength = length;
}
}