package org.radargun.utils; import java.util.Random; import org.radargun.config.DefinitionElement; import org.radargun.config.Property; /** * Random configuration values. * * @author Radim Vansa <rvansa@redhat.com> */ public interface RandomValue<T> { T nextValue(Random random); class PrimitiveConverter extends ReflexiveConverters.ObjectConverter { public <T> PrimitiveConverter() { super(new Class[] {StringValue.class, IntegerValue.class, DoubleValue.class}); } } class NumberConverter extends ReflexiveConverters.ObjectConverter { public NumberConverter() { super(new Class[] {IntegerValue.class, DoubleValue.class}); } } class StringConverter extends ReflexiveConverters.ObjectConverter { public StringConverter() { super(new Class[] {StringValue.class}); } } @DefinitionElement(name = "string", doc = "Generates string objects") class StringValue implements RandomValue<java.lang.String> { @Property(doc = "Minimum length.", optional = false) int minLenght; @Property(doc = "Maximum length.", optional = false) int maxLenght; @Property(doc = "Prefix string. By default empty.") String prefix; @Property(doc = "Suffix string. By default empty.") String suffix; @Override public String nextValue(Random random) { // TODO: set alphabet String str = RandomHelper.randomString(minLenght, maxLenght, random); if (prefix != null) str = prefix + str; if (suffix != null) str = str + suffix; return str; } } @DefinitionElement(name = "int", doc = "Generates integer numbers") class IntegerValue implements RandomValue<java.lang.Integer> { @Property(doc = "Minimum value, inclusive. Default is -2^31.") long min = Integer.MIN_VALUE; @Property(doc = "Maximum value, inclusive. Default is 2^31 - 1.") long max = Integer.MAX_VALUE; @Override public Integer nextValue(Random random) { long l = random.nextLong(); return max >= min ? (int) ((l < 0 ? ~l : l) % (max - min + 1) + min) : 0; } } @DefinitionElement(name = "double", doc = "Generates floating-point numbers") class DoubleValue implements RandomValue<java.lang.Double> { @Property(doc = "Minimum value, inclusive. Default is 0.") double min = 0; @Property(doc = "Maximum value, exclusive. Default is 1.") double max = 1; @Override public Double nextValue(Random random) { long l = random.nextLong(); return max > min ? random.nextDouble() * (max - min) + min : 0d; } } }