diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/MultiResourceItemReader.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/MultiResourceItemReader.java
index 35d885761..7cbfb4df7 100644
--- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/MultiResourceItemReader.java
+++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/MultiResourceItemReader.java
@@ -38,6 +38,8 @@ public class MultiResourceItemReader extends ExecutionContextUserSupport impleme
private boolean shouldReadBuffer = false;
+ private boolean saveState = false;
+
public MultiResourceItemReader() {
setName(MultiResourceItemReader.class.getSimpleName());
}
@@ -129,8 +131,10 @@ public class MultiResourceItemReader extends ExecutionContextUserSupport impleme
* Store the current resource index and delegate's data.
*/
public void update(ExecutionContext executionContext) throws ItemStreamException {
- executionContext.putLong(getKey(RESOURCE_INDEX), currentResourceIndex);
- delegate.update(executionContext);
+ if (saveState) {
+ executionContext.putLong(getKey(RESOURCE_INDEX), currentResourceIndex);
+ delegate.update(executionContext);
+ }
}
/**
@@ -150,5 +154,16 @@ public class MultiResourceItemReader extends ExecutionContextUserSupport impleme
public void setResources(Resource[] resources) {
this.resources = resources;
}
+
+ /**
+ * Set the boolean indicating whether or not state should be saved in the
+ * provided {@link ExecutionContext} during the {@link ItemStream} call to
+ * update.
+ *
+ * @param saveState
+ */
+ public void setSaveState(boolean saveState) {
+ this.saveState = saveState;
+ }
}
diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/MultiResourceItemReaderFlatFileTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/MultiResourceItemReaderFlatFileTests.java
new file mode 100644
index 000000000..1aac541ac
--- /dev/null
+++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/MultiResourceItemReaderFlatFileTests.java
@@ -0,0 +1,40 @@
+package org.springframework.batch.item;
+
+import org.springframework.batch.item.file.FlatFileItemReader;
+import org.springframework.batch.item.file.mapping.FieldSet;
+import org.springframework.batch.item.file.mapping.FieldSetMapper;
+import org.springframework.batch.item.sample.Foo;
+import org.springframework.core.io.ByteArrayResource;
+import org.springframework.core.io.Resource;
+
+public class MultiResourceItemReaderFlatFileTests extends CommonItemStreamItemReaderTests {
+
+ protected ItemReader getItemReader() throws Exception {
+
+ MultiResourceItemReader multiReader = new MultiResourceItemReader();
+ FlatFileItemReader fileReader = new FlatFileItemReader();
+
+ fileReader.setFieldSetMapper(new FieldSetMapper() {
+ public Object mapLine(FieldSet fs) {
+ Foo foo = new Foo();
+ foo.setValue(fs.readInt(0));
+ return foo;
+ }
+ });
+ fileReader.setSaveState(true);
+
+ multiReader.setDelegate(fileReader);
+
+ Resource r1 = new ByteArrayResource("1\n2\n".getBytes());
+ Resource r2 = new ByteArrayResource("".getBytes());
+ Resource r3 = new ByteArrayResource("3\n".getBytes());
+ Resource r4 = new ByteArrayResource("4\n5\n".getBytes());
+
+ multiReader.setResources(new Resource[] { r1, r2, r3, r4 });
+ multiReader.setSaveState(true);
+ multiReader.afterPropertiesSet();
+
+ return multiReader;
+ }
+
+}
diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/MultiResourceItemReaderIntegrationTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/MultiResourceItemReaderIntegrationTests.java
index f9ad85bf9..4782bfbb7 100644
--- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/MultiResourceItemReaderIntegrationTests.java
+++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/MultiResourceItemReaderIntegrationTests.java
@@ -112,6 +112,7 @@ public class MultiResourceItemReaderIntegrationTests extends TestCase {
public void testRestart() throws Exception {
itemReader.setSaveState(true);
+ tested.setSaveState(true);
tested.open(ctx);
diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/MultiResourceItemReaderXmlTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/MultiResourceItemReaderXmlTests.java
new file mode 100644
index 000000000..6b21ad8e1
--- /dev/null
+++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/MultiResourceItemReaderXmlTests.java
@@ -0,0 +1,54 @@
+package org.springframework.batch.item;
+
+import javax.xml.stream.XMLEventReader;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.events.Attribute;
+import javax.xml.stream.events.StartElement;
+
+import org.springframework.batch.item.sample.Foo;
+import org.springframework.batch.item.xml.EventReaderDeserializer;
+import org.springframework.batch.item.xml.StaxEventItemReader;
+import org.springframework.core.io.ByteArrayResource;
+import org.springframework.core.io.Resource;
+
+public class MultiResourceItemReaderXmlTests extends CommonItemStreamItemReaderTests {
+
+ protected ItemReader getItemReader() throws Exception {
+ MultiResourceItemReader multiReader = new MultiResourceItemReader();
+
+ StaxEventItemReader reader = new StaxEventItemReader();
+
+ reader.setFragmentRootElementName("foo");
+ reader.setFragmentDeserializer(new EventReaderDeserializer() {
+ public Object deserializeFragment(XMLEventReader eventReader) {
+ Attribute attr;
+ try {
+ assertTrue(eventReader.nextEvent().isStartDocument());
+ StartElement event = eventReader.nextEvent().asStartElement();
+ attr = (Attribute) event.getAttributes().next();
+ }
+ catch (XMLStreamException e) {
+ throw new RuntimeException(e);
+ }
+ Foo foo = new Foo();
+ foo.setValue(Integer.parseInt(attr.getValue()));
+ return foo;
+ }
+ });
+
+ reader.setSaveState(true);
+
+ Resource r1 = new ByteArrayResource(" ".getBytes());
+ Resource r2 = new ByteArrayResource(" ".getBytes());
+ Resource r3 = new ByteArrayResource(" ".getBytes());
+ Resource r4 = new ByteArrayResource(" ".getBytes());
+
+ multiReader.setDelegate(reader);
+ multiReader.setResources(new Resource[] { r1, r2, r3, r4 });
+ multiReader.setSaveState(true);
+ multiReader.afterPropertiesSet();
+
+ return multiReader;
+ }
+
+}