diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/io/file/SimpleFlatFileItemReader.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/io/file/SimpleFlatFileItemReader.java index 812a501bb..053357fbf 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/io/file/SimpleFlatFileItemReader.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/io/file/SimpleFlatFileItemReader.java @@ -123,8 +123,6 @@ public class SimpleFlatFileItemReader extends AbstractItemReader implements Item public void afterPropertiesSet() throws Exception { Assert.notNull(resource); - Assert.state(resource.exists(), "Resource must exist: [" + resource - + "]"); Assert.notNull(fieldSetMapper, "FieldSetMapper must not be null."); } @@ -133,6 +131,10 @@ public class SimpleFlatFileItemReader extends AbstractItemReader implements Item * @throws IllegalStateException if the resource cannot be opened */ public void open() throws IllegalStateException { + + Assert.state(resource.exists(), "Resource must exist: [" + resource + + "]"); + if (this.reader == null) { ResourceLineReader reader = new ResourceLineReader(resource, encoding); if (recordSeparatorPolicy != null) { diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/io/xml/StaxEventItemReader.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/io/xml/StaxEventItemReader.java index eefdb0b52..11dee7b66 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/io/xml/StaxEventItemReader.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/io/xml/StaxEventItemReader.java @@ -118,6 +118,8 @@ public class StaxEventItemReader extends AbstractItemReader implements ItemReade } public void open() { + Assert.state(resource.exists(), "Input resource does not exist: [" + resource + "]"); + registerSynchronization(); try { inputStream = resource.getInputStream(); @@ -184,7 +186,6 @@ public class StaxEventItemReader extends AbstractItemReader implements ItemReade */ public void afterPropertiesSet() throws Exception { Assert.notNull(resource, "The Resource must not be null."); - Assert.state(resource.exists(), "Input resource does not exist: [" + resource + "]"); Assert.notNull(eventReaderDeserializer, "The FragmentDeserializer must not be null."); Assert.hasLength(fragmentRootElementName, "The FragmentRootElementName must not be null"); } diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/io/file/SimpleFlatFileItemReaderTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/io/file/SimpleFlatFileItemReaderTests.java index 05e5e8fa9..4d474911f 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/io/file/SimpleFlatFileItemReaderTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/io/file/SimpleFlatFileItemReaderTests.java @@ -17,6 +17,7 @@ package org.springframework.batch.io.file; import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; import java.util.List; @@ -31,6 +32,7 @@ import org.springframework.batch.io.file.mapping.FieldSetMapper; import org.springframework.batch.io.file.separator.DefaultRecordSeparatorPolicy; import org.springframework.batch.io.file.transform.DelimitedLineTokenizer; import org.springframework.batch.io.file.transform.LineTokenizer; +import org.springframework.core.io.AbstractResource; import org.springframework.core.io.ByteArrayResource; import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.Resource; @@ -44,10 +46,11 @@ import org.springframework.core.io.Resource; public class SimpleFlatFileItemReaderTests extends TestCase { // object under test - private SimpleFlatFileItemReader inputSource = new SimpleFlatFileItemReader(); + private SimpleFlatFileItemReader itemReader = new SimpleFlatFileItemReader(); // common value used for writing to a file private String TEST_STRING = "FlatFileInputTemplate-TestData"; + private String TEST_OUTPUT = "[FlatFileInputTemplate-TestData]"; // simple stub instead of a realistic tokenizer private LineTokenizer tokenizer = new LineTokenizer() { @@ -68,19 +71,19 @@ public class SimpleFlatFileItemReaderTests extends TestCase { */ protected void setUp() throws Exception { - inputSource.setResource(getInputResource(TEST_STRING)); - inputSource.setTokenizer(tokenizer); - inputSource.setFieldSetMapper(fieldSetMapper); - inputSource.afterPropertiesSet(); + itemReader.setResource(getInputResource(TEST_STRING)); + itemReader.setTokenizer(tokenizer); + itemReader.setFieldSetMapper(fieldSetMapper); + itemReader.afterPropertiesSet(); - inputSource.open(); + itemReader.open(); } /** * Release resources. */ protected void tearDown() throws Exception { - inputSource.close(); + itemReader.close(); } private Resource getInputResource(String input) { @@ -91,28 +94,28 @@ public class SimpleFlatFileItemReaderTests extends TestCase { * Regular usage of read method */ public void testRead() throws Exception { - assertEquals("[FlatFileInputTemplate-TestData]", inputSource.read().toString()); + assertEquals("[FlatFileInputTemplate-TestData]", itemReader.read().toString()); } /** * Regular usage of read method */ public void testReadExhausted() throws Exception { - assertEquals("[FlatFileInputTemplate-TestData]", inputSource.read().toString()); - assertEquals(null, inputSource.read()); + assertEquals("[FlatFileInputTemplate-TestData]", itemReader.read().toString()); + assertEquals(null, itemReader.read()); } /** * Regular usage of read method */ public void testReadWithTokenizerError() throws Exception { - inputSource.setTokenizer(new LineTokenizer() { + itemReader.setTokenizer(new LineTokenizer() { public FieldSet tokenize(String line) { throw new RuntimeException("foo"); } }); try { - inputSource.read(); + itemReader.read(); fail("Expected ParsingException"); } catch (FlatFileParsingException e) { assertEquals(e.getInput(), TEST_STRING); @@ -121,14 +124,14 @@ public class SimpleFlatFileItemReaderTests extends TestCase { } public void testReadWithMapperError() throws Exception { - inputSource.setFieldSetMapper(new FieldSetMapper(){ + itemReader.setFieldSetMapper(new FieldSetMapper(){ public Object mapLine(FieldSet fs) { throw new RuntimeException("foo"); } }); try { - inputSource.read(); + itemReader.read(); fail("Expected ParsingException"); } catch (FlatFileParsingException e) { assertEquals(e.getInput(), TEST_STRING); @@ -137,36 +140,36 @@ public class SimpleFlatFileItemReaderTests extends TestCase { } public void testReadBeforeOpen() throws Exception { - inputSource = new SimpleFlatFileItemReader(); - inputSource.setResource(getInputResource(TEST_STRING)); - inputSource.setFieldSetMapper(fieldSetMapper); - assertEquals("[FlatFileInputTemplate-TestData]", inputSource.read().toString()); + itemReader = new SimpleFlatFileItemReader(); + itemReader.setResource(getInputResource(TEST_STRING)); + itemReader.setFieldSetMapper(fieldSetMapper); + assertEquals("[FlatFileInputTemplate-TestData]", itemReader.read().toString()); } public void testCloseBeforeOpen() throws Exception { - inputSource = new SimpleFlatFileItemReader(); - inputSource.setResource(getInputResource(TEST_STRING)); - inputSource.setFieldSetMapper(fieldSetMapper); - inputSource.close(); + itemReader = new SimpleFlatFileItemReader(); + itemReader.setResource(getInputResource(TEST_STRING)); + itemReader.setFieldSetMapper(fieldSetMapper); + itemReader.close(); // The open still happens automatically on a read... - assertEquals("[FlatFileInputTemplate-TestData]", inputSource.read().toString()); + assertEquals("[FlatFileInputTemplate-TestData]", itemReader.read().toString()); } public void testCloseOnDestroy() throws Exception { final List list = new ArrayList(); - inputSource = new SimpleFlatFileItemReader() { + itemReader = new SimpleFlatFileItemReader() { public void close() { list.add("close"); } }; - inputSource.destroy(); + itemReader.destroy(); assertEquals(1, list.size()); } public void testInitializationWithNullResource() throws Exception { - inputSource = new SimpleFlatFileItemReader(); + itemReader = new SimpleFlatFileItemReader(); try { - inputSource.afterPropertiesSet(); + itemReader.afterPropertiesSet(); fail("Expected IllegalArgumentException"); } catch (IllegalArgumentException e) { @@ -175,24 +178,24 @@ public class SimpleFlatFileItemReaderTests extends TestCase { } public void testOpenTwiceHasNoEffect() throws Exception { - inputSource.open(); + itemReader.open(); testRead(); } public void testSetValidEncoding() throws Exception { - inputSource = new SimpleFlatFileItemReader(); - inputSource.setEncoding("UTF-8"); - inputSource.setResource(getInputResource(TEST_STRING)); - inputSource.setFieldSetMapper(fieldSetMapper); + itemReader = new SimpleFlatFileItemReader(); + itemReader.setEncoding("UTF-8"); + itemReader.setResource(getInputResource(TEST_STRING)); + itemReader.setFieldSetMapper(fieldSetMapper); testRead(); } public void testSetNullEncoding() throws Exception { - inputSource = new SimpleFlatFileItemReader(); - inputSource.setEncoding(null); - inputSource.setResource(getInputResource(TEST_STRING)); + itemReader = new SimpleFlatFileItemReader(); + itemReader.setEncoding(null); + itemReader.setResource(getInputResource(TEST_STRING)); try { - inputSource.open(); + itemReader.open(); fail("Expected IllegalArgumentException"); } catch (IllegalArgumentException e) { @@ -201,11 +204,11 @@ public class SimpleFlatFileItemReaderTests extends TestCase { } public void testSetInvalidEncoding() throws Exception { - inputSource = new SimpleFlatFileItemReader(); - inputSource.setEncoding("foo"); - inputSource.setResource(getInputResource(TEST_STRING)); + itemReader = new SimpleFlatFileItemReader(); + itemReader.setEncoding("foo"); + itemReader.setResource(getInputResource(TEST_STRING)); try { - inputSource.open(); + itemReader.open(); fail("Expected BatchEnvironmentException"); } catch (BatchEnvironmentException e) { @@ -215,57 +218,40 @@ public class SimpleFlatFileItemReaderTests extends TestCase { } public void testEncoding() throws Exception { - inputSource.setEncoding("UTF-8"); + itemReader.setEncoding("UTF-8"); testRead(); } public void testRecordSeparator() throws Exception { - inputSource.setRecordSeparatorPolicy(new DefaultRecordSeparatorPolicy()); + itemReader.setRecordSeparatorPolicy(new DefaultRecordSeparatorPolicy()); testRead(); } public void testComments() throws Exception { - inputSource.setResource(getInputResource("% Comment\n"+TEST_STRING)); - inputSource.setComments(new String[] {"%"}); + itemReader.setResource(getInputResource("% Comment\n"+TEST_STRING)); + itemReader.setComments(new String[] {"%"}); testRead(); } - public void testInvalidFile() throws IOException { - DefaultFlatFileItemReader ffit = new DefaultFlatFileItemReader(); - - FileSystemResource resource = new FileSystemResource("FooDummy.txt"); - assertTrue(!resource.exists()); - ffit.setResource(resource); - - try { - ffit.open(); - fail("File is not existing but exception was not thrown."); - } - catch (BatchEnvironmentException e) { - assertEquals("FooDummy", e.getCause().getMessage().substring(0,8)); - } - - } - /** * Header line is skipped and used to setup fieldSet column names. */ public void testColumnNamesInHeader() throws Exception { final String INPUT = "name1|name2\nvalue1|value2\nvalue3|value4"; - inputSource = new SimpleFlatFileItemReader(); - inputSource.setResource(getInputResource(INPUT)); - inputSource.setTokenizer(new DelimitedLineTokenizer('|')); - inputSource.setFieldSetMapper(fieldSetMapper); - inputSource.setFirstLineIsHeader(true); - inputSource.afterPropertiesSet(); - inputSource.open(); + itemReader = new SimpleFlatFileItemReader(); + itemReader.setResource(getInputResource(INPUT)); + itemReader.setTokenizer(new DelimitedLineTokenizer('|')); + itemReader.setFieldSetMapper(fieldSetMapper); + itemReader.setFirstLineIsHeader(true); + itemReader.afterPropertiesSet(); + itemReader.open(); - FieldSet fs = (FieldSet) inputSource.read(); + FieldSet fs = (FieldSet) itemReader.read(); assertEquals("value1", fs.readString("name1")); assertEquals("value2", fs.readString("name2")); - fs = (FieldSet) inputSource.read(); + fs = (FieldSet) itemReader.read(); assertEquals("value3", fs.readString("name1")); assertEquals("value4", fs.readString("name2")); } @@ -276,20 +262,78 @@ public class SimpleFlatFileItemReaderTests extends TestCase { public void testLinesToSkip() throws Exception { final String INPUT = "foo bar spam\none two\nthree four"; - inputSource = new SimpleFlatFileItemReader(); - inputSource.setResource(getInputResource(INPUT)); - inputSource.setTokenizer(new DelimitedLineTokenizer(' ')); - inputSource.setFieldSetMapper(fieldSetMapper); - inputSource.setLinesToSkip(1); - inputSource.afterPropertiesSet(); - inputSource.open(); + itemReader = new SimpleFlatFileItemReader(); + itemReader.setResource(getInputResource(INPUT)); + itemReader.setTokenizer(new DelimitedLineTokenizer(' ')); + itemReader.setFieldSetMapper(fieldSetMapper); + itemReader.setLinesToSkip(1); + itemReader.afterPropertiesSet(); + itemReader.open(); - FieldSet fs = (FieldSet) inputSource.read(); + FieldSet fs = (FieldSet) itemReader.read(); assertEquals("one", fs.readString(0)); assertEquals("two", fs.readString(1)); - fs = (FieldSet) inputSource.read(); + fs = (FieldSet) itemReader.read(); assertEquals("three", fs.readString(0)); assertEquals("four", fs.readString(1)); } + + public void testNonExistantResource() throws Exception{ + + Resource resource = new NonExistentResource(); + + SimpleFlatFileItemReader testReader = new SimpleFlatFileItemReader(); + testReader.setResource(resource); + testReader.setTokenizer(tokenizer); + testReader.setFieldSetMapper(fieldSetMapper); + testReader.setResource(resource); + + //afterPropertiesSet should only throw an exception if the Resource is null + testReader.afterPropertiesSet(); + + try{ + testReader.open(); + fail(); + }catch(IllegalStateException ex){ + //expected + } + + } + + public void testRuntimeFileCreation() throws Exception{ + + Resource resource = new NonExistentResource(); + + SimpleFlatFileItemReader testReader = new SimpleFlatFileItemReader(); + testReader.setResource(resource); + testReader.setTokenizer(tokenizer); + testReader.setFieldSetMapper(fieldSetMapper); + testReader.setResource(resource); + + //afterPropertiesSet should only throw an exception if the Resource is null + testReader.afterPropertiesSet(); + + //replace the resource to simulate runtime resource creation + testReader.setResource(getInputResource(TEST_STRING)); + assertEquals(TEST_OUTPUT, testReader.read().toString()); + } + + private class NonExistentResource extends AbstractResource{ + + public NonExistentResource() { + } + + public boolean exists() { + return false; + } + + public String getDescription() { + return "NonExistantResource"; + } + + public InputStream getInputStream() throws IOException { + return null; + } + } } diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/io/xml/StaxEventReaderItemReaderTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/io/xml/StaxEventReaderItemReaderTests.java index e147a9daa..8ef669fcf 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/io/xml/StaxEventReaderItemReaderTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/io/xml/StaxEventReaderItemReaderTests.java @@ -245,6 +245,10 @@ public class StaxEventReaderItemReaderTests extends TestCase { public InputStream getInputStream() throws IOException { throw new IOException(); } + + public boolean exists() { + return true; + } }); try{ @@ -254,6 +258,29 @@ public class StaxEventReaderItemReaderTests extends TestCase { } } + + public void testNonExistentResource() throws Exception{ + + source.setResource(new NonExistentResource()); + source.afterPropertiesSet(); + + try{ + source.open(); + fail(); + } + catch(IllegalStateException ex){ + //expected + } + } + + public void testRuntimeFileCreation() throws Exception{ + + source.setResource(new NonExistentResource()); + source.afterPropertiesSet(); + + source.setResource(new ByteArrayResource(xml.getBytes())); + source.read(); + } private int extractRecordCountFrom(Properties statistics) { return Integer.valueOf( @@ -365,4 +392,22 @@ public class StaxEventReaderItemReaderTests extends TestCase { this.openCalled = openCalled; } } + + private class NonExistentResource extends AbstractResource{ + + public NonExistentResource() { + } + + public boolean exists() { + return false; + } + + public String getDescription() { + return "NonExistantResource"; + } + + public InputStream getInputStream() throws IOException { + return null; + } + } }