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 }