Uploaded image for project: 'Spring Batch'
  1. Spring Batch
  2. BATCH-2738

FlatFileItemReaderBuilder class - TAB character is not set as a delimiter

    Details

    • Type: Defect
    • Status: Resolved
    • Priority: Trivial
    • Resolution: Complete
    • Affects Version/s: 4.0.1
    • Fix Version/s: 4.1.0, 4.0.2, 4.1.0.M3
    • Component/s: Core
    • Labels:
    • Environment:
      Java VM 1.8

      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

        Attachments

          Activity

            People

            • Assignee:
              mbenhassine Mahmoud Ben Hassine
              Reporter:
              vchivu Valentin CHIVU
            • Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved:

                Time Tracking

                Estimated:
                Original Estimate - 1d
                1d
                Remaining:
                Remaining Estimate - 1d
                1d
                Logged:
                Time Spent - Not Specified
                Not Specified