Open Source Repository

Home /spring/spring-web-portlet-3.0.5 | Repository Home



org/springframework/web/portlet/handler/PortletContentGenerator.java
/*
 * Copyright 2002-2007 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.portlet.handler;

import javax.portlet.MimeResponse;
import javax.portlet.PortletException;
import javax.portlet.PortletRequest;
import javax.portlet.PortletResponse;

import org.springframework.web.portlet.context.PortletApplicationObjectSupport;

/**
 * Convenient superclass for any kind of web content generator,
 * like {@link org.springframework.web.portlet.mvc.AbstractController}.
 * Can also be used for custom handlers that have their own
 {@link org.springframework.web.portlet.HandlerAdapter}.
 *
 <p>Supports portlet cache control options.
 *
 @author Juergen Hoeller
 @author John A. Lewis
 @since 2.0
 @see #setCacheSeconds
 @see #setRequireSession
 */
public abstract class PortletContentGenerator extends PortletApplicationObjectSupport {

  private boolean requireSession = false;

  private int cacheSeconds = -1;


  /**
   * Set whether a session should be required to handle requests.
   */
  public final void setRequireSession(boolean requireSession) {
    this.requireSession = requireSession;
  }

  /**
   * Return whether a session is required to handle requests.
   */
  public final boolean isRequireSession() {
    return this.requireSession;
  }

  /**
   * Cache content for the given number of seconds. Default is -1,
   * indicating no override of portlet content caching.
   <p>Only if this is set to 0 (no cache) or a positive value (cache for
   * this many seconds) will this class override the portlet settings.
   <p>The cache setting can be overwritten by subclasses, before content is generated.
   */
  public final void setCacheSeconds(int seconds) {
    this.cacheSeconds = seconds;
  }

  /**
   * Return the number of seconds that content is cached.
   */
  public final int getCacheSeconds() {
    return this.cacheSeconds;
  }


  /**
   * Check and prepare the given request and response according to the settings
   * of this generator. Checks for a required session, and applies the number of
   * cache seconds configured for this generator (if it is a render request/response).
   @param request current portlet request
   @param response current portlet response
   @throws PortletException if the request cannot be handled because a check failed
   */
  protected final void check(PortletRequest request, PortletResponse responsethrows PortletException {
    if (this.requireSession) {
      if (request.getPortletSession(false== null) {
        throw new PortletSessionRequiredException("Pre-existing session required but none found");
      }
    }
  }

  /**
   * Check and prepare the given request and response according to the settings
   * of this generator. Checks for a required session, and applies the number of 
   * cache seconds configured for this generator (if it is a render request/response).
   @param request current portlet request
   @param response current portlet response
   @throws PortletException if the request cannot be handled because a check failed
   */
  protected final void checkAndPrepare(PortletRequest request, MimeResponse response)
      throws PortletException {

    checkAndPrepare(request, response, this.cacheSeconds);
  }

  /**
   * Check and prepare the given request and response according to the settings
   * of this generator. Checks for a required session, and applies the given 
   * number of cache seconds (if it is a render request/response).
   @param request current portlet request
   @param response current portlet response
   @param cacheSeconds positive number of seconds into the future that the
   * response should be cacheable for, 0 to prevent caching
   @throws PortletException if the request cannot be handled because a check failed
   */
  protected final void checkAndPrepare(PortletRequest request, MimeResponse response, int cacheSeconds)
      throws PortletException {

    check(request, response);
    applyCacheSeconds(response, cacheSeconds);
  }

  /**
   * Prevent the render response from being cached.
   */
  protected final void preventCaching(MimeResponse response) {
    cacheForSeconds(response, 0);
  }

  /**
   * Set portlet response to allow caching for the given number of seconds.
   @param response current portlet render response
   @param seconds number of seconds into the future that the response
   * should be cacheable for
   */
  protected final void cacheForSeconds(MimeResponse response, int seconds) {
    response.setProperty(MimeResponse.EXPIRATION_CACHE, Integer.toString(seconds));
  }

  /**
   * Apply the given cache seconds to the render response
   @param response current portlet render response
   @param seconds positive number of seconds into the future that the
   * response should be cacheable for, 0 to prevent caching
   */
  protected final void applyCacheSeconds(MimeResponse response, int seconds) {
    if (seconds > 0) {
      cacheForSeconds(response, seconds);
    }
    else if (seconds == 0) {
      preventCaching(response);
    }
    // Leave caching to the portlet configuration otherwise.
  }

}