001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.commons.lang;
018
019 import java.util.Collection;
020 import java.util.Iterator;
021 import java.util.Map;
022
023 /**
024 * <p>This class assists in validating arguments.</p>
025 *
026 * <p>The class is based along the lines of JUnit. If an argument value is
027 * deemed invalid, an IllegalArgumentException is thrown. For example:</p>
028 *
029 * <pre>
030 * Validate.isTrue( i > 0, "The value must be greater than zero: ", i);
031 * Validate.notNull( surname, "The surname must not be null");
032 * </pre>
033 *
034 * @author Apache Software Foundation
035 * @author <a href="mailto:ola.berg@arkitema.se">Ola Berg</a>
036 * @author Gary Gregory
037 * @author Norm Deane
038 * @since 2.0
039 * @version $Id: Validate.java 1057051 2011-01-09 23:15:51Z sebb $
040 */
041 public class Validate {
042 // Validate has no dependencies on other classes in Commons Lang at present
043
044 /**
045 * Constructor. This class should not normally be instantiated.
046 */
047 public Validate() {
048 super();
049 }
050
051 // isTrue
052 //---------------------------------------------------------------------------------
053 /**
054 * <p>Validate that the argument condition is <code>true</code>; otherwise
055 * throwing an exception with the specified message. This method is useful when
056 * validating according to an arbitrary boolean expression, such as validating an
057 * object or using your own custom validation expression.</p>
058 *
059 * <pre>Validate.isTrue( myObject.isOk(), "The object is not OK: ", myObject);</pre>
060 *
061 * <p>For performance reasons, the object value is passed as a separate parameter and
062 * appended to the exception message only in the case of an error.</p>
063 *
064 * @param expression the boolean expression to check
065 * @param message the exception message if invalid
066 * @param value the value to append to the message when invalid
067 * @throws IllegalArgumentException if expression is <code>false</code>
068 */
069 public static void isTrue(boolean expression, String message, Object value) {
070 if (expression == false) {
071 throw new IllegalArgumentException(message + value);
072 }
073 }
074
075 /**
076 * <p>Validate that the argument condition is <code>true</code>; otherwise
077 * throwing an exception with the specified message. This method is useful when
078 * validating according to an arbitrary boolean expression, such as validating a
079 * primitive number or using your own custom validation expression.</p>
080 *
081 * <pre>Validate.isTrue(i > 0.0, "The value must be greater than zero: ", i);</pre>
082 *
083 * <p>For performance reasons, the long value is passed as a separate parameter and
084 * appended to the exception message only in the case of an error.</p>
085 *
086 * @param expression the boolean expression to check
087 * @param message the exception message if invalid
088 * @param value the value to append to the message when invalid
089 * @throws IllegalArgumentException if expression is <code>false</code>
090 */
091 public static void isTrue(boolean expression, String message, long value) {
092 if (expression == false) {
093 throw new IllegalArgumentException(message + value);
094 }
095 }
096
097 /**
098 * <p>Validate that the argument condition is <code>true</code>; otherwise
099 * throwing an exception with the specified message. This method is useful when
100 * validating according to an arbitrary boolean expression, such as validating a
101 * primitive number or using your own custom validation expression.</p>
102 *
103 * <pre>Validate.isTrue(d > 0.0, "The value must be greater than zero: ", d);</pre>
104 *
105 * <p>For performance reasons, the double value is passed as a separate parameter and
106 * appended to the exception message only in the case of an error.</p>
107 *
108 * @param expression the boolean expression to check
109 * @param message the exception message if invalid
110 * @param value the value to append to the message when invalid
111 * @throws IllegalArgumentException if expression is <code>false</code>
112 */
113 public static void isTrue(boolean expression, String message, double value) {
114 if (expression == false) {
115 throw new IllegalArgumentException(message + value);
116 }
117 }
118
119 /**
120 * <p>Validate that the argument condition is <code>true</code>; otherwise
121 * throwing an exception with the specified message. This method is useful when
122 * validating according to an arbitrary boolean expression, such as validating a
123 * primitive number or using your own custom validation expression.</p>
124 *
125 * <pre>
126 * Validate.isTrue( (i > 0), "The value must be greater than zero");
127 * Validate.isTrue( myObject.isOk(), "The object is not OK");
128 * </pre>
129 *
130 * @param expression the boolean expression to check
131 * @param message the exception message if invalid
132 * @throws IllegalArgumentException if expression is <code>false</code>
133 */
134 public static void isTrue(boolean expression, String message) {
135 if (expression == false) {
136 throw new IllegalArgumentException(message);
137 }
138 }
139
140 /**
141 * <p>Validate that the argument condition is <code>true</code>; otherwise
142 * throwing an exception. This method is useful when validating according
143 * to an arbitrary boolean expression, such as validating a
144 * primitive number or using your own custom validation expression.</p>
145 *
146 * <pre>
147 * Validate.isTrue(i > 0);
148 * Validate.isTrue(myObject.isOk());</pre>
149 *
150 * <p>The message of the exception is "The validated expression is
151 * false".</p>
152 *
153 * @param expression the boolean expression to check
154 * @throws IllegalArgumentException if expression is <code>false</code>
155 */
156 public static void isTrue(boolean expression) {
157 if (expression == false) {
158 throw new IllegalArgumentException("The validated expression is false");
159 }
160 }
161
162 // notNull
163 //---------------------------------------------------------------------------------
164
165 /**
166 * <p>Validate that the specified argument is not <code>null</code>;
167 * otherwise throwing an exception.
168 *
169 * <pre>Validate.notNull(myObject);</pre>
170 *
171 * <p>The message of the exception is "The validated object is
172 * null".</p>
173 *
174 * @param object the object to check
175 * @throws IllegalArgumentException if the object is <code>null</code>
176 */
177 public static void notNull(Object object) {
178 notNull(object, "The validated object is null");
179 }
180
181 /**
182 * <p>Validate that the specified argument is not <code>null</code>;
183 * otherwise throwing an exception with the specified message.
184 *
185 * <pre>Validate.notNull(myObject, "The object must not be null");</pre>
186 *
187 * @param object the object to check
188 * @param message the exception message if invalid
189 */
190 public static void notNull(Object object, String message) {
191 if (object == null) {
192 throw new IllegalArgumentException(message);
193 }
194 }
195
196 // notEmpty array
197 //---------------------------------------------------------------------------------
198
199 /**
200 * <p>Validate that the specified argument array is neither <code>null</code>
201 * nor a length of zero (no elements); otherwise throwing an exception
202 * with the specified message.
203 *
204 * <pre>Validate.notEmpty(myArray, "The array must not be empty");</pre>
205 *
206 * @param array the array to check
207 * @param message the exception message if invalid
208 * @throws IllegalArgumentException if the array is empty
209 */
210 public static void notEmpty(Object[] array, String message) {
211 if (array == null || array.length == 0) {
212 throw new IllegalArgumentException(message);
213 }
214 }
215
216 /**
217 * <p>Validate that the specified argument array is neither <code>null</code>
218 * nor a length of zero (no elements); otherwise throwing an exception.
219 *
220 * <pre>Validate.notEmpty(myArray);</pre>
221 *
222 * <p>The message in the exception is "The validated array is
223 * empty".
224 *
225 * @param array the array to check
226 * @throws IllegalArgumentException if the array is empty
227 */
228 public static void notEmpty(Object[] array) {
229 notEmpty(array, "The validated array is empty");
230 }
231
232 // notEmpty collection
233 //---------------------------------------------------------------------------------
234
235 /**
236 * <p>Validate that the specified argument collection is neither <code>null</code>
237 * nor a size of zero (no elements); otherwise throwing an exception
238 * with the specified message.
239 *
240 * <pre>Validate.notEmpty(myCollection, "The collection must not be empty");</pre>
241 *
242 * @param collection the collection to check
243 * @param message the exception message if invalid
244 * @throws IllegalArgumentException if the collection is empty
245 */
246 public static void notEmpty(Collection collection, String message) {
247 if (collection == null || collection.size() == 0) {
248 throw new IllegalArgumentException(message);
249 }
250 }
251
252 /**
253 * <p>Validate that the specified argument collection is neither <code>null</code>
254 * nor a size of zero (no elements); otherwise throwing an exception.
255 *
256 * <pre>Validate.notEmpty(myCollection);</pre>
257 *
258 * <p>The message in the exception is "The validated collection is
259 * empty".</p>
260 *
261 * @param collection the collection to check
262 * @throws IllegalArgumentException if the collection is empty
263 */
264 public static void notEmpty(Collection collection) {
265 notEmpty(collection, "The validated collection is empty");
266 }
267
268 // notEmpty map
269 //---------------------------------------------------------------------------------
270
271 /**
272 * <p>Validate that the specified argument map is neither <code>null</code>
273 * nor a size of zero (no elements); otherwise throwing an exception
274 * with the specified message.
275 *
276 * <pre>Validate.notEmpty(myMap, "The map must not be empty");</pre>
277 *
278 * @param map the map to check
279 * @param message the exception message if invalid
280 * @throws IllegalArgumentException if the map is empty
281 */
282 public static void notEmpty(Map map, String message) {
283 if (map == null || map.size() == 0) {
284 throw new IllegalArgumentException(message);
285 }
286 }
287
288 /**
289 * <p>Validate that the specified argument map is neither <code>null</code>
290 * nor a size of zero (no elements); otherwise throwing an exception.
291 *
292 * <pre>Validate.notEmpty(myMap);</pre>
293 *
294 * <p>The message in the exception is "The validated map is
295 * empty".</p>
296 *
297 * @param map the map to check
298 * @throws IllegalArgumentException if the map is empty
299 * @see #notEmpty(Map, String)
300 */
301 public static void notEmpty(Map map) {
302 notEmpty(map, "The validated map is empty");
303 }
304
305 // notEmpty string
306 //---------------------------------------------------------------------------------
307
308 /**
309 * <p>Validate that the specified argument string is
310 * neither <code>null</code> nor a length of zero (no characters);
311 * otherwise throwing an exception with the specified message.
312 *
313 * <pre>Validate.notEmpty(myString, "The string must not be empty");</pre>
314 *
315 * @param string the string to check
316 * @param message the exception message if invalid
317 * @throws IllegalArgumentException if the string is empty
318 */
319 public static void notEmpty(String string, String message) {
320 if (string == null || string.length() == 0) {
321 throw new IllegalArgumentException(message);
322 }
323 }
324
325 /**
326 * <p>Validate that the specified argument string is
327 * neither <code>null</code> nor a length of zero (no characters);
328 * otherwise throwing an exception with the specified message.
329 *
330 * <pre>Validate.notEmpty(myString);</pre>
331 *
332 * <p>The message in the exception is "The validated
333 * string is empty".</p>
334 *
335 * @param string the string to check
336 * @throws IllegalArgumentException if the string is empty
337 */
338 public static void notEmpty(String string) {
339 notEmpty(string, "The validated string is empty");
340 }
341
342 // notNullElements array
343 //---------------------------------------------------------------------------------
344
345 /**
346 * <p>Validate that the specified argument array is neither
347 * <code>null</code> nor contains any elements that are <code>null</code>;
348 * otherwise throwing an exception with the specified message.
349 *
350 * <pre>Validate.noNullElements(myArray, "The array contain null at position %d");</pre>
351 *
352 * <p>If the array is <code>null</code>, then the message in the exception
353 * is "The validated object is null".</p>
354 *
355 * @param array the array to check
356 * @param message the exception message if the collection has <code>null</code> elements
357 * @throws IllegalArgumentException if the array is <code>null</code> or
358 * an element in the array is <code>null</code>
359 */
360 public static void noNullElements(Object[] array, String message) {
361 Validate.notNull(array);
362 for (int i = 0; i < array.length; i++) {
363 if (array[i] == null) {
364 throw new IllegalArgumentException(message);
365 }
366 }
367 }
368
369 /**
370 * <p>Validate that the specified argument array is neither
371 * <code>null</code> nor contains any elements that are <code>null</code>;
372 * otherwise throwing an exception.
373 *
374 * <pre>Validate.noNullElements(myArray);</pre>
375 *
376 * <p>If the array is <code>null</code>, then the message in the exception
377 * is "The validated object is null".</p>
378 *
379 * <p>If the array has a <code>null</code> element, then the message in the
380 * exception is "The validated array contains null element at index:
381 * " followed by the index.</p>
382 *
383 * @param array the array to check
384 * @throws IllegalArgumentException if the array is <code>null</code> or
385 * an element in the array is <code>null</code>
386 */
387 public static void noNullElements(Object[] array) {
388 Validate.notNull(array);
389 for (int i = 0; i < array.length; i++) {
390 if (array[i] == null) {
391 throw new IllegalArgumentException("The validated array contains null element at index: " + i);
392 }
393 }
394 }
395
396 // notNullElements collection
397 //---------------------------------------------------------------------------------
398
399 /**
400 * <p>Validate that the specified argument collection is neither
401 * <code>null</code> nor contains any elements that are <code>null</code>;
402 * otherwise throwing an exception with the specified message.
403 *
404 * <pre>Validate.noNullElements(myCollection, "The collection contains null elements");</pre>
405 *
406 * <p>If the collection is <code>null</code>, then the message in the exception
407 * is "The validated object is null".</p>
408 *
409 *
410 * @param collection the collection to check
411 * @param message the exception message if the collection has
412 * @throws IllegalArgumentException if the collection is <code>null</code> or
413 * an element in the collection is <code>null</code>
414 */
415 public static void noNullElements(Collection collection, String message) {
416 Validate.notNull(collection);
417 for (Iterator it = collection.iterator(); it.hasNext();) {
418 if (it.next() == null) {
419 throw new IllegalArgumentException(message);
420 }
421 }
422 }
423
424 /**
425 * <p>Validate that the specified argument collection is neither
426 * <code>null</code> nor contains any elements that are <code>null</code>;
427 * otherwise throwing an exception.
428 *
429 * <pre>Validate.noNullElements(myCollection);</pre>
430 *
431 * <p>If the collection is <code>null</code>, then the message in the exception
432 * is "The validated object is null".</p>
433 *
434 * <p>If the collection has a <code>null</code> element, then the message in the
435 * exception is "The validated collection contains null element at index:
436 * " followed by the index.</p>
437 *
438 * @param collection the collection to check
439 * @throws IllegalArgumentException if the collection is <code>null</code> or
440 * an element in the collection is <code>null</code>
441 */
442 public static void noNullElements(Collection collection) {
443 Validate.notNull(collection);
444 int i = 0;
445 for (Iterator it = collection.iterator(); it.hasNext(); i++) {
446 if (it.next() == null) {
447 throw new IllegalArgumentException("The validated collection contains null element at index: " + i);
448 }
449 }
450 }
451
452 /**
453 * <p>Validate an argument, throwing <code>IllegalArgumentException</code>
454 * if the argument collection is <code>null</code> or has elements that
455 * are not of type <code>clazz</code> or a subclass.</p>
456 *
457 * <pre>
458 * Validate.allElementsOfType(collection, String.class, "Collection has invalid elements");
459 * </pre>
460 *
461 * @param collection the collection to check, not null
462 * @param clazz the <code>Class</code> which the collection's elements are expected to be, not null
463 * @param message the exception message if the <code>Collection</code> has elements not of type <code>clazz</code>
464 * @since 2.1
465 */
466 public static void allElementsOfType(Collection collection, Class clazz, String message) {
467 Validate.notNull(collection);
468 Validate.notNull(clazz);
469 for (Iterator it = collection.iterator(); it.hasNext(); ) {
470 if (clazz.isInstance(it.next()) == false) {
471 throw new IllegalArgumentException(message);
472 }
473 }
474 }
475
476 /**
477 * <p>
478 * Validate an argument, throwing <code>IllegalArgumentException</code> if the argument collection is
479 * <code>null</code> or has elements that are not of type <code>clazz</code> or a subclass.
480 * </p>
481 *
482 * <pre>
483 * Validate.allElementsOfType(collection, String.class);
484 * </pre>
485 *
486 * <p>
487 * The message in the exception is 'The validated collection contains an element not of type clazz at index: '.
488 * </p>
489 *
490 * @param collection the collection to check, not null
491 * @param clazz the <code>Class</code> which the collection's elements are expected to be, not null
492 * @since 2.1
493 */
494 public static void allElementsOfType(Collection collection, Class clazz) {
495 Validate.notNull(collection);
496 Validate.notNull(clazz);
497 int i = 0;
498 for (Iterator it = collection.iterator(); it.hasNext(); i++) {
499 if (clazz.isInstance(it.next()) == false) {
500 throw new IllegalArgumentException("The validated collection contains an element not of type "
501 + clazz.getName() + " at index: " + i);
502 }
503 }
504 }
505
506 }