From 878d497956bc6c8246262186b905c91140cf745d Mon Sep 17 00:00:00 2001 From: robokaso Date: Wed, 30 Jul 2008 13:44:29 +0000 Subject: [PATCH] RESOLVED - BATCH-752: FlatFileItemReader restart broken for non-default RecordSeparatorPolicy (record > 1 line) added testcase and used the default jumpToItem(int) implementation from superclass --- .../batch/item/file/FlatFileItemReader.java | 8 --- .../file/FlatFileItemReaderAdvancedTests.java | 69 ++++++++++++++----- 2 files changed, 52 insertions(+), 25 deletions(-) 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 5a4748aed..f293df03d 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 @@ -95,14 +95,6 @@ public class FlatFileItemReader extends AbstractBufferedItemReaderItemStream imp setName(ClassUtils.getShortName(FlatFileItemReader.class)); } - protected void jumpToItem(int itemIndex) throws Exception { - Object record = ""; - int index = itemIndex + (firstLineIsHeader?1:0) + linesToSkip; - while (reader.getPosition() < index && record != null) { - readLine(); - } - } - /** * @return next line to be tokenized and mapped. */ 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 9bdd844a9..943d796f0 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 @@ -24,6 +24,7 @@ import org.springframework.batch.item.ExecutionContext; import org.springframework.batch.item.file.mapping.DefaultFieldSet; import org.springframework.batch.item.file.mapping.FieldSet; import org.springframework.batch.item.file.mapping.FieldSetMapper; +import org.springframework.batch.item.file.separator.RecordSeparatorPolicy; import org.springframework.batch.item.file.transform.LineTokenizer; import org.springframework.core.io.ByteArrayResource; import org.springframework.core.io.Resource; @@ -58,7 +59,8 @@ public class FlatFileItemReaderAdvancedTests extends TestCase { }; /** - * Create inputFile, inject mock/stub dependencies for tested object, initialize the tested object + * Create inputFile, inject mock/stub dependencies for tested object, + * initialize the tested object */ protected void setUp() throws Exception { @@ -151,8 +153,7 @@ public class FlatFileItemReaderAdvancedTests extends TestCase { // get restart data reader.update(executionContext); - assertEquals(4, executionContext.getLong(ClassUtils.getShortName(FlatFileItemReader.class) - + ".read.count")); + assertEquals(4, executionContext.getLong(ClassUtils.getShortName(FlatFileItemReader.class) + ".read.count")); // close input reader.close(executionContext); @@ -166,14 +167,49 @@ public class FlatFileItemReaderAdvancedTests extends TestCase { assertEquals("[testLine6]", reader.read().toString()); reader.update(executionContext); - assertEquals(6, executionContext.getLong(ClassUtils.getShortName(FlatFileItemReader.class) - + ".read.count")); + assertEquals(6, executionContext.getLong(ClassUtils.getShortName(FlatFileItemReader.class) + ".read.count")); + } + + public void testRestartWithCustomRecordSeparatorPolicy() throws Exception { + reader.setResource(getInputResource("testLine1\ntestLine2\ntestLine3\ntestLine4\ntestLine5\ntestLine6")); + reader.setRecordSeparatorPolicy(new RecordSeparatorPolicy() { + // 1 record = 2 lines + boolean pair = true; + + public boolean isEndOfRecord(String line) { + pair = !pair; + return pair; + } + + public String postProcess(String record) { + return record; + } + + public String preProcess(String record) { + return record; + } + }); + + reader.open(executionContext); + + assertEquals("[testLine1testLine2]", reader.read().toString()); + assertEquals("[testLine3testLine4]", reader.read().toString()); + + reader.mark(); + reader.update(executionContext); + + reader.close(executionContext); + + reader.open(executionContext); + + assertEquals("[testLine5testLine6]", reader.read().toString()); } public void testRestartWithHeader() throws Exception { reader.close(null); - reader.setResource(getInputResource("header\ntestLine1\ntestLine2\ntestLine3\ntestLine4\ntestLine5\ntestLine6")); + reader + .setResource(getInputResource("header\ntestLine1\ntestLine2\ntestLine3\ntestLine4\ntestLine5\ntestLine6")); reader.setFirstLineIsHeader(true); reader.open(executionContext); @@ -188,12 +224,12 @@ public class FlatFileItemReaderAdvancedTests extends TestCase { // get restart data reader.update(executionContext); - assertEquals(4, executionContext.getLong(ClassUtils.getShortName(FlatFileItemReader.class) - + ".read.count")); + 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")); + reader + .setResource(getInputResource("header\ntestLine1\ntestLine2\ntestLine3\ntestLine4\ntestLine5\ntestLine6")); // init for restart reader.open(executionContext); @@ -203,14 +239,14 @@ public class FlatFileItemReaderAdvancedTests extends TestCase { assertEquals("[testLine6]", reader.read().toString()); reader.update(executionContext); - assertEquals(6, executionContext.getLong(ClassUtils.getShortName(FlatFileItemReader.class) - + ".read.count")); + 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 + .setResource(getInputResource("header\nignoreme\n\ntestLine1\ntestLine2\ntestLine3\ntestLine4\ntestLine5\ntestLine6")); reader.setLinesToSkip(2); reader.open(executionContext); @@ -225,12 +261,12 @@ public class FlatFileItemReaderAdvancedTests extends TestCase { // get restart data reader.update(executionContext); - assertEquals(4, executionContext.getLong(ClassUtils.getShortName(FlatFileItemReader.class) - + ".read.count")); + 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")); + reader + .setResource(getInputResource("header\nignoreme\ntestLine1\ntestLine2\ntestLine3\ntestLine4\ntestLine5\ntestLine6")); // init for restart reader.open(executionContext); @@ -240,7 +276,6 @@ public class FlatFileItemReaderAdvancedTests extends TestCase { assertEquals("[testLine6]", reader.read().toString()); reader.update(executionContext); - assertEquals(6, executionContext.getLong(ClassUtils.getShortName(FlatFileItemReader.class) - + ".read.count")); + assertEquals(6, executionContext.getLong(ClassUtils.getShortName(FlatFileItemReader.class) + ".read.count")); } }