IN PROGRESS - issue BATCH-213: Rename OutputSource as ItemWriter

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

Renamed the classes and interfaces.
This commit is contained in:
dsyer
2007-11-21 09:07:36 +00:00
parent 1badc11b97
commit 5bc423461d
32 changed files with 740 additions and 89 deletions

View File

@@ -24,12 +24,12 @@ package org.springframework.batch.io;
*
* @author Dave Syer
*/
public interface OutputSource {
public interface ItemWriter {
/**
* Writes provided value object to an output stream or similar.
* Writes provided object to an output stream or similar.
*
* @param output the value object
* @param item the object to write.
*/
public void write(Object output);
public void write(Object item);
}

View File

@@ -0,0 +1,547 @@
/*
* Copyright 2006-2007 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.batch.io.file.support;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.Channels;
import java.nio.channels.FileChannel;
import java.nio.charset.UnsupportedCharsetException;
import java.util.Collection;
import java.util.Iterator;
import java.util.Properties;
import org.springframework.batch.io.ItemWriter;
import org.springframework.batch.io.exception.BatchCriticalException;
import org.springframework.batch.io.exception.BatchEnvironmentException;
import org.springframework.batch.io.file.support.transform.Converter;
import org.springframework.batch.io.support.AbstractTransactionalIoSource;
import org.springframework.batch.item.ResourceLifecycle;
import org.springframework.batch.restart.GenericRestartData;
import org.springframework.batch.restart.RestartData;
import org.springframework.batch.restart.Restartable;
import org.springframework.batch.statistics.StatisticsProvider;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.core.io.Resource;
import org.springframework.dao.DataAccessResourceFailureException;
import org.springframework.util.Assert;
/**
* This class is an output target that writes data to a file or stream. The
* output source also provides restart, statistics and transaction features by
* implementing corresponding interfaces where possible (with a file). The
* location of the file is defined by a {@link Resource} and must represent a
* writable file.<br/>
*
* Uses buffered writer to improve performance.<br/>
*
* Use {@link #write(String)} method to output a line to an output source.
*
* @author Waseem Malik
* @author Tomas Slanina
* @author Robert Kasanicky
* @author Dave Syer
*/
public class FlatFileItemWriter extends AbstractTransactionalIoSource implements
ItemWriter, ResourceLifecycle, Restartable, StatisticsProvider, InitializingBean,
DisposableBean {
/**
* @author dsyer
*
*/
public static class BooleanHolder {
public boolean value;
}
private static final String LINE_SEPARATOR = System.getProperty("line.separator");
public static final String WRITTEN_STATISTICS_NAME = "Written";
public static final String RESTART_COUNT_STATISTICS_NAME = "Restart count";
public static final String RESTART_DATA_NAME = "flatfileoutputtemplate.currentLine";
private Resource resource;
private Properties statistics = new Properties();
private RestartData restartData = new GenericRestartData(new Properties());
private OutputState state = new OutputState();
private Converter converter = new Converter() {
public Object convert(Object input) {
return "" + input;
}
};
public void afterPropertiesSet() throws Exception {
Assert.notNull(resource);
File file = resource.getFile();
Assert.state(!file.exists() || file.canWrite(), "Resource is not writable: [" + resource + "]");
}
/**
* Public setter for the converter. If not-null this will be used to convert
* the input data before it is output.
*
* @param converter the converter to set
*/
public void setConverter(Converter converter) {
this.converter = converter;
}
/**
* Setter for resource. Represents a file that can be written.
*
* @param resource
*/
public void setResource(Resource resource) {
this.resource = resource;
}
/**
* Commit the transaction.
*/
protected void transactionCommitted() {
getOutputState().mark();
}
/**
* Rollback the transaction.
*/
protected void transactionRolledBack() {
getOutputState().checkFileSize();
resetPositionForRestart();
}
// This method removes any information in the file before this reset point.
private void resetPositionForRestart() {
getOutputState().truncate();
}
/**
* Writes out a string followed by a "new line", where the format of the new
* line separator is determined by the underlying operating system. If the
* input is not a String and a converter is available the converter will be
* applied and then this method recursively called with the result. If the
* input is an array or collection each value will be written to a separate
* line (recursively calling this method for each value). If no converter is
* supplied the input object's toString method will be used.<br/>
*
* @param data Object (a String or Object that can be converted) to be
* written to output stream
*/
public void write(Object data) {
convertAndWrite(data, new BooleanHolder());
}
/**
* Convert the date to a format that can be output and then write it out.
* @param data
* @param converted
*/
private void convertAndWrite(Object data, BooleanHolder converted) {
if (data instanceof Collection) {
converted.value = false;
for (Iterator iterator = ((Collection) data).iterator(); iterator.hasNext();) {
Object value = (Object) iterator.next();
// (recursive)
write(value);
}
return;
}
if (data.getClass().isArray()) {
converted.value = false;
Object[] array = (Object[]) data;
for (int i = 0; i < array.length; i++) {
Object value = array[i];
// (recursive)
write(value);
}
return;
}
if (data instanceof String) {
// This is where the output stream is actually written to
getOutputState().write(data + LINE_SEPARATOR);
}
else if (!converted.value) {
// (recursive)
converted.value = true;
convertAndWrite(converter.convert(data), converted);
return;
}
else {
// Should not happen...
throw new IllegalStateException(
"Infinite loop detected - converter did not convert to String or collection/array of objects convertible to String.");
}
}
/**
* @see ResourceLifecycle#close()
*/
public void close() {
getOutputState().close();
}
/**
* Calls close to ensure that bean factories can close and always release
* resources.
*
* @see org.springframework.beans.factory.DisposableBean#destroy()
*/
public void destroy() throws Exception {
close();
}
/**
* Sets encoding for output template.
*/
public void setEncoding(String newEncoding) {
getOutputState().setEncoding(newEncoding);
}
/**
* Sets buffer size for output template
*/
public void setBufferSize(int newSize) {
getOutputState().setBufferSize(newSize);
}
/**
* @param shouldDeleteIfExists the shouldDeleteIfExists to set
*/
public void setShouldDeleteIfExists(boolean shouldDeleteIfExists) {
getOutputState().setShouldDeleteIfExists(shouldDeleteIfExists);
}
/**
* Initialize the Output Template.
* @see ResourceLifecycle#open()
*/
public void open() {
super.registerSynchronization();
}
/**
* @see StatisticsProvider
*/
public Properties getStatistics() {
final OutputState os = getOutputState();
statistics.setProperty(WRITTEN_STATISTICS_NAME, String.valueOf(os.linesWritten));
statistics.setProperty(RESTART_COUNT_STATISTICS_NAME, String.valueOf(os.restartCount));
return statistics;
}
/**
* @see Restartable#getRestartData()
*/
public RestartData getRestartData() {
final OutputState os = getOutputState();
restartData.getProperties().setProperty(RESTART_DATA_NAME, String.valueOf(os.position()));
return restartData;
}
/**
* @see Restartable#restoreFrom(RestartData)
*/
public void restoreFrom(RestartData data) {
if (data == null)
return;
getOutputState().restoreFrom(data.getProperties());
}
// Returns object representing state.
private OutputState getOutputState() {
return (OutputState) state;
}
/**
* Encapsulates the runtime state of the output source. All state changing
* operations on the output source go through this class.
*/
private class OutputState {
// default encoding for writing to output files - set to UTF-8.
private static final String DEFAULT_CHARSET = "UTF-8";
private static final int DEFAULT_BUFFER_SIZE = 2048;
// The bufferedWriter over the file channel that is actually written
BufferedWriter outputBufferedWriter;
FileChannel fileChannel;
// this represents the charset encoding (if any is needed) for the
// output file
String encoding = DEFAULT_CHARSET;
// Optional write buffer size
int bufferSize = DEFAULT_BUFFER_SIZE;
boolean restarted = false;
boolean initialized = false;
long lastMarkedByteOffsetPosition = 0;
long linesWritten = 0;
long restartCount = 0;
boolean shouldDeleteIfExists = true;
/**
* Return the byte offset position of the cursor in the output file as a
* long integer.
*/
public long position() {
long pos = 0;
if (fileChannel == null) {
return 0;
}
try {
outputBufferedWriter.flush();
pos = fileChannel.position();
}
catch (IOException e) {
throw new BatchCriticalException("An Error occured while trying to get filechannel position", e);
}
return pos;
}
/**
* @param properties
*/
public void restoreFrom(Properties properties) {
lastMarkedByteOffsetPosition = Long.parseLong(properties.getProperty(RESTART_DATA_NAME));
restarted = true;
}
/**
* @param shouldDeleteIfExists2
*/
public void setShouldDeleteIfExists(boolean shouldDeleteIfExists) {
this.shouldDeleteIfExists = shouldDeleteIfExists;
}
/**
* @param newSize
*/
public void setBufferSize(int newSize) {
bufferSize = newSize;
}
/**
* @param newEncoding
*/
public void setEncoding(String newEncoding) {
encoding = newEncoding;
}
/**
* Close the open resource and reset counters.
*/
public void close() {
initialized = false;
restarted = false;
try {
if (outputBufferedWriter == null) {
return;
}
outputBufferedWriter.close();
fileChannel.close();
}
catch (IOException ioe) {
throw new BatchEnvironmentException("Unable to close the the Output Source", ioe);
}
}
/**
* @param data
* @param offset
* @param length
*/
public void write(String line) {
if (!initialized) {
initializeBufferedWriter();
}
try {
outputBufferedWriter.write(line);
outputBufferedWriter.flush();
linesWritten++;
}
catch (IOException e) {
throw new BatchCriticalException("An Error occured while trying to write to FileWriterOutputSource", e);
}
}
/**
* Truncate the output at the last known good point.
*/
public void truncate() {
try {
fileChannel.truncate(lastMarkedByteOffsetPosition);
fileChannel.position(lastMarkedByteOffsetPosition);
}
catch (Exception e) {
throw new BatchCriticalException("An Error occured while reseting position in a file for restart", e);
}
}
/**
* Mark the current position.
*/
public void mark() {
lastMarkedByteOffsetPosition = this.position();
}
/**
* Creates the buffered writer for the output file channel based on
* configuration information.
*/
private void initializeBufferedWriter() {
File file;
try {
file = resource.getFile();
// If the output source was restarted, keep existing file.
// If the output source was not restarted, check following:
// - if the file should be deleted, delete it if it was exiting
// and create blank file,
// - if the file should not be deleted, if it already exists,
// throw an exception,
// - if the file was not existing, create new.
if (!restarted) {
if (file.exists()) {
if (shouldDeleteIfExists) {
file.delete();
}
else {
throw new BatchEnvironmentException("Resource already exists: " + resource);
}
}
String parent = file.getParent();
if (parent!=null) {
new File(parent).mkdirs();
}
file.createNewFile();
}
}
catch (IOException ioe) {
throw new DataAccessResourceFailureException("Unable to write to file resource: [" + resource + "]",
ioe);
}
try {
fileChannel = (new FileOutputStream(file.getAbsolutePath(), true)).getChannel();
}
catch (FileNotFoundException fnfe) {
throw new BatchEnvironmentException("Bad filename property parameter " + file, fnfe);
}
outputBufferedWriter = getBufferedWriter(fileChannel, encoding, bufferSize);
// in case of restarting reset position to last commited point
if (restarted) {
this.resetPosition();
}
initialized = true;
linesWritten = 0;
}
/**
* Returns the buffered writer opened to the beginning of the file
* specified by the absolute path name contained in absoluteFileName.
*/
private BufferedWriter getBufferedWriter(FileChannel fileChannel, String encoding, int bufferSize) {
try {
BufferedWriter outputBufferedWriter = null;
// If a buffer was requested, allocate.
if (bufferSize > 0) {
outputBufferedWriter = new BufferedWriter(Channels.newWriter(fileChannel, encoding), bufferSize);
}
else {
outputBufferedWriter = new BufferedWriter(Channels.newWriter(fileChannel, encoding));
}
return outputBufferedWriter;
}
catch (UnsupportedCharsetException ucse) {
throw new BatchEnvironmentException("Bad encoding configuration for output file " + fileChannel, ucse);
}
}
/**
* Resets the file writer's current position to the point stored in the
* last marked byte offset position variable. It first checks to make
* sure the current size of the file is not less than the byte position
* to be moved to (if it is, throws an environment exception), then it
* truncates the file to that reset position, and set the cursor to
* start writing at that point.
*/
private void resetPosition() {
checkFileSize();
resetPositionForRestart();
}
/**
* Checks (on setState) to make sure that the current output file's size
* is not smaller than the last saved commit point. If it is, then the
* file has been damaged in some way and whole task must be started over
* again from the beginning.
*/
public void checkFileSize() {
long size = -1;
try {
outputBufferedWriter.flush();
size = fileChannel.size();
}
catch (Exception e) {
throw new BatchCriticalException("An Error occured while checking file size", e);
}
if (size < lastMarkedByteOffsetPosition) {
throw new BatchCriticalException("Current file size is smaller than size at last commit");
}
}
}
}

View File

@@ -14,7 +14,7 @@ import javax.xml.stream.XMLEventWriter;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import org.springframework.batch.io.OutputSource;
import org.springframework.batch.io.ItemWriter;
import org.springframework.batch.io.file.support.stax.NoStartEndDocumentStreamWriter;
import org.springframework.batch.io.file.support.stax.ObjectToXmlSerializer;
import org.springframework.batch.io.support.FileUtils;
@@ -34,7 +34,7 @@ import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
/**
* StaxEventWriterOutputSource is implementation of {@link OutputSource} which uses
* StaxEventWriterOutputSource is implementation of {@link ItemWriter} which uses
* StAX and {@link ObjectToXmlSerializer} for serializing object to XML.
*
* This output source also provides restart, statistics and transaction
@@ -43,7 +43,7 @@ import org.springframework.util.CollectionUtils;
* @author Peter Zozom
*
*/
public class StaxEventWriterOutputSource implements OutputSource, ResourceLifecycle, Restartable,
public class StaxEventWriterItemWriter implements ItemWriter, ResourceLifecycle, Restartable,
StatisticsProvider, InitializingBean, DisposableBean {
// default encoding
@@ -367,7 +367,7 @@ public class StaxEventWriterOutputSource implements OutputSource, ResourceLifecy
* Write the value object to XML stream.
*
* @param output the value object
* @see org.springframework.batch.io.OutputSource#write(java.lang.Object)
* @see org.springframework.batch.io.ItemWriter#write(java.lang.Object)
*/
public void write(Object output) {

View File

@@ -16,7 +16,7 @@
package org.springframework.batch.io.support;
import org.springframework.batch.io.InputSource;
import org.springframework.batch.io.OutputSource;
import org.springframework.batch.io.ItemWriter;
import org.springframework.batch.repeat.synch.BatchTransactionSynchronizationManager;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.transaction.support.TransactionSynchronization;
@@ -25,7 +25,7 @@ import org.springframework.transaction.support.TransactionSynchronizationManager
/**
* <p>Abstract class that abstracts away transaction handling from input and output sources.
* Since every {@link InputSource} or {@link OutputSource by nature wants to be notified of
* Since every {@link InputSource} or {@link ItemWriter by nature wants to be notified of
* transaction events to maintain the contract that all calls to read or write will ensure
* that correct ordering is maintained regardless of rollbacks.</p>
*

View File

@@ -0,0 +1,104 @@
package org.springframework.batch.item.processor;
import java.util.Properties;
import org.springframework.batch.io.ItemWriter;
import org.springframework.batch.io.Skippable;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.restart.GenericRestartData;
import org.springframework.batch.restart.RestartData;
import org.springframework.batch.restart.Restartable;
import org.springframework.batch.statistics.StatisticsProvider;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.Assert;
/**
* Simple wrapper around {@link ItemWriter} providing {@link Restartable} and
* {@link StatisticsProvider} where the {@link ItemWriter} does.
*
* @author Dave Syer
* @author Robert Kasanicky
*/
public class ItemWriterItemProcessor implements ItemProcessor, Restartable, Skippable,
StatisticsProvider, InitializingBean {
private ItemWriter source;
/**
* Calls {@link #doProcess(Object)} and then writes the result to the output source.
*
* @see org.springframework.batch.item.ItemProcessor#process(java.lang.Object)
*/
final public void process(Object item) throws Exception {
Object result = doProcess(item);
source.write(result);
}
/**
* By default returns the argument. This method is an extension point
* meant to be overridden by subclasses that implement processing logic.
*/
protected Object doProcess(Object item) {
return item;
}
/**
* Setter for output source.
*/
public void setOutputSource(ItemWriter source) {
this.source = source;
}
/**
* @see Restartable#getRestartData()
*/
public RestartData getRestartData() {
Assert.state(source != null, "Source must not be null.");
if (source instanceof Restartable) {
return ((Restartable) source).getRestartData();
}
else{
return new GenericRestartData(new Properties());
}
}
/**
* @see Restartable#restoreFrom(RestartData)
*/
public void restoreFrom(RestartData data) {
Assert.state(source != null, "Source must not be null.");
if (source instanceof Restartable) {
((Restartable) source).restoreFrom(data);
}
}
/**
* @return delegates to the parent template of it is a
* {@link StatisticsProvider}, otherwise returns an empty
* {@link Properties} instance.
* @see StatisticsProvider#getStatistics()
*/
public Properties getStatistics() {
if (!(source instanceof StatisticsProvider)) {
return new Properties();
}
return ((StatisticsProvider) source).getStatistics();
}
public void skip() {
if (source instanceof Skippable) {
((Skippable)source).skip();
}
}
public void afterPropertiesSet() throws Exception {
Assert.notNull(source);
}
}

View File

@@ -1,15 +1,15 @@
package org.springframework.batch.item.processor;
import org.springframework.batch.io.OutputSource;
import org.springframework.batch.io.ItemWriter;
import org.springframework.util.Assert;
/**
* Transforms the item using injected {@link ItemTransformer}
* before it is written to output by {@link OutputSource}.
* before it is written to output by {@link ItemWriter}.
*
* @author Robert Kasanicky
*/
public class TransformerOutputSourceItemProcessor extends OutputSourceItemProcessor {
public class TransformerWriterItemProcessor extends ItemWriterItemProcessor {
private ItemTransformer itemTransformer;
@@ -22,7 +22,7 @@ public class TransformerOutputSourceItemProcessor extends OutputSourceItemProces
/**
* @param itemTransformer will transform the item before
* it is passed to {@link OutputSource}.
* it is passed to {@link ItemWriter}.
*/
public void setItemTransformer(ItemTransformer itemTransformer) {
this.itemTransformer = itemTransformer;

View File

@@ -32,7 +32,7 @@ import org.springframework.transaction.support.TransactionSynchronizationManager
import org.springframework.transaction.support.TransactionSynchronizationUtils;
/**
* Tests of regular usage for {@link FlatFileOutputSource} Exception cases will
* Tests of regular usage for {@link FlatFileItemWriter} Exception cases will
* be in separate TestCase classes with different <code>setUp</code> and
* <code>tearDown</code> methods
*
@@ -40,10 +40,10 @@ import org.springframework.transaction.support.TransactionSynchronizationUtils;
* @author Dave Syer
*
*/
public class FlatFileOutputSourceTests extends TestCase {
public class FlatFileItemWriterTests extends TestCase {
// object under test
private FlatFileOutputSource inputSource = new FlatFileOutputSource();
private FlatFileItemWriter inputSource = new FlatFileItemWriter();
// String to be written into file by the FlatFileInputTemplate
private static final String TEST_STRING = "FlatFileOutputTemplateTest-OutputData";
@@ -351,7 +351,7 @@ public class FlatFileOutputSourceTests extends TestCase {
}
public void testAfterPropertiesSetChecksMandatory() throws Exception {
inputSource = new FlatFileOutputSource();
inputSource = new FlatFileItemWriter();
try {
inputSource.afterPropertiesSet();
fail("Expected IllegalArgumentException");
@@ -362,7 +362,7 @@ public class FlatFileOutputSourceTests extends TestCase {
}
public void testDefaultRestartData() throws Exception {
inputSource = new FlatFileOutputSource();
inputSource = new FlatFileItemWriter();
RestartData restartData = inputSource.getRestartData();
assertNotNull(restartData);
// TODO: assert the properties of the default restart data

View File

@@ -11,7 +11,7 @@ import javax.xml.transform.Result;
import junit.framework.TestCase;
import org.apache.commons.io.FileUtils;
import org.springframework.batch.io.file.support.StaxEventWriterOutputSource;
import org.springframework.batch.io.file.support.StaxEventWriterItemWriter;
import org.springframework.batch.io.file.support.oxm.MarshallingObjectToXmlSerializer;
import org.springframework.batch.restart.RestartData;
import org.springframework.core.io.FileSystemResource;
@@ -25,10 +25,10 @@ import org.springframework.xml.transform.StaxResult;
/**
* Tests for {@link StaxStreamWriterOutputSource}.
*/
public class StaxEventWriterOutputSourceTests extends TestCase {
public class StaxEventWriterItemWriterTests extends TestCase {
// object under test
private StaxEventWriterOutputSource source;
private StaxEventWriterItemWriter source;
// output file
private Resource resource;
@@ -119,7 +119,7 @@ public class StaxEventWriterOutputSourceTests extends TestCase {
final int NUMBER_OF_RECORDS = 10;
for (int i = 0; i < NUMBER_OF_RECORDS; i++) {
String writeStatistics =
source.getStatistics().getProperty(StaxEventWriterOutputSource.WRITE_STATISTICS_NAME);
source.getStatistics().getProperty(StaxEventWriterItemWriter.WRITE_STATISTICS_NAME);
assertEquals(String.valueOf(i), writeStatistics);
source.write(record);
@@ -188,8 +188,8 @@ public class StaxEventWriterOutputSourceTests extends TestCase {
/**
* @return new instance of fully configured output source
*/
private StaxEventWriterOutputSource newOutputSource() throws Exception {
StaxEventWriterOutputSource source = new StaxEventWriterOutputSource();
private StaxEventWriterItemWriter newOutputSource() throws Exception {
StaxEventWriterItemWriter source = new StaxEventWriterItemWriter();
source.setResource(resource);
Marshaller marshaller = new SimpleMarshaller();

View File

@@ -21,9 +21,9 @@ import java.util.Properties;
import junit.framework.TestCase;
import org.springframework.batch.io.OutputSource;
import org.springframework.batch.io.ItemWriter;
import org.springframework.batch.io.Skippable;
import org.springframework.batch.item.processor.OutputSourceItemProcessor;
import org.springframework.batch.item.processor.ItemWriterItemProcessor;
import org.springframework.batch.restart.GenericRestartData;
import org.springframework.batch.restart.RestartData;
import org.springframework.batch.restart.Restartable;
@@ -34,11 +34,11 @@ import org.springframework.batch.support.PropertiesConverter;
* @author Dave Syer
*
*/
public class OutputSourceItemProcessorTests extends TestCase {
public class ItemWriterItemProcessorTests extends TestCase {
private OutputSourceItemProcessor processor = new OutputSourceItemProcessor();
private ItemWriterItemProcessor processor = new ItemWriterItemProcessor();
private OutputSource source;
private ItemWriter source;
/*
* (non-Javadoc)
@@ -147,7 +147,7 @@ public class OutputSourceItemProcessorTests extends TestCase {
* @author Dave Syer
*
*/
public class MockOutputSource implements OutputSource, StatisticsProvider, Restartable, Skippable {
public class MockOutputSource implements ItemWriter, StatisticsProvider, Restartable, Skippable {
private String value;

View File

@@ -3,26 +3,26 @@ package org.springframework.batch.item.processor;
import junit.framework.TestCase;
import org.easymock.MockControl;
import org.springframework.batch.io.OutputSource;
import org.springframework.batch.io.ItemWriter;
/**
* Tests for {@link TransformerOutputSourceItemProcessor}.
* Tests for {@link TransformerWriterItemProcessor}.
*
* @author Robert Kasanicky
*/
public class TransformerOutputSourceItemProcessorTests extends TestCase {
public class TransformerWriterItemProcessorTests extends TestCase {
private TransformerOutputSourceItemProcessor processor = new TransformerOutputSourceItemProcessor();
private TransformerWriterItemProcessor processor = new TransformerWriterItemProcessor();
private ItemTransformer transformer;
private OutputSource outputSource;
private ItemWriter outputSource;
private MockControl tControl = MockControl.createControl(ItemTransformer.class);
private MockControl outControl = MockControl.createControl(OutputSource.class);
private MockControl outControl = MockControl.createControl(ItemWriter.class);
protected void setUp() throws Exception {
transformer = (ItemTransformer) tControl.getMock();
outputSource = (OutputSource) outControl.getMock();
outputSource = (ItemWriter) outControl.getMock();
processor.setItemTransformer(transformer);
processor.setOutputSource(outputSource);

View File

@@ -11,7 +11,7 @@ import junit.framework.TestCase;
import org.custommonkey.xmlunit.XMLAssert;
import org.custommonkey.xmlunit.XMLUnit;
import org.springframework.batch.io.file.support.StaxEventWriterOutputSource;
import org.springframework.batch.io.file.support.StaxEventWriterItemWriter;
import org.springframework.batch.io.file.support.oxm.MarshallingObjectToXmlSerializer;
import org.springframework.batch.io.oxm.domain.Trade;
import org.springframework.core.io.ClassPathResource;
@@ -19,9 +19,9 @@ import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.oxm.Marshaller;
public abstract class AbstractStaxEventWriterOutputSourceTests extends TestCase {
public abstract class AbstractStaxEventWriterItemWriterTests extends TestCase {
private StaxEventWriterOutputSource source = new StaxEventWriterOutputSource();
private StaxEventWriterItemWriter source = new StaxEventWriterItemWriter();
private Resource resource;

View File

@@ -4,7 +4,7 @@ import org.springframework.core.io.ClassPathResource;
import org.springframework.oxm.Marshaller;
import org.springframework.oxm.castor.CastorMarshaller;
public class CastorMarshallingTests extends AbstractStaxEventWriterOutputSourceTests {
public class CastorMarshallingTests extends AbstractStaxEventWriterItemWriterTests {
protected Marshaller getMarshaller() throws Exception {

View File

@@ -5,7 +5,7 @@ import org.springframework.oxm.Marshaller;
import org.springframework.oxm.xstream.XStreamMarshaller;
public class XStreamMarshallingTests extends
AbstractStaxEventWriterOutputSourceTests {
AbstractStaxEventWriterItemWriterTests {
protected Marshaller getMarshaller() throws Exception {
XStreamMarshaller marshaller = new XStreamMarshaller();

View File

@@ -16,7 +16,7 @@
package org.springframework.batch.sample.dao;
import org.springframework.batch.io.OutputSource;
import org.springframework.batch.io.ItemWriter;
import org.springframework.batch.sample.domain.CustomerCredit;
/**
@@ -24,7 +24,7 @@ import org.springframework.batch.sample.domain.CustomerCredit;
*
* @author Robert Kasanicky
*/
public interface CustomerCreditWriter extends OutputSource {
public interface CustomerCreditWriter extends ItemWriter {
void write(CustomerCredit customerCredit);

View File

@@ -16,7 +16,7 @@
package org.springframework.batch.sample.dao;
import org.springframework.batch.io.OutputSource;
import org.springframework.batch.io.ItemWriter;
import org.springframework.batch.item.ResourceLifecycle;
import org.springframework.batch.sample.domain.CustomerCredit;
import org.springframework.beans.factory.DisposableBean;
@@ -30,7 +30,7 @@ import org.springframework.beans.factory.DisposableBean;
public class FlatFileCustomerCreditWriter implements CustomerCreditWriter,
DisposableBean {
private OutputSource outputSource;
private ItemWriter outputSource;
private String separator = "\t";
@@ -52,7 +52,7 @@ public class FlatFileCustomerCreditWriter implements CustomerCreditWriter,
this.separator = separator;
}
public void setOutputSource(OutputSource outputSource) {
public void setOutputSource(ItemWriter outputSource) {
this.outputSource = outputSource;
}

View File

@@ -16,7 +16,7 @@
package org.springframework.batch.sample.dao;
import org.springframework.batch.io.OutputSource;
import org.springframework.batch.io.ItemWriter;
import org.springframework.batch.io.file.support.transform.Converter;
import org.springframework.batch.sample.domain.Order;
@@ -32,7 +32,7 @@ public class FlatFileOrderWriter implements OrderWriter {
/**
* Takes care of writing to a file
*/
private OutputSource outputSource;
private ItemWriter outputSource;
/**
* Converter for order
@@ -55,7 +55,7 @@ public class FlatFileOrderWriter implements OrderWriter {
outputSource.write(converter.convert(data));
}
public void setOutputSource(OutputSource outputSource) {
public void setOutputSource(ItemWriter outputSource) {
this.outputSource = outputSource;
}

View File

@@ -15,7 +15,7 @@
*/
package org.springframework.batch.sample.dao;
import org.springframework.batch.io.OutputSource;
import org.springframework.batch.io.ItemWriter;
import org.springframework.batch.sample.domain.CustomerCredit;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
@@ -24,7 +24,7 @@ import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
*
*/
public class IbatisCustomerCreditWriter extends SqlMapClientDaoSupport
implements CustomerCreditWriter, OutputSource {
implements CustomerCreditWriter, ItemWriter {
String statementId;

View File

@@ -1,11 +1,11 @@
package org.springframework.batch.sample.dao;
import org.springframework.batch.io.OutputSource;
import org.springframework.batch.io.ItemWriter;
import org.springframework.batch.sample.domain.NflGame;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.util.Assert;
public class SqlNflGameDao extends JdbcDaoSupport implements OutputSource {
public class SqlNflGameDao extends JdbcDaoSupport implements ItemWriter {
private static final String INSERT_GAME = "INSERT into GAMES(player_id,year,team,week,opponent,"
+ "completes,attempts,passing_yards,passing_td,interceptions,rushes,rush_yards,"

View File

@@ -1,11 +1,11 @@
package org.springframework.batch.sample.dao;
import org.springframework.batch.io.OutputSource;
import org.springframework.batch.io.ItemWriter;
import org.springframework.batch.sample.domain.NflPlayerSummary;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.util.Assert;
public class SqlNflPlayerSummaryDao extends JdbcDaoSupport implements OutputSource {
public class SqlNflPlayerSummaryDao extends JdbcDaoSupport implements ItemWriter {
private static final String INSERT_SUMMARY = "INSERT into PLAYER_SUMMARY(ID,YEAR,COMPLETES,ATTEMPTS," +
"PASSING_YARDS,PASSING_TD,INTERCEPTIONS,RUSHES,RUSH_YARDS,RECEPTIONS,RECEPTIONS_YARDS," +

View File

@@ -16,7 +16,7 @@
package org.springframework.batch.sample.dao;
import org.springframework.batch.io.OutputSource;
import org.springframework.batch.io.ItemWriter;
import org.springframework.batch.sample.domain.Trade;
@@ -26,7 +26,7 @@ import org.springframework.batch.sample.domain.Trade;
*
* @author Robert Kasanicky
*/
public interface TradeWriter extends OutputSource{
public interface TradeWriter extends ItemWriter{
/**
* Write a trade object to some kind of output,
* different implementations can write to file, database etc.

View File

@@ -2,7 +2,7 @@ package org.springframework.batch.sample.item.processor;
import java.math.BigDecimal;
import org.springframework.batch.io.OutputSource;
import org.springframework.batch.io.ItemWriter;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.sample.domain.CustomerCredit;
@@ -15,7 +15,7 @@ public class CustomerCreditIncreaseProcessor implements ItemProcessor{
public static final BigDecimal FIXED_AMOUNT = new BigDecimal(1000);
private OutputSource outputSource;
private ItemWriter outputSource;
public void process(Object data) throws Exception {
CustomerCredit customerCredit = (CustomerCredit) data;
@@ -23,7 +23,7 @@ public class CustomerCreditIncreaseProcessor implements ItemProcessor{
outputSource.write(customerCredit);
}
public void setOutputSource(OutputSource outputSource) {
public void setOutputSource(ItemWriter outputSource) {
this.outputSource = outputSource;
}

View File

@@ -1,18 +1,18 @@
package org.springframework.batch.sample.item.processor;
import org.springframework.batch.io.file.support.FlatFileOutputSource;
import org.springframework.batch.io.file.support.FlatFileItemWriter;
import org.springframework.batch.item.ItemProcessor;
public class DefaultFlatFileProcessor implements ItemProcessor{
private FlatFileOutputSource flatFileOutputSource;
private FlatFileItemWriter flatFileItemWriter;
public void process(Object data) throws Exception {
flatFileOutputSource.write(""+data);
flatFileItemWriter.write(""+data);
}
public void setFlatFileOutputSource(FlatFileOutputSource flatFileOutputSource) {
this.flatFileOutputSource = flatFileOutputSource;
public void setFlatFileOutputSource(FlatFileItemWriter flatFileItemWriter) {
this.flatFileItemWriter = flatFileItemWriter;
}
}

View File

@@ -31,7 +31,7 @@
<property name="writer" ref="tradeDao" />
</bean>
<bean class="org.springframework.batch.item.processor.OutputSourceItemProcessor">
<bean class="org.springframework.batch.item.processor.ItemWriterItemProcessor">
<property name="outputSource" ref="flatFileOutputSource" />
</bean>
</list>
@@ -83,7 +83,7 @@
</property>
</bean>
<bean class="org.springframework.batch.io.file.support.FlatFileOutputSource" id="flatFileOutputSource">
<bean class="org.springframework.batch.io.file.support.FlatFileItemWriter" id="flatFileOutputSource">
<property name="resource" ref="customerFileLocator" />
</bean>

View File

@@ -28,7 +28,7 @@
class="org.springframework.batch.sample.item.processor.DefaultFlatFileProcessor">
<property name="flatFileOutputSource">
<bean
class="org.springframework.batch.io.file.support.FlatFileOutputSource"
class="org.springframework.batch.io.file.support.FlatFileItemWriter"
scope="step">
<aop:scoped-proxy />
<property name="resource"

View File

@@ -18,7 +18,7 @@
</property>
</bean>
<bean id="flatFileOutputSource" class="org.springframework.batch.io.file.support.FlatFileOutputSource"
<bean id="flatFileOutputSource" class="org.springframework.batch.io.file.support.FlatFileItemWriter"
scope="step" >
<aop:scoped-proxy />
<property name="resource" ref="fileOutputLocator" />

View File

@@ -66,7 +66,7 @@
</property>
<property name="itemProcessor">
<bean
class="org.springframework.batch.item.processor.OutputSourceItemProcessor">
class="org.springframework.batch.item.processor.ItemWriterItemProcessor">
<property name="outputSource">
<bean
class="org.springframework.batch.sample.dao.SqlNflGameDao">
@@ -96,7 +96,7 @@
</property>
<property name="itemProcessor">
<bean
class="org.springframework.batch.item.processor.OutputSourceItemProcessor">
class="org.springframework.batch.item.processor.ItemWriterItemProcessor">
<property name="outputSource">
<bean
class="org.springframework.batch.sample.dao.SqlNflPlayerSummaryDao">

View File

@@ -28,7 +28,7 @@
<aop:scoped-proxy />
<property name="outputSource">
<bean
class="org.springframework.batch.io.file.support.FlatFileOutputSource"
class="org.springframework.batch.io.file.support.FlatFileItemWriter"
id="customerFlatFileOutputSource">
<property name="resource" ref="customerFileLocator" />
</bean>

View File

@@ -40,7 +40,7 @@
</property>
<property name="itemProcessor">
<bean class="org.springframework.batch.item.processor.OutputSourceItemProcessor"
<bean class="org.springframework.batch.item.processor.ItemWriterItemProcessor"
p:outputSource-ref="tradeStaxWriter" />
</property>
</bean>
@@ -49,7 +49,7 @@
</property>
</bean>
<bean class="org.springframework.batch.io.file.support.StaxEventWriterOutputSource" id="tradeStaxWriter">
<bean class="org.springframework.batch.io.file.support.StaxEventWriterItemWriter" id="tradeStaxWriter">
<property name="resource" value="file:target/test-outputs/20070918.testStream.xmlFileStep.output.xml" />
<property name="serializer" ref="tradeMarshallingSerializer" />
<property name="rootTagName" value="trades" />

View File

@@ -2,7 +2,7 @@ package org.springframework.batch.sample.dao;
import java.math.BigDecimal;
import org.springframework.batch.io.OutputSource;
import org.springframework.batch.io.ItemWriter;
import org.springframework.batch.item.ResourceLifecycle;
import org.springframework.batch.sample.domain.CustomerCredit;
@@ -12,15 +12,15 @@ import junit.framework.TestCase;
public class FlatFileCustomerCreditWriterTests extends TestCase {
private MockControl outputControl;
private ResourceLifecycleOutputSource output;
private ResourceLifecycleItemWriter output;
private FlatFileCustomerCreditWriter writer;
public void setUp() throws Exception {
super.setUp();
//create mock for OutputSource
outputControl = MockControl.createControl(ResourceLifecycleOutputSource.class);
output = (ResourceLifecycleOutputSource)outputControl.getMock();
outputControl = MockControl.createControl(ResourceLifecycleItemWriter.class);
output = (ResourceLifecycleItemWriter)outputControl.getMock();
//create new writer
writer = new FlatFileCustomerCreditWriter();
@@ -75,7 +75,7 @@ public class FlatFileCustomerCreditWriterTests extends TestCase {
outputControl.verify();
}
private interface ResourceLifecycleOutputSource extends OutputSource, ResourceLifecycle {
private interface ResourceLifecycleItemWriter extends ItemWriter, ResourceLifecycle {
}
}

View File

@@ -9,7 +9,7 @@ import java.util.Map;
import junit.framework.TestCase;
import org.springframework.batch.io.OutputSource;
import org.springframework.batch.io.ItemWriter;
import org.springframework.batch.io.file.support.transform.LineAggregator;
import org.springframework.batch.sample.LineAggregatorStub;
import org.springframework.batch.sample.domain.Address;
@@ -22,7 +22,7 @@ public class FlatFileOrderWriterTests extends TestCase {
List list = new ArrayList();
private OutputSource output = new OutputSource() {
private ItemWriter output = new ItemWriter() {
public void write(Object output) {
list.add(output);

View File

@@ -5,7 +5,7 @@ import java.math.BigDecimal;
import junit.framework.TestCase;
import org.easymock.MockControl;
import org.springframework.batch.io.OutputSource;
import org.springframework.batch.io.ItemWriter;
import org.springframework.batch.sample.domain.CustomerCredit;
/**
@@ -17,8 +17,8 @@ public class CustomerCreditIncreaseProcessorTests extends TestCase{
private CustomerCreditIncreaseProcessor processor = new CustomerCreditIncreaseProcessor();
private OutputSource outputSource;
private MockControl outputSourceControl = MockControl.createStrictControl(OutputSource.class);
private ItemWriter outputSource;
private MockControl outputSourceControl = MockControl.createStrictControl(ItemWriter.class);
private CustomerCredit customerCredit = new CustomerCredit();
@@ -27,7 +27,7 @@ public class CustomerCreditIncreaseProcessorTests extends TestCase{
customerCredit.setId(1);
customerCredit.setName("testCustomer");
outputSource = (OutputSource) outputSourceControl.getMock();
outputSource = (ItemWriter) outputSourceControl.getMock();
processor.setOutputSource(outputSource);
}

View File

@@ -2,7 +2,7 @@ package org.springframework.batch.sample.item.processor;
import junit.framework.TestCase;
import org.springframework.batch.io.file.support.FlatFileOutputSource;
import org.springframework.batch.io.file.support.FlatFileItemWriter;
import org.springframework.batch.sample.item.processor.DefaultFlatFileProcessor;
public class DefaultFlatFileProcessorTests extends TestCase {
@@ -12,7 +12,7 @@ public class DefaultFlatFileProcessorTests extends TestCase {
final Object testLine = new Object();
//create output source
FlatFileOutputSource output = new FlatFileOutputSource() {
FlatFileItemWriter output = new FlatFileItemWriter() {
public void write(Object line) {
assertEquals(""+testLine, line);
}