001    /*
002     * JBoss DNA (http://www.jboss.org/dna)
003     * See the COPYRIGHT.txt file distributed with this work for information
004     * regarding copyright ownership.  Some portions may be licensed
005     * to Red Hat, Inc. under one or more contributor license agreements.
006     * See the AUTHORS.txt file in the distribution for a full listing of 
007     * individual contributors. 
008     *
009     * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
010     * is licensed to you under the terms of the GNU Lesser General Public License as
011     * published by the Free Software Foundation; either version 2.1 of
012     * the License, or (at your option) any later version.
013     *
014     * JBoss DNA is distributed in the hope that it will be useful,
015     * but WITHOUT ANY WARRANTY; without even the implied warranty of
016     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
017     * Lesser General Public License for more details.
018     *
019     * You should have received a copy of the GNU Lesser General Public
020     * License along with this software; if not, write to the Free
021     * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
022     * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
023     */
024    package org.jboss.dna.common.util;
025    
026    import java.util.Collection;
027    import java.util.Iterator;
028    import java.util.Map;
029    import org.jboss.dna.common.CommonI18n;
030    
031    /**
032     * Utility class that checks arguments to methods. This class is to be used only in API methods, where failure to supply correct
033     * arguments should result in a useful error message. In all cases, use the <code>assert</code> statement.
034     */
035    public final class CheckArg {
036    
037        // ########################## int METHODS ###################################
038    
039        /**
040         * Check that the argument is not less than the supplied value
041         * 
042         * @param argument The argument
043         * @param notLessThanValue the value that is to be used to check the value
044         * @param name The name of the argument
045         * @throws IllegalArgumentException If argument greater than or equal to the supplied vlaue
046         */
047        public static void isNotLessThan( int argument,
048                                          int notLessThanValue,
049                                          String name ) {
050            if (argument < notLessThanValue) {
051                throw new IllegalArgumentException(CommonI18n.argumentMayNotBeLessThan.text(name, argument, notLessThanValue));
052            }
053        }
054    
055        /**
056         * Check that the argument is not greater than the supplied value
057         * 
058         * @param argument The argument
059         * @param notGreaterThanValue the value that is to be used to check the value
060         * @param name The name of the argument
061         * @throws IllegalArgumentException If argument is less than or equal to the supplied value
062         */
063        public static void isNotGreaterThan( int argument,
064                                             int notGreaterThanValue,
065                                             String name ) {
066            if (argument > notGreaterThanValue) {
067                throw new IllegalArgumentException(CommonI18n.argumentMayNotBeGreaterThan.text(name, argument, notGreaterThanValue));
068            }
069        }
070    
071        /**
072         * Check that the argument is greater than the supplied value
073         * 
074         * @param argument The argument
075         * @param greaterThanValue the value that is to be used to check the value
076         * @param name The name of the argument
077         * @throws IllegalArgumentException If argument is not greater than the supplied value
078         */
079        public static void isGreaterThan( int argument,
080                                          int greaterThanValue,
081                                          String name ) {
082            if (argument <= greaterThanValue) {
083                throw new IllegalArgumentException(CommonI18n.argumentMustBeGreaterThan.text(name, argument, greaterThanValue));
084            }
085        }
086    
087        /**
088         * Check that the argument is greater than the supplied value
089         * 
090         * @param argument The argument
091         * @param greaterThanValue the value that is to be used to check the value
092         * @param name The name of the argument
093         * @throws IllegalArgumentException If argument is not greater than the supplied value
094         */
095        public static void isGreaterThan( double argument,
096                                          double greaterThanValue,
097                                          String name ) {
098            if (argument <= greaterThanValue) {
099                throw new IllegalArgumentException(CommonI18n.argumentMustBeGreaterThan.text(name, argument, greaterThanValue));
100            }
101        }
102    
103        /**
104         * Check that the argument is less than the supplied value
105         * 
106         * @param argument The argument
107         * @param lessThanValue the value that is to be used to check the value
108         * @param name The name of the argument
109         * @throws IllegalArgumentException If argument is not less than the supplied value
110         */
111        public static void isLessThan( int argument,
112                                       int lessThanValue,
113                                       String name ) {
114            if (argument >= lessThanValue) {
115                throw new IllegalArgumentException(CommonI18n.argumentMustBeLessThan.text(name, argument, lessThanValue));
116            }
117        }
118    
119        /**
120         * Check that the argument is greater than or equal to the supplied value
121         * 
122         * @param argument The argument
123         * @param greaterThanOrEqualToValue the value that is to be used to check the value
124         * @param name The name of the argument
125         * @throws IllegalArgumentException If argument is not greater than or equal to the supplied value
126         */
127        public static void isGreaterThanOrEqualTo( int argument,
128                                                   int greaterThanOrEqualToValue,
129                                                   String name ) {
130            if (argument < greaterThanOrEqualToValue) {
131                throw new IllegalArgumentException(CommonI18n.argumentMustBeGreaterThanOrEqualTo.text(name,
132                                                                                                      argument,
133                                                                                                      greaterThanOrEqualToValue));
134            }
135        }
136    
137        /**
138         * Check that the argument is less than or equal to the supplied value
139         * 
140         * @param argument The argument
141         * @param lessThanOrEqualToValue the value that is to be used to check the value
142         * @param name The name of the argument
143         * @throws IllegalArgumentException If argument is not less than or equal to the supplied value
144         */
145        public static void isLessThanOrEqualTo( int argument,
146                                                int lessThanOrEqualToValue,
147                                                String name ) {
148            if (argument > lessThanOrEqualToValue) {
149                throw new IllegalArgumentException(CommonI18n.argumentMustBeLessThanOrEqualTo.text(name,
150                                                                                                   argument,
151                                                                                                   lessThanOrEqualToValue));
152            }
153        }
154    
155        /**
156         * Check that the argument is non-negative (>=0).
157         * 
158         * @param argument The argument
159         * @param name The name of the argument
160         * @throws IllegalArgumentException If argument is negative (<0)
161         */
162        public static void isNonNegative( int argument,
163                                          String name ) {
164            if (argument < 0) {
165                throw new IllegalArgumentException(CommonI18n.argumentMayNotBeNegative.text(name, argument));
166            }
167        }
168    
169        /**
170         * Check that the argument is non-positive (<=0).
171         * 
172         * @param argument The argument
173         * @param name The name of the argument
174         * @throws IllegalArgumentException If argument is positive (>0)
175         */
176        public static void isNonPositive( int argument,
177                                          String name ) {
178            if (argument > 0) {
179                throw new IllegalArgumentException(CommonI18n.argumentMayNotBePositive.text(name, argument));
180            }
181        }
182    
183        /**
184         * Check that the argument is negative (<0).
185         * 
186         * @param argument The argument
187         * @param name The name of the argument
188         * @throws IllegalArgumentException If argument is non-negative (>=0)
189         */
190        public static void isNegative( int argument,
191                                       String name ) {
192            if (argument >= 0) {
193                throw new IllegalArgumentException(CommonI18n.argumentMustBeNegative.text(name, argument));
194            }
195        }
196    
197        /**
198         * Check that the argument is positive (>0).
199         * 
200         * @param argument The argument
201         * @param name The name of the argument
202         * @throws IllegalArgumentException If argument is non-positive (<=0)
203         */
204        public static void isPositive( int argument,
205                                       String name ) {
206            if (argument <= 0) {
207                throw new IllegalArgumentException(CommonI18n.argumentMustBePositive.text(name, argument));
208            }
209        }
210    
211        // ########################## long METHODS ###################################
212    
213        /**
214         * Check that the argument is non-negative (>=0).
215         * 
216         * @param argument The argument
217         * @param name The name of the argument
218         * @throws IllegalArgumentException If argument is negative (<0)
219         */
220        public static void isNonNegative( long argument,
221                                          String name ) {
222            if (argument < 0) {
223                throw new IllegalArgumentException(CommonI18n.argumentMayNotBeNegative.text(name, argument));
224            }
225        }
226    
227        /**
228         * Check that the argument is non-positive (<=0).
229         * 
230         * @param argument The argument
231         * @param name The name of the argument
232         * @throws IllegalArgumentException If argument is positive (>0)
233         */
234        public static void isNonPositive( long argument,
235                                          String name ) {
236            if (argument > 0) {
237                throw new IllegalArgumentException(CommonI18n.argumentMayNotBePositive.text(name, argument));
238            }
239        }
240    
241        /**
242         * Check that the argument is negative (<0).
243         * 
244         * @param argument The argument
245         * @param name The name of the argument
246         * @throws IllegalArgumentException If argument is non-negative (>=0)
247         */
248        public static void isNegative( long argument,
249                                       String name ) {
250            if (argument >= 0) {
251                throw new IllegalArgumentException(CommonI18n.argumentMustBeNegative.text(name, argument));
252            }
253        }
254    
255        /**
256         * Check that the argument is positive (>0).
257         * 
258         * @param argument The argument
259         * @param name The name of the argument
260         * @throws IllegalArgumentException If argument is non-positive (<=0)
261         */
262        public static void isPositive( long argument,
263                                       String name ) {
264            if (argument <= 0) {
265                throw new IllegalArgumentException(CommonI18n.argumentMustBePositive.text(name, argument));
266            }
267        }
268    
269        // ########################## double METHODS ###################################
270    
271        /**
272         * Check that the argument is non-negative (>=0).
273         * 
274         * @param argument The argument
275         * @param name The name of the argument
276         * @throws IllegalArgumentException If argument is negative (<0)
277         */
278        public static void isNonNegative( double argument,
279                                          String name ) {
280            if (argument < 0.0) {
281                throw new IllegalArgumentException(CommonI18n.argumentMayNotBeNegative.text(name, argument));
282            }
283        }
284    
285        /**
286         * Check that the argument is non-positive (<=0).
287         * 
288         * @param argument The argument
289         * @param name The name of the argument
290         * @throws IllegalArgumentException If argument is positive (>0)
291         */
292        public static void isNonPositive( double argument,
293                                          String name ) {
294            if (argument > 0.0) {
295                throw new IllegalArgumentException(CommonI18n.argumentMayNotBePositive.text(name, argument));
296            }
297        }
298    
299        /**
300         * Check that the argument is negative (<0).
301         * 
302         * @param argument The argument
303         * @param name The name of the argument
304         * @throws IllegalArgumentException If argument is non-negative (>=0)
305         */
306        public static void isNegative( double argument,
307                                       String name ) {
308            if (argument >= 0.0) {
309                throw new IllegalArgumentException(CommonI18n.argumentMustBeNegative.text(name, argument));
310            }
311        }
312    
313        /**
314         * Check that the argument is positive (>0).
315         * 
316         * @param argument The argument
317         * @param name The name of the argument
318         * @throws IllegalArgumentException If argument is non-positive (<=0)
319         */
320        public static void isPositive( double argument,
321                                       String name ) {
322            if (argument <= 0.0) {
323                throw new IllegalArgumentException(CommonI18n.argumentMustBePositive.text(name, argument));
324            }
325        }
326    
327        /**
328         * Check that the argument is not NaN.
329         * 
330         * @param argument The argument
331         * @param name The name of the argument
332         * @throws IllegalArgumentException If argument is NaN
333         */
334        public static void isNotNan( double argument,
335                                     String name ) {
336            if (Double.isNaN(argument)) {
337                throw new IllegalArgumentException(CommonI18n.argumentMustBeNumber.text(name));
338            }
339        }
340    
341        // ########################## String METHODS ###################################
342    
343        /**
344         * Check that the string is non-null and has length > 0
345         * 
346         * @param argument The argument
347         * @param name The name of the argument
348         * @throws IllegalArgumentException If value is null or length == 0
349         */
350        public static void isNotZeroLength( String argument,
351                                            String name ) {
352            isNotNull(argument, name);
353            if (argument.length() <= 0) {
354                throw new IllegalArgumentException(CommonI18n.argumentMayNotBeNullOrZeroLength.text(name));
355            }
356        }
357    
358        /**
359         * Check that the string is not empty, is not null, and does not contain only whitespace.
360         * 
361         * @param argument String
362         * @param name The name of the argument
363         * @throws IllegalArgumentException If string is null or empty
364         */
365        public static void isNotEmpty( String argument,
366                                       String name ) {
367            isNotZeroLength(argument, name);
368            if (argument != null && argument.trim().length() == 0) {
369                throw new IllegalArgumentException(CommonI18n.argumentMayNotBeNullOrZeroLengthOrEmpty.text(name));
370            }
371        }
372    
373        // ########################## Object METHODS ###################################
374    
375        /**
376         * Check that the specified argument is non-null
377         * 
378         * @param argument The argument
379         * @param name The name of the argument
380         * @throws IllegalArgumentException If argument is null
381         */
382        public static void isNotNull( Object argument,
383                                      String name ) {
384            if (argument == null) {
385                throw new IllegalArgumentException(CommonI18n.argumentMayNotBeNull.text(name));
386            }
387        }
388    
389        /**
390         * Returns the specified argument if it is not <code>null</code>.
391         * 
392         * @param <T>
393         * @param argument The argument
394         * @param name The name of the argument
395         * @return The argument
396         * @throws IllegalArgumentException If argument is <code>null</code>
397         */
398        public static <T> T getNotNull( T argument,
399                                        String name ) {
400            isNotNull(argument, name);
401            return argument;
402        }
403    
404        /**
405         * Check that the argument is null
406         * 
407         * @param argument The argument
408         * @param name The name of the argument
409         * @throws IllegalArgumentException If value is non-null
410         */
411        public static void isNull( Object argument,
412                                   String name ) {
413            if (argument != null) {
414                throw new IllegalArgumentException(CommonI18n.argumentMustBeNull.text(name));
415            }
416        }
417    
418        /**
419         * Check that the object is an instance of the specified Class
420         * 
421         * @param argument Value
422         * @param expectedClass Class
423         * @param name The name of the argument
424         * @throws IllegalArgumentException If value is null
425         */
426        public static void isInstanceOf( Object argument,
427                                         Class<?> expectedClass,
428                                         String name ) {
429            isNotNull(argument, name);
430            if (!expectedClass.isInstance(argument)) {
431                throw new IllegalArgumentException(CommonI18n.argumentMustBeInstanceOf.text(name,
432                                                                                            argument.getClass(),
433                                                                                            expectedClass.getName()));
434            }
435        }
436    
437        /**
438         * Checks that the object is an instance of the specified Class and then returns the object cast to the specified Class
439         * 
440         * @param <C> the class type
441         * @param argument Value
442         * @param expectedClass Class
443         * @param name The name of the argument
444         * @return value cast to the specified Class
445         * @throws IllegalArgumentException If value is not an instance of theClass.
446         */
447        // due to cast in return
448        public static <C> C getInstanceOf( Object argument,
449                                           Class<C> expectedClass,
450                                           String name ) {
451            isInstanceOf(argument, expectedClass, name);
452            return expectedClass.cast(argument);
453        }
454    
455        /**
456         * Asserts that the specified first object is the same as (==) the specified second object.
457         * 
458         * @param <T>
459         * @param argument The argument to assert as the same as <code>object</code>.
460         * @param argumentName The name that will be used within the exception message for the argument should an exception be thrown
461         * @param object The object to assert as the same as <code>argument</code>.
462         * @param objectName The name that will be used within the exception message for <code>object</code> should an exception be
463         *        thrown; if <code>null</code> and <code>object</code> is not <code>null</code>, <code>object.toString()</code> will
464         *        be used.
465         * @throws IllegalArgumentException If the specified objects are not the same.
466         */
467        public static <T> void isSame( final T argument,
468                                       String argumentName,
469                                       final T object,
470                                       String objectName ) {
471            if (argument != object) {
472                if (objectName == null) objectName = getObjectName(object);
473                throw new IllegalArgumentException(CommonI18n.argumentMustBeSameAs.text(argumentName, objectName));
474            }
475        }
476    
477        /**
478         * Asserts that the specified first object is not the same as (==) the specified second object.
479         * 
480         * @param <T>
481         * @param argument The argument to assert as not the same as <code>object</code>.
482         * @param argumentName The name that will be used within the exception message for the argument should an exception be thrown
483         * @param object The object to assert as not the same as <code>argument</code>.
484         * @param objectName The name that will be used within the exception message for <code>object</code> should an exception be
485         *        thrown; if <code>null</code> and <code>object</code> is not <code>null</code>, <code>object.toString()</code> will
486         *        be used.
487         * @throws IllegalArgumentException If the specified objects are the same.
488         */
489        public static <T> void isNotSame( final T argument,
490                                          String argumentName,
491                                          final T object,
492                                          String objectName ) {
493            if (argument == object) {
494                if (objectName == null) objectName = getObjectName(object);
495                throw new IllegalArgumentException(CommonI18n.argumentMustNotBeSameAs.text(argumentName, objectName));
496            }
497        }
498    
499        /**
500         * Asserts that the specified first object is {@link Object#equals(Object) equal to} the specified second object. This method
501         * does take null references into consideration.
502         * 
503         * @param <T>
504         * @param argument The argument to assert equal to <code>object</code>.
505         * @param argumentName The name that will be used within the exception message for the argument should an exception be thrown
506         * @param object The object to assert as equal to <code>argument</code>.
507         * @param objectName The name that will be used within the exception message for <code>object</code> should an exception be
508         *        thrown; if <code>null</code> and <code>object</code> is not <code>null</code>, <code>object.toString()</code> will
509         *        be used.
510         * @throws IllegalArgumentException If the specified objects are not equal.
511         */
512        public static <T> void isEquals( final T argument,
513                                         String argumentName,
514                                         final T object,
515                                         String objectName ) {
516            if (argument == null) {
517                if (object == null) return;
518                // fall through ... one is null
519            } else {
520                if (argument.equals(object)) return;
521                // fall through ... they are not equal
522            }
523            if (objectName == null) objectName = getObjectName(object);
524            throw new IllegalArgumentException(CommonI18n.argumentMustBeEquals.text(argumentName, objectName));
525        }
526    
527        /**
528         * Asserts that the specified first object is not {@link Object#equals(Object) equal to} the specified second object. This
529         * method does take null references into consideration.
530         * 
531         * @param <T>
532         * @param argument The argument to assert equal to <code>object</code>.
533         * @param argumentName The name that will be used within the exception message for the argument should an exception be thrown
534         * @param object The object to assert as equal to <code>argument</code>.
535         * @param objectName The name that will be used within the exception message for <code>object</code> should an exception be
536         *        thrown; if <code>null</code> and <code>object</code> is not <code>null</code>, <code>object.toString()</code> will
537         *        be used.
538         * @throws IllegalArgumentException If the specified objects are equals.
539         */
540        public static <T> void isNotEquals( final T argument,
541                                            String argumentName,
542                                            final T object,
543                                            String objectName ) {
544            if (argument == null) {
545                if (object != null) return;
546                // fall through ... both are null
547            } else {
548                if (!argument.equals(object)) return; // handles object==null
549                // fall through ... they are equal
550            }
551            if (objectName == null) objectName = getObjectName(object);
552            throw new IllegalArgumentException(CommonI18n.argumentMustNotBeEquals.text(argumentName, objectName));
553        }
554    
555        // ########################## ITERATOR METHODS ###################################
556    
557        /**
558         * Checks that the iterator is not empty, and throws an exception if it is.
559         * 
560         * @param argument the iterator to check
561         * @param name The name of the argument
562         * @throws IllegalArgumentException If iterator is empty (i.e., iterator.hasNext() returns false)
563         */
564        public static void isNotEmpty( Iterator<?> argument,
565                                       String name ) {
566            isNotNull(argument, name);
567            if (!argument.hasNext()) {
568                throw new IllegalArgumentException(CommonI18n.argumentMayNotBeEmpty.text(name));
569            }
570        }
571    
572        // ########################## COLLECTION METHODS ###################################
573    
574        /**
575         * Check that the collection is not empty
576         * 
577         * @param argument Collection
578         * @param name The name of the argument
579         * @throws IllegalArgumentException If collection is null or empty
580         */
581        public static void isNotEmpty( Collection<?> argument,
582                                       String name ) {
583            isNotNull(argument, name);
584            if (argument.isEmpty()) {
585                throw new IllegalArgumentException(CommonI18n.argumentMayNotBeEmpty.text(name));
586            }
587        }
588    
589        /**
590         * Check that the map is not empty
591         * 
592         * @param argument Map
593         * @param name The name of the argument
594         * @throws IllegalArgumentException If map is null or empty
595         */
596        public static void isNotEmpty( Map<?, ?> argument,
597                                       String name ) {
598            isNotNull(argument, name);
599            if (argument.isEmpty()) {
600                throw new IllegalArgumentException(CommonI18n.argumentMayNotBeEmpty.text(name));
601            }
602        }
603    
604        /**
605         * Check that the array is empty
606         * 
607         * @param argument Array
608         * @param name The name of the argument
609         * @throws IllegalArgumentException If array is not empty
610         */
611        public static void isEmpty( Object[] argument,
612                                    String name ) {
613            isNotNull(argument, name);
614            if (argument.length > 0) {
615                throw new IllegalArgumentException(CommonI18n.argumentMustBeEmpty.text(name));
616            }
617        }
618    
619        /**
620         * Check that the array is not empty
621         * 
622         * @param argument Array
623         * @param name The name of the argument
624         * @throws IllegalArgumentException If array is null or empty
625         */
626        public static void isNotEmpty( Object[] argument,
627                                       String name ) {
628            isNotNull(argument, name);
629            if (argument.length == 0) {
630                throw new IllegalArgumentException(CommonI18n.argumentMayNotBeEmpty.text(name));
631            }
632        }
633    
634        protected static String getObjectName( Object obj ) {
635            return obj == null ? null : "'" + obj.toString() + "'";
636        }
637    
638        /**
639         * Check that the collection contains the value
640         * 
641         * @param argument Collection to check
642         * @param value Value to check for, may be null
643         * @param name The name of the argument
644         * @throws IllegalArgumentException If collection is null or doesn't contain value
645         */
646        public static void contains( Collection<?> argument,
647                                     Object value,
648                                     String name ) {
649            isNotNull(argument, name);
650            if (!argument.contains(value)) {
651                throw new IllegalArgumentException(CommonI18n.argumentDidNotContainObject.text(name, getObjectName(value)));
652            }
653        }
654    
655        /**
656         * Check that the map contains the key
657         * 
658         * @param argument Map to check
659         * @param key Key to check for, may be null
660         * @param name The name of the argument
661         * @throws IllegalArgumentException If map is null or doesn't contain key
662         */
663        public static void containsKey( Map<?, ?> argument,
664                                        Object key,
665                                        String name ) {
666            isNotNull(argument, name);
667            if (!argument.containsKey(key)) {
668                throw new IllegalArgumentException(CommonI18n.argumentDidNotContainKey.text(name, getObjectName(key)));
669            }
670        }
671    
672        /**
673         * Check that the collection is not null and contains no nulls
674         * 
675         * @param argument Array
676         * @param name The name of the argument
677         * @throws IllegalArgumentException If array is null or has null values
678         */
679        public static void containsNoNulls( Iterable<?> argument,
680                                            String name ) {
681            isNotNull(argument, name);
682            int i = 0;
683            for (Object object : argument) {
684                if (object == null) {
685                    throw new IllegalArgumentException(CommonI18n.argumentMayNotContainNullValue.text(name, i));
686                }
687                ++i;
688            }
689        }
690    
691        /**
692         * Check that the array is not null and contains no nulls
693         * 
694         * @param argument Array
695         * @param name The name of the argument
696         * @throws IllegalArgumentException If array is null or has null values
697         */
698        public static void containsNoNulls( Object[] argument,
699                                            String name ) {
700            isNotNull(argument, name);
701            int i = 0;
702            for (Object object : argument) {
703                if (object == null) {
704                    throw new IllegalArgumentException(CommonI18n.argumentMayNotContainNullValue.text(name, i));
705                }
706                ++i;
707            }
708        }
709    
710        /**
711         * Check that the collection contains at least the supplied number of elements
712         * 
713         * @param argument Collection
714         * @param minimumSize the minimum size
715         * @param name The name of the argument
716         * @throws IllegalArgumentException If collection has a size smaller than the supplied value
717         */
718        public static void hasSizeOfAtLeast( Collection<?> argument,
719                                             int minimumSize,
720                                             String name ) {
721            isNotNull(argument, name);
722            if (argument.size() < minimumSize) {
723                throw new IllegalArgumentException(CommonI18n.argumentMustBeOfMinimumSize.text(name,
724                                                                                               Collection.class.getSimpleName(),
725                                                                                               argument.size(),
726                                                                                               minimumSize));
727            }
728        }
729    
730        /**
731         * Check that the collection contains no more than the supplied number of elements
732         * 
733         * @param argument Collection
734         * @param maximumSize the maximum size
735         * @param name The name of the argument
736         * @throws IllegalArgumentException If collection has a size smaller than the supplied value
737         */
738        public static void hasSizeOfAtMost( Collection<?> argument,
739                                            int maximumSize,
740                                            String name ) {
741            isNotNull(argument, name);
742            if (argument.size() > maximumSize) {
743                throw new IllegalArgumentException(CommonI18n.argumentMustBeOfMinimumSize.text(name,
744                                                                                               Collection.class.getSimpleName(),
745                                                                                               argument.size(),
746                                                                                               maximumSize));
747            }
748        }
749    
750        /**
751         * Check that the map contains at least the supplied number of entries
752         * 
753         * @param argument the map
754         * @param minimumSize the minimum size
755         * @param name The name of the argument
756         * @throws IllegalArgumentException If the map has a size smaller than the supplied value
757         */
758        public static void hasSizeOfAtLeast( Map<?, ?> argument,
759                                             int minimumSize,
760                                             String name ) {
761            isNotNull(argument, name);
762            if (argument.size() < minimumSize) {
763                throw new IllegalArgumentException(CommonI18n.argumentMustBeOfMinimumSize.text(name,
764                                                                                               Map.class.getSimpleName(),
765                                                                                               argument.size(),
766                                                                                               minimumSize));
767            }
768        }
769    
770        /**
771         * Check that the map contains no more than the supplied number of entries
772         * 
773         * @param argument the map
774         * @param maximumSize the maximum size
775         * @param name The name of the argument
776         * @throws IllegalArgumentException If the map has a size smaller than the supplied value
777         */
778        public static void hasSizeOfAtMost( Map<?, ?> argument,
779                                            int maximumSize,
780                                            String name ) {
781            isNotNull(argument, name);
782            if (argument.size() > maximumSize) {
783                throw new IllegalArgumentException(CommonI18n.argumentMustBeOfMinimumSize.text(name,
784                                                                                               Map.class.getSimpleName(),
785                                                                                               argument.size(),
786                                                                                               maximumSize));
787            }
788        }
789    
790        /**
791         * Check that the array contains at least the supplied number of elements
792         * 
793         * @param argument the array
794         * @param minimumSize the minimum size
795         * @param name The name of the argument
796         * @throws IllegalArgumentException If the array has a size smaller than the supplied value
797         */
798        public static void hasSizeOfAtLeast( Object[] argument,
799                                             int minimumSize,
800                                             String name ) {
801            isNotNull(argument, name);
802            if (argument.length < minimumSize) {
803                throw new IllegalArgumentException(CommonI18n.argumentMustBeOfMinimumSize.text(name,
804                                                                                               Object[].class.getSimpleName(),
805                                                                                               argument.length,
806                                                                                               minimumSize));
807            }
808        }
809    
810        /**
811         * Check that the array contains no more than the supplied number of elements
812         * 
813         * @param argument the array
814         * @param maximumSize the maximum size
815         * @param name The name of the argument
816         * @throws IllegalArgumentException If the array has a size smaller than the supplied value
817         */
818        public static void hasSizeOfAtMost( Object[] argument,
819                                            int maximumSize,
820                                            String name ) {
821            isNotNull(argument, name);
822            if (argument.length > maximumSize) {
823                throw new IllegalArgumentException(CommonI18n.argumentMustBeOfMinimumSize.text(name,
824                                                                                               Object[].class.getSimpleName(),
825                                                                                               argument.length,
826                                                                                               maximumSize));
827            }
828        }
829    
830        private CheckArg() {
831            // prevent construction
832        }
833    }