1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package com.rapiddweller.benerator.wrapper;
28
29 import com.rapiddweller.benerator.GeneratorContext;
30 import com.rapiddweller.benerator.IllegalGeneratorStateException;
31 import com.rapiddweller.benerator.InvalidGeneratorSetupException;
32 import com.rapiddweller.benerator.util.AbstractGenerator;
33 import com.rapiddweller.common.IOUtil;
34 import com.rapiddweller.common.TypedIterable;
35
36 import java.io.Closeable;
37 import java.util.Iterator;
38
39
40
41
42
43
44
45
46
47 public class IteratingGenerator<E> extends AbstractGenerator<E> {
48
49 private TypedIterable<E> iterable;
50 private Iterator<E> iterator;
51
52
53
54
55
56
57 public IteratingGenerator() {
58 this(null);
59 }
60
61
62
63
64
65
66 public IteratingGenerator(TypedIterable<E> iterable) {
67 this.iterable = iterable;
68 this.iterator = null;
69 }
70
71
72
73
74
75
76
77
78 public TypedIterable<E> getIterable() {
79 return iterable;
80 }
81
82
83
84
85
86
87 public void setIterable(TypedIterable<E> iterable) {
88 if (this.iterable != null) {
89 throw new IllegalGeneratorStateException("Mutating an initialized generator");
90 }
91 this.iterable = iterable;
92 }
93
94
95
96 @Override
97 public boolean isParallelizable() {
98 return false;
99 }
100
101 @Override
102 public boolean isThreadSafe() {
103 return false;
104 }
105
106 @Override
107 public void init(GeneratorContext context) {
108 if (iterable == null) {
109 throw new InvalidGeneratorSetupException("iterable", "is null");
110 }
111 super.init(context);
112 }
113
114 @Override
115 public Class<E> getGeneratedType() {
116 return iterable.getType();
117 }
118
119 @Override
120 public ProductWrapper<E> generate(ProductWrapper<E> wrapper) {
121 try {
122 assertInitialized();
123 if (iterator != null && !iterator.hasNext()) {
124 return null;
125 }
126 if (iterator == null) {
127
128 createIterator();
129 }
130 if (!iterator.hasNext()) {
131 closeIterator();
132 return null;
133 }
134 E result = iterator.next();
135 if (!iterator.hasNext()) {
136 closeIterator();
137 }
138 return wrapper.wrap(result);
139 } catch (Exception e) {
140 throw new IllegalGeneratorStateException("Generation failed: ", e);
141 }
142 }
143
144 @Override
145 public void reset() {
146 closeIterator();
147 super.reset();
148 createIterator();
149 }
150
151 @Override
152 public void close() {
153 closeIterator();
154 super.close();
155 if (iterable instanceof Closeable) {
156 IOUtil.close((Closeable) iterable);
157 }
158 }
159
160
161
162 private void createIterator() {
163 iterator = iterable.iterator();
164 }
165
166 private void closeIterator() {
167 if (iterator != null) {
168 if (iterator instanceof Closeable) {
169 IOUtil.close((Closeable) iterator);
170 }
171 }
172 }
173
174
175
176 @Override
177 public String toString() {
178 return getClass().getSimpleName() + "[" + iterable + ']';
179 }
180
181 }