IN PROGRESS - issue BATCH-212: Merge InputSource with ItemProvider

http://opensource.atlassian.com/projects/spring/browse/BATCH-212

Merge InputSource/ItemProvider -> ItemReader.
This commit is contained in:
dsyer
2007-12-17 13:13:39 +00:00
parent ddc4a48de1
commit ab98d1ebe6
107 changed files with 828 additions and 826 deletions

View File

@@ -25,12 +25,12 @@ import java.util.Set;
import org.springframework.batch.core.tasklet.Tasklet;
import org.springframework.batch.io.Skippable;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.ItemProvider;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemRecoverer;
import org.springframework.batch.repeat.ExitStatus;
import org.springframework.batch.retry.RetryPolicy;
import org.springframework.batch.retry.callback.ItemProviderRetryCallback;
import org.springframework.batch.retry.policy.ItemProviderRetryPolicy;
import org.springframework.batch.retry.callback.ItemReaderRetryCallback;
import org.springframework.batch.retry.policy.ItemReaderRetryPolicy;
import org.springframework.batch.retry.support.RetryTemplate;
import org.springframework.batch.statistics.StatisticsProvider;
import org.springframework.beans.factory.InitializingBean;
@@ -42,7 +42,7 @@ import org.springframework.util.Assert;
* the reading and processing of batch data into two separate classes:
* ItemProvider and ItemProcessor. The ItemProvider class provides a solid means
* for re-usability and enforces good architecture practices. Because an object
* <em>must</em> be returned by the {@link ItemProvider} to continue
* <em>must</em> be returned by the {@link ItemReader} to continue
* processing, (returning null indicates processing should end) a developer is
* forced to read in all relevant data, place it into a domain object, and
* return that object. The {@link ItemProcessor} will then use this object for
@@ -50,12 +50,12 @@ import org.springframework.util.Assert;
*
* If a {@link RetryPolicy} is provided it will be used to construct a stateful
* retry around the {@link ItemProcessor}, delegating identity concerns to the
* {@link ItemProvider} and recovery concerns to the {@link ItemRecoverer} (if
* {@link ItemReader} and recovery concerns to the {@link ItemRecoverer} (if
* present). In this case clients of this class do not need to take any
* additional action at runtime to take advantage of the retry and recovery,
* provided that when the {@link #execute()} method is called again the same
* item is eventually re-presented (normally this would be the case because a
* transaction would have rolled back and the {@link ItemProvider} would go back
* transaction would have rolled back and the {@link ItemReader} would go back
* to its previous state).<br/>
*
* If a {@link RetryPolicy} is not provided then the {@link ItemRecoverer} can
@@ -65,7 +65,7 @@ import org.springframework.util.Assert;
* can be achieved by injecting an {@link ItemRecoverer} that has a
* transactional recover method.
*
* @see ItemProvider
* @see ItemReader
* @see ItemProcessor
* @see RetryPolicy
* @see Recoverable
@@ -75,7 +75,7 @@ import org.springframework.util.Assert;
* @author Robert Kasanicky
*
*/
public class ItemProviderProcessTasklet implements Tasklet, Skippable,
public class ItemOrientedTasklet implements Tasklet, Skippable,
StatisticsProvider, InitializingBean {
/**
@@ -92,7 +92,7 @@ public class ItemProviderProcessTasklet implements Tasklet, Skippable,
private RetryPolicy retryPolicy = null;
protected ItemProvider itemProvider;
protected ItemReader itemProvider;
protected ItemProcessor itemProcessor;
@@ -100,7 +100,7 @@ public class ItemProviderProcessTasklet implements Tasklet, Skippable,
private RetryTemplate template = new RetryTemplate();
private ItemProviderRetryCallback retryCallback;
private ItemReaderRetryCallback retryCallback;
/**
* Check mandatory properties (provider and processor).
@@ -115,12 +115,12 @@ public class ItemProviderProcessTasklet implements Tasklet, Skippable,
itemRecoverer = (ItemRecoverer) itemProvider;
}
ItemProviderRetryPolicy itemProviderRetryPolicy = new ItemProviderRetryPolicy(
ItemReaderRetryPolicy itemProviderRetryPolicy = new ItemReaderRetryPolicy(
retryPolicy);
template.setRetryPolicy(itemProviderRetryPolicy);
if (retryPolicy != null) {
retryCallback = new ItemProviderRetryCallback(itemProvider,
retryCallback = new ItemReaderRetryCallback(itemProvider,
itemProcessor);
retryCallback.setRecoverer(itemRecoverer);
}
@@ -128,7 +128,7 @@ public class ItemProviderProcessTasklet implements Tasklet, Skippable,
}
/**
* Read from the {@link ItemProvider} and process (if not null) with the
* Read from the {@link ItemReader} and process (if not null) with the
* {@link ItemProcessor}. The call to {@link ItemProcessor} is wrapped in a
* stateful retry, if a {@link RetryPolicy} is provided. The
* {@link ItemRecoverer} is used (if provided) in the case of an exception
@@ -144,7 +144,7 @@ public class ItemProviderProcessTasklet implements Tasklet, Skippable,
public ExitStatus execute() throws Exception {
if (retryCallback == null) {
Object item = itemProvider.next();
Object item = itemProvider.read();
if (item == null) {
return ExitStatus.FINISHED;
}
@@ -168,7 +168,7 @@ public class ItemProviderProcessTasklet implements Tasklet, Skippable,
/**
* @param itemProvider
*/
public void setItemProvider(ItemProvider itemProvider) {
public void setItemProvider(ItemReader itemProvider) {
this.itemProvider = itemProvider;
}

View File

@@ -19,17 +19,17 @@ package org.springframework.batch.execution.tasklet;
import java.util.Properties;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.ItemProvider;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.restart.GenericRestartData;
import org.springframework.batch.restart.RestartData;
import org.springframework.batch.restart.Restartable;
import org.springframework.batch.support.PropertiesConverter;
/**
* An extension of {@link ItemProviderProcessTasklet} that delegates calls to
* An extension of {@link ItemOrientedTasklet} that delegates calls to
* {@link Restartable} to the provider and processor.
*
* @see ItemProvider
* @see ItemReader
* @see ItemProcessor
* @see Restartable
*
@@ -37,7 +37,7 @@ import org.springframework.batch.support.PropertiesConverter;
* @author Dave Syer
*
*/
public class RestartableItemProviderTasklet extends ItemProviderProcessTasklet implements Restartable {
public class RestartableItemOrientedTasklet extends ItemOrientedTasklet implements Restartable {
/**
* @see Restartable#getRestartData()
@@ -55,7 +55,7 @@ public class RestartableItemProviderTasklet extends ItemProviderProcessTasklet i
itemProcessorRestartData = ((Restartable) itemProcessor).getRestartData();
}
RestartableItemProviderTaskletRestartData restartData = new RestartableItemProviderTaskletRestartData(itemProviderRestartData, itemProcessorRestartData);
RestartableItemOrientedTaskletRestartData restartData = new RestartableItemOrientedTaskletRestartData(itemProviderRestartData, itemProcessorRestartData);
return restartData;
}
@@ -67,13 +67,13 @@ public class RestartableItemProviderTasklet extends ItemProviderProcessTasklet i
if (data == null || data.getProperties() == null)
return;
RestartableItemProviderTaskletRestartData moduleRestartData;
RestartableItemOrientedTaskletRestartData moduleRestartData;
if (data instanceof RestartableItemProviderTaskletRestartData) {
moduleRestartData = (RestartableItemProviderTaskletRestartData) data;
if (data instanceof RestartableItemOrientedTaskletRestartData) {
moduleRestartData = (RestartableItemOrientedTaskletRestartData) data;
}
else {
moduleRestartData = new RestartableItemProviderTaskletRestartData(data.getProperties());
moduleRestartData = new RestartableItemOrientedTaskletRestartData(data.getProperties());
}
if (itemProvider instanceof Restartable) {
@@ -84,7 +84,7 @@ public class RestartableItemProviderTasklet extends ItemProviderProcessTasklet i
}
}
private class RestartableItemProviderTaskletRestartData implements RestartData {
private class RestartableItemOrientedTaskletRestartData implements RestartData {
private static final String PROVIDER_KEY = "DATA_PROVIDER";
@@ -94,12 +94,12 @@ public class RestartableItemProviderTasklet extends ItemProviderProcessTasklet i
RestartData processorData;
public RestartableItemProviderTaskletRestartData(RestartData providerData, RestartData processorData) {
public RestartableItemOrientedTaskletRestartData(RestartData providerData, RestartData processorData) {
this.providerData = providerData;
this.processorData = processorData;
}
public RestartableItemProviderTaskletRestartData(Properties data) {
public RestartableItemOrientedTaskletRestartData(Properties data) {
providerData = new GenericRestartData(PropertiesConverter
.stringToProperties(data.getProperty(PROVIDER_KEY)));
processorData = new GenericRestartData(PropertiesConverter.stringToProperties(data

View File

@@ -39,11 +39,11 @@ import org.springframework.batch.execution.repository.dao.MapStepDao;
import org.springframework.batch.execution.runtime.ScheduledJobIdentifierFactory;
import org.springframework.batch.execution.step.SimpleStepConfiguration;
import org.springframework.batch.execution.step.simple.SimpleStepExecutor;
import org.springframework.batch.execution.tasklet.ItemProviderProcessTasklet;
import org.springframework.batch.execution.tasklet.ItemOrientedTasklet;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.ItemProvider;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemRecoverer;
import org.springframework.batch.item.provider.ListItemProvider;
import org.springframework.batch.item.provider.ListItemReader;
import org.springframework.batch.repeat.RepeatContext;
import org.springframework.batch.repeat.exception.handler.ExceptionHandler;
import org.springframework.batch.repeat.support.RepeatTemplate;
@@ -67,7 +67,7 @@ public class SimpleJobTests extends TestCase {
}
};
private ItemProvider provider;
private ItemReader provider;
private DefaultJobExecutor jobExecutor = new DefaultJobExecutor();;
@@ -92,11 +92,11 @@ public class SimpleJobTests extends TestCase {
return getTasklet(new String[] { arg0, arg1 });
}
private ItemProviderProcessTasklet getTasklet(String[] args) throws Exception {
ItemProviderProcessTasklet module = new ItemProviderProcessTasklet();
private ItemOrientedTasklet getTasklet(String[] args) throws Exception {
ItemOrientedTasklet module = new ItemOrientedTasklet();
List items = TransactionAwareProxyFactory.createTransactionalList();
items.addAll(Arrays.asList(args));
provider = new ListItemProvider(items);
provider = new ListItemReader(items);
module.setItemRecoverer(new ItemRecoverer() {
public boolean recover(Object item, Throwable cause) {
recovered.add(item);
@@ -161,7 +161,7 @@ public class SimpleJobTests extends TestCase {
* is recovered ("skipped") on the second attempt (see retry policy
* definition above)...
*/
final ItemProviderProcessTasklet module = getTasklet(new String[] { "foo", "bar", "spam" });
final ItemOrientedTasklet module = getTasklet(new String[] { "foo", "bar", "spam" });
StepConfiguration step = new SimpleStepConfiguration(module);
module.setItemProcessor(new ItemProcessor() {
public void process(Object data) throws Exception {
@@ -177,7 +177,7 @@ public class SimpleJobTests extends TestCase {
assertEquals(BatchStatus.COMPLETED, jobExecution.getJob().getStatus());
assertEquals(0, processed.size());
// provider should be exhausted
assertEquals(null, provider.next());
assertEquals(null, provider.read());
assertEquals(3, recovered.size());
}
@@ -185,7 +185,7 @@ public class SimpleJobTests extends TestCase {
JobConfiguration jobConfiguration = new JobConfiguration();
JobIdentifier runtimeInformation = new SimpleJobIdentifier("real.job");
final ItemProviderProcessTasklet module = getTasklet(new String[] { "foo", "bar", "spam" });
final ItemOrientedTasklet module = getTasklet(new String[] { "foo", "bar", "spam" });
StepConfiguration step = new SimpleStepConfiguration(module);
module.setItemProcessor(new ItemProcessor() {
public void process(Object data) throws Exception {

View File

@@ -36,10 +36,10 @@ import org.springframework.batch.execution.repository.dao.MapStepDao;
import org.springframework.batch.execution.scope.StepScope;
import org.springframework.batch.execution.scope.StepSynchronizationManager;
import org.springframework.batch.execution.step.SimpleStepConfiguration;
import org.springframework.batch.execution.tasklet.ItemProviderProcessTasklet;
import org.springframework.batch.execution.tasklet.ItemOrientedTasklet;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.ItemProvider;
import org.springframework.batch.item.provider.ListItemProvider;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.provider.ListItemReader;
import org.springframework.batch.repeat.ExitStatus;
import org.springframework.batch.repeat.RepeatContext;
import org.springframework.batch.repeat.exception.handler.DefaultExceptionHandler;
@@ -66,8 +66,8 @@ public class DefaultStepExecutorTests extends TestCase {
private RepeatTemplate template;
private ItemProvider getProvider(String[] args) {
return new ListItemProvider(Arrays.asList(args));
private ItemReader getProvider(String[] args) {
return new ListItemReader(Arrays.asList(args));
}
/**
@@ -76,7 +76,7 @@ public class DefaultStepExecutorTests extends TestCase {
* @throws Exception
*/
private Tasklet getTasklet(String[] strings) throws Exception {
ItemProviderProcessTasklet module = new ItemProviderProcessTasklet();
ItemOrientedTasklet module = new ItemOrientedTasklet();
module.setItemProcessor(processor);
module.setItemProvider(getProvider(strings));
module.afterPropertiesSet();

View File

@@ -25,9 +25,9 @@ import junit.framework.TestCase;
import org.springframework.batch.io.Skippable;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.ItemProvider;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemRecoverer;
import org.springframework.batch.item.provider.AbstractItemProvider;
import org.springframework.batch.item.provider.AbstractItemReader;
import org.springframework.batch.repeat.context.RepeatContextSupport;
import org.springframework.batch.repeat.synch.RepeatSynchronizationManager;
import org.springframework.batch.retry.policy.SimpleRetryPolicy;
@@ -38,16 +38,16 @@ import org.springframework.batch.support.PropertiesConverter;
* @author Dave Syer
* @author Peter Zozom
*/
public class ItemProviderProcessTaskletTests extends TestCase {
public class ItemOrientedTaskletTests extends TestCase {
private List list = new ArrayList();
private List items = new ArrayList();
private ItemProvider itemProvider = new AbstractItemProvider() {
private ItemReader itemProvider = new AbstractItemReader() {
int count = 0;
public Object next() throws Exception {
public Object read() throws Exception {
if (count < items.size()) {
Object data = items.get(count++);
if (data instanceof Exception) {
@@ -65,12 +65,12 @@ public class ItemProviderProcessTaskletTests extends TestCase {
}
};
private ItemProviderProcessTasklet module;
private ItemOrientedTasklet module;
public void setUp() throws Exception {
// create module
module = new ItemProviderProcessTasklet();
module = new ItemOrientedTasklet();
// set up module
module.setItemProvider(itemProvider);
@@ -144,15 +144,15 @@ public class ItemProviderProcessTaskletTests extends TestCase {
}
}
public void testSkippableProvider() throws Exception {
module.setItemProvider(new SkippableItemProvider());
public void testSkippableReader() throws Exception {
module.setItemProvider(new SkippableItemReader());
module.setItemRecoverer(null);
module.skip();
assertEquals(1, list.size());
}
public void testSkippablProviderProcessor() throws Exception {
module.setItemProvider(new SkippableItemProvider());
public void testSkippablReaderProcessor() throws Exception {
module.setItemProvider(new SkippableItemReader());
module.setItemProcessor(new SkippableItemProcessor());
module.setItemRecoverer(null);
module.skip();
@@ -160,7 +160,7 @@ public class ItemProviderProcessTaskletTests extends TestCase {
}
public void testStatisticsProvider() throws Exception {
module.setItemProvider(new SkippableItemProvider());
module.setItemProvider(new SkippableItemReader());
Properties stats = module.getStatistics();
assertEquals(1, stats.size());
assertEquals("bar", stats.getProperty("foo"));
@@ -174,7 +174,7 @@ public class ItemProviderProcessTaskletTests extends TestCase {
}
public void testStatisticsProviderProcessor() throws Exception {
module.setItemProvider(new SkippableItemProvider());
module.setItemProvider(new SkippableItemReader());
module.setItemProcessor(new SkippableItemProcessor());
Properties stats = module.getStatistics();
assertEquals(2, stats.size());
@@ -184,7 +184,7 @@ public class ItemProviderProcessTaskletTests extends TestCase {
public void testStatisticsProviderProcessorMergeDuplicates()
throws Exception {
module.setItemProvider(new SkippableItemProvider());
module.setItemProvider(new SkippableItemReader());
module.setItemProcessor(new SkippableItemProcessor(
"foo=bar\nspam=bucket"));
Properties stats = module.getStatistics();
@@ -207,8 +207,8 @@ public class ItemProviderProcessTaskletTests extends TestCase {
}
});
module.setItemProvider(new AbstractItemProvider() {
public Object next() throws Exception {
module.setItemProvider(new AbstractItemReader() {
public Object read() throws Exception {
return "bar";
}
});
@@ -245,8 +245,8 @@ public class ItemProviderProcessTaskletTests extends TestCase {
return true;
}
});
module.setItemProvider(new AbstractItemProvider() {
public Object next() throws Exception {
module.setItemProvider(new AbstractItemReader() {
public Object read() throws Exception {
return "foo";
}
});
@@ -295,10 +295,10 @@ public class ItemProviderProcessTaskletTests extends TestCase {
}
}
private class SkippableItemProvider implements ItemProvider,
private class SkippableItemReader implements ItemReader,
Skippable, StatisticsProvider {
public Object next() throws Exception {
return itemProvider.next();
public Object read() throws Exception {
return itemProvider.read();
}
public Object getKey(Object item) {
return item;

View File

@@ -20,9 +20,9 @@ import java.util.Properties;
import junit.framework.TestCase;
import org.springframework.batch.execution.tasklet.RestartableItemProviderTasklet;
import org.springframework.batch.execution.tasklet.RestartableItemOrientedTasklet;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.ItemProvider;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.restart.GenericRestartData;
import org.springframework.batch.restart.RestartData;
import org.springframework.batch.restart.Restartable;
@@ -31,9 +31,9 @@ import org.springframework.batch.support.PropertiesConverter;
/**
* @author Peter Zozom
*/
public class RestartableItemProviderTaskletTests extends TestCase {
public class RestartableItemOrientedTaskletTests extends TestCase {
private static class MockProvider implements ItemProvider, Restartable {
private static class MockProvider implements ItemReader, Restartable {
RestartData data = new RestartData() {
@@ -43,7 +43,7 @@ public class RestartableItemProviderTaskletTests extends TestCase {
};
public Object next() {
public Object read() {
return null;
}
@@ -88,11 +88,11 @@ public class RestartableItemProviderTaskletTests extends TestCase {
}
private ItemProvider itemProvider;
private ItemReader itemProvider;
private ItemProcessor itemProcessor;
private RestartableItemProviderTasklet module;
private RestartableItemOrientedTasklet module;
public void testRestart() {
@@ -101,7 +101,7 @@ public class RestartableItemProviderTaskletTests extends TestCase {
itemProcessor = new MockProcessor();
// create and set up module
module = new RestartableItemProviderTasklet();
module = new RestartableItemOrientedTasklet();
module.setItemProvider(itemProvider);
module.setItemProcessor(itemProcessor);
@@ -119,7 +119,7 @@ public class RestartableItemProviderTaskletTests extends TestCase {
itemProcessor = new MockProcessor();
// create and set up module
module = new RestartableItemProviderTasklet();
module = new RestartableItemOrientedTasklet();
module.setItemProvider(itemProvider);
module.setItemProcessor(itemProcessor);
@@ -134,7 +134,7 @@ public class RestartableItemProviderTaskletTests extends TestCase {
public void testRestartFromNotRestartable() {
// create and set up module
module = new RestartableItemProviderTasklet();
module = new RestartableItemOrientedTasklet();
module.setItemProvider(null);
module.setItemProcessor(null);

View File

@@ -16,10 +16,10 @@
<bean id="step1" class="org.springframework.batch.execution.step.SimpleStepConfiguration">
<constructor-arg>
<bean
class="org.springframework.batch.execution.tasklet.ItemProviderProcessTasklet">
class="org.springframework.batch.execution.tasklet.ItemOrientedTasklet">
<property name="itemProvider">
<bean
class="org.springframework.batch.item.provider.ListItemProvider">
class="org.springframework.batch.item.provider.ListItemReader">
<constructor-arg value="foo,bar,spam"/>
</bean>
</property>

View File

@@ -18,10 +18,10 @@
<bean id="step1" class="org.springframework.batch.execution.step.SimpleStepConfiguration">
<constructor-arg>
<bean
class="org.springframework.batch.execution.tasklet.ItemProviderProcessTasklet">
class="org.springframework.batch.execution.tasklet.ItemOrientedTasklet">
<property name="itemProvider">
<bean
class="org.springframework.batch.item.provider.ListItemProvider">
class="org.springframework.batch.item.provider.ListItemReader">
<constructor-arg value="foo,bar,spam"/>
</bean>
</property>