package tudu.web.servlet;
import com.sun.syndication.feed.synd.*;
import com.sun.syndication.io.FeedException;
import com.sun.syndication.io.SyndFeedOutput;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import tudu.domain.Todo;
import tudu.domain.TodoList;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.TreeSet;
/**
* RSS feed presentation layer.
*
* @author Julien Dubois
*/
public class RssFeedServlet extends HttpServlet {
private static final long serialVersionUID = -7649835277417858193L;
private final Log log = LogFactory.getLog(RssFeedServlet.class);
/**
* Default feed type.
*/
private static final String FEED_TYPE = "rss_2.0";
/**
* Default mime type.
*/
private static final String MIME_TYPE = "application/xml; charset=UTF-8";
@Override
protected final void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
TodoList todoList = (TodoList) request.getAttribute("todoList");
String link = (String) request.getAttribute("link");
Collection<Todo> todos = new TreeSet<Todo>(todoList.getTodos());
SyndFeed feed = new SyndFeedImpl();
feed.setFeedType(FEED_TYPE);
feed.setTitle(todoList.getName());
feed.setLink(link);
feed.setDescription("Tudu Lists | " + todoList.getName());
List<SyndEntry> entries = new ArrayList<SyndEntry>();
for (Todo todo : todos) {
SyndEntry entry = new SyndEntryImpl();
entry.setLink(link + "?listId=" + todoList.getListId() + "#todoId"
+ todo.getTodoId());
SyndContent description = new SyndContentImpl();
description.setType("text/plain");
if (todo.isCompleted()) {
entry.setTitle("Completed : " + todo.getDescription());
entry.setPublishedDate(todo.getCompletionDate());
description.setValue(todo.getNotes());
} else {
entry.setTitle(todo.getDescription());
entry.setPublishedDate(todo.getCreationDate());
description.setValue(todo.getNotes());
}
entry.setDescription(description);
entries.add(entry);
}
feed.setEntries(entries);
response.setContentType(MIME_TYPE);
SyndFeedOutput output = new SyndFeedOutput();
try {
output.output(feed, response.getWriter());
} catch (FeedException fe) {
String msg = "The RSS feed could not be generated.";
log.error("Error while generating the RSS feed : "
+ fe.getMessage());
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
msg);
}
}
}