OPEN - issue BATCH-771: Refactor Listeners for chunk changes

Make ItemWriteListener match ItemWriter (generic list as argument).
This commit is contained in:
dsyer
2008-08-26 15:21:15 +00:00
parent a0ea47ce63
commit be0432a754
17 changed files with 385 additions and 242 deletions

View File

@@ -15,6 +15,8 @@
*/
package org.springframework.batch.core;
import java.util.List;
import org.springframework.batch.item.ItemWriter;
/**
@@ -23,30 +25,31 @@ import org.springframework.batch.item.ItemWriter;
* @author Lucas Ward
*
*/
public interface ItemWriteListener extends StepListener {
public interface ItemWriteListener<S> extends StepListener {
/**
* Called before {@link ItemWriter#write(java.util.List)}
*
* @param item to be written
* @param items to be written
*/
void beforeWrite(Object item);
void beforeWrite(List<? extends S> items);
/**
* Called after {@link ItemWriter#write(java.util.List)} If the item is last in a
* chunk, this will be called before any transaction is committed, and
* Called after {@link ItemWriter#write(java.util.List)} If the item is last
* in a chunk, this will be called before any transaction is committed, and
* before {@link ChunkListener#afterChunk()}
* @param item written item
* @param items written items
*/
void afterWrite(Object item);
void afterWrite(List<? extends S> items);
/**
* Called if an error occurs while trying to write.
* Called if an error occurs while trying to write. Will be called inside a
* transaction, but the transaction will normally be rolled back. There is
* no way to identify from this callback which of the items (if any) caused
* the error.
*
* @param ex
* thrown from {@link ItemWriter}
* @param item
* attempted to be written.
* @param exception thrown from {@link ItemWriter}
* @param items attempted to be written.
*/
void onWriteError(Exception ex, Object item);
void onWriteError(Exception exception, List<? extends S> items);
}

View File

@@ -15,6 +15,7 @@
*/
package org.springframework.batch.core.listener;
import java.util.Arrays;
import java.util.Iterator;
import org.springframework.batch.core.ChunkListener;
@@ -26,7 +27,7 @@ import org.springframework.core.Ordered;
*/
public class CompositeChunkListener implements ChunkListener {
private OrderedComposite listeners = new OrderedComposite();
private OrderedComposite<ChunkListener> listeners = new OrderedComposite<ChunkListener>();
/**
* Public setter for the listeners.
@@ -34,7 +35,7 @@ public class CompositeChunkListener implements ChunkListener {
* @param listeners
*/
public void setListeners(ChunkListener[] listeners) {
this.listeners.setItems(listeners);
this.listeners.setItems(Arrays.asList(listeners));
}
/**
@@ -53,7 +54,7 @@ public class CompositeChunkListener implements ChunkListener {
* @see org.springframework.batch.core.ChunkListener#afterChunk()
*/
public void afterChunk() {
for (Iterator<Object> iterator = listeners.iterator(); iterator.hasNext();) {
for (Iterator<ChunkListener> iterator = listeners.iterator(); iterator.hasNext();) {
ChunkListener listener = (ChunkListener) iterator.next();
listener.afterChunk();
}
@@ -65,7 +66,7 @@ public class CompositeChunkListener implements ChunkListener {
* @see org.springframework.batch.core.ChunkListener#beforeChunk()
*/
public void beforeChunk() {
for (Iterator<Object> iterator = listeners.reverse(); iterator.hasNext();) {
for (Iterator<ChunkListener> iterator = listeners.reverse(); iterator.hasNext();) {
ChunkListener listener = (ChunkListener) iterator.next();
listener.beforeChunk();
}

View File

@@ -15,6 +15,7 @@
*/
package org.springframework.batch.core.listener;
import java.util.Arrays;
import java.util.Iterator;
import org.springframework.batch.core.JobExecution;
@@ -27,7 +28,7 @@ import org.springframework.core.Ordered;
*/
public class CompositeExecutionJobListener implements JobExecutionListener {
private OrderedComposite listeners = new OrderedComposite();
private OrderedComposite<JobExecutionListener> listeners = new OrderedComposite<JobExecutionListener>();
/**
* Public setter for the listeners.
@@ -35,7 +36,7 @@ public class CompositeExecutionJobListener implements JobExecutionListener {
* @param listeners
*/
public void setListeners(JobExecutionListener[] listeners) {
this.listeners.setItems(listeners);
this.listeners.setItems(Arrays.asList(listeners));
}
/**
@@ -53,7 +54,7 @@ public class CompositeExecutionJobListener implements JobExecutionListener {
* @see org.springframework.batch.core.JobExecutionListener#afterJob(org.springframework.batch.core.JobExecution)
*/
public void afterJob(JobExecution jobExecution) {
for (Iterator<Object> iterator = listeners.reverse(); iterator.hasNext();) {
for (Iterator<JobExecutionListener> iterator = listeners.reverse(); iterator.hasNext();) {
JobExecutionListener listener = (JobExecutionListener) iterator.next();
listener.afterJob(jobExecution);
}
@@ -65,7 +66,7 @@ public class CompositeExecutionJobListener implements JobExecutionListener {
* @see org.springframework.batch.core.JobExecutionListener#beforeJob(org.springframework.batch.core.JobExecution)
*/
public void beforeJob(JobExecution jobExecution) {
for (Iterator<Object> iterator = listeners.iterator(); iterator.hasNext();) {
for (Iterator<JobExecutionListener> iterator = listeners.iterator(); iterator.hasNext();) {
JobExecutionListener listener = (JobExecutionListener) iterator.next();
listener.beforeJob(jobExecution);
}
@@ -78,7 +79,7 @@ public class CompositeExecutionJobListener implements JobExecutionListener {
* java.lang.Throwable)
*/
public void onError(JobExecution jobExecution, Throwable e) {
for (Iterator<Object> iterator = listeners.reverse(); iterator.hasNext();) {
for (Iterator<JobExecutionListener> iterator = listeners.reverse(); iterator.hasNext();) {
JobExecutionListener listener = (JobExecutionListener) iterator.next();
listener.onError(jobExecution, e);
}
@@ -91,7 +92,7 @@ public class CompositeExecutionJobListener implements JobExecutionListener {
* @see org.springframework.batch.core.JobExecutionListener#onInterrupt(org.springframework.batch.core.JobExecution)
*/
public void onInterrupt(JobExecution jobExecution) {
for (Iterator<Object> iterator = listeners.reverse(); iterator.hasNext();) {
for (Iterator<JobExecutionListener> iterator = listeners.reverse(); iterator.hasNext();) {
JobExecutionListener listener = (JobExecutionListener) iterator.next();
listener.onInterrupt(jobExecution);
}

View File

@@ -15,6 +15,7 @@
*/
package org.springframework.batch.core.listener;
import java.util.Arrays;
import java.util.Iterator;
import org.springframework.batch.core.ItemReadListener;
@@ -27,7 +28,7 @@ import org.springframework.core.Ordered;
*/
public class CompositeItemReadListener implements ItemReadListener {
private OrderedComposite listeners = new OrderedComposite();
private OrderedComposite<ItemReadListener> listeners = new OrderedComposite<ItemReadListener>();
/**
* Public setter for the listeners.
@@ -35,7 +36,7 @@ public class CompositeItemReadListener implements ItemReadListener {
* @param itemReadListeners
*/
public void setListeners(ItemReadListener[] itemReadListeners) {
this.listeners.setItems(itemReadListeners);
this.listeners.setItems(Arrays.asList(itemReadListeners));
}
/**
@@ -53,7 +54,7 @@ public class CompositeItemReadListener implements ItemReadListener {
* @see org.springframework.batch.core.ItemReadListener#afterRead(java.lang.Object)
*/
public void afterRead(Object item) {
for (Iterator<Object> iterator = listeners.reverse(); iterator.hasNext();) {
for (Iterator<ItemReadListener> iterator = listeners.reverse(); iterator.hasNext();) {
ItemReadListener listener = (ItemReadListener) iterator.next();
listener.afterRead(item);
}
@@ -65,7 +66,7 @@ public class CompositeItemReadListener implements ItemReadListener {
* @see org.springframework.batch.core.ItemReadListener#beforeRead()
*/
public void beforeRead() {
for (Iterator<Object> iterator = listeners.iterator(); iterator.hasNext();) {
for (Iterator<ItemReadListener> iterator = listeners.iterator(); iterator.hasNext();) {
ItemReadListener listener = (ItemReadListener) iterator.next();
listener.beforeRead();
}
@@ -77,7 +78,7 @@ public class CompositeItemReadListener implements ItemReadListener {
* @see org.springframework.batch.core.ItemReadListener#onReadError(java.lang.Exception)
*/
public void onReadError(Exception ex) {
for (Iterator<Object> iterator = listeners.iterator(); iterator.hasNext();) {
for (Iterator<ItemReadListener> iterator = listeners.iterator(); iterator.hasNext();) {
ItemReadListener listener = (ItemReadListener) iterator.next();
listener.onReadError(ex);
}

View File

@@ -16,6 +16,7 @@
package org.springframework.batch.core.listener;
import java.util.Iterator;
import java.util.List;
import org.springframework.batch.core.ItemWriteListener;
import org.springframework.core.Ordered;
@@ -25,62 +26,61 @@ import org.springframework.core.Ordered;
* @author Dave Syer
*
*/
public class CompositeItemWriteListener implements ItemWriteListener {
public class CompositeItemWriteListener<S> implements ItemWriteListener<S> {
private OrderedComposite listeners = new OrderedComposite();
private OrderedComposite<ItemWriteListener<S>> listeners = new OrderedComposite<ItemWriteListener<S>>();
/**
* Public setter for the listeners.
*
* @param itemWriteListeners
*/
public void setListeners(ItemWriteListener[] itemWriteListeners) {
public void setListeners(List<ItemWriteListener<S>> itemWriteListeners) {
this.listeners.setItems(itemWriteListeners);
}
/**
* Register additional listener.
*
* @param itemReaderListener
* @param itemWriteListener
*/
public void register(ItemWriteListener itemReaderListener) {
listeners.add(itemReaderListener);
public void register(ItemWriteListener<S> itemWriteListener) {
listeners.add(itemWriteListener);
}
/**
* Call the registered listeners in reverse order, respecting and
* prioritising those that implement {@link Ordered}.
* @see org.springframework.batch.core.ItemWriteListener#afterWrite(java.lang.Object)
* @see ItemWriteListener#afterWrite(java.util.List)
*/
public void afterWrite(Object item) {
for (Iterator<Object> iterator = listeners.reverse(); iterator.hasNext();) {
ItemWriteListener listener = (ItemWriteListener) iterator.next();
listener.afterWrite(item);
public void afterWrite(List<? extends S> items) {
for (Iterator<ItemWriteListener<S>> iterator = listeners.reverse(); iterator.hasNext();) {
ItemWriteListener<S> listener = iterator.next();
listener.afterWrite(items);
}
}
/**
* Call the registered listeners in order, respecting and prioritising those
* that implement {@link Ordered}.
* @see org.springframework.batch.core.ItemWriteListener#beforeWrite(java.lang.Object)
* @see ItemWriteListener#beforeWrite(List)
*/
public void beforeWrite(Object item) {
for (Iterator<Object> iterator = listeners.iterator(); iterator.hasNext();) {
ItemWriteListener listener = (ItemWriteListener) iterator.next();
listener.beforeWrite(item);
public void beforeWrite(List<? extends S> items) {
for (Iterator<ItemWriteListener<S>> iterator = listeners.iterator(); iterator.hasNext();) {
ItemWriteListener<S> listener = iterator.next();
listener.beforeWrite(items);
}
}
/**
* Call the registered listeners in reverse order, respecting and
* prioritising those that implement {@link Ordered}.
* @see org.springframework.batch.core.ItemWriteListener#onWriteError(java.lang.Exception,
* java.lang.Object)
* @see ItemWriteListener#onWriteError(Exception, List)
*/
public void onWriteError(Exception ex, Object item) {
for (Iterator<Object> iterator = listeners.reverse(); iterator.hasNext();) {
ItemWriteListener listener = (ItemWriteListener) iterator.next();
listener.onWriteError(ex, item);
public void onWriteError(Exception ex, List<? extends S> items) {
for (Iterator<ItemWriteListener<S>> iterator = listeners.reverse(); iterator.hasNext();) {
ItemWriteListener<S> listener = iterator.next();
listener.onWriteError(ex, items);
}
}
}

View File

@@ -15,6 +15,7 @@
*/
package org.springframework.batch.core.listener;
import java.util.Arrays;
import java.util.Iterator;
import org.springframework.batch.core.SkipListener;
@@ -26,7 +27,7 @@ import org.springframework.core.Ordered;
*/
public class CompositeSkipListener implements SkipListener {
private OrderedComposite listeners = new OrderedComposite();
private OrderedComposite<SkipListener> listeners = new OrderedComposite<SkipListener>();
/**
* Public setter for the listeners.
@@ -34,7 +35,7 @@ public class CompositeSkipListener implements SkipListener {
* @param listeners
*/
public void setListeners(SkipListener[] listeners) {
this.listeners.setItems(listeners);
this.listeners.setItems(Arrays.asList(listeners));
}
/**
@@ -52,7 +53,7 @@ public class CompositeSkipListener implements SkipListener {
* @see org.springframework.batch.core.SkipListener#onSkipInRead(java.lang.Throwable)
*/
public void onSkipInRead(Throwable t) {
for (Iterator<Object> iterator = listeners.iterator(); iterator.hasNext();) {
for (Iterator<SkipListener> iterator = listeners.iterator(); iterator.hasNext();) {
SkipListener listener = (SkipListener) iterator.next();
listener.onSkipInRead(t);
}
@@ -65,7 +66,7 @@ public class CompositeSkipListener implements SkipListener {
* java.lang.Throwable)
*/
public void onSkipInWrite(Object item, Throwable t) {
for (Iterator<Object> iterator = listeners.iterator(); iterator.hasNext();) {
for (Iterator<SkipListener> iterator = listeners.iterator(); iterator.hasNext();) {
SkipListener listener = (SkipListener) iterator.next();
listener.onSkipInWrite(item, t);
}

View File

@@ -15,6 +15,7 @@
*/
package org.springframework.batch.core.listener;
import java.util.Arrays;
import java.util.Iterator;
import org.springframework.batch.core.StepExecution;
@@ -29,7 +30,7 @@ import org.springframework.core.Ordered;
*/
public class CompositeStepExecutionListener implements StepExecutionListener {
private OrderedComposite list = new OrderedComposite();
private OrderedComposite<StepExecutionListener> list = new OrderedComposite<StepExecutionListener>();
/**
* Public setter for the listeners.
@@ -37,7 +38,7 @@ public class CompositeStepExecutionListener implements StepExecutionListener {
* @param listeners
*/
public void setListeners(StepExecutionListener[] listeners) {
list.setItems(listeners);
list.setItems(Arrays.asList(listeners));
}
/**
@@ -56,7 +57,7 @@ public class CompositeStepExecutionListener implements StepExecutionListener {
*/
public ExitStatus afterStep(StepExecution stepExecution) {
ExitStatus status = null;
for (Iterator<Object> iterator = list.reverse(); iterator.hasNext();) {
for (Iterator<StepExecutionListener> iterator = list.reverse(); iterator.hasNext();) {
StepExecutionListener listener = (StepExecutionListener) iterator.next();
ExitStatus close = listener.afterStep(stepExecution);
status = status != null ? status.and(close) : close;
@@ -70,7 +71,7 @@ public class CompositeStepExecutionListener implements StepExecutionListener {
* @see org.springframework.batch.core.StepExecutionListener#beforeStep(StepExecution)
*/
public void beforeStep(StepExecution stepExecution) {
for (Iterator<Object> iterator = list.iterator(); iterator.hasNext();) {
for (Iterator<StepExecutionListener> iterator = list.iterator(); iterator.hasNext();) {
StepExecutionListener listener = (StepExecutionListener) iterator.next();
listener.beforeStep(stepExecution);
}
@@ -84,7 +85,7 @@ public class CompositeStepExecutionListener implements StepExecutionListener {
*/
public ExitStatus onErrorInStep(StepExecution stepExecution, Throwable e) {
ExitStatus status = null;
for (Iterator<Object> iterator = list.reverse(); iterator.hasNext();) {
for (Iterator<StepExecutionListener> iterator = list.reverse(); iterator.hasNext();) {
StepExecutionListener listener = (StepExecutionListener) iterator.next();
ExitStatus close = listener.onErrorInStep(stepExecution, e);
status = status != null ? status.and(close) : close;

View File

@@ -15,6 +15,8 @@
*/
package org.springframework.batch.core.listener;
import java.util.List;
import org.springframework.batch.core.ItemReadListener;
import org.springframework.batch.core.ItemWriteListener;
@@ -26,24 +28,24 @@ import org.springframework.batch.core.ItemWriteListener;
* @author Lucas Ward
*
*/
public class ItemListenerSupport implements ItemWriteListener, ItemReadListener {
public class ItemListenerSupport<S> implements ItemWriteListener<S>, ItemReadListener {
/* (non-Javadoc)
* @see org.springframework.batch.core.domain.ItemWriteListener#afterWrite()
*/
public void afterWrite(Object item) {
public void afterWrite(List<? extends S> item) {
}
/* (non-Javadoc)
* @see org.springframework.batch.core.domain.ItemWriteListener#beforeWrite(java.lang.Object)
*/
public void beforeWrite(Object item) {
public void beforeWrite(List<? extends S> item) {
}
/* (non-Javadoc)
* @see org.springframework.batch.core.domain.ItemWriteListener#onWriteError(java.lang.Exception, java.lang.Object)
*/
public void onWriteError(Exception ex, Object item) {
public void onWriteError(Exception ex, List<? extends S> item) {
}
/* (non-Javadoc)

View File

@@ -15,6 +15,8 @@
*/
package org.springframework.batch.core.listener;
import java.util.List;
import org.springframework.batch.core.ChunkListener;
import org.springframework.batch.core.ItemReadListener;
import org.springframework.batch.core.ItemWriteListener;
@@ -29,8 +31,8 @@ import org.springframework.batch.repeat.ExitStatus;
* @author Dave Syer
*
*/
public class MulticasterBatchListener implements StepExecutionListener, ChunkListener, ItemReadListener,
ItemWriteListener, SkipListener {
public class MulticasterBatchListener<S> implements StepExecutionListener, ChunkListener, ItemReadListener,
ItemWriteListener<S>, SkipListener {
private CompositeStepExecutionListener stepListener = new CompositeStepExecutionListener();
@@ -38,7 +40,7 @@ public class MulticasterBatchListener implements StepExecutionListener, ChunkLis
private CompositeItemReadListener itemReadListener = new CompositeItemReadListener();
private CompositeItemWriteListener itemWriteListener = new CompositeItemWriteListener();
private CompositeItemWriteListener<S> itemWriteListener = new CompositeItemWriteListener<S>();
private CompositeSkipListener skipListener = new CompositeSkipListener();
@@ -61,7 +63,7 @@ public class MulticasterBatchListener implements StepExecutionListener, ChunkLis
register(listeners[i]);
}
}
/**
* Register the listener for callbacks on the appropriate interfaces
* implemented. Any {@link StepListener} can be provided, or an
@@ -78,6 +80,7 @@ public class MulticasterBatchListener implements StepExecutionListener, ChunkLis
this.itemReadListener.register((ItemReadListener) listener);
}
if (listener instanceof ItemWriteListener) {
// TODO: make this type safe somehow?
this.itemWriteListener.register((ItemWriteListener) listener);
}
if (listener instanceof SkipListener) {
@@ -191,11 +194,11 @@ public class MulticasterBatchListener implements StepExecutionListener, ChunkLis
/**
*
* @see org.springframework.batch.core.listener.CompositeItemWriteListener#afterWrite(Object)
* @see ItemWriteListener#afterWrite(List)
*/
public void afterWrite(Object item) {
public void afterWrite(List<? extends S> items) {
try {
itemWriteListener.afterWrite(item);
itemWriteListener.afterWrite(items);
}
catch (RuntimeException e) {
throw new StepListenerFailedException("Error in afterWrite.", e);
@@ -203,12 +206,12 @@ public class MulticasterBatchListener implements StepExecutionListener, ChunkLis
}
/**
* @param item
* @see org.springframework.batch.core.listener.CompositeItemWriteListener#beforeWrite(java.lang.Object)
* @param items
* @see ItemWriteListener#beforeWrite(List)
*/
public void beforeWrite(Object item) {
public void beforeWrite(List<? extends S> items) {
try {
itemWriteListener.beforeWrite(item);
itemWriteListener.beforeWrite(items);
}
catch (RuntimeException e) {
throw new StepListenerFailedException("Error in beforeWrite.", e);
@@ -217,13 +220,12 @@ public class MulticasterBatchListener implements StepExecutionListener, ChunkLis
/**
* @param ex
* @param item
* @see org.springframework.batch.core.listener.CompositeItemWriteListener#onWriteError(java.lang.Exception,
* java.lang.Object)
* @param items
* @see ItemWriteListener#onWriteError(Exception, List)
*/
public void onWriteError(Exception ex, Object item) {
public void onWriteError(Exception ex, List<? extends S> items) {
try {
itemWriteListener.onWriteError(ex, item);
itemWriteListener.onWriteError(ex, items);
}
catch (RuntimeException e) {
throw new StepListenerFailedException("Error in onWriteError.", ex, e);

View File

@@ -22,32 +22,32 @@ import java.util.Iterator;
import java.util.List;
import java.util.TreeSet;
import org.springframework.core.OrderComparator;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.AnnotationAwareOrderComparator;
/**
* @author Dave Syer
*
*/
class OrderedComposite {
class OrderedComposite<S> {
private List<Object> unordered = new ArrayList<Object>();
private List<S> unordered = new ArrayList<S>();
@SuppressWarnings("unchecked")
private Collection<Object> ordered = new TreeSet<Object>(new OrderComparator());
private Collection<S> ordered = new TreeSet<S>(new AnnotationAwareOrderComparator());
private List<Object> list = new ArrayList<Object>();
private List<S> list = new ArrayList<S>();
/**
* Public setter for the listeners.
*
* @param items
*/
public void setItems(Object[] items) {
public void setItems(List<S> items) {
unordered.clear();
ordered.clear();
for (int i = 0; i < items.length; i++) {
add(items[i]);
for (S s : items) {
add(s);
}
}
@@ -56,7 +56,7 @@ class OrderedComposite {
*
* @param item
*/
public void add(Object item) {
public void add(S item) {
if (item instanceof Ordered) {
if (!ordered.contains(item)) {
ordered.add(item);
@@ -77,8 +77,8 @@ class OrderedComposite {
* first, followed by any unordered ones.
* @return an iterator over the list of items
*/
public Iterator<Object> iterator() {
return new ArrayList<Object>(list).iterator();
public Iterator<S> iterator() {
return new ArrayList<S>(list).iterator();
}
/**
@@ -86,8 +86,8 @@ class OrderedComposite {
* last, after any unordered ones.
* @return an iterator over the list of items
*/
public Iterator<Object> reverse() {
ArrayList<Object> result = new ArrayList<Object>(list);
public Iterator<S> reverse() {
ArrayList<S> result = new ArrayList<S>(list);
Collections.reverse(result);
return result.iterator();
}

View File

@@ -15,12 +15,14 @@
*/
package org.springframework.batch.core.listener;
import org.springframework.batch.core.StepListener;
import java.util.List;
import org.springframework.batch.core.ChunkListener;
import org.springframework.batch.core.ItemReadListener;
import org.springframework.batch.core.ItemWriteListener;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.StepExecutionListener;
import org.springframework.batch.core.StepListener;
import org.springframework.batch.repeat.ExitStatus;
/**
@@ -29,8 +31,8 @@ import org.springframework.batch.repeat.ExitStatus;
* @author Lucas Ward
*
*/
public class StepListenerSupport implements StepExecutionListener, ChunkListener,
ItemReadListener, ItemWriteListener {
public class StepListenerSupport<S> implements StepExecutionListener, ChunkListener,
ItemReadListener, ItemWriteListener<S> {
/* (non-Javadoc)
* @see org.springframework.batch.core.domain.StepListener#afterStep(StepExecution stepExecution)
@@ -83,21 +85,21 @@ public class StepListenerSupport implements StepExecutionListener, ChunkListener
}
/* (non-Javadoc)
* @see org.springframework.batch.core.domain.ItemWriteListener#afterWrite()
* @see org.springframework.batch.core.ItemWriteListener#afterWrite(java.util.List)
*/
public void afterWrite(Object item) {
public void afterWrite(List<? extends S> items) {
}
/* (non-Javadoc)
* @see org.springframework.batch.core.domain.ItemWriteListener#beforeWrite(java.lang.Object)
* @see org.springframework.batch.core.ItemWriteListener#beforeWrite(java.util.List)
*/
public void beforeWrite(Object item) {
public void beforeWrite(List<? extends S> items) {
}
/* (non-Javadoc)
* @see org.springframework.batch.core.domain.ItemWriteListener#onWriteError(java.lang.Exception, java.lang.Object)
* @see org.springframework.batch.core.ItemWriteListener#onWriteError(java.lang.Exception, java.util.List)
*/
public void onWriteError(Exception ex, Object item) {
public void onWriteError(Exception exception, List<? extends S> items) {
}
}

View File

@@ -15,6 +15,8 @@
*/
package org.springframework.batch.core.step.item;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.batch.core.listener.ItemListenerSupport;
@@ -28,16 +30,12 @@ import org.springframework.batch.core.listener.ItemListenerSupport;
* @author Lucas Ward
*
*/
public class DefaultItemFailureHandler extends ItemListenerSupport {
public class DefaultItemFailureHandler extends ItemListenerSupport<Object> {
protected static final Log logger = LogFactory
.getLog(DefaultItemFailureHandler.class);
/*
* (non-Javadoc)
*
* @see org.springframework.batch.core.domain.ItemFailureLog#log(java.util.List)
*/
@Override
public void onReadError(Exception ex) {
try {
logger.error("Error encountered while reading", ex);
@@ -47,7 +45,8 @@ public class DefaultItemFailureHandler extends ItemListenerSupport {
}
}
public void onWriteError(Exception ex, Object item) {
@Override
public void onWriteError(Exception ex, List<? extends Object> item) {
try {
logger.error("Error encountered while writing item: [ " + item + "]", ex);
} catch (Exception exception) {

View File

@@ -60,7 +60,7 @@ public class ItemOrientedStepHandler<T, S> implements StepHandler {
private final RepeatOperations repeatOperations;
final private MulticasterBatchListener listener = new MulticasterBatchListener();
final private MulticasterBatchListener<S> listener = new MulticasterBatchListener<S>();
/**
* @param itemReader
@@ -291,7 +291,7 @@ public class ItemOrientedStepHandler<T, S> implements StepHandler {
* Public getter for the listener.
* @return the listener
*/
protected MulticasterBatchListener getListener() {
protected MulticasterBatchListener<S> getListener() {
return listener;
}

View File

@@ -15,7 +15,13 @@
*/
package org.springframework.batch.core.listener;
import static org.easymock.EasyMock.*;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
@@ -23,42 +29,43 @@ import org.springframework.batch.core.ItemWriteListener;
/**
* @author Lucas Ward
*
*
*/
public class CompositeItemWriteListenerTests {
ItemWriteListener listener;
CompositeItemWriteListener compositeListener;
ItemWriteListener<Object> listener;
CompositeItemWriteListener<Object> compositeListener;
@SuppressWarnings("unchecked")
@Before
public void setUp() throws Exception {
listener = createMock(ItemWriteListener.class);
compositeListener = new CompositeItemWriteListener();
compositeListener = new CompositeItemWriteListener<Object>();
compositeListener.register(listener);
}
@Test
public void testBeforeWrite(){
Object item = new Object();
public void testBeforeWrite() {
List<Object> item = Collections.singletonList(new Object());
listener.beforeWrite(item);
replay(listener);
compositeListener.beforeWrite(item);
verify(listener);
}
@Test
public void testAfterWrite(){
Object item = new Object();
public void testAfterWrite() {
List<Object> item = Collections.singletonList(new Object());
listener.afterWrite(item);
replay(listener);
compositeListener.afterWrite(item);
verify(listener);
}
@Test
public void testOnWriteError(){
Object item = new Object();
public void testOnWriteError() {
List<Object> item = Collections.singletonList(new Object());
Exception ex = new Exception();
listener.onWriteError(ex, item);
replay(listener);
@@ -68,8 +75,12 @@ public class CompositeItemWriteListenerTests {
@Test
public void testSetListners() throws Exception {
compositeListener.setListeners(new ItemWriteListener[] {listener});
Object item = new Object();
compositeListener.setListeners(new ArrayList<ItemWriteListener<Object>>() {
{
add(listener);
}
});
List<Object> item = Collections.singletonList(new Object());
listener.beforeWrite(item);
replay(listener);
compositeListener.beforeWrite(item);

View File

@@ -18,6 +18,8 @@ package org.springframework.batch.core.listener;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.springframework.batch.core.StepExecution;
@@ -26,44 +28,48 @@ import org.springframework.batch.repeat.ExitStatus;
/**
* @author Dave Syer
*
*
*/
public class MulticasterBatchListenerTests {
private MulticasterBatchListener multicast = new MulticasterBatchListener();
private MulticasterBatchListener<String> multicast = new MulticasterBatchListener<String>();
private int count = 0;
private boolean error = false;
@Before
public void setUp() {
multicast.register(new CountingStepListenerSupport());
}
/**
* Test method for {@link org.springframework.batch.core.listener.MulticasterBatchListener#setListeners(org.springframework.batch.core.StepListener[])}.
* Test method for
* {@link org.springframework.batch.core.listener.MulticasterBatchListener#setListeners(org.springframework.batch.core.StepListener[])}
* .
*/
@Test
public void testSetListeners() {
multicast.setListeners(new StepListener[] { new StepListenerSupport() {
multicast.setListeners(new StepListener[] { new StepListenerSupport<String>() {
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
count++;
return super.afterStep(stepExecution);
}
}});
} });
multicast.afterStep(null);
// setListeners is cumulative (should be OK if used for DI)
assertEquals(2, count);
}
/**
* Test method for {@link org.springframework.batch.core.listener.MulticasterBatchListener#register(org.springframework.batch.core.StepListener)}.
* Test method for
* {@link org.springframework.batch.core.listener.MulticasterBatchListener#register(org.springframework.batch.core.StepListener)}
* .
*/
@Test
public void testRegister() {
multicast.register(new StepListenerSupport() {
multicast.register(new StepListenerSupport<String>() {
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
count++;
@@ -75,7 +81,9 @@ public class MulticasterBatchListenerTests {
}
/**
* Test method for {@link org.springframework.batch.core.listener.MulticasterBatchListener#afterStep(org.springframework.batch.core.StepExecution)}.
* Test method for
* {@link org.springframework.batch.core.listener.MulticasterBatchListener#afterStep(org.springframework.batch.core.StepExecution)}
* .
*/
@Test
public void testAfterStepFails() {
@@ -83,17 +91,19 @@ public class MulticasterBatchListenerTests {
try {
multicast.afterStep(null);
fail("Expected StepListenerFailedException");
} catch (StepListenerFailedException e) {
}
catch (StepListenerFailedException e) {
// expected
String message = e.getCause().getMessage();
assertEquals("Wrong message: "+message, "listener error", message);
assertEquals("Wrong message: " + message, "listener error", message);
}
assertEquals(1, count);
}
/**
* Test method for {@link org.springframework.batch.core.listener.MulticasterBatchListener#beforeStep(org.springframework.batch.core.StepExecution)}.
* Test method for
* {@link org.springframework.batch.core.listener.MulticasterBatchListener#beforeStep(org.springframework.batch.core.StepExecution)}
* .
*/
@Test
public void testBeforeStep() {
@@ -102,7 +112,9 @@ public class MulticasterBatchListenerTests {
}
/**
* Test method for {@link org.springframework.batch.core.listener.MulticasterBatchListener#beforeStep(org.springframework.batch.core.StepExecution)}.
* Test method for
* {@link org.springframework.batch.core.listener.MulticasterBatchListener#beforeStep(org.springframework.batch.core.StepExecution)}
* .
*/
@Test
public void testBeforeStepFails() {
@@ -110,16 +122,19 @@ public class MulticasterBatchListenerTests {
try {
multicast.beforeStep(null);
fail("Expected StepListenerFailedException");
} catch (StepListenerFailedException e) {
}
catch (StepListenerFailedException e) {
// expected
String message = e.getCause().getMessage();
assertEquals("Wrong message: "+message, "listener error", message);
assertEquals("Wrong message: " + message, "listener error", message);
}
assertEquals(1, count);
}
/**
* Test method for {@link org.springframework.batch.core.listener.MulticasterBatchListener#onErrorInStep(org.springframework.batch.core.StepExecution, java.lang.Throwable)}.
* Test method for
* {@link org.springframework.batch.core.listener.MulticasterBatchListener#onErrorInStep(org.springframework.batch.core.StepExecution, java.lang.Throwable)}
* .
*/
@Test
public void testOnErrorInStep() {
@@ -128,7 +143,9 @@ public class MulticasterBatchListenerTests {
}
/**
* Test method for {@link org.springframework.batch.core.listener.MulticasterBatchListener#onErrorInStep(org.springframework.batch.core.StepExecution, java.lang.Throwable)}.
* Test method for
* {@link org.springframework.batch.core.listener.MulticasterBatchListener#onErrorInStep(org.springframework.batch.core.StepExecution, java.lang.Throwable)}
* .
*/
@Test
public void testOnErrorInStepFails() {
@@ -136,16 +153,19 @@ public class MulticasterBatchListenerTests {
try {
multicast.onErrorInStep(null, new RuntimeException("foo"));
fail("Expected StepListenerFailedException");
} catch (StepListenerFailedException e) {
}
catch (StepListenerFailedException e) {
// expected
String message = e.getCause().getMessage();
assertEquals("Wrong message: "+message, "foo", message);
assertEquals("Wrong message: " + message, "foo", message);
}
assertEquals(1, count);
}
/**
* Test method for {@link org.springframework.batch.core.listener.MulticasterBatchListener#afterChunk()}.
* Test method for
* {@link org.springframework.batch.core.listener.MulticasterBatchListener#afterChunk()}
* .
*/
@Test
public void testAfterChunk() {
@@ -154,7 +174,9 @@ public class MulticasterBatchListenerTests {
}
/**
* Test method for {@link org.springframework.batch.core.listener.MulticasterBatchListener#afterChunk()}.
* Test method for
* {@link org.springframework.batch.core.listener.MulticasterBatchListener#afterChunk()}
* .
*/
@Test
public void testAfterChunkFails() {
@@ -162,16 +184,19 @@ public class MulticasterBatchListenerTests {
try {
multicast.afterChunk();
fail("Expected StepListenerFailedException");
} catch (StepListenerFailedException e) {
}
catch (StepListenerFailedException e) {
// expected
String message = e.getCause().getMessage();
assertEquals("Wrong message: "+message, "listener error", message);
assertEquals("Wrong message: " + message, "listener error", message);
}
assertEquals(1, count);
}
/**
* Test method for {@link org.springframework.batch.core.listener.MulticasterBatchListener#beforeChunk()}.
* Test method for
* {@link org.springframework.batch.core.listener.MulticasterBatchListener#beforeChunk()}
* .
*/
@Test
public void testBeforeChunk() {
@@ -180,7 +205,9 @@ public class MulticasterBatchListenerTests {
}
/**
* Test method for {@link org.springframework.batch.core.listener.MulticasterBatchListener#beforeChunk()}.
* Test method for
* {@link org.springframework.batch.core.listener.MulticasterBatchListener#beforeChunk()}
* .
*/
@Test
public void testBeforeChunkFails() {
@@ -188,16 +215,19 @@ public class MulticasterBatchListenerTests {
try {
multicast.beforeChunk();
fail("Expected StepListenerFailedException");
} catch (StepListenerFailedException e) {
}
catch (StepListenerFailedException e) {
// expected
String message = e.getCause().getMessage();
assertEquals("Wrong message: "+message, "listener error", message);
assertEquals("Wrong message: " + message, "listener error", message);
}
assertEquals(1, count);
}
/**
* Test method for {@link org.springframework.batch.core.listener.MulticasterBatchListener#afterRead(java.lang.Object)}.
* Test method for
* {@link org.springframework.batch.core.listener.MulticasterBatchListener#afterRead(java.lang.Object)}
* .
*/
@Test
public void testAfterRead() {
@@ -206,7 +236,9 @@ public class MulticasterBatchListenerTests {
}
/**
* Test method for {@link org.springframework.batch.core.listener.MulticasterBatchListener#afterRead(java.lang.Object)}.
* Test method for
* {@link org.springframework.batch.core.listener.MulticasterBatchListener#afterRead(java.lang.Object)}
* .
*/
@Test
public void testAfterReadFails() {
@@ -214,16 +246,19 @@ public class MulticasterBatchListenerTests {
try {
multicast.afterRead(null);
fail("Expected StepListenerFailedException");
} catch (StepListenerFailedException e) {
}
catch (StepListenerFailedException e) {
// expected
String message = e.getCause().getMessage();
assertEquals("Wrong message: "+message, "listener error", message);
assertEquals("Wrong message: " + message, "listener error", message);
}
assertEquals(1, count);
}
/**
* Test method for {@link org.springframework.batch.core.listener.MulticasterBatchListener#beforeRead()}.
* Test method for
* {@link org.springframework.batch.core.listener.MulticasterBatchListener#beforeRead()}
* .
*/
@Test
public void testBeforeRead() {
@@ -232,7 +267,9 @@ public class MulticasterBatchListenerTests {
}
/**
* Test method for {@link org.springframework.batch.core.listener.MulticasterBatchListener#beforeRead()}.
* Test method for
* {@link org.springframework.batch.core.listener.MulticasterBatchListener#beforeRead()}
* .
*/
@Test
public void testBeforeReadFails() {
@@ -240,16 +277,19 @@ public class MulticasterBatchListenerTests {
try {
multicast.beforeRead();
fail("Expected StepListenerFailedException");
} catch (StepListenerFailedException e) {
}
catch (StepListenerFailedException e) {
// expected
String message = e.getCause().getMessage();
assertEquals("Wrong message: "+message, "listener error", message);
assertEquals("Wrong message: " + message, "listener error", message);
}
assertEquals(1, count);
}
/**
* Test method for {@link org.springframework.batch.core.listener.MulticasterBatchListener#onReadError(java.lang.Exception)}.
* Test method for
* {@link org.springframework.batch.core.listener.MulticasterBatchListener#onReadError(java.lang.Exception)}
* .
*/
@Test
public void testOnReadError() {
@@ -258,7 +298,9 @@ public class MulticasterBatchListenerTests {
}
/**
* Test method for {@link org.springframework.batch.core.listener.MulticasterBatchListener#onReadError(java.lang.Exception)}.
* Test method for
* {@link org.springframework.batch.core.listener.MulticasterBatchListener#onReadError(java.lang.Exception)}
* .
*/
@Test
public void testOnReadErrorFails() {
@@ -266,16 +308,19 @@ public class MulticasterBatchListenerTests {
try {
multicast.onReadError(new RuntimeException("foo"));
fail("Expected StepListenerFailedException");
} catch (StepListenerFailedException e) {
}
catch (StepListenerFailedException e) {
// expected
String message = e.getCause().getMessage();
assertEquals("Wrong message: "+message, "foo", message);
assertEquals("Wrong message: " + message, "foo", message);
}
assertEquals(1, count);
}
/**
* Test method for {@link org.springframework.batch.core.listener.MulticasterBatchListener#afterWrite(java.lang.Object)}.
* Test method for
* {@link org.springframework.batch.core.listener.MulticasterBatchListener#afterWrite(java.util.List)}
* .
*/
@Test
public void testAfterWrite() {
@@ -284,7 +329,9 @@ public class MulticasterBatchListenerTests {
}
/**
* Test method for {@link org.springframework.batch.core.listener.MulticasterBatchListener#afterWrite(java.lang.Object)}.
* Test method for
* {@link org.springframework.batch.core.listener.MulticasterBatchListener#afterWrite(java.util.List)}
* .
*/
@Test
public void testAfterWriteFails() {
@@ -292,16 +339,19 @@ public class MulticasterBatchListenerTests {
try {
multicast.afterWrite(null);
fail("Expected StepListenerFailedException");
} catch (StepListenerFailedException e) {
}
catch (StepListenerFailedException e) {
// expected
String message = e.getCause().getMessage();
assertEquals("Wrong message: "+message, "listener error", message);
assertEquals("Wrong message: " + message, "listener error", message);
}
assertEquals(1, count);
}
/**
* Test method for {@link org.springframework.batch.core.listener.MulticasterBatchListener#beforeWrite(java.lang.Object)}.
* Test method for
* {@link org.springframework.batch.core.listener.MulticasterBatchListener#beforeWrite(List)}
* .
*/
@Test
public void testBeforeWrite() {
@@ -310,7 +360,9 @@ public class MulticasterBatchListenerTests {
}
/**
* Test method for {@link org.springframework.batch.core.listener.MulticasterBatchListener#beforeWrite(java.lang.Object)}.
* Test method for
* {@link org.springframework.batch.core.listener.MulticasterBatchListener#beforeWrite(List)}
* .
*/
@Test
public void testBeforeWriteFails() {
@@ -318,16 +370,19 @@ public class MulticasterBatchListenerTests {
try {
multicast.beforeWrite(null);
fail("Expected StepListenerFailedException");
} catch (StepListenerFailedException e) {
}
catch (StepListenerFailedException e) {
// expected
String message = e.getCause().getMessage();
assertEquals("Wrong message: "+message, "listener error", message);
assertEquals("Wrong message: " + message, "listener error", message);
}
assertEquals(1, count);
}
/**
* Test method for {@link org.springframework.batch.core.listener.MulticasterBatchListener#onWriteError(java.lang.Exception, java.lang.Object)}.
* Test method for
* {@link org.springframework.batch.core.listener.MulticasterBatchListener#onWriteError(Exception, java.util.List)}
* .
*/
@Test
public void testOnWriteError() {
@@ -336,7 +391,9 @@ public class MulticasterBatchListenerTests {
}
/**
* Test method for {@link org.springframework.batch.core.listener.MulticasterBatchListener#onWriteError(java.lang.Exception, java.lang.Object)}.
* Test method for
* {@link org.springframework.batch.core.listener.MulticasterBatchListener#onWriteError(Exception, java.util.List)}
* .
*/
@Test
public void testOnWriteErrorFails() {
@@ -344,16 +401,19 @@ public class MulticasterBatchListenerTests {
try {
multicast.onWriteError(new RuntimeException("foo"), null);
fail("Expected StepListenerFailedException");
} catch (StepListenerFailedException e) {
}
catch (StepListenerFailedException e) {
// expected
String message = e.getCause().getMessage();
assertEquals("Wrong message: "+message, "foo", message);
assertEquals("Wrong message: " + message, "foo", message);
}
assertEquals(1, count);
}
/**
* Test method for {@link org.springframework.batch.core.listener.MulticasterBatchListener#onSkipInRead(java.lang.Throwable)}.
* Test method for
* {@link org.springframework.batch.core.listener.MulticasterBatchListener#onSkipInRead(java.lang.Throwable)}
* .
*/
@Test
public void testOnSkipInRead() {
@@ -369,7 +429,9 @@ public class MulticasterBatchListenerTests {
}
/**
* Test method for {@link org.springframework.batch.core.listener.MulticasterBatchListener#onSkipInRead(java.lang.Throwable)}.
* Test method for
* {@link org.springframework.batch.core.listener.MulticasterBatchListener#onSkipInRead(java.lang.Throwable)}
* .
*/
@Test
public void testOnSkipInReadFails() {
@@ -383,16 +445,19 @@ public class MulticasterBatchListenerTests {
try {
multicast.onSkipInRead(new RuntimeException("bar"));
fail("Expected RuntimeException");
} catch (RuntimeException e) {
}
catch (RuntimeException e) {
// expected
String message = e.getMessage();
assertEquals("Wrong message: "+message, "foo", message);
assertEquals("Wrong message: " + message, "foo", message);
}
assertEquals(1, count);
}
/**
* Test method for {@link org.springframework.batch.core.listener.MulticasterBatchListener#onSkipInWrite(java.lang.Object, java.lang.Throwable)}.
* Test method for
* {@link org.springframework.batch.core.listener.MulticasterBatchListener#onSkipInWrite(java.lang.Object, java.lang.Throwable)}
* .
*/
@Test
public void testOnSkipInWrite() {
@@ -408,7 +473,9 @@ public class MulticasterBatchListenerTests {
}
/**
* Test method for {@link org.springframework.batch.core.listener.MulticasterBatchListener#onSkipInWrite(java.lang.Object, java.lang.Throwable)}.
* Test method for
* {@link org.springframework.batch.core.listener.MulticasterBatchListener#onSkipInWrite(java.lang.Object, java.lang.Throwable)}
* .
*/
@Test
public void testOnSkipInWriteFails() {
@@ -422,19 +489,20 @@ public class MulticasterBatchListenerTests {
try {
multicast.onSkipInWrite(null, new RuntimeException("bar"));
fail("Expected RuntimeException");
} catch (RuntimeException e) {
}
catch (RuntimeException e) {
// expected
String message = e.getMessage();
assertEquals("Wrong message: "+message, "foo", message);
assertEquals("Wrong message: " + message, "foo", message);
}
assertEquals(1, count);
}
/**
* @author Dave Syer
*
*
*/
private final class CountingStepListenerSupport extends StepListenerSupport {
private final class CountingStepListenerSupport extends StepListenerSupport<String> {
@Override
public void onReadError(Exception ex) {
count++;
@@ -444,8 +512,12 @@ public class MulticasterBatchListenerTests {
super.onReadError(ex);
}
/* (non-Javadoc)
* @see org.springframework.batch.core.listener.StepListenerSupport#afterChunk()
/*
* (non-Javadoc)
*
* @see
* org.springframework.batch.core.listener.StepListenerSupport#afterChunk
* ()
*/
@Override
public void afterChunk() {
@@ -456,8 +528,12 @@ public class MulticasterBatchListenerTests {
super.afterChunk();
}
/* (non-Javadoc)
* @see org.springframework.batch.core.listener.StepListenerSupport#afterRead(java.lang.Object)
/*
* (non-Javadoc)
*
* @see
* org.springframework.batch.core.listener.StepListenerSupport#afterRead
* (java.lang.Object)
*/
@Override
public void afterRead(Object item) {
@@ -468,8 +544,12 @@ public class MulticasterBatchListenerTests {
super.afterRead(item);
}
/* (non-Javadoc)
* @see org.springframework.batch.core.listener.StepListenerSupport#afterStep(org.springframework.batch.core.StepExecution)
/*
* (non-Javadoc)
*
* @see
* org.springframework.batch.core.listener.StepListenerSupport#afterStep
* (org.springframework.batch.core.StepExecution)
*/
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
@@ -480,20 +560,12 @@ public class MulticasterBatchListenerTests {
return super.afterStep(stepExecution);
}
/* (non-Javadoc)
* @see org.springframework.batch.core.listener.StepListenerSupport#afterWrite(java.lang.Object)
*/
@Override
public void afterWrite(Object item) {
count++;
if (error) {
throw new RuntimeException("listener error");
}
super.afterWrite(item);
}
/* (non-Javadoc)
* @see org.springframework.batch.core.listener.StepListenerSupport#beforeChunk()
/*
* (non-Javadoc)
*
* @see
* org.springframework.batch.core.listener.StepListenerSupport#beforeChunk
* ()
*/
@Override
public void beforeChunk() {
@@ -504,8 +576,12 @@ public class MulticasterBatchListenerTests {
super.beforeChunk();
}
/* (non-Javadoc)
* @see org.springframework.batch.core.listener.StepListenerSupport#beforeRead()
/*
* (non-Javadoc)
*
* @see
* org.springframework.batch.core.listener.StepListenerSupport#beforeRead
* ()
*/
@Override
public void beforeRead() {
@@ -516,8 +592,12 @@ public class MulticasterBatchListenerTests {
super.beforeRead();
}
/* (non-Javadoc)
* @see org.springframework.batch.core.listener.StepListenerSupport#beforeStep(org.springframework.batch.core.StepExecution)
/*
* (non-Javadoc)
*
* @see
* org.springframework.batch.core.listener.StepListenerSupport#beforeStep
* (org.springframework.batch.core.StepExecution)
*/
@Override
public void beforeStep(StepExecution stepExecution) {
@@ -528,20 +608,44 @@ public class MulticasterBatchListenerTests {
super.beforeStep(stepExecution);
}
/* (non-Javadoc)
* @see org.springframework.batch.core.listener.StepListenerSupport#beforeWrite(java.lang.Object)
/*
* (non-Javadoc)
*
* @see
* org.springframework.batch.core.listener.StepListenerSupport#afterWrite
* (java.util.List)
*/
@Override
public void beforeWrite(Object item) {
public void afterWrite(List<? extends String> items) {
count++;
if (error) {
throw new RuntimeException("listener error");
}
super.beforeWrite(item);
super.afterWrite(items);
}
/* (non-Javadoc)
* @see org.springframework.batch.core.listener.StepListenerSupport#onErrorInStep(org.springframework.batch.core.StepExecution, java.lang.Throwable)
/*
* (non-Javadoc)
*
* @see
* org.springframework.batch.core.listener.StepListenerSupport#beforeWrite
* (java.util.List)
*/
@Override
public void beforeWrite(List<? extends String> items) {
count++;
if (error) {
throw new RuntimeException("listener error");
}
super.beforeWrite(items);
}
/*
* (non-Javadoc)
*
* @see
* org.springframework.batch.core.listener.StepListenerSupport#onErrorInStep
* (org.springframework.batch.core.StepExecution, java.lang.Throwable)
*/
@Override
public ExitStatus onErrorInStep(StepExecution stepExecution, Throwable e) {
@@ -552,18 +656,22 @@ public class MulticasterBatchListenerTests {
return super.onErrorInStep(stepExecution, e);
}
/* (non-Javadoc)
* @see org.springframework.batch.core.listener.StepListenerSupport#onWriteError(java.lang.Exception, java.lang.Object)
/*
* (non-Javadoc)
*
* @see
* org.springframework.batch.core.listener.StepListenerSupport#onWriteError
* (java.lang.Exception, java.util.List)
*/
@Override
public void onWriteError(Exception ex, Object item) {
public void onWriteError(Exception exception, List<? extends String> items) {
count++;
if (error) {
throw new RuntimeException("listener error");
}
super.onWriteError(ex, item);
super.onWriteError(exception, items);
}
}
}

View File

@@ -15,6 +15,7 @@
*/
package org.springframework.batch.core.listener;
import java.util.Arrays;
import java.util.Iterator;
import org.springframework.core.Ordered;
@@ -23,27 +24,31 @@ import junit.framework.TestCase;
/**
* @author Dave Syer
*
*
*/
public class OrderedCompositeTests extends TestCase {
private OrderedComposite list = new OrderedComposite();
private OrderedComposite<Object> list = new OrderedComposite<Object>();
/**
* Test method for {@link org.springframework.batch.core.listener.OrderedComposite#setItems(java.lang.Object[])}.
* Test method for
* {@link org.springframework.batch.core.listener.OrderedComposite#setItems(java.util.List)}
* .
*/
public void testSetItems() {
list.setItems(new String[] {"1", "2"});
list.setItems(Arrays.asList(new Object[] { "1", "2" }));
Iterator<Object> iterator = list.iterator();
assertEquals("1", iterator.next());
assertEquals("2", iterator.next());
}
/**
* Test method for {@link org.springframework.batch.core.listener.OrderedComposite#add(java.lang.Object)}.
* Test method for
* {@link org.springframework.batch.core.listener.OrderedComposite#add(java.lang.Object)}
* .
*/
public void testAdd() {
list.setItems(new String[] {"1"});
list.setItems(Arrays.asList((Object) "1"));
list.add("3");
Iterator<Object> iterator = list.iterator();
assertEquals("1", iterator.next());
@@ -51,10 +56,12 @@ public class OrderedCompositeTests extends TestCase {
}
/**
* Test method for {@link org.springframework.batch.core.listener.OrderedComposite#add(java.lang.Object)}.
* Test method for
* {@link org.springframework.batch.core.listener.OrderedComposite#add(java.lang.Object)}
* .
*/
public void testAddOrdered() {
list.setItems(new String[] {"1"});
list.setItems(Arrays.asList((Object) "1"));
list.add(new Ordered() {
public int getOrder() {
return 0;
@@ -66,10 +73,12 @@ public class OrderedCompositeTests extends TestCase {
}
/**
* Test method for {@link org.springframework.batch.core.listener.OrderedComposite#add(java.lang.Object)}.
* Test method for
* {@link org.springframework.batch.core.listener.OrderedComposite#add(java.lang.Object)}
* .
*/
public void testAddMultipleOrdered() {
list.setItems(new String[] {"1"});
list.setItems(Arrays.asList((Object) "1"));
list.add(new Ordered() {
public int getOrder() {
return 1;

View File

@@ -134,12 +134,14 @@ public class SimpleStepFactoryBeanTests {
throw new RuntimeException("Error!");
}
});
factory.setListeners(new StepListener[] { new ItemListenerSupport() {
factory.setListeners(new StepListener[] { new ItemListenerSupport<String>() {
@Override
public void onReadError(Exception ex) {
listened.add(ex);
}
public void onWriteError(Exception ex, Object item) {
@Override
public void onWriteError(Exception ex, List<? extends String> item) {
listened.add(ex);
}
} });