package org.marketcetera.util.misc;
import java.nio.charset.Charset;
import java.util.Random;
/**
* Utilities for random string generation. All random distributions
* are uniform.
*
* @author tlerios@marketcetera.com
* @since 0.6.0
* @version $Id: RandomStrings.java 16154 2012-07-14 16:34:05Z colin $
*/
/* $License$ */
@ClassVersion("$Id: RandomStrings.java 16154 2012-07-14 16:34:05Z colin $")
public final class RandomStrings
{
// CLASS DATA.
/**
* The default maximum length of a randomly generated string whose
* characters are all Unicode code points that can be encoded by
* some charset (supplied or implied); the minimum length is 1.
*/
public static final int DEFAULT_LEN_STR_CHARSET=255;
/**
* The default maximum length of a randomly generated string whose
* characters are all Unicode code points that are deemed valid by
* {@link StringUtils#isValid(int)}; the minimum length is 1.
*/
public static final int DEFAULT_LEN_STR_VALID=255;
/**
* The default maximum length of a randomly generated string whose
* characters are all Unicode code points that are digits; the
* minimum length is 1.
*/
public static final int DEFAULT_LEN_STR_DIGIT=20;
/**
* The default maximum length of a randomly generated string whose
* characters are all Unicode code points that are letters; the
* minimum length is 1.
*/
public static final int DEFAULT_LEN_STR_LETTER=255;
/**
* The default maximum length of a randomly generated string whose
* characters are all Unicode code points that are letters or
* digits; the minimum length is 1.
*/
public static final int DEFAULT_LEN_STR_ALNUM=255;
/**
* The default maximum length of a randomly generated string whose
* characters are all Unicode code points; in addition, the first
* character is always a letter, the second is always a digit, and
* the rest (if any) are either letters or digits; the minimum
* length is 2.
*/
public static final int DEFAULT_LEN_STR_ID=255;
private static Random sGenerator;
// CLASS METHODS.
/**
* Initialization.
*/
static
{
sGenerator=new Random();
resetGeneratorRandom();
}
/**
* Resets the random number generator used by this class to the
* given seed value, which henceforth results in a repeatable,
* deterministic sequence of random code points and strings.
*
* @param seed The seed.
*/
public static void resetGeneratorRandom
(long seed)
{
sGenerator.setSeed(seed);
}
/**
* Resets the random number generator used by this class to a
* random seed value, and returns that value.
*
* @return The seed.
*/
public static long resetGeneratorRandom()
{
long seed=System.nanoTime();
resetGeneratorRandom(seed);
return seed;
}
/**
* Resets the random number generator used by this class to a
* fixed seed value, which henceforth results in a repeatable,
* deterministic sequence of random code points and strings.
*/
public static void resetGeneratorFixed()
{
resetGeneratorRandom(0);
}
/**
* Returns a randomly generated Unicode code point within the
* full range of valid Unicode scalar values.
*
* @return The code point.
*/
public static int genUCP()
{
return sGenerator.nextInt
(Character.MAX_CODE_POINT-Character.MIN_CODE_POINT+1)+
Character.MIN_CODE_POINT;
}
/**
* Returns a randomly generated Unicode code point that meets the
* constraints of the given filter.
*
* @param filter The filter.
*
* @return The code point.
*/
public static int genUCP
(UCPFilter filter)
{
int[] ucps=UCPFilterInfo.getInfo(filter).getUCPs();
return ucps[sGenerator.nextInt(ucps.length)];
}
/**
* Returns a randomly generated Unicode code point that can be
* encoded by the given charset.
*
* @param cs The charset.
*
* @return The code point.
*/
public static int genUCPCharset
(Charset cs)
{
return genUCP(UCPFilter.forCharset(cs));
}
/**
* Returns a randomly generated Unicode code point that can be
* encoded by the default JVM charset.
*
* @return The code point.
*/
public static int genUCPDefCharset()
{
return genUCP(UCPFilter.getDefaultCharset());
}
/**
* Returns a randomly generated Unicode code point that can be
* encoded by the current system file encoding/charset (as
* specified in the system property <code>file.encoding</code>).
*
* @return The code point.
*/
public static int genUCPFileSystem()
{
return genUCP(UCPFilter.getFileSystemCharset());
}
/**
* Returns a randomly generated Unicode code point that is deemed
* valid by {@link StringUtils#isValid(int)}.
*
* @return The code point.
*/
public static int genUCPValid()
{
return genUCP(UCPFilter.VALID);
}
/**
* Returns a randomly generated Unicode code point that is
* a digit.
*
* @return The code point.
*/
public static int genUCPDigit()
{
return genUCP(UCPFilter.DIGIT);
}
/**
* Returns a randomly generated Unicode code point that is
* a letter.
*
* @return The code point.
*/
public static int genUCPLetter()
{
return genUCP(UCPFilter.LETTER);
}
/**
* Returns a randomly generated Unicode code point that is
* either a letter or a digit.
*
* @return The code point.
*/
public static int genUCPAlNum()
{
return genUCP(UCPFilter.ALNUM);
}
/**
* Returns a generated string of the given length whose characters
* are all Unicode code points that meet the constraints of the
* given filter.
*
* @param filter The filter.
* @param len The length (in code points).
*
* @return The string.
*/
public static String genStr
(UCPFilter filter,
int len)
{
int[] ucps=UCPFilterInfo.getInfo(filter).getUCPs();
StringBuilder builder=new StringBuilder();
for (int i=0;i<len;i++) {
builder.appendCodePoint(ucps[sGenerator.nextInt(ucps.length)]);
}
return builder.toString();
}
/**
* Returns a randomly generated string of the given length whose
* characters are all Unicode code points that can be encoded by
* the given charset.
*
* @param cs The charset.
* @param len The length (in code points).
*
* @return The string.
*/
public static String genStrCharset
(Charset cs,
int len)
{
return genStr(UCPFilter.forCharset(cs),len);
}
/**
* Returns a randomly generated string of the given length whose
* characters are all Unicode code points that can be encoded by
* the default JVM charset.
*
* @param len The length (in code points).
*
* @return The string.
*/
public static String genStrDefCharset
(int len)
{
return genStr(UCPFilter.getDefaultCharset(),len);
}
/**
* Returns a randomly generated string of the given length whose
* characters are all Unicode code points that can be encoded by
* the current system file encoding/charset (as specified in the
* system property <code>file.encoding</code>).
*
* @param len The length (in code points).
*
* @return The string.
*/
public static String genStrFileSystem
(int len)
{
return genStr(UCPFilter.getFileSystemCharset(),len);
}
/**
* Returns a randomly generated string of the given length whose
* characters are all Unicode code points that are deemed valid by
* {@link StringUtils#isValid(int)}.
*
* @param len The length (in code points).
*
* @return The string.
*/
public static String genStrValid
(int len)
{
return genStr(UCPFilter.VALID,len);
}
/**
* Returns a randomly generated string of the given length whose
* characters are all Unicode code points that are digits.
*
* @param len The length (in code points).
*
* @return The string.
*/
public static String genStrDigit
(int len)
{
return genStr(UCPFilter.DIGIT,len);
}
/**
* Returns a randomly generated string of the given length whose
* characters are all Unicode code points that are letters.
*
* @param len The length (in code points).
*
* @return The string.
*/
public static String genStrLetter
(int len)
{
return genStr(UCPFilter.LETTER,len);
}
/**
* Returns a randomly generated string of the given length whose
* characters are all Unicode code points that are letters or
* digits.
*
* @param len The length (in code points).
*
* @return The string.
*/
public static String genStrAlNum
(int len)
{
return genStr(UCPFilter.ALNUM,len);
}
/**
* Returns a randomly generated string of the given length whose
* characters are all Unicode code points; in addition, the first
* character (if any) is always a letter, the second (if any) is
* always a digit, and the rest (if any) are either letters or
* digits.
*
* @param len The length (in code points).
*
* @return The string.
*/
public static String genStrId
(int len)
{
if (len<=0) {
return org.apache.commons.lang.StringUtils.EMPTY;
}
StringBuilder builder=new StringBuilder();
builder.appendCodePoint(genUCPLetter());
if (len==1) {
return builder.toString();
}
builder.appendCodePoint(genUCPDigit());
if (len==2) {
return builder.toString();
}
builder.append(genStrAlNum(len-2));
return builder.toString();
}
/**
* Returns a randomly generated string of random length (bound by
* {@link #DEFAULT_LEN_STR_CHARSET}) whose characters are all
* Unicode code points that can be encoded by the given charset.
*
* @param cs The charset.
*
* @return The string.
*/
public static String genStrCharset
(Charset cs)
{
return genStrCharset(cs,sGenerator.nextInt(DEFAULT_LEN_STR_CHARSET)+1);
}
/**
* Returns a randomly generated string of random length (bound by
* {@link #DEFAULT_LEN_STR_CHARSET}) whose characters are all
* Unicode code points that can be encoded by the default JVM
* charset.
*
* @return The string.
*/
public static String genStrDefCharset()
{
return genStrDefCharset(sGenerator.nextInt(DEFAULT_LEN_STR_CHARSET)+1);
}
/**
* Returns a randomly generated string of random length (bound by
* {@link #DEFAULT_LEN_STR_CHARSET}) whose characters are all
* Unicode code points that can be encoded by the current system
* file encoding/charset (as specified in the system property
* <code>file.encoding</code>).
*
* @return The string.
*/
public static String genStrFileSystem()
{
return genStrFileSystem(sGenerator.nextInt(DEFAULT_LEN_STR_CHARSET)+1);
}
/**
* Returns a randomly generated string of random length (bound by
* {@link #DEFAULT_LEN_STR_VALID}) whose characters are all
* Unicode code points that are deemed valid by {@link
* StringUtils#isValid(int)}.
*
* @return The string.
*/
public static String genStrValid()
{
return genStrValid(sGenerator.nextInt(DEFAULT_LEN_STR_VALID)+1);
}
/**
* Returns a randomly generated string of random length (bound by
* {@link #DEFAULT_LEN_STR_DIGIT}) whose characters are all
* Unicode code points that are digits.
*
* @return The string.
*/
public static String genStrDigit()
{
return genStrDigit(sGenerator.nextInt(DEFAULT_LEN_STR_DIGIT)+1);
}
/**
* Returns a randomly generated string of random length (bound by
* {@link #DEFAULT_LEN_STR_LETTER}) whose characters are all
* Unicode code points that are letters.
*
* @return The string.
*/
public static String genStrLetter()
{
return genStrLetter(sGenerator.nextInt(DEFAULT_LEN_STR_LETTER)+1);
}
/**
* Returns a randomly generated string of random length (bound by
* {@link #DEFAULT_LEN_STR_ALNUM}) whose characters are all
* Unicode code points that are letters or digits.
*
* @return The string.
*/
public static String genStrAlNum()
{
return genStrAlNum(sGenerator.nextInt(DEFAULT_LEN_STR_ALNUM)+1);
}
/**
* Returns a randomly generated string of random length (bound by
* {@link #DEFAULT_LEN_STR_ID}) whose characters are all Unicode
* code points; in addition, the first character is always a
* letter, the second is always a digit, and the rest (if any) are
* either letters or digits.
*
* @return The string.
*/
public static String genStrId()
{
return genStrId(sGenerator.nextInt(DEFAULT_LEN_STR_ID-1)+2);
}
// CONSTRUCTOR.
/**
* Constructor. It is private so that no instances can be created.
*/
private RandomStrings() {}
}