From 244e18a0190d439a9005d3ffef6526f656862a76 Mon Sep 17 00:00:00 2001 From: dsyer Date: Mon, 28 Sep 2009 08:45:21 +0000 Subject: [PATCH] RESOLVED - issue BATCH-1417: Error in FlatFileItemReader when RecordSeparatorPolicy.preProcess or readLine returns null Throw FlatFileParseException if file ends in the middle of a record. --- .../batch/item/file/FlatFileItemReader.java | 6 ++- .../item/file/FlatFileItemReaderTests.java | 42 ++++++++++++++++++- 2 files changed, 46 insertions(+), 2 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 3698ab95d..364d2a377 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 @@ -180,7 +180,11 @@ public class FlatFileItemReader extends AbstractItemCountingItemStreamItemRea String record = line; if (line != null) { while (line != null && !recordSeparatorPolicy.isEndOfRecord(record)) { - record = recordSeparatorPolicy.preProcess(record) + (line = readLine()); + line = readLine(); + if (line==null) { + throw new FlatFileParseException("Unexpected end of file before record complete", record, lineCount); + } + record = recordSeparatorPolicy.preProcess(record) + line; } } String logicalLine = recordSeparatorPolicy.postProcess(record); diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/FlatFileItemReaderTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/FlatFileItemReaderTests.java index b411ba397..5b264347d 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/FlatFileItemReaderTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/FlatFileItemReaderTests.java @@ -1,6 +1,9 @@ package org.springframework.batch.item.file; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.fail; import java.io.IOException; import java.io.InputStream; @@ -70,6 +73,43 @@ public class FlatFileItemReaderTests { assertEquals("testLine5testLine6", reader.read()); } + @Test + public void testCustomRecordSeparatorPolicyEndOfFile() throws Exception { + + 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.setResource(getInputResource("testLine1\ntestLine2\ntestLine3\n")); + reader.open(executionContext); + + assertEquals("testLine1testLine2", reader.read()); + + try { + reader.read(); + fail("Expected Exception"); + } catch (FlatFileParseException e) { + // File ends in the middle of a record + assertEquals(3, e.getLineNumber()); + assertEquals("testLine3", e.getInput()); + } + + } + @Test public void testRestartWithSkippedLines() throws Exception {