From f5268ced571b0d10baa5c8c9a252f8d890bb0184 Mon Sep 17 00:00:00 2001 From: robokaso Date: Mon, 11 Aug 2008 09:30:29 +0000 Subject: [PATCH] RESOLVED - BATCH-766: Insufficient error handling in case of a missing resource for a org.springframework.batch.item.xml.StaxEventItemWriter Added check to open(..) that output resource exists --- .../batch/item/xml/StaxEventItemWriter.java | 3 ++ .../item/xml/StaxEventItemWriterTests.java | 46 +++++++++++++------ 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/xml/StaxEventItemWriter.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/xml/StaxEventItemWriter.java index 96dffb793..292486136 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/xml/StaxEventItemWriter.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/xml/StaxEventItemWriter.java @@ -254,6 +254,9 @@ public class StaxEventItemWriter extends ExecutionContextUserSupport implements * @see org.springframework.batch.item.ItemStream#open(ExecutionContext) */ public void open(ExecutionContext executionContext) { + + Assert.state(resource.exists(), "Output resource must exist"); + long startAtPosition = 0; // if restart data is provided, restart from provided offset diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/xml/StaxEventItemWriterTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/xml/StaxEventItemWriterTests.java index bf7d8cec4..6637f0693 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/xml/StaxEventItemWriterTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/xml/StaxEventItemWriterTests.java @@ -13,6 +13,7 @@ import junit.framework.TestCase; import org.apache.commons.io.FileUtils; import org.springframework.batch.item.ExecutionContext; import org.springframework.batch.item.xml.oxm.MarshallingEventWriterSerializer; +import org.springframework.core.io.DescriptiveResource; import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.Resource; import org.springframework.oxm.Marshaller; @@ -37,7 +38,7 @@ public class StaxEventItemWriterTests extends TestCase { // test item for writing to output private Object item = new Object() { public String toString() { - return ClassUtils.getShortName(StaxEventItemWriter.class)+"-testString"; + return ClassUtils.getShortName(StaxEventItemWriter.class) + "-testString"; } }; @@ -101,7 +102,7 @@ public class StaxEventItemWriterTests extends TestCase { assertFalse(content.contains(TEST_STRING)); writer.flush(); content = outputFileContent(); - assertTrue("Wrong content: "+content, contains(content, TEST_STRING)); + assertTrue("Wrong content: " + content, contains(content, TEST_STRING)); } /** @@ -140,14 +141,14 @@ public class StaxEventItemWriterTests extends TestCase { public void testWriteWithHeader() throws Exception { Object header1 = new Object(); Object header2 = new Object(); - writer.setHeaderItems(new Object[] {header1, header2}); + writer.setHeaderItems(new Object[] { header1, header2 }); writer.open(executionContext); writer.write(item); writer.flush(); String content = outputFileContent(); - assertTrue("Wrong content: "+content, contains(content, "")); - assertTrue("Wrong content: "+content, contains(content, "")); - assertTrue("Wrong content: "+content, contains(content, TEST_STRING)); + assertTrue("Wrong content: " + content, contains(content, "")); + assertTrue("Wrong content: " + content, contains(content, "")); + assertTrue("Wrong content: " + content, contains(content, TEST_STRING)); } /** @@ -155,7 +156,7 @@ public class StaxEventItemWriterTests extends TestCase { */ public void testWriteWithHeaderAfterRollback() throws Exception { Object header = new Object(); - writer.setHeaderItems(new Object[] {header}); + writer.setHeaderItems(new Object[] { header }); writer.open(executionContext); writer.write(item); writer.clear(); @@ -163,8 +164,8 @@ public class StaxEventItemWriterTests extends TestCase { writer.write(item); writer.flush(); String content = outputFileContent(); - assertEquals("Wrong content: "+content, 1, countContains(content, "")); - assertEquals("Wrong content: "+content, 1, countContains(content, TEST_STRING)); + assertEquals("Wrong content: " + content, 1, countContains(content, "")); + assertEquals("Wrong content: " + content, 1, countContains(content, TEST_STRING)); } /** @@ -172,7 +173,7 @@ public class StaxEventItemWriterTests extends TestCase { */ public void testWriteWithHeaderAfterFlushAndRollback() throws Exception { Object header = new Object(); - writer.setHeaderItems(new Object[] {header}); + writer.setHeaderItems(new Object[] { header }); writer.open(executionContext); writer.write(item); writer.flush(); @@ -183,8 +184,8 @@ public class StaxEventItemWriterTests extends TestCase { writer.clear(); writer.flush(); String content = outputFileContent(); - assertEquals("Wrong content: "+content, 1, countContains(content, "")); - assertEquals("Wrong content: "+content, 1, countContains(content, TEST_STRING)); + assertEquals("Wrong content: " + content, 1, countContains(content, "")); + assertEquals("Wrong content: " + content, 1, countContains(content, TEST_STRING)); } /** @@ -223,6 +224,25 @@ public class StaxEventItemWriterTests extends TestCase { assertTrue(outputFileContent().endsWith("")); } + public void testNonExistantResource() throws Exception { + Resource doesntExist = new DescriptiveResource("") { + + public boolean exists() { + return false; + } + + }; + writer.setResource(doesntExist); + + try { + writer.open(executionContext); + fail(); + } + catch (IllegalStateException e) { + assertEquals("Output resource must exist", e.getMessage()); + } + } + /** * Checks the received parameters. */ @@ -298,7 +318,7 @@ public class StaxEventItemWriterTests extends TestCase { private int countContains(String str, String searchStr) { int begin = -1; int count = 0; - while (str.indexOf(searchStr, begin+1) > begin) { + while (str.indexOf(searchStr, begin + 1) > begin) { count++; begin = str.indexOf(searchStr, begin); }