diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/support/AggregateItemReader.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/support/AggregateItemReader.java index b8b6d95af..a73cb1510 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/support/AggregateItemReader.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/support/AggregateItemReader.java @@ -17,19 +17,22 @@ package org.springframework.batch.item.support; import java.util.ArrayList; -import java.util.Collection; +import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.batch.item.ItemReader; +import org.springframework.batch.item.MarkFailedException; +import org.springframework.batch.item.ResetFailedException; import org.springframework.batch.item.file.mapping.FieldSetMapper; /** * An {@link ItemReader} that delivers a list as its item, storing up objects - * from the injected {@link ItemReader} until they are ready to be packed out - * as a collection. The {@link ItemReader} should mark the beginning and end of - * records with the constant values in {@link FieldSetMapper} ({@link AggregateItemReader#BEGIN_RECORD} - * and {@link AggregateItemReader#END_RECORD}).
+ * from the injected {@link ItemReader} until they are ready to be packed out as + * a collection. The {@link ItemReader} should mark the beginning and end of + * records with the constant values in {@link FieldSetMapper} ( + * {@link AggregateItemReader#BEGIN_RECORD} and + * {@link AggregateItemReader#END_RECORD}).
* * This class is thread safe (it can be used concurrently by multiple threads) * as long as the {@link ItemReader} is also thread safe. @@ -37,10 +40,9 @@ import org.springframework.batch.item.file.mapping.FieldSetMapper; * @author Dave Syer * */ -public class AggregateItemReader extends DelegatingItemReader { +public class AggregateItemReader implements ItemReader> { - private static final Log log = LogFactory - .getLog(AggregateItemReader.class); + private static final Log log = LogFactory.getLog(AggregateItemReader.class); /** * Marker for the end of a multi-object record. @@ -52,22 +54,25 @@ public class AggregateItemReader extends DelegatingItemReader { */ public static final Object BEGIN_RECORD = new Object(); + private ItemReader itemReader; + /** * Get the next list of records. - * @throws Exception + * @throws Exception * * @see org.springframework.batch.item.ItemReader#read() */ - public Object read() throws Exception { + public List read() throws Exception { ResultHolder holder = new ResultHolder(); - while (process(super.read(), holder)) { + while (process(itemReader.read(), holder)) { continue; } if (!holder.exhausted) { return holder.records; - } else { + } + else { return null; } } @@ -98,6 +103,18 @@ public class AggregateItemReader extends DelegatingItemReader { return true; } + public void mark() throws MarkFailedException { + itemReader.mark(); + } + + public void reset() throws ResetFailedException { + itemReader.reset(); + } + + public void setItemReader(ItemReader itemReader) { + this.itemReader = itemReader; + } + /** * Private class for temporary state management while item is being * collected. @@ -105,8 +122,9 @@ public class AggregateItemReader extends DelegatingItemReader { * @author Dave Syer * */ - private static class ResultHolder { - Collection records = new ArrayList(); + private class ResultHolder { + List records = new ArrayList(); + boolean exhausted = false; }