This simple delegate encapsulates a one-time read.
class OneItemReader<T> implements ItemReader<T> { boolean read = false; ItemReader<T> delegate; @Override public T read() { if(read) { return null; } T item = delegate.read(); read = true; return item; } }
You can create your reader without thinking about a single reading and wrap it with this small delegate.
Your StockURLReader may be defined as
class StockURLReader implements ItemReader<StockReader> { String[] tokens = new String[0]; int index = 0; StockDAO stockReader; void setURL(String URL) { this.tokens = URL.split(","); index = 0; } StockData read() { if(index < tokens.length) { return stockReader.getStockData(tokens[index++]); } return null; } }
Create OneTimeReader and set StockURLReader as the delegate, and you have a separate reading of StockData from the one-time reading logic.
If you want to read the StockData group, the best solution would be to create a StockDataListBean , where you save all the StockData read from the fragmented URL.
class StockDataListBean { List<StockData> data = new LinkedList<StockData>(); }
and change StockURLReader as:
class StockURLReader implements ItemReader<StockDataListBean> { String[] URLs = new String[0]; int index; StockDAO stockReader; void setURLs(String[] URL) { this.URLs = URL; index = 0; } StockDataListBean read() { StockDataListBean item = null; if(index < URLs.length) { item = new StockDataListBean(); for(String token : URLs[index].split(",").length) { item.data.add(stockReader.getStockData(token)); } } return item; } }
source share