5
5
import stroom .test .common .data .DataWriter ;
6
6
import stroom .test .common .data .FlatDataWriterBuilder ;
7
7
import stroom .test .common .data .XmlAttributesDataWriterBuilder ;
8
+ import stroom .util .concurrent .ThreadUtil ;
8
9
import stroom .util .io .FileUtil ;
10
+ import stroom .util .logging .DurationTimer ;
9
11
import stroom .util .logging .LogUtil ;
10
12
11
13
import io .vavr .Tuple ;
@@ -44,6 +46,7 @@ public class SampleDataGenerator {
44
46
private final Path templatesDir ;
45
47
46
48
private final List <CompletableFuture <Void >> futures = new ArrayList <>();
49
+ private final AtomicInteger taskCounter = new AtomicInteger ();
47
50
48
51
@ Inject
49
52
public SampleDataGenerator () {
@@ -68,37 +71,53 @@ public static void main(String[] args) {
68
71
public void generateData (final Path dir ) {
69
72
70
73
ensureAndCleanDir (dir );
74
+ LOGGER .info ("Cleaned dir {}" , dir );
71
75
72
76
generateDataViewingData (dir );
77
+ LOGGER .info ("Generated data viewing data" );
73
78
74
79
generateRefDataForEffectiveDateTesting (dir );
80
+ LOGGER .info ("Generated reference data" );
75
81
76
82
generateCharsetData (dir );
77
-
78
- LOGGER .info ("Waiting for {} async tasks to complete" , futures .size ());
83
+ LOGGER .info ("Generated charset data" );
84
+
85
+ while (true ) {
86
+ final int runningTasks = taskCounter .get ();
87
+ if (runningTasks == 0 ) {
88
+ break ;
89
+ } else {
90
+ LOGGER .info ("Waiting for {} async tasks to complete" , runningTasks );
91
+ ThreadUtil .sleep (2_000 );
92
+ }
93
+ }
94
+ LOGGER .info ("Joining threads" );
79
95
CompletableFuture .allOf (futures .toArray (CompletableFuture []::new )).join ();
80
96
LOGGER .info ("Completed generation" );
81
97
}
82
98
83
- private void generateDataViewingData (final Path dir ) {
84
- final int shortLoremText = 4 ;
85
- final int longLoremText = 200 ;
86
- // Increment the random seed each time so each data set has different but predictable data
87
- long randomSeed = 0 ;
88
-
89
- final DataWriter csvDataWriter = FlatDataWriterBuilder .builder ()
90
- .delimitedBy ("," )
91
- .enclosedBy ("\" " )
92
- .outputHeaderRow (true )
93
- .build ();
94
-
95
- final DataWriter xmlDataWriter = XmlAttributesDataWriterBuilder .builder ()
99
+ private DataWriter buildXmlDataWriter () {
100
+ return XmlAttributesDataWriterBuilder .builder ()
96
101
.namespace ("records:2" )
97
102
.rootElementName ("records" )
98
103
.recordElementName ("record" )
99
104
.fieldValueElementName ("data" )
100
105
.build ();
106
+ }
101
107
108
+ private DataWriter buildCsvDataWriter () {
109
+ return FlatDataWriterBuilder .builder ()
110
+ .delimitedBy ("," )
111
+ .enclosedBy ("\" " )
112
+ .outputHeaderRow (true )
113
+ .build ();
114
+ }
115
+
116
+ private void generateDataViewingData (final Path dir ) {
117
+ final int shortLoremText = 4 ;
118
+ final int longLoremText = 200 ;
119
+ // Increment the random seed each time so each data set has different but predictable data
120
+ long randomSeed = 0 ;
102
121
103
122
// Data that has one record per line
104
123
// One with long lines, one with short
@@ -107,7 +126,7 @@ private void generateDataViewingData(final Path dir) {
107
126
1 ,
108
127
"DATA_VIEWING_MULTI_LINE-EVENTS" ,
109
128
"\n " ,
110
- csvDataWriter ,
129
+ DataWriterMode . CSV ,
111
130
shortLoremText ,
112
131
LocalDateTime .of (2020 , 6 , 1 , 0 , 0 ),
113
132
randomSeed ++);
@@ -117,7 +136,7 @@ private void generateDataViewingData(final Path dir) {
117
136
2 ,
118
137
"DATA_VIEWING_MULTI_LINE-EVENTS" ,
119
138
"\n " ,
120
- csvDataWriter ,
139
+ DataWriterMode . CSV ,
121
140
longLoremText ,
122
141
LocalDateTime .of (2020 , 7 , 1 , 0 , 0 ),
123
142
randomSeed ++);
@@ -128,7 +147,7 @@ private void generateDataViewingData(final Path dir) {
128
147
1 ,
129
148
"DATA_VIEWING_SINGLE_LINE-EVENTS" ,
130
149
"|" ,
131
- csvDataWriter ,
150
+ DataWriterMode . CSV ,
132
151
shortLoremText ,
133
152
LocalDateTime .of (2020 , 8 , 1 , 0 , 0 ),
134
153
randomSeed ++);
@@ -139,7 +158,7 @@ private void generateDataViewingData(final Path dir) {
139
158
1 ,
140
159
"DATA_VIEWING_XML_SINGLE_LINE-EVENTS" ,
141
160
"" ,
142
- xmlDataWriter ,
161
+ DataWriterMode . XML ,
143
162
shortLoremText ,
144
163
LocalDateTime .of (2020 , 9 , 1 , 0 , 0 ),
145
164
randomSeed ++);
@@ -151,7 +170,7 @@ private void generateDataViewingData(final Path dir) {
151
170
1 ,
152
171
"DATA_VIEWING_XML_MULTI_LINE-EVENTS" ,
153
172
"\n " ,
154
- xmlDataWriter ,
173
+ DataWriterMode . XML ,
155
174
shortLoremText ,
156
175
LocalDateTime .of (2020 , 10 , 1 , 0 , 0 ),
157
176
randomSeed ++);
@@ -161,25 +180,28 @@ private void generateDataViewingData(final Path dir) {
161
180
2 ,
162
181
"DATA_VIEWING_XML_MULTI_LINE-EVENTS" ,
163
182
"\n " ,
164
- xmlDataWriter ,
183
+ DataWriterMode . XML ,
165
184
longLoremText ,
166
185
LocalDateTime .of (2020 , 11 , 1 , 0 , 0 ),
167
186
randomSeed ++);
168
-
169
187
}
170
188
171
189
private void generateDataViewRawData (final Path dir ,
172
190
final int fileNo ,
173
191
final String feedName ,
174
192
final String recordSeparator ,
175
- final DataWriter dataWriter ,
193
+ final DataWriterMode dataWriterMode ,
176
194
final int loremWordCount ,
177
195
final LocalDateTime startDate ,
178
196
final long randomSeed ) {
179
197
final Path file = makeInputFilePath (dir , fileNo , feedName );
198
+ final DataWriter dataWriter = switch (dataWriterMode ) {
199
+ case CSV -> buildCsvDataWriter ();
200
+ case XML -> buildXmlDataWriter ();
201
+ };
180
202
181
- futures . add ( CompletableFuture . runAsync (() -> {
182
- LOGGER . info ( "Generating file {}" , file . toAbsolutePath (). normalize () );
203
+ runAsync (() -> {
204
+ final DurationTimer timer = DurationTimer . start ( );
183
205
DataGenerator .buildDefinition ()
184
206
.addFieldDefinition (DataGenerator .randomDateTimeField (
185
207
"dateTime" ,
@@ -201,7 +223,7 @@ private void generateDataViewRawData(final Path dir,
201
223
faker -> faker .name ().lastName ()))
202
224
.addFieldDefinition (DataGenerator .fakerField (
203
225
"username" ,
204
- faker -> faker .name ().username ()))
226
+ faker -> faker .internet ().username ()))
205
227
.addFieldDefinition (DataGenerator .fakerField (
206
228
"bloodGroup" ,
207
229
faker -> faker .bloodtype ().bloodGroup ()))
@@ -225,7 +247,9 @@ private void generateDataViewRawData(final Path dir,
225
247
.rowCount (2_000 )
226
248
.withRandomSeed (randomSeed )
227
249
.generate ();
228
- }));
250
+ LOGGER .info ("Generated file {} in {}" ,
251
+ file .toAbsolutePath ().normalize (), timer );
252
+ });
229
253
}
230
254
231
255
private void generateRefDataForEffectiveDateTesting (final Path dir ) {
@@ -242,7 +266,7 @@ private void generateRefDataForEffectiveDateTesting(final Path dir) {
242
266
final int finalI = i ;
243
267
final LocalDateTime finalEffectiveDateTime = effectiveDateTime ;
244
268
245
- futures . add ( CompletableFuture . runAsync (() -> {
269
+ runAsync (() -> {
246
270
final Path refFile = makeInputFilePath (dir , finalI , finalEffectiveDateTime , refFeed );
247
271
LOGGER .info ("Generating file {}" , refFile .toAbsolutePath ().normalize ().toString ());
248
272
@@ -263,12 +287,12 @@ private void generateRefDataForEffectiveDateTesting(final Path dir) {
263
287
.consumedBy (DataGenerator .getFileOutputConsumer (refFile ))
264
288
.rowCount (userCount )
265
289
.generate ();
266
-
267
- }));
290
+ });
268
291
effectiveDateTime = effectiveDateTime .plusDays (1 );
269
292
}
270
293
271
- futures .add (CompletableFuture .runAsync (() -> {
294
+
295
+ runAsync (() -> {
272
296
final Path eventsFile = makeInputFilePath (dir , 1 , eventsFeed );
273
297
LOGGER .info ("Generating file {}" , eventsFile .toAbsolutePath ().normalize ());
274
298
@@ -290,6 +314,17 @@ private void generateRefDataForEffectiveDateTesting(final Path dir) {
290
314
.rowCount (userCount )
291
315
.multiThreaded ()
292
316
.generate ();
317
+ });
318
+ }
319
+
320
+ private void runAsync (final Runnable asyncTask ) {
321
+ taskCounter .incrementAndGet ();
322
+ futures .add (CompletableFuture .runAsync (() -> {
323
+ try {
324
+ asyncTask .run ();
325
+ } finally {
326
+ taskCounter .decrementAndGet ();
327
+ }
293
328
}));
294
329
}
295
330
@@ -340,7 +375,7 @@ private void generateDataForCharset(final String feedName,
340
375
final ByteOrderMark byteOrderMark ,
341
376
final String sourceContent ,
342
377
final int iteration ) {
343
- futures . add ( CompletableFuture . runAsync (() -> {
378
+ runAsync (() -> {
344
379
LOGGER .info ("Creating feed {} in {} for charset {} and BOM {}" ,
345
380
feedName , dir , charset , byteOrderMark );
346
381
@@ -378,7 +413,7 @@ private void generateDataForCharset(final String feedName,
378
413
} catch (Exception e ) {
379
414
throw new RuntimeException (e );
380
415
}
381
- })) ;
416
+ });
382
417
}
383
418
384
419
private Path makeInputFilePath (final Path dir ,
@@ -406,4 +441,14 @@ private void ensureAndCleanDir(final Path dir) {
406
441
}
407
442
}
408
443
444
+
445
+ // --------------------------------------------------------------------------------
446
+
447
+
448
+ private static enum DataWriterMode {
449
+ XML ,
450
+ CSV ,
451
+ ;
452
+ }
453
+
409
454
}
0 commit comments