/*
 * Copyright 2002-2018 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.springframework.web.servlet.view.feed;

import java.io.OutputStreamWriter;
import java.util.Map;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.rometools.rome.feed.WireFeed;
import com.rometools.rome.io.WireFeedOutput;

import org.springframework.util.StringUtils;
import org.springframework.web.servlet.view.AbstractView;

Abstract base class for Atom and RSS Feed views, using the ROME package.

>NOTE: As of Spring 4.1, this is based on the com.rometools variant of ROME, version 1.5. Please upgrade your build dependency.

Application-specific view classes will typically extend from either AbstractRssFeedView or AbstractAtomFeedView instead of from this class.

Thanks to Jettro Coenradie and Sergio Bossa for the original feed view prototype!

Author:Arjen Poutsma, Juergen Hoeller
Type parameters:
See Also:
Since:3.0
/** * Abstract base class for Atom and RSS Feed views, using the * <a href="https://github.com/rometools/rome">ROME</a> package. * * <p>><b>NOTE: As of Spring 4.1, this is based on the {@code com.rometools} * variant of ROME, version 1.5. Please upgrade your build dependency.</b> * * <p>Application-specific view classes will typically extend from either * {@link AbstractRssFeedView} or {@link AbstractAtomFeedView} instead of from this class. * * <p>Thanks to Jettro Coenradie and Sergio Bossa for the original feed view prototype! * * @author Arjen Poutsma * @author Juergen Hoeller * @since 3.0 * @param <T> the {@link WireFeed} type * @see AbstractRssFeedView * @see AbstractAtomFeedView */
public abstract class AbstractFeedView<T extends WireFeed> extends AbstractView { @Override protected final void renderMergedOutputModel( Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception { T wireFeed = newFeed(); buildFeedMetadata(model, wireFeed, request); buildFeedEntries(model, wireFeed, request, response); setResponseContentType(request, response); if (!StringUtils.hasText(wireFeed.getEncoding())) { wireFeed.setEncoding("UTF-8"); } WireFeedOutput feedOutput = new WireFeedOutput(); ServletOutputStream out = response.getOutputStream(); feedOutput.output(wireFeed, new OutputStreamWriter(out, wireFeed.getEncoding())); out.flush(); }
Create a new feed to hold the entries.
Returns:the newly created Feed instance
/** * Create a new feed to hold the entries. * @return the newly created Feed instance */
protected abstract T newFeed();
Populate the feed metadata (title, link, description, etc.).

Default is an empty implementation. Subclasses can override this method to add meta fields such as title, link description, etc.

Params:
  • model – the model, in case meta information must be populated from it
  • feed – the feed being populated
  • request – in case we need locale etc. Shouldn't look at attributes.
/** * Populate the feed metadata (title, link, description, etc.). * <p>Default is an empty implementation. Subclasses can override this method * to add meta fields such as title, link description, etc. * @param model the model, in case meta information must be populated from it * @param feed the feed being populated * @param request in case we need locale etc. Shouldn't look at attributes. */
protected void buildFeedMetadata(Map<String, Object> model, T feed, HttpServletRequest request) { }
Subclasses must implement this method to build feed entries, given the model.

Note that the passed-in HTTP response is just supposed to be used for setting cookies or other HTTP headers. The built feed itself will automatically get written to the response after this method returns.

Params:
  • model – the model Map
  • feed – the feed to add entries to
  • request – in case we need locale etc. Shouldn't look at attributes.
  • response – in case we need to set cookies. Shouldn't write to it.
Throws:
  • Exception – any exception that occurred during building
/** * Subclasses must implement this method to build feed entries, given the model. * <p>Note that the passed-in HTTP response is just supposed to be used for * setting cookies or other HTTP headers. The built feed itself will automatically * get written to the response after this method returns. * @param model the model Map * @param feed the feed to add entries to * @param request in case we need locale etc. Shouldn't look at attributes. * @param response in case we need to set cookies. Shouldn't write to it. * @throws Exception any exception that occurred during building */
protected abstract void buildFeedEntries(Map<String, Object> model, T feed, HttpServletRequest request, HttpServletResponse response) throws Exception; }