View Javadoc
1   /*
2    * Redistribution and use of this software and associated documentation
3    * ("Software"), with or without modification, are permitted provided
4    * that the following conditions are met:
5    *
6    * 1. Redistributions of source code must retain copyright
7    *    statements and notices.  Redistributions must also contain a
8    *    copy of this document.
9    *
10   * 2. Redistributions in binary form must reproduce the
11   *    above copyright notice, this list of conditions and the
12   *    following disclaimer in the documentation and/or other
13   *    materials provided with the distribution.
14   *
15   * 3. The name "Exolab" must not be used to endorse or promote
16   *    products derived from this Software without prior written
17   *    permission of Intalio, Inc.  For written permission,
18   *    please contact info@exolab.org.
19   *
20   * 4. Products derived from this Software may not be called "Exolab"
21   *    nor may "Exolab" appear in their names without prior written
22   *    permission of Intalio, Inc. Exolab is a registered
23   *    trademark of Intalio, Inc.
24   *
25   * 5. Due credit should be given to the Exolab Project
26   *    (http://www.exolab.org/).
27   *
28   * THIS SOFTWARE IS PROVIDED BY INTALIO, INC. AND CONTRIBUTORS
29   * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
30   * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
31   * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
32   * INTALIO, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
33   * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
34   * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
35   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
37   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
38   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
39   * OF THE POSSIBILITY OF SUCH DAMAGE.
40   *
41   * Copyright 2001-2003 (C) Intalio, Inc. All Rights Reserved.
42   *
43   */
44  package org.exolab.castor.xml.validators;
45  
46  import org.exolab.castor.xml.TypeValidator;
47  import org.exolab.castor.xml.ValidationContext;
48  import org.exolab.castor.xml.ValidationException;
49  
50  /**
51   * The Short Validation class. This class handles validation for the primitive
52   * <code>short</code> and the <code>java.lang.Short</code> types.
53   *
54   * @author <a href="mailto:visco@intalio.com">Keith Visco</a>
55   * @author <a href="mailto:blandin@intalio.com">Arnaud Blandin</a>
56   * @version $Revision$ $Date: 2003-03-03 02:57:21 -0700 (Mon, 03 Mar 2003) $
57   */
58  public class ShortValidator extends PatternValidator implements TypeValidator {
59  
60      /** If true, we perform "minimum value" validation. */
61      private boolean _useMin   = false;
62      /** If true, we perform "maximum value" validation. */
63      private boolean _useMax   = false;
64      /** If true, we perform "fixed" validation. */
65      private boolean _useFixed = false;
66      /** Minimum value (inclusive) for this short.  (Not used unless _useMin == true.) */
67      private short   _min         = 0;
68      /** Maximum value (inclusive) for this short.  (Not used unless _useMax == true.) */
69      private short   _max         = 0;
70      /** Maximum number of digits in this short. (Not applied if < 0.) */
71      private int     _totalDigits = -1;
72      /** Fixed value of this short. (Not used unless _useFixed == true.) */
73      private short   _fixed       = 0;
74  
75      /**
76       * Creates a new ShortValidator with no restrictions.
77       */
78      public ShortValidator() {
79          super();
80      } // -- ShortValidator
81  
82      /**
83       * Clears the fixed value for this ShortValidator.
84       */
85      public void clearFixed() {
86          _useFixed = false;
87      } // -- clearFixed
88  
89      /**
90       * Clears the maximum value for this ShortValidator.
91       */
92      public void clearMax() {
93          _useMax = false;
94      } // -- clearMax
95  
96      /**
97       * Clears the minimum value for this ShortValidator.
98       */
99      public void clearMin() {
100         _useMin = false;
101     } // -- clearMin
102 
103     /**
104      * Returns the configured fixed value for short validation. Returns null if
105      * no fixed value has been configured.
106      *
107      * @return the fixed value to validate against.
108      */
109     public Short getFixed() {
110         if (_useFixed) {
111             return new Short(_fixed);
112         }
113         return null;
114     } // -- getFixed
115 
116     /**
117      * Returns the configured maximum value for short validation. Returns null
118      * if no maximum has been configured.
119      *
120      * @return the maximum (inclusive) value to validate against.
121      */
122     public Short getMaxInclusive() {
123         if (_useMax) {
124             return new Short(_max);
125         }
126         return null;
127     } // -- getMaxInclusive
128 
129     /**
130      * Returns the configured minimum value for short validation. Returns null
131      * if no minimum has been configured.
132      *
133      * @return the minimum (inclusive) value to validate against.
134      */
135     public Short getMinInclusive() {
136         if (_useMin) {
137             return new Short(_min);
138         }
139         return null;
140     } // -- getMinInclusive
141 
142     /**
143      * Returns the configured maximum number of digits (inclusive) for
144      * short validation. Returns null if no maximum number of digits has
145      * been configured.
146      *
147      * @return the maximum number of digits to validate against.
148      */
149     public Integer getTotalDigits() {
150         if (_totalDigits >= 0) {
151             return new Integer(_totalDigits);
152         }
153         return null;
154     } // -- getTotalDigits
155 
156     /**
157      * Returns true if a fixed value to validate against has been set.
158      *
159      * @return true if a fixed value has been set.
160      */
161     public boolean hasFixed() {
162         return _useFixed;
163     } // -- hasFixed
164 
165     /**
166      * Sets the fixed value for short validation.
167      * <p>
168      * NOTE: If maximum and/or minimum values have been set and the fixed value
169      * is not within that max/min range, then no short will pass validation.
170      * This is as according to the XML Schema spec.
171      *
172      * @param fixedValue
173      *            the fixed value that a short validated with this validator
174      *            must be equal to.
175      */
176     public void setFixed(final short fixedValue) {
177         _useFixed = true;
178         this._fixed = fixedValue;
179     } // -- setFixed
180 
181     /**
182      * Sets the minimum (exclusive) value for short validation. To pass
183      * validation, a short must be greater than this value.
184      *
185      * @param minValue
186      *            the minimum (exclusive) value for short validation.
187      */
188     public void setMinExclusive(final short minValue) {
189         _useMin = true;
190         _min = (short) (minValue + 1);
191     } // -- setMinExclusive
192 
193     /**
194      * Sets the minimum (inclusive) value for short validation. To pass
195      * validation, a short must be greater than or equal to this value.
196      *
197      * @param minValue
198      *            the minimum (inclusive) value for short validation.
199      */
200     public void setMinInclusive(final short minValue) {
201         _useMin = true;
202         _min = minValue;
203     } // -- setMinInclusive
204 
205     /**
206      * Sets the maximum (exclusive) value for short validation. To pass
207      * validation, a short must be less than this value.
208      *
209      * @param maxValue
210      *            the maximum (exclusive) value for short validation.
211      */
212     public void setMaxExclusive(final short maxValue) {
213         _useMax = true;
214         _max = (short) (maxValue - 1);
215     } // -- setMaxExclusive
216 
217     /**
218      * Sets the maximum (inclusive) value for short validation. To pass
219      * validation, a short must be less than or equal to this value.
220      *
221      * @param maxValue
222      *            the maximum (inclusive) value for short validation.
223      */
224     public void setMaxInclusive(final short maxValue) {
225         _useMax = true;
226         _max = maxValue;
227     } // -- setMaxInclusive
228 
229     /**
230      * Sets the maximum number of digits for short validation. To pass
231      * validation, a short must have this many digits or fewer. Leading zeros
232      * are not counted.
233      *
234      * @param totalDig
235      *            the maximum (inclusive) number of digits for short validation.
236      *            (must be > 0)
237      */
238     public void setTotalDigits(final int totalDig) {
239         if (totalDig <= 0) {
240             throw new IllegalArgumentException(
241                     "ShortValidator: the totalDigits facet must be positive");
242         }
243         _totalDigits = totalDig;
244     }
245 
246     /**
247      * Validates the given Object.
248      *
249      * @param s
250      *            the short to validate
251      * @param context
252      *            the ValidationContext
253      * @throws ValidationException if the object fails validation.
254      */
255     public void validate(final short s, final ValidationContext context)
256                                                     throws ValidationException {
257         if (_useFixed && s != _fixed) {
258             String err = "short " + s + " is not equal to the fixed value: " + _fixed;
259             throw new ValidationException(err);
260         }
261 
262         if (_useMin && s < _min) {
263             String err = "short " + s + " is less than the minimum allowed value: " + _min;
264             throw new ValidationException(err);
265         }
266 
267         if (_useMax && s > _max) {
268             String err = "short " + s + " is greater than the maximum allowed value: " + _max;
269             throw new ValidationException(err);
270         }
271 
272         if (_totalDigits != -1) {
273             int length = Short.toString(s).length();
274             if (s < 0) {
275                 length--;
276             }
277             if (length > _totalDigits) {
278                 String err = "short " + s + " has too many digits -- must have "
279                         + _totalDigits + " digits or fewer.";
280                 throw new ValidationException(err);
281             }
282         }
283 
284         if (hasPattern()) {
285             super.validate(Short.toString(s), context);
286         }
287     } // -- validate
288 
289     /**
290      * Validates the given Object.
291      *
292      * @param object
293      *            the Object to validate
294      * @throws ValidationException if the object fails validation.
295      */
296     public void validate(final Object object) throws ValidationException {
297         validate(object, (ValidationContext) null);
298     } // -- validate
299 
300     /**
301      * Validates the given Object.
302      *
303      * @param object
304      *            the Object to validate
305      * @param context
306      *            the ValidationContext
307      * @throws ValidationException if the object fails validation.
308      */
309     public void validate(final Object object, final ValidationContext context)
310                                                     throws ValidationException {
311         if (object == null) {
312             String err = "ShortValidator cannot validate a null object.";
313             throw new ValidationException(err);
314         }
315 
316         short value = 0;
317         try {
318             value = ((Short) object).shortValue();
319         } catch (Exception ex) {
320             String err = "Expecting a Short, received instead: " + object.getClass().getName();
321             throw new ValidationException(err);
322         }
323         validate(value, context);
324     } //-- validate
325 
326 } //-- ShortValidator