From ca4fc0dbb4d0cade4fc946af26e088d6991539b4 Mon Sep 17 00:00:00 2001 From: robokaso Date: Tue, 3 Jun 2008 08:52:48 +0000 Subject: [PATCH] IN PROGRESS - BATCH-520: Add a Delegating File Reader For Multiple Files added the common 'foo' tests for both flatfile and xml added setter for 'saveState' --- .../batch/item/MultiResourceItemReader.java | 19 ++++++- .../MultiResourceItemReaderFlatFileTests.java | 40 ++++++++++++++ ...ltiResourceItemReaderIntegrationTests.java | 1 + .../item/MultiResourceItemReaderXmlTests.java | 54 +++++++++++++++++++ 4 files changed, 112 insertions(+), 2 deletions(-) create mode 100644 spring-batch-infrastructure/src/test/java/org/springframework/batch/item/MultiResourceItemReaderFlatFileTests.java create mode 100644 spring-batch-infrastructure/src/test/java/org/springframework/batch/item/MultiResourceItemReaderXmlTests.java 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; + } + +}