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.util;
28
29 import com.rapiddweller.benerator.Generator;
30 import com.rapiddweller.benerator.wrapper.ProductWrapper;
31
32 import java.io.Closeable;
33 import java.util.Iterator;
34
35 /**
36 * Wraps a {@link Generator} with an {@link Iterator} interface.<br/>
37 * <br/>
38 * Created at 21.07.2009 10:09:55
39 *
40 * @param <E> the type parameter
41 * @author Volker Bergmann
42 * @since 0.6.0
43 */
44 public class GeneratorIterator<E> implements Iterator<E>, Closeable {
45
46 private final Generator<E> source;
47 private E next;
48 private final WrapperProvider<E> wrapperProvider = new WrapperProvider<>();
49
50 /**
51 * Instantiates a new Generator iterator.
52 *
53 * @param source the source
54 */
55 public GeneratorIterator(Generator<E> source) {
56 this.source = source;
57 this.next = fetchNext(source);
58 }
59
60 @Override
61 public boolean hasNext() {
62 return next != null;
63 }
64
65 @Override
66 public E next() {
67 E result = next;
68 next = source.generate(wrapperProvider.get()).unwrap();
69 return result;
70 }
71
72 @Override
73 public void remove() {
74 throw new UnsupportedOperationException("removal is not supported by " + getClass());
75 }
76
77 @Override
78 public void close() {
79 source.close();
80 }
81
82 /**
83 * Fetch next e.
84 *
85 * @param source the source
86 * @return the e
87 */
88 protected E fetchNext(Generator<E> source) {
89 ProductWrapper<E> wrapper = source.generate(wrapperProvider.get());
90 return (wrapper != null ? wrapper.unwrap() : null);
91 }
92
93 }