From f7a88902eddad9510a9b36755a32a64db7c20650 Mon Sep 17 00:00:00 2001 From: jpraet Date: Fri, 1 Mar 2013 21:14:43 +0100 Subject: [PATCH 1/2] BATCH-1972: StaxEventItemReader fails when restarted at end of file --- .../batch/item/xml/StaxEventItemReader.java | 15 ++++++++++++-- .../item/xml/StaxEventItemReaderTests.java | 20 +++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/xml/StaxEventItemReader.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/xml/StaxEventItemReader.java index 5a24cebe6..f89419e88 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/xml/StaxEventItemReader.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/xml/StaxEventItemReader.java @@ -17,6 +17,7 @@ package org.springframework.batch.item.xml; import java.io.InputStream; +import java.util.NoSuchElementException; import javax.xml.namespace.QName; import javax.xml.stream.XMLEventReader; @@ -247,8 +248,18 @@ public class StaxEventItemReader extends AbstractItemCountingItemStreamItemRe @Override protected void jumpToItem(int itemIndex) throws Exception { for (int i = 0; i < itemIndex; i++) { - readToStartFragment(); - readToEndFragment(); + try { + readToStartFragment(); + readToEndFragment(); + } catch (NoSuchElementException e) { + if (itemIndex == (i + 1)) { + // we can presume a NoSuchElementException on the last item means the EOF was reached on the last run + return; + } else { + // if NoSuchElementException occurs on an item other than the last one, this indicates a problem + throw e; + } + } } } diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/xml/StaxEventItemReaderTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/xml/StaxEventItemReaderTests.java index 456ba9c6f..165353b96 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/xml/StaxEventItemReaderTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/xml/StaxEventItemReaderTests.java @@ -223,6 +223,26 @@ public class StaxEventItemReaderTests { } + /** + * Test restart at end of file. + */ + @Test + public void testRestartAtEndOfFile() throws Exception { + + source.open(executionContext); + assertNotNull(source.read()); + assertNotNull(source.read()); + assertNull(source.read()); + source.update(executionContext); + source.close(); + + assertEquals(3, executionContext.getInt(ClassUtils.getShortName(StaxEventItemReader.class) + ".read.count")); + + source = createNewInputSouce(); + source.open(executionContext); + assertNull(source.read()); + } + @Test public void testRestoreWorksFromClosedStream() throws Exception { source.close(); From 0c224009b997eb09d30d11d33717b6715bc479f7 Mon Sep 17 00:00:00 2001 From: Michael Minella Date: Mon, 4 Mar 2013 17:21:50 -0600 Subject: [PATCH 2/2] BATCH-1972: Fixed some whitespace issues --- .../batch/item/xml/StaxEventItemReader.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/xml/StaxEventItemReader.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/xml/StaxEventItemReader.java index f89419e88..a2ec0f80a 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/xml/StaxEventItemReader.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/xml/StaxEventItemReader.java @@ -52,7 +52,7 @@ import org.springframework.util.ClassUtils; * @author Robert Kasanicky */ public class StaxEventItemReader extends AbstractItemCountingItemStreamItemReader implements - ResourceAwareItemReaderItemStream, InitializingBean { +ResourceAwareItemReaderItemStream, InitializingBean { private static final Log logger = LogFactory.getLog(StaxEventItemReader.class); @@ -87,7 +87,7 @@ public class StaxEventItemReader extends AbstractItemCountingItemStreamItemRe this.strict = strict; } - @Override + @Override public void setResource(Resource resource) { this.resource = resource; } @@ -114,7 +114,7 @@ public class StaxEventItemReader extends AbstractItemCountingItemStreamItemRe * the root element is empty. * @throws IllegalStateException if the Resource does not exist. */ - @Override + @Override public void afterPropertiesSet() throws Exception { Assert.notNull(unmarshaller, "The Unmarshaller must not be null."); Assert.hasLength(fragmentRootElementName, "The FragmentRootElementName must not be null"); @@ -160,7 +160,7 @@ public class StaxEventItemReader extends AbstractItemCountingItemStreamItemRe } } - @Override + @Override protected void doClose() throws Exception { try { if (fragmentReader != null) { @@ -177,7 +177,7 @@ public class StaxEventItemReader extends AbstractItemCountingItemStreamItemRe } - @Override + @Override protected void doOpen() throws Exception { Assert.notNull(resource, "The Resource must not be null."); @@ -207,7 +207,7 @@ public class StaxEventItemReader extends AbstractItemCountingItemStreamItemRe /** * Move to next fragment and map it to item. */ - @Override + @Override protected T doRead() throws Exception { if (noInput) {