package nl.primatras.backoffice.web.view;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import nl.primatras.backoffice.domain.Order;
import org.springframework.web.servlet.view.AbstractView;
import com.sun.syndication.feed.synd.SyndContent;
import com.sun.syndication.feed.synd.SyndContentImpl;
import com.sun.syndication.feed.synd.SyndEntry;
import com.sun.syndication.feed.synd.SyndEntryImpl;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.feed.synd.SyndFeedImpl;
import com.sun.syndication.io.SyndFeedOutput;
/**
* Class to create a Rss feed. The feed is created using the
* Rome Library.
* This class is largely based on the servlet example from their wiki site.
* By default this class uses the atom_0.3 rss version, but if you specify
* a parameter 'type' with another rss version that is supported by Rome, it
* will create an rss feed based on that version.
*
* @author Jettro Coenradie
*/
public class RssOrderView extends AbstractView {
private static final String DEFAULT_FEED_TYPE = "atom_0.3";
private static final String FEED_TYPE = "type";
private static final String ORDER_COLLECTION = "orders";
private String orderOverviewView;
/**
* Default constructor
*/
public RssOrderView() {
setContentType("application/xml; charset=UTF-8");
setOrderOverviewView("showOrderOverview.html");
}
@Override
protected void renderMergedOutputModel(Map model,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
List orders = (List)model.get(ORDER_COLLECTION);
String baseUrl = "http://"+ request.getServerName() +":"+ request.getServerPort() +
request.getContextPath() + "/";
SyndFeed feed = getFeed(orders,baseUrl);
String feedType = request.getParameter(FEED_TYPE);
feedType = (feedType!=null) ? feedType : DEFAULT_FEED_TYPE;
feed.setFeedType(feedType);
response.setContentType(getContentType());
SyndFeedOutput output = new SyndFeedOutput();
output.output(feed,response.getWriter());
}
/**
* Creates a list with entries from the provided list of orders
* @param orders
* @param contextPath
* @return
*/
private SyndFeed getFeed(List orders,String contextPath) {
SyndFeed feed = new SyndFeedImpl();
feed.setAuthor(getMessageSourceAccessor().getMessage("order.feed.author"));
feed.setTitle(getMessageSourceAccessor().getMessage("order.feed.title"));
feed.setDescription(getMessageSourceAccessor().getMessage("order.feed.description"));
feed.setLink(contextPath);
List entries = new ArrayList();
for (Order order : orders) {
String entryTitle = order.getCustomer().getLastname();
String entryLink = contextPath + getOrderOverviewView() +
"?id=" + order.getId();
String entryDescription = order.toString();
entries.add(createEntry(entryTitle,entryLink,entryDescription,order.getCreatedate()));
}
feed.setEntries(entries);
return feed;
}
/**
* Creates an entry from the provided data
* @param title
* @param link
* @param description
* @param createDate
* @return the new create entry
*/
private SyndEntry createEntry (String title, String link, String description,
Date createDate) {
SyndEntry entry = new SyndEntryImpl();
entry.setTitle(title);
entry.setLink(link);
entry.setPublishedDate(createDate);
SyndContent entryDescription = new SyndContentImpl();
entryDescription.setType("text/plain");
entryDescription.setValue(description);
entry.setDescription(entryDescription);
return entry;
}
public String getOrderOverviewView() {
return orderOverviewView;
}
public void setOrderOverviewView(String orderOverviewView) {
this.orderOverviewView = orderOverviewView;
}
}