1 /*
2 * (c) Copyright 2006-2020 by rapiddweller GmbH & Volker Bergmann. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, is permitted under the terms of the
6 * GNU General Public License.
7 *
8 * For redistributing this software or a derivative work under a license other
9 * than the GPL-compatible Free Software License as defined by the Free
10 * Software Foundation or approved by OSI, you must first obtain a commercial
11 * license to this software product from rapiddweller GmbH & Volker Bergmann.
12 *
13 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
14 * WITHOUT A WARRANTY OF ANY KIND. ALL EXPRESS OR IMPLIED CONDITIONS,
15 * REPRESENTATIONS AND WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF
16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE
17 * HEREBY EXCLUDED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
18 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24 * POSSIBILITY OF SUCH DAMAGE.
25 */
26
27 package com.rapiddweller.benerator.distribution.sequence;
28
29 import com.rapiddweller.benerator.Generator;
30 import com.rapiddweller.benerator.util.ThreadSafeGenerator;
31 import com.rapiddweller.benerator.wrapper.ProductWrapper;
32
33 import java.util.concurrent.atomic.AtomicInteger;
34
35 /**
36 * {@link Generator} class for use by the {@link LiteralSequence}.<br/><br/>
37 * Created: 03.06.2010 08:48:44
38 *
39 * @param <E> the type parameter
40 * @author Volker Bergmann
41 * @since 0.6.3
42 */
43 public class PredefinedSequenceGenerator<E extends Number> extends ThreadSafeGenerator<E> { // compare with SequenceGenerator
44
45 private final Class<E> numberType;
46 private final E[] numbers;
47 private final AtomicInteger cursor;
48
49 /**
50 * Instantiates a new Predefined sequence generator.
51 *
52 * @param numbers the numbers
53 */
54 @SuppressWarnings("unchecked")
55 public PredefinedSequenceGenerator(E... numbers) {
56 this.numbers = numbers;
57 this.numberType = (numbers.length > 0 ? (Class<E>) numbers[0].getClass() : (Class<E>) Number.class);
58 this.cursor = new AtomicInteger(0);
59 }
60
61 @Override
62 public Class<E> getGeneratedType() {
63 return numberType;
64 }
65
66 @Override
67 public ProductWrapper<E> generate(ProductWrapper<E> wrapper) {
68 int i = cursor.getAndIncrement();
69 if (i >= numbers.length) {
70 return null;
71 } else {
72 return wrapper.wrap(numbers[i]);
73 }
74 }
75
76 @Override
77 public void reset() {
78 this.cursor.set(0);
79 super.reset();
80 }
81
82 }