From a6dd427f931f5184dfc47b4b74dcdd7ce5c6f53e Mon Sep 17 00:00:00 2001 From: dsyer Date: Mon, 28 Sep 2009 16:54:53 +0000 Subject: [PATCH] BATCH-1417: fixed in 2.0.x as well --- .../batch/item/file/FlatFileItemReader.java | 6 ++- .../item/file/FlatFileItemReaderTests.java | 37 +++++++++++++++++++ 2 files changed, 42 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 f8208d72b..b7f9e42b9 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 @@ -167,7 +167,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..2971ccc92 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 @@ -70,6 +70,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 {