Repository: commons-text Updated Branches: refs/heads/master 6468b2313 -> ba4e4932f
TEXT-51: remove RandomStringGenerator for 1.0 release add again in 1.1 Project: http://git-wip-us.apache.org/repos/asf/commons-text/repo Commit: http://git-wip-us.apache.org/repos/asf/commons-text/commit/ba4e4932 Tree: http://git-wip-us.apache.org/repos/asf/commons-text/tree/ba4e4932 Diff: http://git-wip-us.apache.org/repos/asf/commons-text/diff/ba4e4932 Branch: refs/heads/master Commit: ba4e4932f0d864a15c94d32fb8c341e230d928df Parents: 6468b23 Author: Rob Tompkins <chtom...@gmail.com> Authored: Mon Jan 2 09:43:04 2017 -0500 Committer: Rob Tompkins <chtom...@gmail.com> Committed: Mon Jan 2 09:43:04 2017 -0500 ---------------------------------------------------------------------- src/changes/changes.xml | 1 + .../commons/text/RandomStringGenerator.java | 316 ------------------- .../commons/text/CharacterPredicatesTest.java | 50 --- .../commons/text/RandomStringGeneratorTest.java | 212 ------------- 4 files changed, 1 insertion(+), 578 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-text/blob/ba4e4932/src/changes/changes.xml ---------------------------------------------------------------------- diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 0c1ea01..b7b473b 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -22,6 +22,7 @@ <body> <release version="1.0" date="tba" description="tba"> + <action issue="TEXT-51" type="remove" dev="chtompki">Remove RandomStringGenerator to be added back in the 1.1 release</action> <action issue="TEXT-50" type="update" dev="chtompki">Upgrade from commons-parent version 41 to version 42</action> <action issue="TEXT-40" type="add" dev="chtompki" due-to="Sampanna Kahu">Escape HTML characters only once</action> <action issue="TEXT-37" type="fix" dev="djones">Global vs local source of randomness</action> http://git-wip-us.apache.org/repos/asf/commons-text/blob/ba4e4932/src/main/java/org/apache/commons/text/RandomStringGenerator.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/text/RandomStringGenerator.java b/src/main/java/org/apache/commons/text/RandomStringGenerator.java deleted file mode 100644 index c4411a2..0000000 --- a/src/main/java/org/apache/commons/text/RandomStringGenerator.java +++ /dev/null @@ -1,316 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.text; - -import java.util.HashSet; -import java.util.Random; -import java.util.Set; -import java.util.concurrent.ThreadLocalRandom; - -/** - * <p> - * Generates random Unicode strings containing the specified number of code points. - * Instances are created using a builder class, which allows the - * callers to define the properties of the generator. See the documentation for the - * {@link Builder} class to see available properties. - * </p> - * - * <pre> - * // Generates a 20 code point string, using only the letters a-z - * RandomStringGenerator generator = new RandomStringGenerator.Builder().withinRange('a', 'z').build(); - * String random = generator.generate(20); - * </pre> - * - * <p> - * {@code RandomStringBuilder} instances are immutable and thread-safe. - * </p> - * - * @since 1.0 - */ -public final class RandomStringGenerator { - - private final int minimumCodePoint; - private final int maximumCodePoint; - private final Set<CharacterPredicate> inclusivePredicates; - private final Random random; - - - /** - * Constructs the generator. - * - * @param minimumCodePoint - * smallest allowed code point (inclusive) - * @param maximumCodePoint - * largest allowed code point (inclusive) - * @param inclusivePredicates - * filters for code points - * @param random - * source of randomness - */ - private RandomStringGenerator(int minimumCodePoint, int maximumCodePoint, - Set<CharacterPredicate> inclusivePredicates, Random random) { - this.minimumCodePoint = minimumCodePoint; - this.maximumCodePoint = maximumCodePoint; - this.inclusivePredicates = inclusivePredicates; - this.random = random; - } - - /** - * Generates a random number within a range, using a - * {@link ThreadLocalRandom} instance or the user-supplied source of - * randomness. - * - * @param minInclusive - * the minimum value allowed - * @param maxInclusive - * the maximum value allowed - * @return the random number. - */ - private int generateRandomNumber(final int minInclusive, final int maxInclusive) { - if (random != null) { - return random.nextInt(maxInclusive - minInclusive + 1) + minInclusive; - } - - return ThreadLocalRandom.current().nextInt(minInclusive, maxInclusive + 1); - } - - - /** - * <p> - * Generates a random string, containing the specified number of code points. - * </p> - * <p>Code points are randomly selected between the minimum and maximum values defined - * in the generator. - * Surrogate and private use characters are not returned, although the - * resulting string may contain pairs of surrogates that together encode a - * supplementary character. - * </p> - * <p> - * Note: the number of {@code char} code units generated will exceed - * {@code length} if the string contains supplementary characters. See the - * {@link Character} documentation to understand how Java stores Unicode - * values. - * </p> - * - * @param length - * the number of code points to generate - * @return the generated string - * @throws IllegalArgumentException - * if {@code length < 0} - * @since 1.0 - */ - public String generate(final int length) { - if (length == 0) { - return ""; - } - - if (length < 0) { - throw new IllegalArgumentException(String.format("Length %d is smaller than zero.", length)); - } - - final StringBuilder builder = new StringBuilder(length); - long remaining = length; - - do { - int codePoint = generateRandomNumber(minimumCodePoint, maximumCodePoint); - - switch (Character.getType(codePoint)) { - case Character.UNASSIGNED: - case Character.PRIVATE_USE: - case Character.SURROGATE: - continue; - } - - if (inclusivePredicates != null) { - boolean matchedFilter = false; - for (CharacterPredicate predicate : inclusivePredicates) { - if (predicate.test(codePoint)) { - matchedFilter = true; - break; - } - } - if (!matchedFilter) { - continue; - } - } - - builder.appendCodePoint(codePoint); - remaining--; - - } while (remaining != 0); - - return builder.toString(); - } - - - /** - * <p>A builder for generating {@code RandomStringGenerator} instances.</p> - * <p>The behaviour of a generator is controlled by properties set by this - * builder. Each property has a default value, which can be overridden by - * calling the methods defined in this class, prior to calling {@link #build()}.</p> - * - * <p>All the property setting methods return the {@code Builder} instance to allow for method chaining.</p> - * - * <p>The minimum and maximum code point values are defined using {@link #withinRange(int, int)}. The - * default values are {@code 0} and {@link Character#MAX_CODE_POINT} respectively.</p> - * - * <p>The source of randomness can be set using {@link #usingRandom(Random)}, otherwise {@link ThreadLocalRandom} - * is used.</p> - * - * <p>The type of code points returned can be filtered using {@link #filteredBy(CharacterPredicate...)}, - * which defines a collection of - * tests that are applied to the randomly generated code points. The code points - * will only be included in the result if they pass at least one of the tests. - * Some commonly used predicates are provided by the {@link CharacterPredicates} enum.</p> - * - * <p>This class is not thread safe.</p> - * @since 1.0 - */ - public static class Builder implements org.apache.commons.text.Builder<RandomStringGenerator> { - - /** - * The default maximum code point allowed: {@link Character#MAX_CODE_POINT} - * ({@value}) - * - * @since 1.0 - */ - public static final int DEFAULT_MAXIMUM_CODE_POINT = Character.MAX_CODE_POINT; - - /** - * The default string length produced by this builder: {@value} - * - * @since 1.0 - */ - public static final int DEFAULT_LENGTH = 0; - - /** - * The default minimum code point allowed: {@value} - * - * @since 1.0 - */ - public static final int DEFAULT_MINIMUM_CODE_POINT = 0; - - private int minimumCodePoint = DEFAULT_MINIMUM_CODE_POINT; - private int maximumCodePoint = DEFAULT_MAXIMUM_CODE_POINT; - private Set<CharacterPredicate> inclusivePredicates; - private Random random; - - - /** - * <p> - * Specifies the minimum and maximum code points allowed in the generated - * string. - * </p> - * - * @param minimumCodePoint - * the smallest code point allowed (inclusive) - * @param maximumCodePoint - * the largest code point allowed (inclusive) - * @return {@code this}, to allow method chaining - * @throws IllegalArgumentException - * if {@code maximumCodePoint >} - * {@link Character#MAX_CODE_POINT} - * @throws IllegalArgumentException - * if {@code minimumCodePoint < 0} - * @throws IllegalArgumentException - * if {@code minimumCodePoint > maximumCodePoint} - * @since 1.0 - */ - public Builder withinRange(final int minimumCodePoint, final int maximumCodePoint) { - if (minimumCodePoint > maximumCodePoint) { - throw new IllegalArgumentException(String.format( - "Minimum code point %d is larger than maximum code point %d", minimumCodePoint, maximumCodePoint)); - } - if (minimumCodePoint < 0) { - throw new IllegalArgumentException(String.format("Minimum code point %d is negative", minimumCodePoint)); - } - if (maximumCodePoint > Character.MAX_CODE_POINT) { - throw new IllegalArgumentException( - String.format("Value %d is larger than Character.MAX_CODE_POINT.", maximumCodePoint)); - } - - this.minimumCodePoint = minimumCodePoint; - this.maximumCodePoint = maximumCodePoint; - return this; - } - - /** - * <p> - * Limits the characters in the generated string to those that match at - * least one of the predicates supplied. - * </p> - * - * <p> - * Passing {@code null} or an empty array to this method will revert to the - * default behaviour of allowing any character. Multiple calls to this - * method will replace the previously stored predicates. - * </p> - * - * @param predicates - * the predicates, may be {@code null} or empty - * @return {@code this}, to allow method chaining - * @since 1.0 - */ - public Builder filteredBy(final CharacterPredicate... predicates) { - if (predicates == null || predicates.length == 0) { - inclusivePredicates = null; - return this; - } - - if (inclusivePredicates == null) { - inclusivePredicates = new HashSet<>(); - } else { - inclusivePredicates.clear(); - } - - for (CharacterPredicate predicate : predicates) { - inclusivePredicates.add(predicate); - } - - return this; - } - - /** - * <p> - * Overrides the default source of randomness. - * </p> - * - * <p> - * Passing {@code null} to this method will revert to the default source of - * randomness. - * </p> - * - * @param random - * the source of randomness, may be {@code null} - * @return {@code this}, to allow method chaining - * @since 1.0 - */ - public Builder usingRandom(final Random random) { - this.random = random; - return this; - } - - /** - * <p>Builds the {@code RandomStringGenerator} using the properties specified.</p> - */ - @Override - public RandomStringGenerator build() { - return new RandomStringGenerator(minimumCodePoint, maximumCodePoint, inclusivePredicates, random); - } - - } -} http://git-wip-us.apache.org/repos/asf/commons-text/blob/ba4e4932/src/test/java/org/apache/commons/text/CharacterPredicatesTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/text/CharacterPredicatesTest.java b/src/test/java/org/apache/commons/text/CharacterPredicatesTest.java deleted file mode 100644 index 3ff8b74..0000000 --- a/src/test/java/org/apache/commons/text/CharacterPredicatesTest.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.text; - -import static org.junit.Assert.assertTrue; - -import org.junit.Test; - -/** - * Tests for implementations in the {@link CharacterPredicates} enum. - */ -public class CharacterPredicatesTest { - @Test - public void testDigitPredicate() throws Exception { - String str = new RandomStringGenerator.Builder().filteredBy(CharacterPredicates.DIGITS).build().generate(5000); - - int i = 0; - do { - int codePoint = str.codePointAt(i); - assertTrue(Character.isDigit(codePoint)); - i += Character.charCount(codePoint); - } while (i < str.length()); - } - - @Test - public void testLetterPredicate() throws Exception { - String str = new RandomStringGenerator.Builder().filteredBy(CharacterPredicates.LETTERS).build().generate(5000); - - int i = 0; - do { - int codePoint = str.codePointAt(i); - assertTrue(Character.isLetter(codePoint)); - i += Character.charCount(codePoint); - } while (i < str.length()); - } -} http://git-wip-us.apache.org/repos/asf/commons-text/blob/ba4e4932/src/test/java/org/apache/commons/text/RandomStringGeneratorTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/text/RandomStringGeneratorTest.java b/src/test/java/org/apache/commons/text/RandomStringGeneratorTest.java deleted file mode 100644 index 36ce5e0..0000000 --- a/src/test/java/org/apache/commons/text/RandomStringGeneratorTest.java +++ /dev/null @@ -1,212 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.text; - -import static org.junit.Assert.*; - -import java.util.Random; - -import org.junit.Test; - -/** - * Tests for {@link RandomStringGenerator} - */ -public class RandomStringGeneratorTest { - - private static int codePointLength(String s) { - return s.codePointCount(0, s.length()); - } - - private static final CharacterPredicate A_FILTER = new CharacterPredicate() { - @Override - public boolean test(int codePoint) { - return codePoint == 'a'; - } - }; - - private static final CharacterPredicate B_FILTER = new CharacterPredicate() { - @Override - public boolean test(int codePoint) { - return codePoint == 'b'; - } - }; - - @Test(expected = IllegalArgumentException.class) - public void testInvalidLength() throws Exception { - RandomStringGenerator generator = new RandomStringGenerator.Builder().build(); - generator.generate(-1); - } - - @Test - public void testSetLength() throws Exception { - final int length = 99; - RandomStringGenerator generator = new RandomStringGenerator.Builder().build(); - String str = generator.generate(length); - assertEquals(length, codePointLength(str)); - } - - @Test(expected = IllegalArgumentException.class) - public void testBadMinimumCodePoint() throws Exception { - new RandomStringGenerator.Builder().withinRange(-1, 1); - } - - @Test(expected = IllegalArgumentException.class) - public void testBadMaximumCodePoint() throws Exception { - new RandomStringGenerator.Builder().withinRange(0, Character.MAX_CODE_POINT + 1); - } - - @Test - public void testWithinRange() throws Exception { - final int length = 5000; - final int minimumCodePoint = 'a'; - final int maximumCodePoint = 'z'; - RandomStringGenerator generator = new RandomStringGenerator.Builder().withinRange(minimumCodePoint,maximumCodePoint).build(); - String str = generator.generate(length); - - int i = 0; - do { - int codePoint = str.codePointAt(i); - assertTrue(codePoint >= minimumCodePoint && codePoint <= maximumCodePoint); - i += Character.charCount(codePoint); - } while (i < str.length()); - - } - - @Test - public void testNoLoneSurrogates() throws Exception { - final int length = 5000; - String str = new RandomStringGenerator.Builder().build().generate(length); - - char lastChar = str.charAt(0); - for (int i = 1; i < str.length(); i++) { - char c = str.charAt(i); - - if (Character.isLowSurrogate(c)) { - assertTrue(Character.isHighSurrogate(lastChar)); - } - - if (Character.isHighSurrogate(lastChar)) { - assertTrue(Character.isLowSurrogate(c)); - } - - if (Character.isHighSurrogate(c)) { - // test this isn't the last character in the string - assertTrue(i + 1 < str.length()); - } - - lastChar = c; - } - } - - @Test - public void testUsingRandom() throws Exception { - final char testChar = 'a'; - final Random testRandom = new Random() { - private static final long serialVersionUID = 1L; - - @Override - public int nextInt(int n) { - return testChar; - } - }; - - String str = new RandomStringGenerator.Builder().usingRandom(testRandom).build().generate(10); - for (char c : str.toCharArray()) { - assertEquals(testChar, c); - } - } - - @Test - public void testMultipleFilters() throws Exception { - String str = new RandomStringGenerator.Builder().withinRange('a','d') - .filteredBy(A_FILTER, B_FILTER).build().generate(5000); - - boolean aFound = false; - boolean bFound = false; - - for (char c : str.toCharArray()) { - if (c == 'a') { - aFound = true; - } else if (c == 'b') { - bFound = true; - } else { - fail("Invalid character"); - } - } - - assertTrue(aFound && bFound); - } - - @Test - public void testNoPrivateCharacters() throws Exception { - final int startOfPrivateBMPChars = 0xE000; - - // Request a string in an area of the Basic Multilingual Plane that is - // largely - // occupied by private characters - String str = new RandomStringGenerator.Builder().withinRange(startOfPrivateBMPChars, - Character.MIN_SUPPLEMENTARY_CODE_POINT - 1).build().generate(5000); - - int i = 0; - do { - int codePoint = str.codePointAt(i); - assertFalse(Character.getType(codePoint) == Character.PRIVATE_USE); - i += Character.charCount(codePoint); - } while (i < str.length()); - } - - @Test(expected = IllegalArgumentException.class) - public void testBadMinAndMax() throws Exception { - new RandomStringGenerator.Builder().withinRange(2, 1); - } - - @Test - public void testRemoveFilters() throws Exception { - - RandomStringGenerator.Builder builder = new RandomStringGenerator.Builder().withinRange('a', 'z') - .filteredBy(A_FILTER); - - builder.filteredBy(); - - String str = builder.build().generate(100); - for (char c : str.toCharArray()) { - if (c != 'a') { - // filter was successfully removed - return; - } - } - - fail("Filter appears to have remained in place"); - } - - @Test - public void testChangeOfFilter() throws Exception { - RandomStringGenerator.Builder builder = new RandomStringGenerator.Builder().withinRange('a', 'z') - .filteredBy(A_FILTER); - String str = builder.filteredBy(B_FILTER).build().generate(100); - - for (char c : str.toCharArray()) { - assertTrue(c == 'b'); - } - } - - @Test - public void testZeroLength() throws Exception { - RandomStringGenerator generator = new RandomStringGenerator.Builder().build(); - assertEquals("", generator.generate(0)); - } -}