OPEN - issue BATCH-320: Refactor ItemWriter as primary collaborator (with wrapper for processor)

http://jira.springframework.org/browse/BATCH-320

Half way there - tests OK, but some naming and tidying up to do.
This commit is contained in:
dsyer
2008-01-28 22:37:46 +00:00
parent 8c1210f5da
commit 0e27ea6660
89 changed files with 585 additions and 719 deletions

View File

@@ -21,6 +21,7 @@ import org.springframework.batch.io.Skippable;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemRecoverer;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.repeat.ExitStatus;
import org.springframework.batch.retry.RetryPolicy;
import org.springframework.batch.retry.callback.ItemReaderRetryCallback;
@@ -86,7 +87,7 @@ public class ItemOrientedTasklet implements Tasklet, Skippable, InitializingBean
protected ItemReader itemProvider;
protected ItemProcessor itemProcessor;
protected ItemWriter itemWriter;
private ItemRecoverer itemRecoverer;
@@ -101,7 +102,7 @@ public class ItemOrientedTasklet implements Tasklet, Skippable, InitializingBean
*/
public void afterPropertiesSet() throws Exception {
Assert.notNull(itemProvider, "ItemReader must be provided");
Assert.notNull(itemProcessor, "ItemProcessor must be provided");
Assert.notNull(itemWriter, "ItemProcessor must be provided");
if (itemRecoverer == null && (itemProvider instanceof ItemRecoverer)) {
itemRecoverer = (ItemRecoverer) itemProvider;
@@ -111,7 +112,7 @@ public class ItemOrientedTasklet implements Tasklet, Skippable, InitializingBean
template.setRetryPolicy(itemProviderRetryPolicy);
if (retryPolicy != null) {
retryCallback = new ItemReaderRetryCallback(itemProvider, itemProcessor);
retryCallback = new ItemReaderRetryCallback(itemProvider, itemWriter);
retryCallback.setRecoverer(itemRecoverer);
}
@@ -139,7 +140,7 @@ public class ItemOrientedTasklet implements Tasklet, Skippable, InitializingBean
return ExitStatus.FINISHED;
}
try {
itemProcessor.process(item);
itemWriter.write(item);
}
catch (Exception e) {
if (itemRecoverer != null) {
@@ -164,10 +165,10 @@ public class ItemOrientedTasklet implements Tasklet, Skippable, InitializingBean
}
/**
* @param moduleProcessor
* @param writer
*/
public void setItemProcessor(ItemProcessor moduleProcessor) {
this.itemProcessor = moduleProcessor;
public void setItemWriter(ItemWriter writer) {
this.itemWriter = writer;
}
/**
@@ -197,8 +198,8 @@ public class ItemOrientedTasklet implements Tasklet, Skippable, InitializingBean
if (this.itemProvider instanceof Skippable) {
((Skippable) this.itemProvider).skip();
}
if (this.itemProcessor instanceof Skippable) {
((Skippable) this.itemProcessor).skip();
if (this.itemWriter instanceof Skippable) {
((Skippable) this.itemWriter).skip();
}
}

View File

@@ -51,8 +51,8 @@ public class RestartableItemOrientedTasklet extends ItemOrientedTasklet implemen
itemProviderRestartData = ((Restartable) itemProvider).getRestartData();
}
if (itemProcessor instanceof Restartable) {
itemProcessorRestartData = ((Restartable) itemProcessor).getRestartData();
if (itemWriter instanceof Restartable) {
itemProcessorRestartData = ((Restartable) itemWriter).getRestartData();
}
RestartableItemOrientedTaskletRestartData restartData = new RestartableItemOrientedTaskletRestartData(itemProviderRestartData, itemProcessorRestartData);
@@ -79,8 +79,8 @@ public class RestartableItemOrientedTasklet extends ItemOrientedTasklet implemen
if (itemProvider instanceof Restartable) {
((Restartable) itemProvider).restoreFrom(moduleRestartData.providerData);
}
if (itemProcessor instanceof Restartable) {
((Restartable) itemProcessor).restoreFrom(moduleRestartData.processorData);
if (itemWriter instanceof Restartable) {
((Restartable) itemWriter).restoreFrom(moduleRestartData.processorData);
}
}

View File

@@ -21,18 +21,18 @@ import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.support.transaction.TransactionAwareProxyFactory;
import org.springframework.beans.factory.InitializingBean;
public class EmptyItemProcessor implements ItemProcessor, InitializingBean {
public class EmptyItemWriter implements ItemWriter, InitializingBean {
private boolean failed = false;
// point at which to fail...
private int failurePoint = Integer.MAX_VALUE;
protected Log logger = LogFactory.getLog(EmptyItemProcessor.class);
protected Log logger = LogFactory.getLog(EmptyItemWriter.class);
List list;
@@ -45,7 +45,7 @@ public class EmptyItemProcessor implements ItemProcessor, InitializingBean {
this.failurePoint = failurePoint;
}
public void process(Object data) {
public void write(Object data) {
if (!failed && list.size() == failurePoint) {
failed = true;
throw new RuntimeException("Failed processing: [" + data + "]");

View File

@@ -38,9 +38,9 @@ import org.springframework.batch.execution.repository.dao.MapStepDao;
import org.springframework.batch.execution.step.SimpleStep;
import org.springframework.batch.execution.step.simple.SimpleStepExecutor;
import org.springframework.batch.execution.tasklet.ItemOrientedTasklet;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemRecoverer;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.reader.ListItemReader;
import org.springframework.batch.repeat.RepeatContext;
import org.springframework.batch.repeat.exception.handler.ExceptionHandler;
@@ -59,8 +59,8 @@ public class SimpleJobTests extends TestCase {
private List processed = new ArrayList();
private ItemProcessor processor = new ItemProcessor() {
public void process(Object data) throws Exception {
private ItemWriter processor = new ItemWriter() {
public void write(Object data) throws Exception {
processed.add((String) data);
}
};
@@ -103,7 +103,7 @@ public class SimpleJobTests extends TestCase {
}
});
module.setItemReader(provider);
module.setItemProcessor(processor);
module.setItemWriter(processor);
module.afterPropertiesSet();
return module;
}
@@ -155,8 +155,8 @@ public class SimpleJobTests extends TestCase {
*/
final ItemOrientedTasklet module = getTasklet(new String[] { "foo", "bar", "spam" });
Step step = new SimpleStep(module);
module.setItemProcessor(new ItemProcessor() {
public void process(Object data) throws Exception {
module.setItemWriter(new ItemWriter() {
public void write(Object data) throws Exception {
throw new RuntimeException("Try again Dummy!");
}
});
@@ -178,8 +178,8 @@ public class SimpleJobTests extends TestCase {
Job jobConfiguration = new Job();
final ItemOrientedTasklet module = getTasklet(new String[] { "foo", "bar", "spam" });
Step step = new SimpleStep(module);
module.setItemProcessor(new ItemProcessor() {
public void process(Object data) throws Exception {
module.setItemWriter(new ItemWriter() {
public void write(Object data) throws Exception {
throw new RuntimeException("Foo");
}
});

View File

@@ -41,8 +41,8 @@ import org.springframework.batch.execution.scope.StepScope;
import org.springframework.batch.execution.scope.StepSynchronizationManager;
import org.springframework.batch.execution.step.SimpleStep;
import org.springframework.batch.execution.tasklet.ItemOrientedTasklet;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.reader.ListItemReader;
import org.springframework.batch.repeat.ExitStatus;
import org.springframework.batch.repeat.RepeatContext;
@@ -61,8 +61,8 @@ public class SimpleStepExecutorTests extends TestCase {
ArrayList processed = new ArrayList();
ItemProcessor processor = new ItemProcessor() {
public void process(Object data) throws Exception {
ItemWriter processor = new ItemWriter() {
public void write(Object data) throws Exception {
processed.add((String) data);
}
};
@@ -86,7 +86,7 @@ public class SimpleStepExecutorTests extends TestCase {
*/
private Tasklet getTasklet(String[] strings) throws Exception {
ItemOrientedTasklet module = new ItemOrientedTasklet();
module.setItemProcessor(processor);
module.setItemWriter(processor);
module.setItemReader(getReader(strings));
module.afterPropertiesSet();
return module;

View File

@@ -24,9 +24,9 @@ import java.util.Properties;
import junit.framework.TestCase;
import org.springframework.batch.io.Skippable;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemRecoverer;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.reader.AbstractItemReader;
import org.springframework.batch.repeat.context.RepeatContextSupport;
import org.springframework.batch.repeat.synch.RepeatSynchronizationManager;
@@ -59,8 +59,8 @@ public class ItemOrientedTaskletTests extends TestCase {
}
};
private ItemProcessor itemProcessor = new ItemProcessor() {
public void process(Object data) throws Exception {
private ItemWriter itemWriter = new ItemWriter() {
public void write(Object data) throws Exception {
list.add(data);
}
};
@@ -74,7 +74,7 @@ public class ItemOrientedTaskletTests extends TestCase {
// set up module
module.setItemReader(itemProvider);
module.setItemProcessor(itemProcessor);
module.setItemWriter(itemWriter);
module.afterPropertiesSet();
@@ -153,7 +153,7 @@ public class ItemOrientedTaskletTests extends TestCase {
public void testSkippablReaderProcessor() throws Exception {
module.setItemReader(new SkippableItemReader());
module.setItemProcessor(new SkippableItemProcessor());
module.setItemWriter(new SkippableItemWriter());
module.setItemRecoverer(null);
module.skip();
assertEquals(2, list.size());
@@ -178,8 +178,8 @@ public class ItemOrientedTaskletTests extends TestCase {
}
});
module.setItemProcessor(new ItemProcessor() {
public void process(Object data) throws Exception {
module.setItemWriter(new ItemWriter() {
public void write(Object data) throws Exception {
throw new RuntimeException("FOO");
}
});
@@ -215,8 +215,8 @@ public class ItemOrientedTaskletTests extends TestCase {
return "foo";
}
});
module.setItemProcessor(new ItemProcessor() {
public void process(Object data) throws Exception {
module.setItemWriter(new ItemWriter() {
public void write(Object data) throws Exception {
throw new RuntimeException("FOO");
}
});
@@ -252,7 +252,7 @@ public class ItemOrientedTaskletTests extends TestCase {
}
public void testInitialisationWithNullProcessor() throws Exception {
module.setItemProcessor(null);
module.setItemWriter(null);
try {
module.afterPropertiesSet();
} catch (IllegalArgumentException e) {
@@ -276,20 +276,20 @@ public class ItemOrientedTaskletTests extends TestCase {
}
}
private class SkippableItemProcessor implements ItemProcessor, Skippable,
private class SkippableItemWriter implements ItemWriter, Skippable,
StatisticsProvider {
String props = "foo=bar";
public SkippableItemProcessor() {
public SkippableItemWriter() {
super();
}
public SkippableItemProcessor(String props) {
public SkippableItemWriter(String props) {
this();
this.props = props;
}
public void process(Object data) throws Exception {
public void write(Object data) throws Exception {
// no-op
}

View File

@@ -20,9 +20,8 @@ import java.util.Properties;
import junit.framework.TestCase;
import org.springframework.batch.execution.tasklet.RestartableItemOrientedTasklet;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.restart.GenericRestartData;
import org.springframework.batch.restart.RestartData;
import org.springframework.batch.restart.Restartable;
@@ -66,7 +65,7 @@ public class RestartableItemOrientedTaskletTests extends TestCase {
}
private static class MockProcessor implements ItemProcessor, Restartable {
private static class MockWriter implements ItemWriter, Restartable {
RestartData data = new RestartData() {
public Properties getProperties() {
@@ -74,7 +73,7 @@ public class RestartableItemOrientedTaskletTests extends TestCase {
}
};
public void process(Object data) {
public void write(Object data) {
}
public RestartData getRestartData() {
@@ -90,7 +89,7 @@ public class RestartableItemOrientedTaskletTests extends TestCase {
private ItemReader itemProvider;
private ItemProcessor itemProcessor;
private ItemWriter itemWriter;
private RestartableItemOrientedTasklet module;
@@ -98,12 +97,12 @@ public class RestartableItemOrientedTaskletTests extends TestCase {
// create data provider and data processor
itemProvider = new MockProvider();
itemProcessor = new MockProcessor();
itemWriter = new MockWriter();
// create and set up module
module = new RestartableItemOrientedTasklet();
module.setItemReader(itemProvider);
module.setItemProcessor(itemProcessor);
module.setItemWriter(itemWriter);
// get restart data
RestartData data = module.getRestartData();
@@ -116,12 +115,12 @@ public class RestartableItemOrientedTaskletTests extends TestCase {
// create data provider and data processor
itemProvider = new MockProvider();
itemProcessor = new MockProcessor();
itemWriter = new MockWriter();
// create and set up module
module = new RestartableItemOrientedTasklet();
module.setItemReader(itemProvider);
module.setItemProcessor(itemProcessor);
module.setItemWriter(itemWriter);
// get restart data
RestartData data = module.getRestartData();
@@ -136,7 +135,7 @@ public class RestartableItemOrientedTaskletTests extends TestCase {
// create and set up module
module = new RestartableItemOrientedTasklet();
module.setItemReader(null);
module.setItemProcessor(null);
module.setItemWriter(null);
// get restart data
RestartData data = module.getRestartData();

View File

@@ -23,8 +23,8 @@
<constructor-arg value="foo,bar,spam"/>
</bean>
</property>
<property name="itemProcessor">
<bean class="org.springframework.batch.execution.launch.EmptyItemProcessor"/>
<property name="itemWriter">
<bean class="org.springframework.batch.execution.launch.EmptyItemWriter"/>
</property>
</bean>
</constructor-arg>

View File

@@ -19,8 +19,8 @@
<constructor-arg value="foo,bar,spam"/>
</bean>
</property>
<property name="itemProcessor">
<bean class="org.springframework.batch.execution.launch.EmptyItemProcessor"/>
<property name="itemWriter">
<bean class="org.springframework.batch.execution.launch.EmptyItemWriter"/>
</property>
</bean>
</constructor-arg>

View File

@@ -25,8 +25,8 @@
<constructor-arg value="foo,bar,spam"/>
</bean>
</property>
<property name="itemProcessor">
<bean class="org.springframework.batch.execution.launch.EmptyItemProcessor"/>
<property name="itemWriter">
<bean class="org.springframework.batch.execution.launch.EmptyItemWriter"/>
</property>
</bean>
</constructor-arg>