From 074ea016810f5b3d805ebfd53a80a4c55835a0c6 Mon Sep 17 00:00:00 2001 From: dsyer Date: Thu, 17 Jul 2008 17:06:33 +0000 Subject: [PATCH] RESOLVED: BATCH-732 FlatFileItemReader ignores skipped lines on restart --- .../batch/item/file/FlatFileItemReader.java | 3 +- .../file/FlatFileItemReaderAdvancedTests.java | 73 +++++++++++++++++++ 2 files changed, 75 insertions(+), 1 deletion(-) 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 7a10b39b4..95a2d8695 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 @@ -97,7 +97,8 @@ public class FlatFileItemReader extends AbstractBufferedItemReaderItemStream imp protected void jumpToItem(int itemIndex) throws Exception { Object record = ""; - while (reader.getPosition() < itemIndex && record != null) { + int index = itemIndex + (firstLineIsHeader?1:0) + linesToSkip; + while (reader.getPosition() < index && record != null) { readLine(); } } diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/FlatFileItemReaderAdvancedTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/FlatFileItemReaderAdvancedTests.java index 18e93b04a..6c3c82d05 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/FlatFileItemReaderAdvancedTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/FlatFileItemReaderAdvancedTests.java @@ -170,4 +170,77 @@ public class FlatFileItemReaderAdvancedTests extends TestCase { + ".read.count")); } + public void testRestartWithHeader() throws Exception { + + reader.close(null); + reader.setResource(getInputResource("header\ntestLine1\ntestLine2\ntestLine3\ntestLine4\ntestLine5\ntestLine6")); + reader.setFirstLineIsHeader(true); + reader.open(executionContext); + + // read some records + reader.read(); + reader.read(); + // commit them + reader.mark(); + // read next two records + reader.read(); + reader.read(); + + // get restart data + reader.update(executionContext); + assertEquals(4, executionContext.getLong(ClassUtils.getShortName(FlatFileItemReader.class) + + ".read.count")); + // close input + reader.close(executionContext); + + reader.setResource(getInputResource("header\ntestLine1\ntestLine2\ntestLine3\ntestLine4\ntestLine5\ntestLine6")); + + // init for restart + reader.open(executionContext); + + // read remaining records + assertEquals("[testLine5]", reader.read().toString()); + assertEquals("[testLine6]", reader.read().toString()); + + reader.update(executionContext); + assertEquals(6, executionContext.getLong(ClassUtils.getShortName(FlatFileItemReader.class) + + ".read.count")); + } + + public void testRestartWithSkippedLines() throws Exception { + + reader.close(null); + reader.setResource(getInputResource("header\nignoreme\n\ntestLine1\ntestLine2\ntestLine3\ntestLine4\ntestLine5\ntestLine6")); + reader.setLinesToSkip(2); + reader.open(executionContext); + + // read some records + reader.read(); + reader.read(); + // commit them + reader.mark(); + // read next two records + reader.read(); + reader.read(); + + // get restart data + reader.update(executionContext); + assertEquals(4, executionContext.getLong(ClassUtils.getShortName(FlatFileItemReader.class) + + ".read.count")); + // close input + reader.close(executionContext); + + reader.setResource(getInputResource("header\nignoreme\ntestLine1\ntestLine2\ntestLine3\ntestLine4\ntestLine5\ntestLine6")); + + // init for restart + reader.open(executionContext); + + // read remaining records + assertEquals("[testLine5]", reader.read().toString()); + assertEquals("[testLine6]", reader.read().toString()); + + reader.update(executionContext); + assertEquals(6, executionContext.getLong(ClassUtils.getShortName(FlatFileItemReader.class) + + ".read.count")); + } }