[BATCH-2738] FlatFileItemReaderBuilder class - TAB character is not set as a delimiter Created: 08/Jul/18  Updated: 31/Aug/18  Resolved: 31/Aug/18

Status: Resolved
Project: Spring Batch
Component/s: Core
Affects Version/s: 4.0.1
Fix Version/s: 4.1.0, 4.0.2, 4.1.0.M3

Type: Defect Priority: Trivial
Reporter: Valentin CHIVU Assignee: Mahmoud Ben Hassine
Resolution: Complete Votes: 0
Labels: Spring
Remaining Estimate: 1d
Time Spent: Not Specified
Original Estimate: 1d
Environment:

Java VM 1.8


Reference URL: https://stackoverflow.com/questions/51738718/flatfileitemreader-tab-delimiter-not-working
Pull Request URL: https://github.com/spring-projects/spring-batch/pull/626

 Description   

Hi Spring Batch Team,

My name is Valentin, I am from Romania, I am Java Application Developer and I work for a project by using Spring Batch Core framework.
My project requires to create a batch which reads data from a simple flat file with TAB character as a field separator.

I use your new feature Spring Batch Core 4 class org.springframework.batch.item.file.builder.FlatFileItemReaderBuilder.DelimitedBuilder<T>. In my code, I want to set the TAB delimiter by the next sequence:

FlatFileItemReaderBuilder<MyData> flatFileItemReaderBuilder = new FlatFileItemReaderBuilder<>();
FlatFileItemReaderBuilder.DelimitedBuilder<MyData> flatFileItemReaderBuilderDelimited = flatFileItemReaderBuilder.delimited();
flatFileItemReaderBuilderDelimited.delimiter(DelimitedLineTokenizer.DELIMITER_TAB);
// flatFileItemReaderBuilderDelimited.delimiter("\t");

I've found the TAB character is not set as a delimiter on the field org.springframework.batch.item.file.builder.FlatFileItemReaderBuilder.DelimitedBuilder.delimiter. I've found that, in general, the delimiter is set by the method org.springframework.batch.item.file.builder.FlatFileItemReaderBuilder.DelimitedBuilder.build() at line 631, by the sequence:
 
if(StringUtils.hasText(this.delimiter)) {
                tokenizer.setDelimiter(this.delimiter);
}

Here the delimiter is checked against the method org.springframework.util.StringUtils.hasText(String). According to the hasText() method specification, "this method returns true if the String is not null, its length is greater than 0, and it contains at least one non-whitespace character." But in the case of TAB character, the string contains only one character (i.e. TAB character) which is a whitespace character, thus the condition is not valid, and the TAB character is not set as a delimiter.

Please correct me if I am wrong. As long as DelimitedLineTokenizer.DELIMITER_TAB constant exists, to exclude the TAB character was not an intention, and maybe this is a bug. 
 
I think the class FlatFileItemReaderBuilder is a very good idea. I have already used this class for other separators. I am looking forward to your feedback.

P.S. For the moment, I have solved the problem by using the classic Spring Batch 3 style.

Best Regards,
Valentin CHIVU
Java Developer
Romania


Generated at Fri Nov 15 02:15:44 UTC 2019 using Jira 7.13.8#713008-sha1:1606a5c1e7006e1ab135aac81f7a9566b2dbc3a6.