View Javadoc

    1   /*
    2    * $Id: ServletConfigInterceptor.java 502196 2007-02-01 11:28:57Z rgielen $
    3    *
    4    * Licensed to the Apache Software Foundation (ASF) under one
    5    * or more contributor license agreements.  See the NOTICE file
    6    * distributed with this work for additional information
    7    * regarding copyright ownership.  The ASF licenses this file
    8    * to you under the Apache License, Version 2.0 (the
    9    * "License"); you may not use this file except in compliance
    10   * with the License.  You may obtain a copy of the License at
    11   *
    12   *  http://www.apache.org/licenses/LICENSE-2.0
    13   *
    14   * Unless required by applicable law or agreed to in writing,
    15   * software distributed under the License is distributed on an
    16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    17   * KIND, either express or implied.  See the License for the
    18   * specific language governing permissions and limitations
    19   * under the License.
    20   */
    21  package org.apache.struts2.interceptor;
    22
    23  import java.util.Map;
    24
    25  import javax.servlet.ServletContext;
    26  import javax.servlet.http.HttpServletRequest;
    27  import javax.servlet.http.HttpServletResponse;
    28  import javax.portlet.PortletRequest;
    29
    30  import org.apache.struts2.StrutsStatics;
    31  import org.apache.struts2.servlet.interceptor.ServletPrincipalProxy;
    32  import org.apache.struts2.portlet.PortletActionConstants;
    33  import org.apache.struts2.portlet.interceptor.PortletPrincipalProxy;
    34  import org.apache.struts2.util.ServletContextAware;
    35
    36  import com.opensymphony.xwork2.ActionContext;
    37  import com.opensymphony.xwork2.ActionInvocation;
    38  import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
    39
    40
    41  /***
    42   * <!-- START SNIPPET: description -->
    43   *
    44   * An interceptor which sets action properties based on the interfaces an action implements. For example, if the action
    45   * implements {@link ParameterAware} then the action context's parameter map will be set on it.
    46   *
    47   * <p/> This interceptor is designed to set all properties an action needs if it's aware of servlet parameters, the
    48   * servlet context, the session, etc. Interfaces that it supports are:
    49   *
    50   * <ul>
    51   *
    52   * <li>{@link ServletContextAware}</li>
    53   *
    54   * <li>{@link ServletRequestAware}</li>
    55   *
    56   * <li>{@link ServletResponseAware}</li>
    57   *
    58   * <li>{@link ParameterAware}</li>
    59   *
    60   * <li>{@link RequestAware}</li>
    61   *
    62   * <li>{@link SessionAware}</li>
    63   *
    64   * <li>{@link ApplicationAware}</li>
    65   *
    66   * <li>{@link PrincipalAware}</li>
    67   *
    68   * </ul>
    69   *
    70   * <!-- END SNIPPET: description -->
    71   *
    72   * <p/> <u>Interceptor parameters:</u>
    73   *
    74   * <!-- START SNIPPET: parameters -->
    75   *
    76   * <ul>
    77   *
    78   * <li>None</li>
    79   *
    80   * </ul>
    81   *
    82   * <!-- END SNIPPET: parameters -->
    83   *
    84   * <p/> <u>Extending the interceptor:</u>
    85   *
    86   * <p/>
    87   *
    88   * <!-- START SNIPPET: extending -->
    89   *
    90   * There are no known extension points for this interceptor.
    91   *
    92   * <!-- END SNIPPET: extending -->
    93   *
    94   * <p/> <u>Example code:</u>
    95   *
    96   * <pre>
    97   * <!-- START SNIPPET: example -->
    98   * &lt;action name="someAction" class="com.examples.SomeAction"&gt;
    99   *     &lt;interceptor-ref name="servlet-config"/&gt;
    100  *     &lt;interceptor-ref name="basicStack"/&gt;
    101  *     &lt;result name="success"&gt;good_result.ftl&lt;/result&gt;
    102  * &lt;/action&gt;
    103  * <!-- END SNIPPET: example -->
    104  * </pre>
    105  *
    106  * @see ServletContextAware
    107  * @see ServletRequestAware
    108  * @see ServletResponseAware
    109  * @see ParameterAware
    110  * @see SessionAware
    111  * @see ApplicationAware
    112  * @see PrincipalAware
    113  */
    114 public class ServletConfigInterceptor extends AbstractInterceptor implements StrutsStatics {
    115
    116     private static final long serialVersionUID = 605261777858676638L;
    117
    118     /***
    119      * Sets action properties based on the interfaces an action implements. Things like application properties,
    120      * parameters, session attributes, etc are set based on the implementing interface.
    121      *
    122      * @param invocation an encapsulation of the action execution state.
    123      * @throws Exception if an error occurs when setting action properties.
    124      */
    125     public String intercept(ActionInvocation invocation) throws Exception {
    126         final Object action = invocation.getAction();
    127         final ActionContext context = invocation.getInvocationContext();
    128
    129         if (action instanceof ServletRequestAware) {
    130             HttpServletRequest request = (HttpServletRequest) context.get(HTTP_REQUEST);
    131             ((ServletRequestAware) action).setServletRequest(request);
    132         }
    133
    134         if (action instanceof ServletResponseAware) {
    135             HttpServletResponse response = (HttpServletResponse) context.get(HTTP_RESPONSE);
    136             ((ServletResponseAware) action).setServletResponse(response);
    137         }
    138
    139         if (action instanceof ParameterAware) {
    140             ((ParameterAware) action).setParameters(context.getParameters());
    141         }
    142
    143         if (action instanceof RequestAware) {
    144             ((RequestAware) action).setRequest((Map) context.get("request"));
    145         }
    146
    147         if (action instanceof SessionAware) {
    148             ((SessionAware) action).setSession(context.getSession());
    149         }
    150
    151         if (action instanceof ApplicationAware) {
    152             ((ApplicationAware) action).setApplication(context.getApplication());
    153         }
    154
    155         if (action instanceof PrincipalAware) {
    156             HttpServletRequest request = (HttpServletRequest) context.get(HTTP_REQUEST);
    157             Object portletRequest = context.get(PortletActionConstants.REQUEST);
    158             if (portletRequest != null) {
    159                 // We are in portlet environment, so principal information resides in PortletRequest
    160                 ((PrincipalAware) action).setPrincipalProxy(new PortletPrincipalProxy((PortletRequest) portletRequest));
    161             } else {
    162                 // We are in servtlet environment, so principal information resides in HttpServletRequest
    163                 ((PrincipalAware) action).setPrincipalProxy(new ServletPrincipalProxy(request));
    164             }
    165         }
    166         if (action instanceof ServletContextAware) {
    167             ServletContext servletContext = (ServletContext) context.get(SERVLET_CONTEXT);
    168             ((ServletContextAware) action).setServletContext(servletContext);
    169         }
    170         return invocation.invoke();
    171     }
    172 }