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.beans.PropertyEditorSupport;
20 import java.util.Arrays;
21 import java.util.Comparator;
22
23 import org.springframework.util.Assert;
24 import org.springframework.util.StringUtils;
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 public class RangeArrayPropertyEditor extends PropertyEditorSupport {
51
52 private boolean forceDisjointRanges = false;
53
54
55
56
57
58
59
60 public void setForceDisjointRanges(boolean forceDisjointRanges) {
61 this.forceDisjointRanges = forceDisjointRanges;
62 }
63
64 @Override
65 public void setAsText(String text) throws IllegalArgumentException {
66
67
68 String[] strRanges = text.split(",");
69 Range[] ranges = new Range[strRanges.length];
70
71
72 for (int i = 0; i < strRanges.length; i++) {
73 String[] range = strRanges[i].split("-");
74
75 int min;
76 int max;
77
78 if ((range.length == 1) && (StringUtils.hasText(range[0]))) {
79 min = Integer.parseInt(range[0].trim());
80
81 ranges[i] = new Range(min);
82 } else if ((range.length == 2) && (StringUtils.hasText(range[0]))
83 && (StringUtils.hasText(range[1]))) {
84 min = Integer.parseInt(range[0].trim());
85 max = Integer.parseInt(range[1].trim());
86 ranges[i] = new Range(min,max);
87 } else {
88 throw new IllegalArgumentException("Range[" + i + "]: range (" + strRanges[i] + ") is invalid");
89 }
90
91 }
92
93 setMaxValues(ranges);
94 setValue(ranges);
95 }
96
97 @Override
98 public String getAsText() {
99 Range[] ranges = (Range[])getValue();
100
101 StringBuffer sb = new StringBuffer();
102
103 for (int i = 0; i < ranges.length; i++) {
104 if(i>0) {
105 sb.append(", ");
106 }
107 sb.append(ranges[i]);
108 }
109 return sb.toString();
110 }
111
112 private void setMaxValues(final Range[] ranges) {
113
114
115 Integer[] c = new Integer[ranges.length];
116 for (int i=0; i<c.length; i++) {
117 c[i] = i;
118 }
119
120
121 Arrays.sort(c, new Comparator<Integer>() {
122 @Override
123 public int compare(Integer r1, Integer r2) {
124 return ranges[r1].getMin()-ranges[r2].getMin();
125 }
126 }
127 );
128
129
130 for (int i = 0; i < c.length - 1; i++) {
131 if (!ranges[c[i]].hasMaxValue()) {
132
133 ranges[c[i]] = new Range(ranges[c[i]].getMin(),ranges[c[i+1]].getMin() - 1);
134 }
135 }
136
137 if (forceDisjointRanges) {
138 verifyRanges(ranges);
139 }
140 }
141
142
143 private void verifyRanges(Range[] ranges) {
144
145 for(int i = 1; i < ranges.length;i++) {
146 Assert.isTrue(ranges[i-1].getMax() < ranges[i].getMin(),
147 "Ranges must be disjoint. Range[" + (i-1) + "]: (" + ranges[i-1] +
148 ") Range[" + i +"]: (" + ranges[i] + ")");
149 }
150 }
151 }