/* * Copyright 2005 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springmodules.web.servlet.view; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.bind.RequestUtils; import org.springframework.web.servlet.view.AbstractView; import com.sun.syndication.feed.synd.SyndFeed; import com.sun.syndication.feed.synd.SyndFeedImpl; import com.sun.syndication.io.SyndFeedOutput; /** * Abstract superclass for rss views, using the * <a href="http://wiki.java.net/bin/view/Javawsxml/Rome">Rome</a> Library. * This library is created by Alejandro Abdelnur, Patrick Chanezon and * Elaine Chien. By default this class uses the atom_1.0 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. You can also change * the deafult type via the appropriate setter. * * You need to add two libraries to make use of this class: * - rome.jar (version 0.8) * - jdom.jar (version 1.0) * * Currently j2se1.4+ is also required. * * @author Jettro Coenradie (original author) * @author Sergio Bossa (maintainer) */ public abstract class AbstractRssView extends AbstractView { private static final String DEFAULT_FEED_TYPE = "atom_1.0"; private static final String FEED_TYPE = "type"; private String defaultFeedType; private String baseUrl; /** * This constructor sets the appropriate content type "application/xml; charset=UTF-8". */ public AbstractRssView() { setContentType("application/xml; charset=UTF-8"); setDefaultFeedType(DEFAULT_FEED_TYPE); } /* (non-Javadoc) * @see org.springframework.web.servlet.view.AbstractView#renderMergedOutputModel(java.util.Map, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */ protected final void renderMergedOutputModel(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception { setBaseUrl(request); SyndFeed feed = newSyndFeed(); buildFeed(model,request,response,feed); String feedType = RequestUtils.getStringParameter(request,FEED_TYPE); feedType = (feedType!=null) ? feedType : getDefaultFeedType(); feed.setFeedType(feedType); response.setContentType(getContentType()); SyndFeedOutput output = new SyndFeedOutput(); output.output(feed,response.getWriter()); } /** * This method must be implemented by your subclass and must create a * <code>com.sun.syndication.feed.synd.SyndFeed</code> * @param model the model Map * @param request in case we need locale etc. Shouldn't look at attributes. * @param respons in case we need to set cookies. Shouldn't write to it. * @param feed feed to be filled with data. * @throws Exception any exception that occured during the creation of the feed */ abstract protected void buildFeed(Map model, HttpServletRequest request, HttpServletResponse respons, SyndFeed feed) throws Exception; /** * Creates a new instance of a SyndFeed, you can override this method to return * your own instance of a SyndFeed. Default a <code>com.sun.syndication.feed.synd.SyndFeedImpl</code> * is returned. * @return new instance of a SyndFeed * @see com.lowagie.text.Document */ protected SyndFeed newSyndFeed() { return new SyndFeedImpl(); } /** * Returns the base url of the server the rss in running on, is used to create * the url where the rss items link to. * @return String with the baseUrl. */ protected String getBaseUrl() { return this.baseUrl; } /** * Sets the baseUrl based on parameters obtained from the request. This method is * called by renderMergedOutputModel and can be overridden. * @param request used to obtain data from the running server. */ protected void setBaseUrl(HttpServletRequest request) { StringBuffer sb = new StringBuffer(); sb.append("http://"); sb.append(request.getServerName()); sb.append(":"); sb.append(request.getServerPort()); sb.append(request.getContextPath()); sb.append("/"); this.baseUrl = sb.toString(); } /* Getters and setter */ public String getDefaultFeedType() { return defaultFeedType; } public void setDefaultFeedType(String defaultFeedType) { this.defaultFeedType = defaultFeedType; } }