@@ -155,8 +155,22 @@ public Pipeline create(final PipelineData pipelineData,
155
155
throw new PipelineFactoryException ("The pipeline has no source element" );
156
156
}
157
157
158
+ // Get the split depth to use with the stepping controller.
159
+ int controllerSplitDepth = 1 ;
160
+ if (controller != null ) {
161
+ controllerSplitDepth =
162
+ getSplitDepth (elementInstances , elementTypeMap , linkSets , sourceElement .getElementId ());
163
+ controllerSplitDepth = Math .max (controllerSplitDepth , 1 );
164
+ }
165
+
158
166
// Link the instances.
159
- link (elementInstances , elementTypeMap , linkSets , controller , sourceElement , sourceElement .getElementId ());
167
+ link (elementInstances ,
168
+ elementTypeMap ,
169
+ linkSets ,
170
+ controller ,
171
+ sourceElement ,
172
+ sourceElement .getElementId (),
173
+ controllerSplitDepth );
160
174
161
175
// We need to create a root element that will be a target for the input
162
176
// stream.
@@ -236,12 +250,11 @@ public static void setProperty(final ElementRegistry pipelineElementRegistry,
236
250
// stepping and have code to insert.
237
251
if (controller != null ) {
238
252
final PipelineStepRequest request = controller .getRequest ();
239
- if (request .getCode () != null && request .getCode ().size () > 0 ) {
253
+ if (request .getCode () != null && ! request .getCode ().isEmpty () ) {
240
254
final String code = request .getCode ().get (id );
241
255
if (code != null ) {
242
- if (elementInstance instanceof SupportsCodeInjection ) {
243
- final SupportsCodeInjection supportsCodeInjection =
244
- (SupportsCodeInjection ) elementInstance ;
256
+ if (elementInstance instanceof
257
+ final SupportsCodeInjection supportsCodeInjection ) {
245
258
supportsCodeInjection .setInjectedCode (code );
246
259
}
247
260
}
@@ -308,7 +321,8 @@ private void link(final Map<String, Element> elementInstances,
308
321
final Map <String , Set <String >> linkSets ,
309
322
final SteppingController controller ,
310
323
final Element parentElement ,
311
- final String parentElementId ) {
324
+ final String parentElementId ,
325
+ final int controllerSplitDepth ) {
312
326
// Get the child elements of the supplied 'from' element id that we want
313
327
// to work with.
314
328
final List <Element > childElements = getChildElements (parentElementId , elementInstances , elementTypeMap ,
@@ -335,37 +349,71 @@ private void link(final Map<String, Element> elementInstances,
335
349
addMonitor (elementId , elementType , childElement , fragment , controller );
336
350
337
351
} else {
338
- fragment = insertRecorder (elementId , elementType , fragment , true , controller );
339
- fragment = insertRecorder (elementId , elementType , fragment , false , controller );
352
+ fragment = insertRecorder (elementId , elementType , fragment , true , controller ,
353
+ controllerSplitDepth );
354
+ fragment = insertRecorder (elementId , elementType , fragment , false , controller ,
355
+ controllerSplitDepth );
340
356
addMonitor (elementId , elementType , childElement , fragment , controller );
341
357
fragment = insertRecordDetector (elementType , fragment , true , controller );
342
358
fragment = insertRecordDetector (elementType , fragment , false , controller );
343
359
}
344
360
}
345
361
346
362
// Continue to link the children of this child.
347
- link (elementInstances , elementTypeMap , linkSets , controller , fragment .getOut (), elementId );
363
+ link (elementInstances ,
364
+ elementTypeMap ,
365
+ linkSets ,
366
+ controller ,
367
+ fragment .getOut (),
368
+ elementId ,
369
+ controllerSplitDepth );
348
370
349
371
// Now set the target of the parent element to be the 'wrapped'
350
372
// child to complete the link.
351
373
if (parentElement != null && parentElement != fragment .getIn ()) {
352
- if (!(parentElement instanceof HasTargets )) {
374
+ if (parentElement instanceof final HasTargets hasTargets ) {
375
+ if (childElement instanceof Target ) {
376
+ if (fragment .getIn () instanceof final Target target ) {
377
+ hasTargets .addTarget (target );
378
+ }
379
+ } else {
380
+ throw new PipelineFactoryException ("Attempt to link to an element that is not a target: "
381
+ + parentElement .getElementId () + " > " + elementId );
382
+ }
383
+ } else {
353
384
throw new PipelineFactoryException (
354
385
"Attempt to link from an element that cannot target another element: "
355
- + parentElement .getElementId ());
356
- }
357
- if (!(childElement instanceof Target )) {
358
- throw new PipelineFactoryException ("Attempt to link to an element that is not a target: "
359
- + parentElement .getElementId () + " > " + elementId );
386
+ + parentElement .getElementId ());
360
387
}
388
+ }
389
+ }
390
+ }
361
391
362
- final HasTargets hasTargets = (HasTargets ) parentElement ;
363
- if (fragment .getIn () instanceof Target ) {
364
- final Target target = (Target ) fragment .getIn ();
365
- hasTargets .addTarget (target );
366
- }
392
+ /**
393
+ * Get the split depth for use in stepping.
394
+ */
395
+ private int getSplitDepth (final Map <String , Element > elementInstances ,
396
+ final Map <Element , PipelineElementType > elementTypeMap ,
397
+ final Map <String , Set <String >> linkSets ,
398
+ final String parentElementId ) {
399
+ // Get the child elements of the supplied 'from' element id that we want
400
+ // to work with.
401
+ final List <Element > childElements = getChildElements (parentElementId , elementInstances , elementTypeMap ,
402
+ linkSets , null );
403
+
404
+ // Loop over the child elements and link them to the parent.
405
+ for (final Element childElement : childElements ) {
406
+ if (childElement instanceof final SplitFilter splitFilter ) {
407
+ return splitFilter .getSplitDepth ();
408
+ }
409
+ final int childSplitDepth =
410
+ getSplitDepth (elementInstances , elementTypeMap , linkSets , childElement .getElementId ());
411
+ if (childSplitDepth != -1 ) {
412
+ return childSplitDepth ;
367
413
}
368
414
}
415
+
416
+ return -1 ;
369
417
}
370
418
371
419
/**
@@ -390,7 +438,7 @@ private List<Element> getChildElements(final String fromElementId,
390
438
List <Element > childElements = Collections .emptyList ();
391
439
392
440
final Set <String > toElementIdSet = linkSets .get (fromElementId );
393
- if (toElementIdSet != null && toElementIdSet .size () > 0 ) {
441
+ if (toElementIdSet != null && ! toElementIdSet .isEmpty () ) {
394
442
childElements = new ArrayList <>(toElementIdSet .size ());
395
443
396
444
for (final String toElementId : toElementIdSet ) {
@@ -440,7 +488,8 @@ private Fragment insertRecorder(final String elementId,
440
488
final PipelineElementType elementType ,
441
489
final Fragment fragment ,
442
490
final boolean input ,
443
- final SteppingController controller ) {
491
+ final SteppingController controller ,
492
+ final int controllerSplitDepth ) {
444
493
Fragment result = fragment ;
445
494
446
495
// Get any filter settings that might be applied to XML output.
@@ -458,29 +507,25 @@ private Fragment insertRecorder(final String elementId,
458
507
outputRecorder .setElementId (elementId );
459
508
result = new Fragment (outputRecorder );
460
509
461
- } else if (in instanceof AbstractInputElement ) {
462
- final AbstractInputElement filter = (AbstractInputElement ) in ;
510
+ } else if (in instanceof final AbstractInputElement filter ) {
463
511
final ReaderRecorder recorder = new ReaderRecorder (errorReceiverProxy );
464
512
recorder .setElementId (elementId );
465
513
recorder .setTarget (filter );
466
514
result = new Fragment (recorder , fragment .getOut ());
467
515
468
- } else if (in instanceof AbstractReaderElement ) {
469
- final AbstractReaderElement filter = (AbstractReaderElement ) in ;
516
+ } else if (in instanceof final AbstractReaderElement filter ) {
470
517
final ReaderRecorder recorder = new ReaderRecorder (errorReceiverProxy );
471
518
recorder .setElementId (elementId );
472
519
recorder .setTarget (filter );
473
520
result = new Fragment (recorder , fragment .getOut ());
474
521
475
- } else if (in instanceof AbstractParser ) {
476
- final AbstractParser parser = (AbstractParser ) in ;
522
+ } else if (in instanceof final AbstractParser parser ) {
477
523
final ReaderRecorder recorder = new ReaderRecorder (errorReceiverProxy );
478
524
recorder .setElementId (elementId );
479
525
recorder .setTarget (parser );
480
526
result = new Fragment (recorder , fragment .getOut ());
481
527
482
- } else if (in instanceof XMLFilter && elementType .hasRole (PipelineElementType .ROLE_MUTATOR )) {
483
- final XMLFilter filter = (XMLFilter ) in ;
528
+ } else if (in instanceof final XMLFilter filter && elementType .hasRole (PipelineElementType .ROLE_MUTATOR )) {
484
529
485
530
// Create stepping filter.
486
531
final SAXEventRecorder recorder = elementFactory .getElementInstance (SAXEventRecorder .class );
@@ -502,27 +547,24 @@ private Fragment insertRecorder(final String elementId,
502
547
outputRecorder .setElementId (elementId );
503
548
result = new Fragment (outputRecorder );
504
549
505
- } else if (out instanceof AbstractInputElement ) {
506
- final AbstractInputElement filter = (AbstractInputElement ) out ;
550
+ } else if (out instanceof final AbstractInputElement filter ) {
507
551
final ReaderRecorder recorder = new ReaderRecorder (errorReceiverProxy );
508
552
recorder .setElementId (elementId );
509
553
filter .setTarget (recorder );
510
554
result = new Fragment (fragment .getIn (), recorder );
511
555
512
- } else if (out instanceof AbstractReaderElement ) {
513
- final AbstractReaderElement filter = (AbstractReaderElement ) out ;
556
+ } else if (out instanceof final AbstractReaderElement filter ) {
514
557
final ReaderRecorder recorder = new ReaderRecorder (errorReceiverProxy );
515
558
recorder .setElementId (elementId );
516
559
filter .setTarget (recorder );
517
560
result = new Fragment (fragment .getIn (), recorder );
518
561
519
- } else if (out instanceof AbstractParser ) {
520
- final AbstractParser parser = (AbstractParser ) out ;
562
+ } else if (out instanceof final AbstractParser parser ) {
521
563
522
564
// Insert a split filter after the parser to split all XML into
523
565
// single records.
524
566
final SplitFilter splitFilter = elementFactory .getElementInstance (SplitFilter .class );
525
- splitFilter .setSplitDepth (1 );
567
+ splitFilter .setSplitDepth (controllerSplitDepth );
526
568
splitFilter .setSplitCount (controller .getRequest ().getStepSize ());
527
569
parser .setTarget (splitFilter );
528
570
@@ -537,18 +579,17 @@ private Fragment insertRecorder(final String elementId,
537
579
538
580
result = new Fragment (fragment .getIn (), recorder );
539
581
540
- } else if (out instanceof XMLFilter && elementType .hasRole (PipelineElementType .ROLE_WRITER )) {
541
- final XMLFilter filter = (XMLFilter ) out ;
582
+ } else if (out instanceof final XMLFilter filter && elementType .hasRole (PipelineElementType .ROLE_WRITER )) {
542
583
543
584
final OutputRecorder outputRecorder = elementFactory .getElementInstance (OutputRecorder .class );
544
585
outputRecorder .setElementId (elementId );
545
586
((HasTargets ) filter ).setTarget (outputRecorder );
546
587
547
588
result = new Fragment (fragment .getIn (), outputRecorder );
548
589
549
- } else if (out instanceof XMLFilter && ( elementType . hasRole ( PipelineElementType . ROLE_MUTATOR )
550
- || elementType .hasRole (PipelineElementType .ROLE_VALIDATOR ))) {
551
- final XMLFilter filter = ( XMLFilter ) out ;
590
+ } else if (out instanceof final XMLFilter filter &&
591
+ ( elementType .hasRole (PipelineElementType .ROLE_MUTATOR ) ||
592
+ elementType . hasRole ( PipelineElementType . ROLE_VALIDATOR ))) {
552
593
553
594
// Create stepping filter.
554
595
final SAXEventRecorder recorder = elementFactory .getElementInstance (SAXEventRecorder .class );
@@ -629,7 +670,7 @@ private Fragment insertRecordDetector(final PipelineElementType elementType,
629
670
if (!input ) {
630
671
if (elementType .hasRole (PipelineElementType .ROLE_PARSER )) {
631
672
if (controller .getRecordDetector () == null
632
- || !(controller .getRecordDetector () instanceof SAXRecordDetector )) {
673
+ || !(controller .getRecordDetector () instanceof SAXRecordDetector )) {
633
674
final SAXRecordDetector recordDetector = elementFactory .getElementInstance (SAXRecordDetector .class );
634
675
controller .setRecordDetector (recordDetector );
635
676
((HasTargets ) fragment .getOut ()).setTarget (recordDetector );
0 commit comments