diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/FlatFileItemReader.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/FlatFileItemReader.java index b51575f9b..dc3f10f17 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/FlatFileItemReader.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/FlatFileItemReader.java @@ -90,10 +90,19 @@ public class FlatFileItemReader extends AbstractItemReaderItemStream imple private BufferedReader reader; + private LineCallbackHandler headerCallback; + public FlatFileItemReader() { setName(ClassUtils.getShortName(FlatFileItemReader.class)); } + /** + * headerCallback will be passed the header line before any items are read. + */ + public void setHeaderCallback(LineCallbackHandler headerCallback) { + this.headerCallback = headerCallback; + } + /** * Setter for resource property. The location of an input stream that can be * read. @@ -227,6 +236,9 @@ public class FlatFileItemReader extends AbstractItemReaderItemStream imple String[] names = tokenizer.tokenize(firstLine).getValues(); ((AbstractLineTokenizer) tokenizer).setNames(names); } + if (headerCallback != null) { + headerCallback.handleLine(firstLine); + } } } diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/LineCallbackHandler.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/LineCallbackHandler.java new file mode 100644 index 000000000..e1ba89400 --- /dev/null +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/LineCallbackHandler.java @@ -0,0 +1,12 @@ +package org.springframework.batch.item.file; + +/** + * Callback interface for handling a line from file. Useful e.g. for header + * processing. + * + * @author Robert Kasanicky + */ +public interface LineCallbackHandler { + + void handleLine(String line); +} diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/FlatFileItemReaderBasicTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/FlatFileItemReaderBasicTests.java index ec2804f87..1a0b5be0f 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/FlatFileItemReaderBasicTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/FlatFileItemReaderBasicTests.java @@ -20,6 +20,7 @@ import java.io.IOException; import java.io.InputStream; import junit.framework.TestCase; +import static org.easymock.EasyMock.*; import org.springframework.batch.item.ExecutionContext; import org.springframework.batch.item.ItemStreamException; @@ -228,15 +229,21 @@ public class FlatFileItemReaderBasicTests extends TestCase { /** * Header line is skipped and used to setup fieldSet column names. + * It is also passed to header callback. */ public void testColumnNamesInHeader() throws Exception { final String INPUT = "name1|name2\nvalue1|value2\nvalue3|value4"; + + LineCallbackHandler headerCallback = createStrictMock(LineCallbackHandler.class); + headerCallback.handleLine("name1|name2"); + replay(headerCallback); itemReader = new FlatFileItemReader
(); itemReader.setResource(getInputResource(INPUT)); itemReader.setLineTokenizer(new DelimitedLineTokenizer('|')); itemReader.setFieldSetMapper(fieldSetMapper); itemReader.setFirstLineIsHeader(true); + itemReader.setHeaderCallback(headerCallback); itemReader.afterPropertiesSet(); itemReader.open(executionContext); @@ -247,6 +254,8 @@ public class FlatFileItemReaderBasicTests extends TestCase { fs = itemReader.read(); assertEquals("value3", fs.readString("name1")); assertEquals("value4", fs.readString("name2")); + + verify(headerCallback); } /**