scolebourne 2003/07/31 16:24:35 Modified: lang/src/java/org/apache/commons/lang RandomStringUtils.java lang/src/test/org/apache/commons/lang RandomStringUtilsTest.java Log: Fix RandomStringUtils to not throw NPE all the time Revision Changes Path 1.20 +37 -32 jakarta-commons/lang/src/java/org/apache/commons/lang/RandomStringUtils.java Index: RandomStringUtils.java =================================================================== RCS file: /home/cvs/jakarta-commons/lang/src/java/org/apache/commons/lang/RandomStringUtils.java,v retrieving revision 1.19 retrieving revision 1.20 diff -u -r1.19 -r1.20 --- RandomStringUtils.java 26 Jul 2003 10:32:17 -0000 1.19 +++ RandomStringUtils.java 31 Jul 2003 23:24:35 -0000 1.20 @@ -190,7 +190,7 @@ * @return the random string */ public static String random(int count, int start, int end, boolean letters, boolean numbers) { - return random(count, start, end, letters, numbers, null); + return random(count, start, end, letters, numbers, null, RANDOM); } /** @@ -207,14 +207,14 @@ * @param end the position in set of chars to end before * @param letters only allow letters? * @param numbers only allow numbers? - * @param set the set of chars to choose randoms from. + * @param chars the set of chars to choose randoms from. * If <code>null</code>, then it will use the set of all chars. * @return the random string * @throws ArrayIndexOutOfBoundsException if there are not * <code>(end - start) + 1</code> characters in the set array. */ - public static String random(int count, int start, int end, boolean letters, boolean numbers, char[] set) { - return random(count,start,end,letters,numbers,set,RANDOM); + public static String random(int count, int start, int end, boolean letters, boolean numbers, char[] chars) { + return random(count, start, end, letters, numbers, chars, RANDOM); } /** @@ -241,7 +241,7 @@ * @param end the position in set of chars to end before * @param letters only allow letters? * @param numbers only allow numbers? - * @param set the set of chars to choose randoms from. + * @param chars the set of chars to choose randoms from. * If <code>null</code>, then it will use the set of all chars. * @param random a source of randomness. * @return the random string @@ -249,16 +249,16 @@ * <code>(end - start) + 1</code> characters in the set array. * @throws IllegalArgumentException if <code>count</code> < 0. */ - public static String random(int count, int start, int end, boolean letters, boolean numbers, char[] set, Random random) { - if( count == 0 ) { + public static String random(int count, int start, int end, boolean letters, boolean numbers, char[] chars, Random random) { + if (count == 0) { return ""; - } else if( count < 0 ) { + } else if (count < 0) { throw new IllegalArgumentException("Requested random string length " + count + " is less than 0."); } - if( (start == 0) && (end == 0) ) { + if ((start == 0) && (end == 0)) { end = 'z' + 1; start = ' '; - if(!letters && !numbers) { + if (!letters && !numbers) { start = 0; end = Integer.MAX_VALUE; } @@ -267,20 +267,18 @@ StringBuffer buffer = new StringBuffer(); int gap = end - start; - while(count-- != 0) { + while (count-- != 0) { char ch; - if(set == null) { - ch = (char)(random.nextInt(gap) + start); + if (chars == null) { + ch = (char) (random.nextInt(gap) + start); } else { - ch = set[random.nextInt(gap) + start]; + ch = chars[random.nextInt(gap) + start]; } - if( (letters && numbers && Character.isLetterOrDigit(ch)) || - (letters && Character.isLetter(ch)) || - (numbers && Character.isDigit(ch)) || - (!letters && !numbers) - ) - { - buffer.append( ch ); + if ((letters && numbers && Character.isLetterOrDigit(ch)) + || (letters && Character.isLetter(ch)) + || (numbers && Character.isDigit(ch)) + || (!letters && !numbers)) { + buffer.append(ch); } else { count++; } @@ -296,13 +294,16 @@ * specified.</p> * * @param count the length of random string to create - * @param set the String containing the set of characters to use, - * must not be <code>null</code> + * @param chars the String containing the set of characters to use, + * may be null * @return the random string - * @throws NullPointerException if the set is <code>null</code> + * @throws IllegalArgumentException if <code>count</code> < 0. */ - public static String random(int count, String set) { - return random(count, set.toCharArray()); + public static String random(int count, String chars) { + if (chars == null) { + return random(count, 0, 0, false, false, null, RANDOM); + } + return random(count, chars.toCharArray()); } /** @@ -312,12 +313,16 @@ * <p>Characters will be chosen from the set of characters specified.</p> * * @param count the length of random string to create - * @param set the character array containing the set of characters to use - * must not be <code>null</code> + * @param chars the character array containing the set of characters to use, + * may be null * @return the random string - * @throws NullPointerException if the set is <code>null</code> + * @throws IllegalArgumentException if <code>count</code> < 0. */ - public static String random(int count, char[] set) { - return random(count, 0, set.length, false, false, set); + public static String random(int count, char[] chars) { + if (chars == null) { + return random(count, 0, 0, false, false, null, RANDOM); + } + return random(count, 0, chars.length, false, false, chars, RANDOM); } + } 1.10 +42 -7 jakarta-commons/lang/src/test/org/apache/commons/lang/RandomStringUtilsTest.java Index: RandomStringUtilsTest.java =================================================================== RCS file: /home/cvs/jakarta-commons/lang/src/test/org/apache/commons/lang/RandomStringUtilsTest.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- RandomStringUtilsTest.java 30 Jul 2003 22:21:39 -0000 1.9 +++ RandomStringUtilsTest.java 31 Jul 2003 23:24:35 -0000 1.10 @@ -157,6 +157,12 @@ r2 = RandomStringUtils.random(50, set); assertTrue("!r1.equals(r2)", !r1.equals(r2)); + r1 = RandomStringUtils.random(50, (String) null); + assertEquals("random(50) length", 50, r1.length()); + r2 = RandomStringUtils.random(50, (String) null); + assertEquals("random(50) length", 50, r2.length()); + assertTrue("!r1.equals(r2)", !r1.equals(r2)); + set = "stuvwxyz"; r1 = RandomStringUtils.random(50, set.toCharArray()); assertEquals("random(50, \"stuvwxyz\")", 50, r1.length()); @@ -165,6 +171,12 @@ } r2 = RandomStringUtils.random(50, set); assertTrue("!r1.equals(r2)", !r1.equals(r2)); + + r1 = RandomStringUtils.random(50, (char[]) null); + assertEquals("random(50) length", 50, r1.length()); + r2 = RandomStringUtils.random(50, (char[]) null); + assertEquals("random(50) length", 50, r2.length()); + assertTrue("!r1.equals(r2)", !r1.equals(r2)); long seed = System.currentTimeMillis(); r1 = RandomStringUtils.random(50,0,0,true,true,null,new Random(seed)); @@ -174,13 +186,36 @@ r1 = RandomStringUtils.random(0); assertEquals("random(0).equals(\"\")", "", r1); - Exception e = null; + } + public void testExceptions() { try { - r1 = RandomStringUtils.random(-1); - } catch (Exception e2) { - e = e2; - } - assertNotNull("random(<0) throws exception", e); + RandomStringUtils.random(-1); + fail(); + } catch (IllegalArgumentException ex) {} + try { + RandomStringUtils.random(-1, true, true); + fail(); + } catch (IllegalArgumentException ex) {} + try { + RandomStringUtils.random(-1, new char[0]); + fail(); + } catch (IllegalArgumentException ex) {} + try { + RandomStringUtils.random(-1, ""); + fail(); + } catch (IllegalArgumentException ex) {} + try { + RandomStringUtils.random(-1, 'a', 'z', false, false); + fail(); + } catch (IllegalArgumentException ex) {} + try { + RandomStringUtils.random(-1, 'a', 'z', false, false, new char[0]); + fail(); + } catch (IllegalArgumentException ex) {} + try { + RandomStringUtils.random(-1, 'a', 'z', false, false, new char[0], new Random()); + fail(); + } catch (IllegalArgumentException ex) {} } /**
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]