View Javadoc

1   /*
2    * $Id: DynaValidatorForm.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.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 }