1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.apache.struts.validator;
22
23 import org.apache.commons.beanutils.DynaBean;
24 import org.apache.commons.logging.Log;
25 import org.apache.commons.logging.LogFactory;
26 import org.apache.commons.validator.Validator;
27 import org.apache.commons.validator.ValidatorException;
28 import org.apache.commons.validator.ValidatorResults;
29 import org.apache.struts.action.ActionErrors;
30 import org.apache.struts.action.ActionMapping;
31 import org.apache.struts.action.DynaActionForm;
32
33 import javax.servlet.ServletContext;
34 import javax.servlet.http.HttpServletRequest;
35
36 import java.io.Serializable;
37
38 import java.util.Map;
39
40 /**
41 * <p>This class extends <strong>DynaActionForm</strong> and provides basic
42 * field validation based on an XML file. The key passed into the validator
43 * is the action element's 'name' attribute from the struts-config.xml which
44 * should match the form element's name attribute in the validation.xml.</p>
45 *
46 * <ul>
47 *
48 * <li>See <code>ValidatorPlugin</code> definition in struts-config.xml for
49 * validation rules.</li>
50 *
51 * </ul>
52 *
53 * @version $Rev: 471754 $ $Date: 2005-05-07 12:11:38 -0400 (Sat, 07 May 2005)
54 * $
55 * @see org.apache.struts.action.ActionForm
56 * @since Struts 1.1
57 */
58 public class DynaValidatorForm extends DynaActionForm implements DynaBean,
59 Serializable {
60 /**
61 * Commons Logging instance.
62 */
63 private static Log log = LogFactory.getLog(DynaValidatorForm.class);
64
65 /**
66 * The results returned from the validation performed by the
67 * <code>Validator</code>.
68 */
69 protected ValidatorResults validatorResults = null;
70
71 /**
72 * Used to indicate the current page of a multi-page form.
73 */
74 protected int page = 0;
75
76 /**
77 * Gets page.
78 *
79 * @return page number.
80 */
81 public int getPage() {
82 return page;
83 }
84
85 /**
86 * Sets page.
87 *
88 * @param page page number
89 */
90 public void setPage(int page) {
91 this.page = page;
92 }
93
94 /**
95 * Validate the properties that have been set from this HTTP request, and
96 * return an <code>ActionErrors</code> object that encapsulates any
97 * validation errors that have been found. If no errors are found, return
98 * <code>null</code> or an <code>ActionErrors</code> object with no
99 * recorded error messages.
100 *
101 * @param mapping The mapping used to select this instance.
102 * @param request The servlet request we are processing.
103 * @return <code>ActionErrors</code> object that encapsulates any
104 * validation errors.
105 */
106 public ActionErrors validate(ActionMapping mapping,
107 HttpServletRequest request) {
108 this.setPageFromDynaProperty();
109
110 ServletContext application = getServlet().getServletContext();
111 ActionErrors errors = new ActionErrors();
112
113 String validationKey = getValidationKey(mapping, request);
114
115 Validator validator =
116 Resources.initValidator(validationKey, this, application, request,
117 errors, page);
118
119 try {
120 validatorResults = validator.validate();
121 } catch (ValidatorException e) {
122 log.error(e.getMessage(), e);
123 }
124
125 return errors;
126 }
127
128 /**
129 * Returns the Validation key.
130 *
131 * @param mapping The mapping used to select this instance
132 * @param request The servlet request we are processing
133 * @return validation key - the form element's name in this case
134 */
135 public String getValidationKey(ActionMapping mapping,
136 HttpServletRequest request) {
137 return mapping.getAttribute();
138 }
139
140 /**
141 * Sets this.page to the value of the Dyna property "page" if it's
142 * defined. This is used to setup the page variable before validation
143 * starts.
144 *
145 * @since Struts 1.2
146 */
147 protected void setPageFromDynaProperty() {
148 Map props = this.getMap();
149
150 if (props.containsKey("page")) {
151 Integer p = null;
152
153 try {
154 p = (Integer) props.get("page");
155 } catch (ClassCastException e) {
156 log.error("Dyna 'page' property must be of type java.lang.Integer.",
157 e);
158 throw e;
159 }
160
161 if (p == null) {
162 throw new NullPointerException(
163 "Dyna 'page' property must not be null. "
164 + " Either provide an initial value or set 'convertNull' to false. ");
165 }
166
167 this.page = p.intValue();
168 }
169 }
170
171 /**
172 * Reset all properties to their default values.
173 *
174 * @param mapping The mapping used to select this instance
175 * @param request The servlet request we are processing
176 */
177 public void reset(ActionMapping mapping, HttpServletRequest request) {
178 super.reset(mapping, request);
179 page = 0;
180 validatorResults = null;
181 }
182
183 /**
184 * Get results of the validation performed by the <code>Validator</code>.
185 *
186 * @return validator results as ValidatorResults object
187 */
188 public ValidatorResults getValidatorResults() {
189 return validatorResults;
190 }
191
192 /**
193 * Set results of the validation performed by the <code>Validator</code>.
194 *
195 * @param validatorResults Set results of the validation performed
196 */
197 public void setValidatorResults(ValidatorResults validatorResults) {
198 this.validatorResults = validatorResults;
199 }
200
201 /**
202 * Returns a <code>Map</code> of values returned from any validation that
203 * returns a value other than <code>null</code> or <code>Boolean</code>
204 * with the key the full property path of the field.
205 *
206 * @return Returns a <code>Map</code> of values, otherwise returns null if
207 * no results.
208 */
209 public Map getResultValueMap() {
210 return ((validatorResults != null)
211 ? validatorResults.getResultValueMap() : null);
212 }
213 }