1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.springframework.batch.item.file.transform;
18
19 import java.util.ArrayList;
20 import java.util.Arrays;
21 import java.util.List;
22
23
24
25
26
27
28
29
30
31
32
33 public class FixedLengthTokenizer extends AbstractLineTokenizer {
34
35 private Range[] ranges;
36
37 private int maxRange = 0;
38
39 boolean open = false;
40
41
42
43
44
45
46
47
48
49
50
51
52 public void setColumns(Range[] ranges) {
53 this.ranges = Arrays.asList(ranges).toArray(new Range[ranges.length]);
54 calculateMaxRange(ranges);
55 }
56
57
58
59
60
61
62 private void calculateMaxRange(Range[] ranges) {
63 if (ranges == null || ranges.length == 0) {
64 maxRange = 0;
65 return;
66 }
67
68 open = false;
69 maxRange = ranges[0].getMin();
70
71 for (int i = 0; i < ranges.length; i++) {
72 int upperBound;
73 if (ranges[i].hasMaxValue()) {
74 upperBound = ranges[i].getMax();
75 }
76 else {
77 upperBound = ranges[i].getMin();
78 if (upperBound > maxRange) {
79 open = true;
80 }
81 }
82
83 if (upperBound > maxRange) {
84 maxRange = upperBound;
85 }
86 }
87 }
88
89
90
91
92
93
94
95
96
97
98
99 protected List<String> doTokenize(String line) {
100 List<String> tokens = new ArrayList<String>(ranges.length);
101 int lineLength;
102 String token;
103
104 lineLength = line.length();
105
106 if (lineLength < maxRange && isStrict()) {
107 throw new IncorrectLineLengthException("Line is shorter than max range " + maxRange, maxRange, lineLength);
108 }
109
110 if (!open && lineLength > maxRange && isStrict()) {
111 throw new IncorrectLineLengthException("Line is longer than max range " + maxRange, maxRange, lineLength);
112 }
113
114 for (int i = 0; i < ranges.length; i++) {
115
116 int startPos = ranges[i].getMin() - 1;
117 int endPos = ranges[i].getMax();
118
119 if (lineLength >= endPos) {
120 token = line.substring(startPos, endPos);
121 }
122 else if (lineLength >= startPos) {
123 token = line.substring(startPos);
124 }
125 else {
126 token = "";
127 }
128
129 tokens.add(token);
130 }
131
132 return tokens;
133 }
134 }