package org.magenta.random; import com.google.common.collect.Range; /** * Helper class that generates random {@code strings}. * * @author ngagnon * */ public class RandomString { private static final String LOREM_IPSUM = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras " + "convallis vitae magna ut elementum. Nam lobortis placerat ultrices. Nullam auctor est sit amet " + "nulla commodo, nec posuere sem placerat. Vestibulum interdum lobortis leo, in dictum neque " + "accumsan eu. Aenean quis turpis rhoncus, imperdiet quam ac, adipiscing magna. Cras interdum " + "tempus tortor sit amet volutpat. Aliquam ac diam a sem interdum sollicitudin et quis metus." + " Ut ac lorem ipsum. Donec quam sapien, placerat eget nisi ut, varius imperdiet purus." + " Pellentesque rhoncus tempus odio, vel egestas felis. Praesent pretium suscipit arcu." + " Donec turpis massa, dignissim suscipit diam non, laoreet tempus urna. Phasellus quis interdum" + " tellus. Aliquam dictum nec nisi et vulputate. Vestibulum vitae dui vel sapien hendrerit eleifend." + " Aenean vel libero varius, facilisis nulla eget, euismod eros. Sed ullamcorper, quam a iaculis" + " elementum, dolor turpis aliquam arcu, ac sollicitudin felis felis eget dolor. Vestibulum" + " lobortis vestibulum urna et imperdiet. Class aptent taciti sociosqu ad litora torquent per" + " conubia nostra, per inceptos himenaeos. Nulla nec suscipit ipsum. Phasellus euismod at mauris" + " sed tristique. Nunc pharetra orci at tortor placerat, vitae aliquam erat tristique. Vestibulum" + " hendrerit viverra enim. Vestibulum venenatis fringilla lacus tristique ornare. Interdum et" + " malesuada fames ac ante ipsum primis in faucibus. Vivamus varius purus arcu. Suspendisse vulputate" + " nulla sed egestas ultrices. Fusce pellentesque, elit sed semper fringilla, arcu justo lobortis" + " massa, pellentesque tincidunt neque risus a nulla. Ut posuere mauris at sem imperdiet, eu" + " consectetur justo fringilla. Pellentesque in imperdiet turpis. Curabitur varius egestas turpis" + " id rutrum. Pellentesque tempor lacus lectus, ut accumsan ipsum volutpat a. Nam vulputate" + " tincidunt nisl, a scelerisque augue fringilla vel. Duis tincidunt tellus ac turpis feugiat" + " tempor. Suspendisse lacus risus, dictum sed arcu quis, faucibus hendrerit mauris. Vivamus" + " venenatis tellus at tristique luctus. Phasellus vitae eros vitae sapien ornare porttitor eu" + " in justo. Nulla facilisi. Proin in risus vitae nisi dignissim imperdiet. Morbi eget dui eget" + " leo varius sollicitudin fringilla a urna. Nunc venenatis ultrices purus, a cursus lectus volutpat" + " ac. Nulla tincidunt justo augue, nec posuere lorem mollis sed. Integer euismod, urna a mollis" + " blandit, arcu ipsum rutrum elit, sed suscipit est tellus iaculis quam. Phasellus varius lobortis" + " sem eget eleifend.Mauris mattis lorem sed rhoncus gravida. Integer elementum, justo id hendrerit" + " fermentum, urna arcu aliquet mi, non varius nibh risus in purus. Ut viverra, elit non porta" + " laoreet, erat tortor dignissim tellus, non venenatis erat lorem eu quam. Etiam hendrerit magna" + " augue. Suspendisse iaculis scelerisque augue ut pretium. Fusce nec dignissim sapien. Maecenas" + " lacinia luctus ante tincidunt varius."; private String alphabet; private String letters; private String numbers; private RandomInteger integers; /** * Default constructor. * * @param alphabet the alphabet from which to generate {@code strings}. * @param integers used to select letters from the alphabet. */ public RandomString(String alphabet, RandomInteger integers) { this.alphabet = alphabet; this.letters = extractLetters(alphabet); this.numbers = extractNumbers(alphabet); this.integers = integers; } private String extractNumbers(String alphabet) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < alphabet.length(); i++) { char current = alphabet.charAt(i); if (Character.isDigit(alphabet.charAt(i))) { sb.append(current); } } return sb.toString(); } private String extractLetters(String alphabet) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < alphabet.length(); i++) { char current = alphabet.charAt(i); if (Character.isLetter(alphabet.charAt(i))) { sb.append(current); } } return sb.toString(); } /** * Generate a string. * * @param length * the length of the string to generate * @return a randomly generated string */ public String charabia(int length) { final StringBuilder sb = new StringBuilder(); for (int i = 0; i < length; i++) { sb.append(anyChar(letters)); } return sb.toString(); } private char anyChar(String alphabet) { return alphabet.charAt(integers.anyPositive(alphabet.length())); } /** * Generate a string using the specified {@code example}. The generated string will have the same length as the {@code example} and * will contain letters and numbers at the same place they are found in the {@code example}. * <p> * Some examples: * <ul> * <li>{@code 123-456-7890} will produce strings such as {@code 333-6127-3357, 324-7578-7412, 895-467-1654}</li> * <li>{@code A1A 1A1 } will produce strings such as {@code H2G 5M2, K4F 8Q2, G9X 4X4}</li> * <li>{@code CH4NG3_M3 } will produce strings such as {@code ES8AI8_J1, JQ4JF7_K4}</li> * </ul> * * * @param example the example * @return a generated string */ public String generateFromExample(String example) { StringBuilder sb = new StringBuilder(); boolean escapeMode = false; for (int i = 0; i < example.length(); i++) { char current = example.charAt(i); if (!escapeMode && Character.isLetter(current)) { sb.append(anyChar(letters)); } else if (!escapeMode && Character.isDigit(current)) { sb.append(anyChar(numbers)); } else if (!escapeMode && current == '$') { escapeMode = true; } else { sb.append(current); escapeMode = false; } } return sb.toString(); } /** * Generate randomly a string. * * @param lengthRange * the variable length of the string to generate * @return a randomly generated string */ public String charabia(Range<Integer> lengthRange) { final StringBuilder sb = new StringBuilder(); int length = integers.any(lengthRange); for (int i = 0; i < length; i++) { sb.append(anyChar(letters)); } return sb.toString(); } /** * Generate "lorem ipsum" text for the given length. * * @param length * the length of the text * @return a "lorem ipsum" text */ public String loremipsum(int length) { final StringBuilder sb = new StringBuilder(); for (int i = 0; i < length; i++) { sb.append(LOREM_IPSUM.charAt(i)); } return sb.toString(); } }