Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit a508729

Browse files
committed
Initial commit
1 parent 32f723b commit a508729

File tree

2 files changed

+586
-0
lines changed

2 files changed

+586
-0
lines changed
Lines changed: 354 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,354 @@
1+
/*
2+
* Copyright 2016 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package org.springframework.batch.item.file.builder;
17+
18+
import java.util.ArrayList;
19+
import java.util.Arrays;
20+
import java.util.HashSet;
21+
import java.util.Iterator;
22+
import java.util.List;
23+
import java.util.Set;
24+
25+
import org.springframework.batch.item.file.FlatFileItemReader;
26+
import org.springframework.batch.item.file.LineCallbackHandler;
27+
import org.springframework.batch.item.file.LineMapper;
28+
import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper;
29+
import org.springframework.batch.item.file.mapping.DefaultLineMapper;
30+
import org.springframework.batch.item.file.mapping.FieldSetMapper;
31+
import org.springframework.batch.item.file.separator.RecordSeparatorPolicy;
32+
import org.springframework.batch.item.file.separator.SimpleRecordSeparatorPolicy;
33+
import org.springframework.batch.item.file.transform.DefaultFieldSetFactory;
34+
import org.springframework.batch.item.file.transform.DelimitedLineTokenizer;
35+
import org.springframework.batch.item.file.transform.FieldSetFactory;
36+
import org.springframework.batch.item.file.transform.FixedLengthTokenizer;
37+
import org.springframework.batch.item.file.transform.LineTokenizer;
38+
import org.springframework.batch.item.file.transform.Range;
39+
import org.springframework.core.io.Resource;
40+
import org.springframework.util.StringUtils;
41+
42+
/**
43+
* @author Michael Minella
44+
*/
45+
public class FlatFileItemReaderBuilder<T> {
46+
47+
private String name;
48+
49+
private boolean strict = true;
50+
51+
private RecordSeparatorPolicy recordSeparatorPolicy =
52+
new SimpleRecordSeparatorPolicy();
53+
54+
private Resource resource;
55+
56+
private int maxItemCount = Integer.MAX_VALUE;
57+
58+
private List<String> comments = new ArrayList<>();
59+
60+
private int linesToSkip = 0;
61+
62+
private LineCallbackHandler skippedLinesCallback;
63+
64+
private LineMapper<T> lineMapper;
65+
66+
private FieldSetMapper<T> fieldSetMapper;
67+
68+
private LineTokenizer lineTokenizer;
69+
70+
private DelimitedBuilder<T> delimitedBuilder;
71+
72+
private FixedLengthBuilder<T> fixedLengthBuilder;
73+
74+
private Class<? extends T> beanMapperClass;
75+
76+
private boolean saveState = true;
77+
78+
public FlatFileItemReaderBuilder<T> strict(boolean strict) {
79+
this.strict = strict;
80+
return this;
81+
}
82+
83+
public FlatFileItemReaderBuilder<T> recordSeparatorPolicy(RecordSeparatorPolicy policy) {
84+
this.recordSeparatorPolicy = policy;
85+
return this;
86+
}
87+
88+
public FlatFileItemReaderBuilder<T> resource(Resource resource) {
89+
this.resource = resource;
90+
return this;
91+
}
92+
93+
public FlatFileItemReaderBuilder<T> maxItemCount(int maxItemCount) {
94+
this.maxItemCount = maxItemCount;
95+
return this;
96+
}
97+
98+
public FlatFileItemReaderBuilder<T> comments(String[] comments) {
99+
this.comments.addAll(Arrays.asList(comments));
100+
return this;
101+
}
102+
103+
public FlatFileItemReaderBuilder<T> addComment(String comment) {
104+
this.comments.add(comment);
105+
return this;
106+
}
107+
108+
public FlatFileItemReaderBuilder<T> linesToSkip(int linesToSkip) {
109+
this.linesToSkip = linesToSkip;
110+
return this;
111+
}
112+
113+
public FlatFileItemReaderBuilder<T> skippedLinesCallback(LineCallbackHandler callback) {
114+
this.skippedLinesCallback = callback;
115+
return this;
116+
}
117+
118+
public FlatFileItemReaderBuilder<T> lineMapper(LineMapper<T> lineMapper) {
119+
this.lineMapper = lineMapper;
120+
return this;
121+
}
122+
123+
public FlatFileItemReaderBuilder<T> fieldSetMapper(FieldSetMapper<T> mapper) {
124+
this.fieldSetMapper = mapper;
125+
return this;
126+
}
127+
128+
public FlatFileItemReaderBuilder<T> lineTokenizer(LineTokenizer tokenizer) {
129+
this.lineTokenizer = tokenizer;
130+
return this;
131+
}
132+
133+
public DelimitedBuilder<T> delimited() {
134+
this.delimitedBuilder = new DelimitedBuilder<>(this);
135+
return this.delimitedBuilder;
136+
}
137+
138+
public FixedLengthBuilder<T> fixedLength() {
139+
this.fixedLengthBuilder = new FixedLengthBuilder<>(this);
140+
return this.fixedLengthBuilder;
141+
}
142+
143+
public FlatFileItemReaderBuilder<T> beanMapperClass(Class beanMapperClass) {
144+
this.beanMapperClass = beanMapperClass;
145+
return this;
146+
}
147+
148+
public FlatFileItemReaderBuilder<T> saveState(boolean saveState) {
149+
this.saveState = saveState;
150+
return this;
151+
}
152+
153+
public FlatFileItemReaderBuilder<T> name(String name) {
154+
this.name = name;
155+
return this;
156+
}
157+
158+
public FlatFileItemReader<T> build() throws Exception {
159+
FlatFileItemReader<T> reader = new FlatFileItemReader<>();
160+
161+
reader.setName(this.name);
162+
reader.setResource(this.resource);
163+
164+
if(this.lineMapper != null) {
165+
reader.setLineMapper(this.lineMapper);
166+
}
167+
else {
168+
DefaultLineMapper<T> lineMapper = new DefaultLineMapper<>();
169+
170+
if(this.lineTokenizer != null) {
171+
lineMapper.setLineTokenizer(this.lineTokenizer);
172+
lineMapper.setFieldSetMapper(this.fieldSetMapper);
173+
}
174+
else if(this.fixedLengthBuilder != null) {
175+
lineMapper.setLineTokenizer(this.fixedLengthBuilder.build());
176+
}
177+
else if(this.delimitedBuilder != null) {
178+
lineMapper.setLineTokenizer(this.delimitedBuilder.build());
179+
}
180+
else {
181+
throw new IllegalStateException("No LineTokenizer implementation was provided");
182+
}
183+
184+
if(this.beanMapperClass != null) {
185+
BeanWrapperFieldSetMapper mapper = new BeanWrapperFieldSetMapper();
186+
mapper.setTargetType(this.beanMapperClass);
187+
mapper.afterPropertiesSet();
188+
189+
lineMapper.setFieldSetMapper(mapper);
190+
}
191+
192+
reader.setLineMapper(lineMapper);
193+
}
194+
195+
reader.setLinesToSkip(this.linesToSkip);
196+
reader.setComments(this.comments.toArray(new String[this.comments.size()]));
197+
reader.setSkippedLinesCallback(this.skippedLinesCallback);
198+
reader.setRecordSeparatorPolicy(this.recordSeparatorPolicy);
199+
reader.setMaxItemCount(this.maxItemCount);
200+
reader.setSaveState(this.saveState);
201+
reader.setStrict(this.strict);
202+
203+
return reader;
204+
}
205+
206+
public static class DelimitedBuilder<T> {
207+
private FlatFileItemReaderBuilder<T> parent;
208+
209+
private List<String> names = new ArrayList<>();
210+
211+
private String delimiter;
212+
213+
private Character quoteCharacter;
214+
215+
private List<Integer> includedFields = new ArrayList<>();
216+
217+
private FieldSetFactory fieldSetFactory = new DefaultFieldSetFactory();
218+
219+
private boolean strict = true;
220+
221+
public DelimitedBuilder(FlatFileItemReaderBuilder<T> parent) {
222+
this.parent = parent;
223+
}
224+
225+
public DelimitedBuilder<T> delimiter(String delimiter) {
226+
this.delimiter = delimiter;
227+
return this;
228+
}
229+
230+
public DelimitedBuilder<T> quoteCharacter(char quoteCharacter) {
231+
this.quoteCharacter = quoteCharacter;
232+
return this;
233+
}
234+
235+
public DelimitedBuilder<T> includedFields(Integer[] fields) {
236+
this.includedFields.addAll(Arrays.asList(fields));
237+
return this;
238+
}
239+
240+
public DelimitedBuilder<T> addIncludedField(int field) {
241+
this.includedFields.add(field);
242+
return this;
243+
}
244+
245+
public DelimitedBuilder<T> fieldSetFactory(FieldSetFactory fieldSetFactory) {
246+
this.fieldSetFactory = fieldSetFactory;
247+
return this;
248+
}
249+
250+
public FlatFileItemReaderBuilder<T> names(String [] names) {
251+
this.names.addAll(Arrays.asList(names));
252+
return this.parent;
253+
}
254+
255+
public DelimitedLineTokenizer build() throws Exception {
256+
DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();
257+
258+
tokenizer.setNames(this.names.toArray(new String[this.names.size()]));
259+
260+
if(StringUtils.hasText(this.delimiter)) {
261+
tokenizer.setDelimiter(this.delimiter);
262+
}
263+
264+
if(this.quoteCharacter != null) {
265+
tokenizer.setQuoteCharacter(this.quoteCharacter);
266+
}
267+
268+
if(!this.includedFields.isEmpty()) {
269+
Set<Integer> deDupedFields = new HashSet<>(this.includedFields.size());
270+
deDupedFields.addAll(this.includedFields);
271+
deDupedFields.remove(null);
272+
273+
int [] fields = new int[deDupedFields.size()];
274+
Iterator<Integer> iterator = deDupedFields.iterator();
275+
for(int i = 0; i < fields.length; i++) {
276+
fields[i] = iterator.next();
277+
}
278+
279+
tokenizer.setIncludedFields(fields);
280+
}
281+
282+
tokenizer.setFieldSetFactory(this.fieldSetFactory);
283+
tokenizer.setStrict(this.strict);
284+
285+
tokenizer.afterPropertiesSet();
286+
287+
return tokenizer;
288+
}
289+
}
290+
291+
public static class FixedLengthBuilder<T> {
292+
private FlatFileItemReaderBuilder<T> parent;
293+
294+
private List<Range> ranges = new ArrayList<>();
295+
296+
private int maxRange = 0;
297+
298+
private List<String> names = new ArrayList<>();
299+
300+
private boolean strict = true;
301+
302+
private FieldSetFactory fieldSetFactory = new DefaultFieldSetFactory();
303+
304+
public FixedLengthBuilder(FlatFileItemReaderBuilder<T> parent) {
305+
this.parent = parent;
306+
}
307+
308+
public FixedLengthBuilder<T> ranges(Range[] ranges) {
309+
this.ranges.addAll(Arrays.asList(ranges));
310+
return this;
311+
}
312+
313+
public FixedLengthBuilder<T> addRange(Range range) {
314+
this.ranges.add(range);
315+
return this;
316+
}
317+
318+
public FixedLengthBuilder<T> addRange(Range range, int index) {
319+
this.ranges.add(index, range);
320+
return this;
321+
}
322+
323+
public FixedLengthBuilder<T> maxRange(int maxRange) {
324+
this.maxRange = maxRange;
325+
return this;
326+
}
327+
328+
public FlatFileItemReaderBuilder<T> names(String [] names) {
329+
this.names.addAll(Arrays.asList(names));
330+
return this.parent;
331+
}
332+
333+
public FixedLengthBuilder<T> strict(boolean strict) {
334+
this.strict = strict;
335+
return this;
336+
}
337+
338+
public FixedLengthBuilder<T> fieldSetFactory(FieldSetFactory factory) {
339+
this.fieldSetFactory = factory;
340+
return this;
341+
}
342+
343+
public FixedLengthTokenizer build() {
344+
FixedLengthTokenizer tokenizer = new FixedLengthTokenizer();
345+
346+
tokenizer.setNames(this.names.toArray(new String[this.names.size()]));
347+
tokenizer.setColumns(this.ranges.toArray(new Range[this.ranges.size()]));
348+
tokenizer.setFieldSetFactory(this.fieldSetFactory);
349+
tokenizer.setStrict(this.strict);
350+
351+
return tokenizer;
352+
}
353+
}
354+
}

0 commit comments

Comments
 (0)