From 4e7c64a44344a53d49c5e9ecda2aa4f22c467fcf Mon Sep 17 00:00:00 2001 From: Mahmoud Ben Hassine Date: Thu, 9 May 2019 16:48:53 +0200 Subject: [PATCH] Add method to set a custom BufferedReaderFactory in FlatFileItemReaderBuilder Resolves BATCH-2770 --- .../builder/FlatFileItemReaderBuilder.java | 22 ++++++++++++++++++- .../FlatFileItemReaderBuilderTests.java | 6 ++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/builder/FlatFileItemReaderBuilder.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/builder/FlatFileItemReaderBuilder.java index b106cd6dc..9f43f685a 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/builder/FlatFileItemReaderBuilder.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/builder/FlatFileItemReaderBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 the original author or authors. + * Copyright 2016-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,6 +29,8 @@ import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.batch.item.file.BufferedReaderFactory; +import org.springframework.batch.item.file.DefaultBufferedReaderFactory; import org.springframework.batch.item.file.FlatFileItemReader; import org.springframework.batch.item.file.LineCallbackHandler; import org.springframework.batch.item.file.LineMapper; @@ -69,6 +71,9 @@ public class FlatFileItemReaderBuilder { private RecordSeparatorPolicy recordSeparatorPolicy = new SimpleRecordSeparatorPolicy(); + private BufferedReaderFactory bufferedReaderFactory = + new DefaultBufferedReaderFactory(); + private Resource resource; private List comments = new ArrayList<>(); @@ -201,6 +206,19 @@ public class FlatFileItemReaderBuilder { return this; } + /** + * Configure a custom {@link BufferedReaderFactory} for the reader. + * + * @param factory custom factory + * @return The current instance of the builder. + * @see FlatFileItemReader#setBufferedReaderFactory(BufferedReaderFactory) + */ + public FlatFileItemReaderBuilder bufferedReaderFactory(BufferedReaderFactory factory) { + this.bufferedReaderFactory = factory; + return this; + } + + /** * The {@link Resource} to be used as input. * @@ -429,6 +447,7 @@ public class FlatFileItemReaderBuilder { } Assert.notNull(this.recordSeparatorPolicy, "A RecordSeparatorPolicy is required."); + Assert.notNull(this.bufferedReaderFactory, "A BufferedReaderFactory is required."); int validatorValue = this.tokenizerValidator.intValue(); FlatFileItemReader reader = new FlatFileItemReader<>(); @@ -500,6 +519,7 @@ public class FlatFileItemReaderBuilder { reader.setSkippedLinesCallback(this.skippedLinesCallback); reader.setRecordSeparatorPolicy(this.recordSeparatorPolicy); + reader.setBufferedReaderFactory(this.bufferedReaderFactory); reader.setMaxItemCount(this.maxItemCount); reader.setCurrentItemCount(this.currentItemCount); reader.setSaveState(this.saveState); diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/builder/FlatFileItemReaderBuilderTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/builder/FlatFileItemReaderBuilderTests.java index abc110e1a..78e085664 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/builder/FlatFileItemReaderBuilderTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/builder/FlatFileItemReaderBuilderTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2016-2018 the original author or authors. + * Copyright 2016-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,6 +15,8 @@ */ package org.springframework.batch.item.file.builder; +import java.io.InputStreamReader; +import java.io.LineNumberReader; import java.util.ArrayList; import java.util.List; @@ -174,6 +176,8 @@ public class FlatFileItemReaderBuilderTests { .names("first", "second", "third") .targetType(Foo.class) .recordSeparatorPolicy(new DefaultRecordSeparatorPolicy("\"", "%")) + .bufferedReaderFactory((resource, encoding) -> + new LineNumberReader(new InputStreamReader(resource.getInputStream(), encoding))) .maxItemCount(2) .saveState(false) .build();