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.FieldExpressionValidator;
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 class NuitonFieldExpressionValidator extends FieldExpressionValidator {
43  
44      private static final Log log = LogFactory.getLog(NuitonFieldExpressionValidator.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 void validateWhenNotSkip(Object object) throws ValidationException {
73          super.validate(object);
74      }
75  
76      @Override
77      public void validate(Object object) throws ValidationException {
78  
79          // evaluate the skip parameter
80          boolean mustSkip = evaluateSkipParameter(object);
81  
82          if (mustSkip) {
83  
84              // skip is set to true, so skip the validation
85              if (log.isDebugEnabled()) {
86                  log.debug("Skip the validation from " + this +
87                            ", due to skip parameter evaluated to true");
88              }
89              return;
90          }
91  
92          // must validate
93          validateWhenNotSkip(object);
94      }
95  
96      /**
97       * Evaluate the skip parameter value against the object to validate.
98       *
99       * This parameter can be an OGNL expression.
100      *
101      * @param object the object to validate
102      * @return the evaluation of the skip parameter.
103      * @throws ValidationException if could not evaluate the parameter
104      */
105     protected boolean evaluateSkipParameter(Object object) throws ValidationException {
106 
107         skip = skip.trim();
108 
109         if ("false".equals(skip)) {
110 
111             return false;
112         }
113 
114         if ("true".equals(skip)) {
115 
116             return true;
117         }
118 
119         try {
120             Boolean answer = Boolean.FALSE;
121             Object obj;
122             obj = getFieldValue(skip, object);
123             if (obj != null && obj instanceof Boolean) {
124                 answer = (Boolean) obj;
125             }
126             return answer;
127         } catch (ValidationException e) {
128             throw e;
129         } catch (Exception e) {
130             // let this pass, but it will be logged right below
131             throw new ValidationException(
132                     "Can not evaluate boolean expression [" + skip +
133                     "] for reason " + e.getMessage());
134         }
135 
136     }
137 
138 }