View Javadoc

    1   /*
    2    * Copyright 2004 The Apache Software Foundation.
    3    *
    4    * Licensed under the Apache License, Version 2.0 (the "License");
    5    * you may not use this file except in compliance with the License.
    6    * You may obtain a copy of the License at
    7    *
    8    *     http://www.apache.org/licenses/LICENSE-2.0
    9    *
    10   * Unless required by applicable law or agreed to in writing, software
    11   * distributed under the License is distributed on an "AS IS" BASIS,
    12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13   * See the License for the specific language governing permissions and
    14   * limitations under the License.
    15   *
    16   * $Header:$
    17   */
    18  package org.apache.struts2.s1;
    19
    20  import java.util.Arrays;
    21  import java.util.Iterator;
    22
    23  import javax.servlet.http.HttpServletRequest;
    24  import javax.servlet.http.HttpServletResponse;
    25
    26  import org.apache.struts.Globals;
    27  import org.apache.struts.action.Action;
    28  import org.apache.struts.action.ActionForm;
    29  import org.apache.struts.action.ActionForward;
    30  import org.apache.struts.action.ActionMapping;
    31  import org.apache.struts.action.ActionMessage;
    32  import org.apache.struts.action.ActionMessages;
    33  import org.apache.struts2.ServletActionContext;
    34  import org.apache.struts2.StrutsException;
    35  import org.apache.struts2.dispatcher.DefaultActionSupport;
    36  import org.apache.struts2.dispatcher.Dispatcher;
    37
    38  import com.opensymphony.xwork2.ActionContext;
    39  import com.opensymphony.xwork2.ObjectFactory;
    40  import com.opensymphony.xwork2.config.entities.ActionConfig;
    41  import com.opensymphony.xwork2.interceptor.ScopedModelDriven;
    42
    43  /***
    44   * Wraps legacy Struts 1.3 Actions.  Supports the following features:
    45   * <ul>
    46   *  <li>ActionForms</li>
    47   *  <li>ActionForwards that have the same name as a result</li>
    48   *  <li>ActionMessages stored in the request, converted to Struts 2 messages</li>
    49   *  <li>Action-level validation flag</li>
    50   * </ul>
    51   * Still to do:
    52   * <ul>
    53   *  <li>Custom ActionForward instances that don't have an associated result config</li>
    54   *  <li>setServlet() calls for the Action</li>
    55   *  <li>Most everything else...</li>
    56   * </ul>
    57   */
    58  public class Struts1Action extends DefaultActionSupport implements ScopedModelDriven<ActionForm> {
    59
    60      private ActionForm actionForm;
    61      private String className;
    62      private boolean validate;
    63      private String scopeKey;
    64
    65      public String execute() throws Exception {
    66          ActionContext ctx = ActionContext.getContext();
    67          ActionConfig actionConfig = ctx.getActionInvocation().getProxy().getConfig();
    68          Action action = null;
    69          try {
    70              action = (Action) ObjectFactory.getObjectFactory().buildBean(className, null);
    71          } catch (Exception e) {
    72              throw new StrutsException("Unable to create the legacy Struts Action", e, actionConfig);
    73          }
    74
    75          // We should call setServlet() here, but let's stub that out later
    76
    77          Struts1Factory strutsFactory = new Struts1Factory(Dispatcher.getInstance().getConfigurationManager().getConfiguration());
    78          ActionMapping mapping = strutsFactory.createActionMapping(actionConfig);
    79          HttpServletRequest request = ServletActionContext.getRequest();
    80          HttpServletResponse response = ServletActionContext.getResponse();
    81          ActionForward forward = action.execute(mapping, actionForm, request, response);
    82
    83          ActionMessages messages = (ActionMessages) request.getAttribute(Globals.MESSAGE_KEY);
    84          if (messages != null) {
    85              for (Iterator i = messages.get(); i.hasNext(); ) {
    86                  ActionMessage msg = (ActionMessage) i.next();
    87                  if (msg.getValues() != null && msg.getValues().length > 0) {
    88                      addActionMessage(getText(msg.getKey(), Arrays.asList(msg.getValues())));
    89                  } else {
    90                      addActionMessage(getText(msg.getKey()));
    91                  }
    92              }
    93          }
    94
    95          if (forward instanceof WrapperActionForward || actionConfig.getResults().containsKey(forward.getName())) {
    96              return forward.getName();
    97          } else {
    98              throw new StrutsException("Unable to handle action forwards that don't have an associated result", actionConfig);
    99          }
    100     }
    101
    102     public void setModel(ActionForm model) {
    103         actionForm = model;
    104     }
    105
    106     public ActionForm getModel() {
    107         return actionForm;
    108     }
    109
    110     /***
    111      * @return the validate
    112      */
    113     public boolean isValidate() {
    114         return validate;
    115     }
    116
    117     /***
    118      * @param validate the validate to set
    119      */
    120     public void setValidate(boolean validate) {
    121         this.validate = validate;
    122     }
    123
    124     /***
    125      * @param className the className to set
    126      */
    127     public void setClassName(String className) {
    128         this.className = className;
    129     }
    130
    131     public String getScopeKey() {
    132         return scopeKey;
    133     }
    134
    135     public void setScopeKey(String key) {
    136         this.scopeKey = key;
    137     }
    138 }