View Javadoc

1   /*
2    * $Id: AbstractPopulateActionForm.java 471754 2006-11-06 14:55:09Z husted $
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.struts.chain.commands;
22  
23  import org.apache.struts.Globals;
24  import org.apache.struts.action.ActionForm;
25  import org.apache.struts.chain.contexts.ActionContext;
26  import org.apache.struts.config.ActionConfig;
27  
28  import java.util.Map;
29  
30  /**
31   * <p>Populate the form bean (if any) for this request.</p>
32   *
33   * @version $Rev: 471754 $ $Date: 2005-11-12 13:01:44 -0500 (Sat, 12 Nov 2005)
34   *          $
35   */
36  public abstract class AbstractPopulateActionForm extends ActionCommandBase {
37      // ---------------------------------------------------------- Public Methods
38  
39      /**
40       * <p>Populate the form bean (if any) for this request.</p>
41       *
42       * @param actionCtx The <code>Context</code> for the current request
43       * @return <code>false</code> so that processing continues
44       * @throws Exception On an unexpected error
45       */
46      public boolean execute(ActionContext actionCtx)
47          throws Exception {
48          // Is there a form bean for this request?
49          ActionForm actionForm = actionCtx.getActionForm();
50  
51          if (actionForm == null) {
52              return (false);
53          }
54  
55          // Reset the form bean property values
56          ActionConfig actionConfig = actionCtx.getActionConfig();
57  
58          reset(actionCtx, actionConfig, actionForm);
59  
60          populate(actionCtx, actionConfig, actionForm);
61  
62          handleCancel(actionCtx, actionConfig, actionForm);
63  
64          return (false);
65      }
66  
67      // ------------------------------------------------------- Protected Methods
68  
69      /**
70       * <p>Call the <code>reset()</code> method on the specified form
71       * bean.</p>
72       *
73       * @param context      The context for this request
74       * @param actionConfig The actionConfig for this request
75       * @param actionForm   The form bean for this request
76       */
77      protected abstract void reset(ActionContext context,
78          ActionConfig actionConfig, ActionForm actionForm);
79  
80      /**
81       * <p> Populate the given <code>ActionForm</code> with request parameter
82       * values, taking into account any prefix/suffix values configured on the
83       * given <code>ActionConfig</code>. </p>
84       *
85       * @param context      The ActionContext we are processing
86       * @param actionConfig The ActionConfig we are processing
87       * @param actionForm   The ActionForm we are processing
88       * @throws Exception On an unexpected error
89       */
90      protected abstract void populate(ActionContext context,
91          ActionConfig actionConfig, ActionForm actionForm)
92          throws Exception;
93  
94      // original implementation casting context to WebContext is not safe
95      // when the input value is an ActionContext.
96  
97      /**
98       * <p>For a given request parameter name, trim off any prefix and/or
99       * suffix which are defined in <code>actionConfig</code> and return what
100      * remains. If either prefix or suffix is defined, then return null for
101      * <code>name</code> values which do not begin or end accordingly.</p>
102      *
103      * @param actionConfig The ActionConfig we are processing
104      * @param name         The request parameter name to proceess
105      * @return The request parameter name trimmed of any suffix or prefix
106      */
107     protected String trimParameterName(ActionConfig actionConfig, String name) {
108         String stripped = name;
109         String prefix = actionConfig.getPrefix();
110         String suffix = actionConfig.getSuffix();
111 
112         if (prefix != null) {
113             if (!stripped.startsWith(prefix)) {
114                 return null;
115             }
116 
117             stripped = stripped.substring(prefix.length());
118         }
119 
120         if (suffix != null) {
121             if (!stripped.endsWith(suffix)) {
122                 return null;
123             }
124 
125             stripped =
126                 stripped.substring(0, stripped.length() - suffix.length());
127         }
128 
129         return stripped;
130     }
131 
132     /**
133      * <p>Take into account whether the request includes any defined value for
134      * the global "cancel" parameter.</p> <p> An issue was raised (but I don't
135      * think a Bugzilla ticket created) about the security implications of
136      * using a well-known cancel property which skips form validation, as you
137      * may not write your actions to deal with the cancellation case. </p>
138      *
139      * @param context      The ActionContext we are processing
140      * @param actionConfig The ActionConfig we are processing
141      * @param actionForm   The ActionForm we are processing
142      * @throws Exception On an unexpected error
143      * @see Globals.CANCEL_PROPERTY
144      * @see Globals.CANCEL_PROPERTY_X
145      */
146     protected void handleCancel(ActionContext context,
147         ActionConfig actionConfig, ActionForm actionForm)
148         throws Exception {
149         Map paramValues = context.getParameterMap();
150 
151         // Set the cancellation attribute if appropriate
152         if ((paramValues.get(Globals.CANCEL_PROPERTY) != null)
153             || (paramValues.get(Globals.CANCEL_PROPERTY_X) != null)) {
154             context.setCancelled(Boolean.TRUE);
155         } else {
156             context.setCancelled(Boolean.FALSE);
157         }
158     }
159 }