001: /*
002: * (c) Copyright 2006 by Volker Bergmann. All rights reserved.
003: *
004: * Redistribution and use in source and binary forms, with or without
005: * modification, is permitted under the terms of the
006: * GNU General Public License.
007: *
008: * For redistributing this software or a derivative work under a license other
009: * than the GPL-compatible Free Software License as defined by the Free
010: * Software Foundation or approved by OSI, you must first obtain a commercial
011: * license to this software product from Volker Bergmann.
012: *
013: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
014: * WITHOUT A WARRANTY OF ANY KIND. ALL EXPRESS OR IMPLIED CONDITIONS,
015: * REPRESENTATIONS AND WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF
016: * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE
017: * HEREBY EXCLUDED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
018: * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
019: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
020: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
021: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
022: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
023: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
024: * POSSIBILITY OF SUCH DAMAGE.
025: */
026:
027: package org.databene.benerator.wrapper;
028:
029: import org.databene.benerator.primitive.number.adapter.IntegerGenerator;
030: import org.databene.benerator.*;
031: import org.databene.commons.ArrayUtil;
032:
033: /**
034: * Assembles the output of a source generator into an array of random length.<br/>
035: * <br/>
036: * Created: 26.08.2006 09:37:55
037: */
038: public class SimpleArrayGenerator<E> extends GeneratorWrapper<E, E[]> {
039:
040: /** The generator that creates the array length */
041: private IntegerGenerator sizeGenerator;
042:
043: private Class<E> componentType;
044: private Class<E[]> generatedType;
045:
046: // constructors ----------------------------------------------------------------------------------------------------
047:
048: public SimpleArrayGenerator() {
049: this (null, null, 0, 30, Sequence.RANDOM);
050: }
051:
052: public SimpleArrayGenerator(Generator<E> source,
053: Class<E> productType, int minLength, int maxLength) {
054: this (source, productType, minLength, maxLength, Sequence.RANDOM);
055: }
056:
057: public SimpleArrayGenerator(Generator<E> source,
058: Class<E> productType, int minLength, int maxLength,
059: Distribution distribution) {
060: super (source);
061: this .componentType = productType;
062: this .sizeGenerator = new IntegerGenerator(minLength, maxLength,
063: 1, distribution);
064: }
065:
066: // configuration properties ----------------------------------------------------------------------------------------
067:
068: /** Returns the minimum array length to generate */
069: public long getMinLength() {
070: return sizeGenerator.getMin();
071: }
072:
073: /** Sets the minimum array length to generate */
074: public void setMinLength(int minLength) {
075: sizeGenerator.setMin(minLength);
076: }
077:
078: /** Returns the maximum array length to generate */
079: public long getMaxLength() {
080: return sizeGenerator.getMin();
081: }
082:
083: /** Sets the maximum array length to generate */
084: public void setMaxLength(int maxLength) {
085: sizeGenerator.setMax(maxLength);
086: }
087:
088: public Distribution getLengthDistribution() {
089: return sizeGenerator.getDistribution();
090: }
091:
092: public void setLengthDistribution(Distribution distribution) {
093: sizeGenerator.setDistribution(distribution);
094: }
095:
096: // generator implementation ----------------------------------------------------------------------------------------
097:
098: public Class<E[]> getGeneratedType() {
099: return generatedType;
100: }
101:
102: public void validate() {
103: if (dirty) {
104: super .validate();
105: sizeGenerator.validate();
106: if (source == null)
107: throw new InvalidGeneratorSetupException("source",
108: " is null");
109: Class<E> cType = (componentType != null ? componentType
110: : source.getGeneratedType());
111: this .generatedType = ArrayUtil.arrayType(cType);
112: dirty = false;
113: }
114: }
115:
116: /** @see org.databene.benerator.Generator#generate() */
117: public E[] generate() {
118: int length = sizeGenerator.generate();
119: E[] array = ArrayUtil.newInstance(componentType, length);
120: for (int i = 0; i < length; i++)
121: array[i] = source.generate();
122: return array;
123: }
124:
125: // implementation --------------------------------------------------------------------------------------------------
126:
127: }
|