Open Source Repository

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



org/springframework/web/portlet/handler/ParameterMappingInterceptor.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.ActionRequest;
import javax.portlet.ActionResponse;

/**
 * Interceptor to forward a request parameter from the <code>ActionRequest</code> to the
 <code>RenderRequest</code>.
 *
 <p>This can be useful when using {@link ParameterHandlerMapping ParameterHandlerMapping}
 * or {@link PortletModeParameterHandlerMapping PortletModeParameterHandlerMapping}.
 * It will ensure that the parameter that was used to map the <code>ActionRequest</code>
 * to a handler will be forwarded to the <code>RenderRequest</code> so that it will also be 
 * mapped the same way.
 *
 <p>When using this Interceptor, you can still change the value of the mapping parameter
 * in your handler in order to change where the render request will get mapped.
 *
 <p>Be aware that this Interceptor does call <code>ActionResponse.setRenderParameter</code>,
 * which means that you will not be able to call <code>ActionResponse.sendRedirect</code> in
 * your handler.  If you may need to issue a redirect, then you should avoid this Interceptor
 * and either write a different one that does this in a different way, or manually forward
 * the parameter from within your handler(s).
 *
 <p>Thanks to Rainer Schmitz for suggesting this mapping strategy!
 *
 @author John A. Lewis
 @since 2.0
 @see ParameterHandlerMapping
 @see PortletModeParameterHandlerMapping
 */
public class ParameterMappingInterceptor extends HandlerInterceptorAdapter {

  /** Request parameter name to use for mapping to handlers */
  public final static String DEFAULT_PARAMETER_NAME = "action";

  private String parameterName = DEFAULT_PARAMETER_NAME;


  /**
   * Set the name of the parameter used for mapping.
   */
  public void setParameterName(String parameterName) {
    this.parameterName = (parameterName != null ? parameterName : DEFAULT_PARAMETER_NAME);
  }


  /**
   * If request is an {@link javax.portlet.ActionRequest ActionRequest},
   * get handler mapping parameter and add it to the ActionResponse.
   */
  @Override
  public boolean preHandleAction(ActionRequest request, ActionResponse response, Object handler) {
    String mappingParameter = request.getParameter(this.parameterName);
    if (mappingParameter != null) {
      response.setRenderParameter(parameterName, mappingParameter);
    }
    return true;
  }

}