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.engine.statement;
28
29 import com.rapiddweller.benerator.Generator;
30 import com.rapiddweller.benerator.engine.BeneratorContext;
31 import com.rapiddweller.benerator.wrapper.ProductWrapper;
32 import com.rapiddweller.common.Context;
33 import com.rapiddweller.common.ErrorHandler;
34 import com.rapiddweller.common.IOUtil;
35 import com.rapiddweller.script.Expression;
36 import com.rapiddweller.task.PageListener;
37 import com.rapiddweller.task.TaskExecutor;
38
39 import java.io.Closeable;
40 import java.util.ArrayList;
41 import java.util.List;
42
43
44
45
46
47
48
49 public class GenerateOrIterateStatement extends AbstractStatement implements Closeable, PageListener {
50
51
52
53
54 protected GenerateAndConsumeTask task;
55
56
57
58 protected final Generator<Long> countGenerator;
59
60
61
62 protected final Expression<Long> minCount;
63
64
65
66 protected final Expression<Long> pageSize;
67
68
69
70 protected final Expression<PageListener> pageListenerEx;
71
72
73
74 protected PageListener pageListener;
75
76
77
78 protected final boolean infoLog;
79
80
81
82 protected final boolean isSubCreator;
83
84
85
86 protected final BeneratorContext context;
87
88
89
90 protected final BeneratorContext childContext;
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105 public GenerateOrIterateStatement(String productName, Generator<Long> countGenerator, Expression<Long> minCount,
106 Expression<Long> pageSize, Expression<PageListener> pageListenerEx,
107 Expression<ErrorHandler> errorHandler, boolean infoLog, boolean isSubCreator, BeneratorContext context) {
108 this.task = null;
109 this.countGenerator = countGenerator;
110 this.minCount = minCount;
111 this.pageSize = pageSize;
112 this.pageListenerEx = pageListenerEx;
113 this.infoLog = infoLog;
114 this.isSubCreator = isSubCreator;
115 this.context = context;
116 this.childContext = context.createSubContext(productName);
117 }
118
119
120
121
122
123
124 public void setTask(GenerateAndConsumeTask task) {
125 this.task = task;
126 }
127
128
129
130
131
132
133 public GenerateAndConsumeTask getTask() {
134 return task;
135 }
136
137
138
139
140
141
142 public BeneratorContext getContext() {
143 return context;
144 }
145
146
147
148
149
150
151 public BeneratorContext getChildContext() {
152 return childContext;
153 }
154
155
156
157
158 @Override
159 public boolean execute(BeneratorContext ctx) {
160 if (!beInitialized(ctx)) {
161 task.reset();
162 }
163 executeTask(generateCount(childContext), minCount.evaluate(childContext), pageSize.evaluate(childContext),
164 evaluatePageListeners(childContext), getErrorHandler(childContext));
165 if (!isSubCreator) {
166 close();
167 }
168 return true;
169 }
170
171
172
173
174
175
176
177 public Long generateCount(BeneratorContext context) {
178 beInitialized(context);
179 ProductWrapper<Long> count = countGenerator.generate(new ProductWrapper<>());
180 return (count != null ? count.unwrap() : null);
181 }
182
183 @Override
184 public void close() {
185 task.close();
186 countGenerator.close();
187 if (pageListener instanceof Closeable) {
188 IOUtil.close((Closeable) pageListener);
189 }
190 }
191
192
193
194 @Override
195 public void pageStarting() {
196 }
197
198 @Override
199 public void pageFinished() {
200 getTask().pageFinished();
201 }
202
203
204
205
206
207
208
209
210
211
212 protected List<PageListener> evaluatePageListeners(Context context) {
213 List<PageListener> listeners = new ArrayList<>();
214 if (pageListener != null) {
215 pageListener = pageListenerEx.evaluate(context);
216 if (pageListener != null) {
217 listeners.add(pageListener);
218 }
219 }
220 return listeners;
221 }
222
223
224
225
226
227
228
229 protected boolean beInitialized(BeneratorContext context) {
230 if (!countGenerator.wasInitialized()) {
231 countGenerator.init(childContext);
232 task.init(childContext);
233 return true;
234 }
235 return false;
236 }
237
238
239
240
241
242
243
244
245
246
247 protected void executeTask(Long requestedExecutions, Long minExecutions, Long pageSizeValue,
248 List<PageListener> pageListeners, ErrorHandler errorHandler) {
249 TaskExecutor.execute(task, childContext, requestedExecutions, minExecutions,
250 pageListeners, pageSizeValue, false, errorHandler, infoLog);
251 }
252
253 }