1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.springframework.batch.core.step.item;
18
19 import java.util.ArrayList;
20 import java.util.Collection;
21 import java.util.Collections;
22 import java.util.Iterator;
23 import java.util.List;
24
25
26
27
28
29
30
31
32
33
34
35 public class Chunk<W> implements Iterable<W> {
36
37 private List<W> items = new ArrayList<W>();
38
39 private List<SkipWrapper<W>> skips = new ArrayList<SkipWrapper<W>>();
40
41 private List<Exception> errors = new ArrayList<Exception>();
42
43 private Object userData;
44
45 private boolean end;
46
47 private boolean busy;
48
49 public Chunk() {
50 this(null, null);
51 }
52
53 public Chunk(Collection<? extends W> items) {
54 this(items, null);
55 }
56
57 public Chunk(Collection<? extends W> items, List<SkipWrapper<W>> skips) {
58 super();
59 if (items != null) {
60 this.items = new ArrayList<W>(items);
61 }
62 if (skips != null) {
63 this.skips = new ArrayList<SkipWrapper<W>>(skips);
64 }
65 }
66
67
68
69
70
71 public void add(W item) {
72 items.add(item);
73 }
74
75
76
77
78 public void clear() {
79 items.clear();
80 skips.clear();
81 userData = null;
82 }
83
84
85
86
87 public List<W> getItems() {
88 return Collections.unmodifiableList(new ArrayList<W>(items));
89 }
90
91
92
93
94 public List<SkipWrapper<W>> getSkips() {
95 return Collections.unmodifiableList(skips);
96 }
97
98
99
100
101 public List<Exception> getErrors() {
102 return Collections.unmodifiableList(errors);
103 }
104
105
106
107
108
109
110
111 public void skip(Exception e) {
112 errors.add(e);
113 }
114
115
116
117
118 public boolean isEmpty() {
119 return items.isEmpty();
120 }
121
122
123
124
125
126 @Override
127 public ChunkIterator iterator() {
128 return new ChunkIterator(items);
129 }
130
131
132
133
134 public int size() {
135 return items.size();
136 }
137
138
139
140
141
142
143 public boolean isEnd() {
144 return end;
145 }
146
147
148
149
150
151 public void setEnd() {
152 this.end = true;
153 }
154
155
156
157
158
159
160
161 public boolean isBusy() {
162 return busy;
163 }
164
165
166
167
168
169
170
171 public void setBusy(boolean busy) {
172 this.busy = busy;
173 }
174
175
176
177
178 public void clearSkips() {
179 skips.clear();
180 }
181
182 public Object getUserData() {
183 return userData;
184 }
185
186 public void setUserData(Object userData) {
187 this.userData = userData;
188 }
189
190
191
192
193
194
195 @Override
196 public String toString() {
197 return String.format("[items=%s, skips=%s]", items, skips);
198 }
199
200
201
202
203
204
205
206
207 public class ChunkIterator implements Iterator<W> {
208
209 final private Iterator<W> iterator;
210
211 private W next;
212
213 public ChunkIterator(List<W> items) {
214 iterator = items.iterator();
215 }
216
217 @Override
218 public boolean hasNext() {
219 return iterator.hasNext();
220 }
221
222 @Override
223 public W next() {
224 next = iterator.next();
225 return next;
226 }
227
228 public void remove(Throwable e) {
229 remove();
230 skips.add(new SkipWrapper<W>(next, e));
231 }
232
233 @Override
234 public void remove() {
235 if (next == null) {
236 if (iterator.hasNext()) {
237 next = iterator.next();
238 }
239 else {
240 return;
241 }
242 }
243 iterator.remove();
244 }
245
246 @Override
247 public String toString() {
248 return String.format("[items=%s, skips=%s]", items, skips);
249 }
250
251 }
252
253 }