/*
* (c) Copyright 2010 by Volker Bergmann. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, is permitted under the terms of the
* GNU General Public License (GPL).
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* WITHOUT A WARRANTY OF ANY KIND. ALL EXPRESS OR IMPLIED CONDITIONS,
* REPRESENTATIONS AND WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE
* HEREBY EXCLUDED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
package org.databene.benerator.primitive;
import org.databene.benerator.Generator;
import org.databene.benerator.GeneratorContext;
import org.databene.benerator.distribution.Distribution;
import org.databene.benerator.distribution.SequenceManager;
import org.databene.benerator.wrapper.GeneratorProxy;
import org.databene.script.Expression;
import org.databene.script.expression.ExpressionUtil;
/**
* {@link Generator} implementation that generates {@link Long} numbers,
* redefining the underlying distribution on each <code>reset()</code> by
* evaluating the <code>min</code>, <code>max</code>, <code>granularity</code>,
* <code>distribution</code> and <code>unique</code> values.<br/><br/>
* Created: 27.03.2010 19:28:38
* @since 0.6.0
* @author Volker Bergmann
*/
public class DynamicLongGenerator extends GeneratorProxy<Long> {
protected Expression<Long> min;
protected Expression<Long> max;
protected Expression<Long> granularity;
protected Expression<? extends Distribution> distribution;
protected Expression<Boolean> unique;
// constructors ----------------------------------------------------------------------------------------------------
public DynamicLongGenerator() {
this(ExpressionUtil.constant(0L), ExpressionUtil.constant(30L),
ExpressionUtil.constant(1L), ExpressionUtil.constant(SequenceManager.RANDOM_SEQUENCE),
ExpressionUtil.constant(false));
}
public DynamicLongGenerator(Expression<Long> min, Expression<Long> max,
Expression<Long> granularity, Expression<? extends Distribution> distribution,
Expression<Boolean> unique) {
super(Long.class);
this.min = min;
this.max = max;
this.granularity = granularity;
this.distribution = distribution;
}
// Generator interface ---------------------------------------------------------------------------------------------
/** ensures consistency of the state */
@Override
public void init(GeneratorContext context) {
assertNotInitialized();
this.context = context;
resetMembers(min.evaluate(context), max.evaluate(context));
super.init(context);
}
@Override
public void reset() {
assertInitialized();
resetMembers(min.evaluate(context), max.evaluate(context));
super.reset();
}
protected void resetMembers(Long minValue, Long maxValue) {
if (minValue == null)
minValue = 0L;
Long granularityValue = ExpressionUtil.evaluate(granularity, context);
if (granularityValue == null)
granularityValue = 1L;
Distribution dist = distribution.evaluate(context);
Generator<Long> source = dist.createNumberGenerator(Long.class, minValue, maxValue, granularityValue, false);
source.init(context);
setSource(source);
}
}