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 * $Id$
44 */
45 package org.exolab.castor.xml.validators;
46
47 import org.exolab.castor.xml.TypeValidator;
48 import org.exolab.castor.xml.ValidationContext;
49 import org.exolab.castor.xml.ValidationException;
50
51 /**
52 * The Byte Validation class. This class handles validation for the primitive
53 * <code>byte</code> and <code>java.lang.Byte</code> types.
54 *
55 * @author <a href="mailto:visco@intalio.com">Keith Visco</a>
56 * @author <a href="mailto:blandin@intalio.com">Arnaud Blandin</a>
57 * @version $Revision$ $Date: 2003-03-03 02:57:21 -0700 (Mon, 03 Mar
58 * 2003) $
59 */
60 public class ByteValidator extends PatternValidator implements TypeValidator {
61
62 /** If true, we perform "minimum value" validation. */
63 private boolean _useMin = false;
64 /** If true, we perform "maximum value" validation. */
65 private boolean _useMax = false;
66 /** If true, we perform "fixed" validation. */
67 private boolean _useFixed = false;
68 /** Minimum value (inclusive) for this byte. (Not used unless _useMin == true.) */
69 private byte _min = 0;
70 /** Maximum value (inclusive) for this byte. (Not used unless _useMax == true.) */
71 private byte _max = 0;
72 /** Maximum number of digits in this byte. (Not applied if < 0.) */
73 private int _totalDigits = -1;
74 /** Fixed value of this byte. (Not used unless _useFixed == true.) */
75 private byte _fixed = 0;
76
77 /**
78 * Creates a new ByteValidator with no restrictions.
79 */
80 public ByteValidator() {
81 super();
82 } // -- ByteValidator
83
84 /**
85 * Clears the fixed value for this IntegerValidator.
86 */
87 public void clearFixed() {
88 _useFixed = false;
89 } // -- clearFixed
90
91 /**
92 * Clears the maximum value for this ByteValidator.
93 */
94 public void clearMax() {
95 _useMax = false;
96 } // -- clearMax
97
98 /**
99 * Clears the minimum value for this ByteValidator.
100 */
101 public void clearMin() {
102 _useMin = false;
103 } // -- clearMin
104
105 /**
106 * Returns the configured fixed value for byte validation. Returns null if
107 * no fixed value has been configured.
108 *
109 * @return the fixed value to validate against.
110 */
111 public Byte getFixed() {
112 if (_useFixed) {
113 return new Byte(_fixed);
114 }
115 return null;
116 } // -- getFixed
117
118 /**
119 * Returns the configured maximum value for byte validation. Returns null if
120 * no maximum has been configured.
121 *
122 * @return the maximum (inclusive) value to validate against.
123 */
124 public Byte getMaxInclusive() {
125 if (_useMax) {
126 return new Byte(_max);
127 }
128 return null;
129 } // -- getMaxInclusive
130
131 /**
132 * Returns the configured mainmum value for byte validation. Returns null if
133 * no minimum has been configured.
134 *
135 * @return the minimum (inclusive) value to validate against.
136 */
137 public Byte getMinInclusive() {
138 if (_useMin) {
139 return new Byte(_min);
140 }
141 return null;
142 } // -- getMinInclusive
143
144 /**
145 * Returns the configured maximum number of digits (inclusive) for byte
146 * validation. Returns null if no maximum number of digits has been
147 * configured.
148 *
149 * @return the maximum number of digits to validate against.
150 */
151 public Integer getTotalDigits() {
152 if (_totalDigits >= 0) {
153 return new Integer(_totalDigits);
154 }
155 return null;
156 } // -- getTotalDigits
157
158 /**
159 * Returns true if a fixed value to validate against has been set.
160 *
161 * @return true if a fixed value has been set.
162 */
163 public boolean hasFixed() {
164 return _useFixed;
165 } // -- hasFixed
166
167 /**
168 * Sets the fixed value for byte validation.
169 * <p>
170 * NOTE: If maximum and/or minimum values have been set and the fixed value
171 * is not within that max/min range, then no byte will pass validation. This
172 * is as according to the XML Schema spec.
173 *
174 * @param fixedValue
175 * the fixed value that a byte validated with this validator must
176 * be equal to.
177 */
178 public void setFixed(final byte fixedValue) {
179 _useFixed = true;
180 this._fixed = fixedValue;
181 } // -- setFixed
182
183 /**
184 * Sets the minimum (exclusive) value for byte validation. To pass
185 * validation, a byte must be greater than this value.
186 *
187 * @param minValue
188 * the minimum (exclusive) value for byte validation.
189 */
190 public void setMinExclusive(final byte minValue) {
191 _useMin = true;
192 _min = (byte) (minValue + 1);
193 } // -- setMinExclusive
194
195 /**
196 * Sets the minimum (inclusive) value for byte validation. To pass
197 * validation, a byte must be greater than or equal to this value.
198 *
199 * @param minValue
200 * the minimum (inclusive) value for byte validation.
201 */
202 public void setMinInclusive(final byte minValue) {
203 _useMin = true;
204 _min = minValue;
205 } // -- setMinInclusive
206
207 /**
208 * Sets the maximum (exclusive) value for byte validation. To pass
209 * validation, a byte must be less than this value.
210 *
211 * @param maxValue
212 * the maximum (exclusive) value for byte validation.
213 */
214 public void setMaxExclusive(final byte maxValue) {
215 _useMax = true;
216 _max = (byte) (maxValue - 1);
217 } // -- setMaxExclusive
218
219 /**
220 * Sets the maximum (inclusive) value for byte validation. To pass
221 * validation, a byte must be less than or equal to this value.
222 *
223 * @param maxValue
224 * the maximum (inclusive) value for byte validation.
225 */
226 public void setMaxInclusive(final byte maxValue) {
227 _useMax = true;
228 _max = maxValue;
229 } // -- setMaxInclusive
230
231 /**
232 * Sets the maximum number of digits for byte validation. To pass
233 * validation, a byte must have this many digits or fewer. Leading zeros are
234 * not counted.
235 *
236 * @param totalDig
237 * the maximum (inclusive) number of digits for byte validation.
238 * (must be > 0)
239 */
240 public void setTotalDigits(final int totalDig) {
241 if (totalDig <= 0) {
242 throw new IllegalArgumentException(
243 "IntegerValidator: the totalDigits facet must be positive");
244 }
245 _totalDigits = totalDig;
246 }
247
248 /**
249 * Validates the given Object.
250 *
251 * @param b
252 * the byte to validate
253 * @param context
254 * the ValidationContext
255 * @throws ValidationException if the object fails validation.
256 */
257 public void validate(final byte b, final ValidationContext context)
258 throws ValidationException {
259 if (_useFixed && b != _fixed) {
260 String err = "byte " + b + " is not equal to the fixed value: " + _fixed;
261 throw new ValidationException(err);
262 }
263
264 if (_useMin && b < _min) {
265 String err = "byte " + b + " is less than the minimum allowed value: " + _min;
266 throw new ValidationException(err);
267 }
268
269 if (_useMax && b > _max) {
270 String err = "byte " + b + " is greater than the maximum allowed value: " + _max;
271 throw new ValidationException(err);
272 }
273
274 if (_totalDigits != -1) {
275 int length = Byte.toString(b).length();
276 if (b < 0) {
277 length--;
278 }
279 if (length > _totalDigits) {
280 String err = "byte " + b + " has too many digits -- must have "
281 + _totalDigits + " digits or fewer.";
282 throw new ValidationException(err);
283 }
284 }
285
286 if (hasPattern()) {
287 super.validate(Byte.toString(b), context);
288 }
289 } // -- validate
290
291 /**
292 * Validates the given Object.
293 *
294 * @param object
295 * the Object to validate
296 * @throws ValidationException if the object fails validation.
297 */
298 public void validate(final Object object) throws ValidationException {
299 validate(object, (ValidationContext) null);
300 } // -- validate
301
302 /**
303 * Validates the given Object.
304 *
305 * @param object
306 * the Object to validate
307 * @param context
308 * the ValidationContext
309 * @throws ValidationException if the object fails validation.
310 */
311 public void validate(final Object object, final ValidationContext context)
312 throws ValidationException {
313 if (object == null) {
314 String err = "ByteValidator cannot validate a null object.";
315 throw new ValidationException(err);
316 }
317
318 byte value = 0;
319 try {
320 value = ((Byte) object).byteValue();
321 } catch (Exception ex) {
322 String err = "Expecting a Byte, received instead: ";
323 err += object.getClass().getName();
324 throw new ValidationException(err);
325 }
326 validate(value, context);
327 } // -- validate
328
329 } // -- ByteValidator