diff --git a/infrastructure/src/main/java/org/springframework/batch/item/provider/DefaultFlatFileItemProvider.java b/infrastructure/src/main/java/org/springframework/batch/item/provider/FlatFileItemProvider.java similarity index 88% rename from infrastructure/src/main/java/org/springframework/batch/item/provider/DefaultFlatFileItemProvider.java rename to infrastructure/src/main/java/org/springframework/batch/item/provider/FlatFileItemProvider.java index 853a51582..69f48d79f 100644 --- a/infrastructure/src/main/java/org/springframework/batch/item/provider/DefaultFlatFileItemProvider.java +++ b/infrastructure/src/main/java/org/springframework/batch/item/provider/FlatFileItemProvider.java @@ -18,6 +18,7 @@ package org.springframework.batch.item.provider; import java.util.Properties; +import org.springframework.batch.io.Skippable; import org.springframework.batch.io.file.FieldSet; import org.springframework.batch.io.file.FieldSetMapper; import org.springframework.batch.item.validator.Validator; @@ -33,8 +34,8 @@ import org.springframework.batch.statistics.StatisticsProvider; * * @author Dave Syer */ -public class DefaultFlatFileItemProvider extends AbstractFieldSetItemProvider implements Restartable, - StatisticsProvider { +public class FlatFileItemProvider extends AbstractFieldSetItemProvider implements Restartable, + StatisticsProvider, Skippable { private FieldSetMapper mapper; private Validator validator; @@ -102,4 +103,14 @@ public class DefaultFlatFileItemProvider extends AbstractFieldSetItemProvider im return ((StatisticsProvider) source).getStatistics(); } + /** + * @return delegates to the input source if it is a + * {@link Skippable}. + * @see Skippable#skip() + */ + public void skip() { + if (source instanceof Skippable) { + ((Skippable) source).skip(); + } + } } diff --git a/infrastructure/src/test/java/org/springframework/batch/item/provider/DefaultFlatFileItemProviderTests.java b/infrastructure/src/test/java/org/springframework/batch/item/provider/FlatFileItemProviderTests.java similarity index 74% rename from infrastructure/src/test/java/org/springframework/batch/item/provider/DefaultFlatFileItemProviderTests.java rename to infrastructure/src/test/java/org/springframework/batch/item/provider/FlatFileItemProviderTests.java index e2666aadc..f872491f5 100644 --- a/infrastructure/src/test/java/org/springframework/batch/item/provider/DefaultFlatFileItemProviderTests.java +++ b/infrastructure/src/test/java/org/springframework/batch/item/provider/FlatFileItemProviderTests.java @@ -22,12 +22,13 @@ import java.util.Properties; import junit.framework.TestCase; +import org.springframework.batch.io.Skippable; import org.springframework.batch.io.exception.ValidationException; import org.springframework.batch.io.file.FieldSet; import org.springframework.batch.io.file.FieldSetInputSource; import org.springframework.batch.io.file.FieldSetMapper; import org.springframework.batch.io.file.support.DefaultFlatFileInputSource; -import org.springframework.batch.item.provider.DefaultFlatFileItemProvider; +import org.springframework.batch.item.provider.FlatFileItemProvider; import org.springframework.batch.item.validator.Validator; import org.springframework.batch.restart.GenericRestartData; import org.springframework.batch.restart.RestartData; @@ -37,27 +38,33 @@ import org.springframework.batch.support.PropertiesConverter; import org.springframework.core.io.ByteArrayResource; /** - * Unit tests for {@link DefaultFlatFileItemProvider} + * Unit tests for {@link FlatFileItemProvider} * * @author Robert Kasanicky + * @author Dave Syer */ -public class DefaultFlatFileItemProviderTests extends TestCase { - +public class FlatFileItemProviderTests extends TestCase { + public static String FOO = "foo"; // object under test - private DefaultFlatFileItemProvider itemProvider = new DefaultFlatFileItemProvider(); - + private FlatFileItemProvider itemProvider = new FlatFileItemProvider(); + // Input source private DefaultFlatFileInputSource source; - - //mock mapper + + // mock mapper private FieldSetMapper mapper; - + private List list = new ArrayList(); - + // create mock objects and inject them into data provider protected void setUp() throws Exception { - source = new DefaultFlatFileInputSource(); + source = new DefaultFlatFileInputSource() { + public void skip() { + super.skip(); + list.add("skipped"); + } + }; source.setResource(new ByteArrayResource("a,b".getBytes())); mapper = new FieldSetMapper() { public Object mapLine(FieldSet fs) { @@ -66,36 +73,43 @@ public class DefaultFlatFileItemProviderTests extends TestCase { }; itemProvider.setSource(source); itemProvider.setMapper(mapper); - assertTrue(Restartable.class.isAssignableFrom(DefaultFlatFileInputSource.class)); - assertTrue(FieldSetInputSource.class.isAssignableFrom(DefaultFlatFileInputSource.class)); - assertTrue(StatisticsProvider.class.isAssignableFrom(DefaultFlatFileInputSource.class)); + assertTrue(Restartable.class + .isAssignableFrom(DefaultFlatFileInputSource.class)); + assertTrue(Skippable.class + .isAssignableFrom(DefaultFlatFileInputSource.class)); + assertTrue(FieldSetInputSource.class + .isAssignableFrom(DefaultFlatFileInputSource.class)); + assertTrue(StatisticsProvider.class + .isAssignableFrom(DefaultFlatFileInputSource.class)); } /** * Uses input template to provide the domain object. */ - public void testNext() { + public void testNext() { Object result = itemProvider.next(); - assertSame("domain object is provided by the input template", FOO, result); + assertSame("domain object is provided by the input template", FOO, + result); } - + /** * Uses input template to provide the domain object. */ - public void testNextWithValidator() { + public void testNextWithValidator() { itemProvider.setValidator(new Validator() { public void validate(Object value) throws ValidationException { list.add(value); } }); itemProvider.next(); - assertSame("domain object is provided by the input template", FOO, list.get(0)); + assertSame("domain object is provided by the input template", FOO, list + .get(0)); } /** * Uses input template to provide the domain object. */ - public void testNextWithValidatorAndInvalidData() { + public void testNextWithValidatorAndInvalidData() { itemProvider.setValidator(new Validator() { public void validate(Object value) throws ValidationException { throw new ValidationException("Invalid input"); @@ -114,10 +128,10 @@ public class DefaultFlatFileItemProviderTests extends TestCase { * Gets statistics from the input template */ public void testGetStatistics() { - Properties statistics = ((StatisticsProvider) source).getStatistics(); + Properties statistics = ((StatisticsProvider) source).getStatistics(); assertEquals(statistics, itemProvider.getStatistics()); } - + /** * Gets statistics from the input template */ @@ -132,58 +146,72 @@ public class DefaultFlatFileItemProviderTests extends TestCase { */ public void testGetRestartData() { RestartData data = ((Restartable) source).getRestartData(); - assertEquals(data.getProperties(), itemProvider.getRestartData().getProperties()); + assertEquals(data.getProperties(), itemProvider.getRestartData() + .getProperties()); } - + /** * Forwarded restart data to input template */ public void testRestoreFrom() { - + final List list = new ArrayList(); - + RestartData data = new RestartData() { public Properties getProperties() { list.add(FOO); return ((Restartable) source).getRestartData().getProperties(); - }}; - + } + }; + itemProvider.restoreFrom(data); - - //assertEquals(1, list.size()); getProperties are called multiple times due to null checks + + // assertEquals(1, list.size()); getProperties are called multiple times + // due to null checks assertTrue(list.size() > 0); } /** * Forward restart data to input template - * @throws Exception + * + * @throws Exception */ public void testRestoreFromWithoutRestartable() throws Exception { itemProvider.setSource(null); try { - itemProvider.restoreFrom(new GenericRestartData(PropertiesConverter.stringToProperties("value=bar"))); + itemProvider.restoreFrom(new GenericRestartData(PropertiesConverter + .stringToProperties("value=bar"))); fail("Expected IllegalStateException"); - } - catch (IllegalStateException e) { + } catch (IllegalStateException e) { // expected } } /** * Forward restart data to input template - * @throws Exception + * + * @throws Exception */ public void testGetRestartDataWithoutRestartable() throws Exception { itemProvider.setSource(null); try { itemProvider.getRestartData(); fail("Expected IllegalStateException"); - } - catch (IllegalStateException e) { + } catch (IllegalStateException e) { // expected } } + /** + * Forward restart data to input template + * + * @throws Exception + */ + public void testSkippable() throws Exception { + assertEquals(0, list.size()); + itemProvider.skip(); + assertEquals(1, list.size()); + } } diff --git a/samples/src/main/resources/jobs/beanWrapperMapperSampleJob.xml b/samples/src/main/resources/jobs/beanWrapperMapperSampleJob.xml index b393d5bbe..54cd8e099 100644 --- a/samples/src/main/resources/jobs/beanWrapperMapperSampleJob.xml +++ b/samples/src/main/resources/jobs/beanWrapperMapperSampleJob.xml @@ -22,7 +22,7 @@ class="org.springframework.batch.execution.tasklet.RestartableItemProviderTasklet"> + class="org.springframework.batch.item.provider.FlatFileItemProvider"> @@ -42,7 +42,7 @@ class="org.springframework.batch.execution.tasklet.RestartableItemProviderTasklet"> + class="org.springframework.batch.item.provider.FlatFileItemProvider"> diff --git a/samples/src/main/resources/jobs/compositeProcessorSample.xml b/samples/src/main/resources/jobs/compositeProcessorSample.xml index 5a7a568ee..4fee75603 100644 --- a/samples/src/main/resources/jobs/compositeProcessorSample.xml +++ b/samples/src/main/resources/jobs/compositeProcessorSample.xml @@ -22,7 +22,7 @@ class="org.springframework.batch.execution.tasklet.RestartableItemProviderTasklet"> + class="org.springframework.batch.item.provider.FlatFileItemProvider"> diff --git a/samples/src/main/resources/jobs/fixedLengthImportJob.xml b/samples/src/main/resources/jobs/fixedLengthImportJob.xml index 7f675048b..41ad3dd95 100644 --- a/samples/src/main/resources/jobs/fixedLengthImportJob.xml +++ b/samples/src/main/resources/jobs/fixedLengthImportJob.xml @@ -22,7 +22,7 @@ class="org.springframework.batch.execution.tasklet.RestartableItemProviderTasklet"> + class="org.springframework.batch.item.provider.FlatFileItemProvider"> diff --git a/samples/src/main/resources/jobs/restartSample.xml b/samples/src/main/resources/jobs/restartSample.xml index 7d05ba364..21f03a383 100644 --- a/samples/src/main/resources/jobs/restartSample.xml +++ b/samples/src/main/resources/jobs/restartSample.xml @@ -20,7 +20,7 @@ + class="org.springframework.batch.item.provider.FlatFileItemProvider"> diff --git a/samples/src/main/resources/jobs/tradeJob.xml b/samples/src/main/resources/jobs/tradeJob.xml index 4ef3d7d37..2419b12a0 100644 --- a/samples/src/main/resources/jobs/tradeJob.xml +++ b/samples/src/main/resources/jobs/tradeJob.xml @@ -24,7 +24,7 @@ + class="org.springframework.batch.item.provider.FlatFileItemProvider">