View Javadoc
1   /*
2    * #%L
3    * Nuiton Validator
4    * %%
5    * Copyright (C) 2013 - 2014 Code Lutin, Tony Chemit
6    * %%
7    * This program is free software: you can redistribute it and/or modify
8    * it under the terms of the GNU Lesser General Public License as 
9    * published by the Free Software Foundation, either version 3 of the 
10   * License, or (at your option) any later version.
11   * 
12   * This program is distributed in the hope that it will be useful,
13   * but WITHOUT ANY WARRANTY; without even the implied warranty of
14   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   * GNU General Lesser Public License for more details.
16   * 
17   * You should have received a copy of the GNU General Lesser Public 
18   * License along with this program.  If not, see
19   * <http://www.gnu.org/licenses/lgpl-3.0.html>.
20   * #L%
21   */
22  package org.nuiton.validator.xwork2.field;
23  
24  import com.opensymphony.xwork2.validator.ValidationException;
25  import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport;
26  import org.apache.commons.logging.Log;
27  import org.apache.commons.logging.LogFactory;
28  
29  /**
30   * Nuiton default field validator.
31   *
32   * This validator offers a {@link #skip} property that can be used to skip or
33   * not the validator, this property is a OGNL expression.
34   *
35   * To use this new field validator support, just now implements the method
36   * {@link #validateWhenNotSkip(Object)}. This method will be invoked only if the skip
37   * parameter is evaluated to {@code false}.
38   *
39   * @author Tony Chemit - chemit@codelutin.com
40   * @since 2.3
41   */
42  public abstract class NuitonFieldValidatorSupport extends FieldValidatorSupport {
43  
44      private static final Log log = LogFactory.getLog(NuitonFieldValidatorSupport.class);
45  
46      /**
47       * extra parameter at the very beginning of the
48       * {@link #validate(Object)} method to be able to skip (or not) the
49       * validator execution.
50       *
51       * by default the value is {@code false} : it seems fair to want to
52       * validate if the validator is used :D...
53       */
54      protected String skip = "false";
55  
56      /**
57       * Sets the value of the {@link #skip} parameter.
58       *
59       * @param skip the new value of the {@link #skip} parameter
60       */
61      public void setSkip(String skip) {
62          this.skip = skip;
63      }
64  
65      /**
66       * Method to be invoked when skip parameter was not evaludated to {@code true}.
67       *
68       * @param object the object to be validated.
69       * @throws ValidationException is thrown if there is validation error(s).
70       */
71  
72      protected abstract void validateWhenNotSkip(Object object) throws ValidationException;
73  
74      @Override
75      public void validate(Object object) throws ValidationException {
76  
77          // evaluate the skip parameter
78          boolean mustSkip = evaluateSkipParameter(object);
79  
80          if (mustSkip) {
81  
82              // skip is set to true, so skip the validation
83              if (log.isDebugEnabled()) {
84                  log.debug("Skip the validation from " + this +
85                            ", due to skip parameter evaluated to true");
86              }
87              return;
88          }
89  
90          // must validate
91          validateWhenNotSkip(object);
92      }
93  
94      /**
95       * Evaluate the skip parameter value against the object to validate.
96       *
97       * This parameter can be an OGNL expression.
98       *
99       * @param object the object to validate
100      * @return the evaluation of the skip parameter.
101      * @throws ValidationException if could not evaluate the parameter
102      */
103     protected boolean evaluateSkipParameter(Object object) throws ValidationException {
104 
105         skip = skip.trim();
106 
107         if ("false".equals(skip)) {
108 
109             return false;
110         }
111 
112         if ("true".equals(skip)) {
113 
114             return true;
115         }
116 
117         try {
118             Boolean answer = Boolean.FALSE;
119             Object obj;
120             obj = getFieldValue(skip, object);
121             if (obj != null && obj instanceof Boolean) {
122                 answer = (Boolean) obj;
123             }
124             return answer;
125         } catch (ValidationException e) {
126             throw e;
127         } catch (Exception e) {
128             // let this pass, but it will be logged right below
129             throw new ValidationException(
130                     "Can not evaluate boolean expression [" + skip +
131                     "] for reason " + e.getMessage());
132         }
133 
134     }
135 
136     @Override
137     public Object getFieldValue(String name,
138                                 Object object) throws ValidationException {
139         return super.getFieldValue(name, object);
140     }
141 }