/*
* Copyright (c) 2017 OBiBa. All rights reserved.
*
* This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.obiba.magma.datasource.generated;
import java.util.Random;
import org.obiba.magma.Value;
import org.obiba.magma.Variable;
public class TextValueGenerator extends GeneratedVariableValueSource {
private static final LoremIpsum LOREM_IPSUM = LoremIpsum.getInstance();
public TextValueGenerator(Variable variable) {
super(variable);
}
@Override
protected Value nextValue(Variable variable, GeneratedValueSet valueSet) {
return valueSet.dataGenerator.nextInt(0, 1) == 0
? variable.getValueType().nullValue()
: variable.getValueType().valueOf(
LOREM_IPSUM.paragraphs(valueSet.dataGenerator.nextInt(0, 1), valueSet.dataGenerator.nextInt(0, 1) == 0));
}
/*
* https://github.com/oliverdodd/jlorem/blob/master/src/main/java/net/_01001111/text/LoremIpsum.java
*
* Copyright 2010 Oliver C Dodd http://01001111.net
* Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
*/
@SuppressWarnings("SpellCheckingInspection")
private static class LoremIpsum {
/*
* The Lorem Ipsum Standard Paragraph
*/
private static final String STANDARD =
"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. " +
"Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. " +
"Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. " +
"Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
private static final String[] WORDS = { "a", "ac", "accumsan", "ad", "adipiscing", "aenean", "aliquam", "aliquet",
"amet", "ante", "aptent", "arcu", "at", "auctor", "augue", "bibendum", "blandit", "class", "commodo",
"condimentum", "congue", "consectetur", "consequat", "conubia", "convallis", "cras", "cubilia", "cum",
"curabitur", "curae", "cursus", "dapibus", "diam", "dictum", "dictumst", "dignissim", "dis", "dolor", "donec",
"dui", "duis", "egestas", "eget", "eleifend", "elementum", "elit", "enim", "erat", "eros", "est", "et", "etiam",
"eu", "euismod", "facilisi", "facilisis", "fames", "faucibus", "felis", "fermentum", "feugiat", "fringilla",
"fusce", "gravida", "habitant", "habitasse", "hac", "hendrerit", "himenaeos", "iaculis", "id", "imperdiet",
"in", "inceptos", "integer", "interdum", "ipsum", "justo", "lacinia", "lacus", "laoreet", "lectus", "leo",
"libero", "ligula", "litora", "lobortis", "lorem", "luctus", "maecenas", "magna", "magnis", "malesuada",
"massa", "mattis", "mauris", "metus", "mi", "molestie", "mollis", "montes", "morbi", "mus", "nam", "nascetur",
"natoque", "nec", "neque", "netus", "nibh", "nisi", "nisl", "non", "nostra", "nulla", "nullam", "nunc", "odio",
"orci", "ornare", "parturient", "pellentesque", "penatibus", "per", "pharetra", "phasellus", "placerat",
"platea", "porta", "porttitor", "posuere", "potenti", "praesent", "pretium", "primis", "proin", "pulvinar",
"purus", "quam", "quis", "quisque", "rhoncus", "ridiculus", "risus", "rutrum", "sagittis", "sapien",
"scelerisque", "sed", "sem", "semper", "senectus", "sit", "sociis", "sociosqu", "sodales", "sollicitudin",
"suscipit", "suspendisse", "taciti", "tellus", "tempor", "tempus", "tincidunt", "torquent", "tortor",
"tristique", "turpis", "ullamcorper", "ultrices", "ultricies", "urna", "ut", "varius", "vehicula", "vel",
"velit", "venenatis", "vestibulum", "vitae", "vivamus", "viverra", "volutpat", "vulputate" };
private static final String[] PUNCTUATION = { ".", "?" };
private static final String EOL = System.getProperty("line.separator");
private static final Random RANDOM = new Random();
public static LoremIpsum getInstance() {
return new LoremIpsum();
}
private LoremIpsum() {
}
/**
* Get a RANDOM word
*/
public String randomWord() {
return WORDS[RANDOM.nextInt(WORDS.length - 1)];
}
/**
* Get a RANDOM PUNCTUATION mark
*/
public String randomPunctuation() {
return PUNCTUATION[RANDOM.nextInt(PUNCTUATION.length - 1)];
}
/**
* Get a string of WORDS
*
* @param count - the number of WORDS to fetch
*/
@SuppressWarnings({ "AssignmentToMethodParameter", "PMD.AvoidReassigningParameters" })
public String words(int count) {
StringBuilder s = new StringBuilder();
while(count-- > 0) s.append(randomWord()).append(" ");
return s.toString().trim();
}
/**
* Get a sentence fragment
*/
public String sentenceFragment() {
return words(RANDOM.nextInt(10) + 3);
}
/**
* Get a sentence
*/
public String sentence() {
// first word
String w = randomWord();
StringBuilder s = new StringBuilder(w.substring(0, 1).toUpperCase()).append(w.substring(1)).append(" ");
// commas?
if(RANDOM.nextBoolean()) {
int r = RANDOM.nextInt(3) + 1;
for(int i = 0; i < r; i++)
s.append(sentenceFragment()).append(", ");
}
// last fragment + PUNCTUATION
return s.append(sentenceFragment()).append(randomPunctuation()).toString();
}
/**
* Get multiple sentences
*
* @param count - the number of sentences
*/
@SuppressWarnings({ "AssignmentToMethodParameter", "PMD.AvoidReassigningParameters" })
public String sentences(int count) {
StringBuilder s = new StringBuilder();
while(count-- > 0) s.append(sentence()).append(" ");
return s.toString().trim();
}
/**
* Get a paragraph
*
* @useStandard - get the STANDARD Lorem Ipsum paragraph?
*/
public String paragraph(boolean useStandard) {
return useStandard ? STANDARD : sentences(RANDOM.nextInt(3) + 2);
}
public String paragraph() {
return paragraph(false);
}
/**
* Get multiple paragraphs
*
* @param count - the number of paragraphs
* @useStandard - begin with the STANDARD Lorem Ipsum paragraph?
*/
@SuppressWarnings({ "AssignmentToMethodParameter", "PMD.AvoidReassigningParameters" })
public String paragraphs(int count, boolean useStandard) {
if(count == 0) return null;
StringBuilder s = new StringBuilder();
while(count-- > 0) {
s.append(paragraph(useStandard)).append(EOL).append(EOL);
useStandard = false;
}
return s.toString().trim();
}
public String paragraphs(int count) {
return paragraphs(count, false);
}
}
}