1 package com.github.mygreen.supercsv.validation;
2
3 import java.util.ArrayList;
4 import java.util.List;
5 import java.util.Objects;
6
7 import com.github.mygreen.supercsv.annotation.CsvColumn;
8 import com.github.mygreen.supercsv.builder.ColumnMapping;
9 import com.github.mygreen.supercsv.util.ArgUtils;
10
11
12
13
14
15
16
17
18
19 public class CsvField<T> {
20
21 private final String name;
22
23 private final T value;
24
25 private final ColumnMapping columnMapping;
26
27 private final ValidationContext<?> validationContext;
28
29 private final List<CsvFieldValidator<T>> validators = new ArrayList<>();
30
31
32
33
34
35
36
37
38
39
40 @SuppressWarnings("unchecked")
41 public <R> CsvField(final ValidationContext<R> validationContext, final R record, final String fieldName) {
42 Objects.requireNonNull(validationContext);
43 Objects.requireNonNull(record);
44 ArgUtils.notEmpty(fieldName, "fieldName");
45
46 this.columnMapping = validationContext.getBeanMapping().getColumnMapping(fieldName)
47 .orElseThrow(() -> new IllegalArgumentException(
48 String.format("not found field '%s' in record '%s'", fieldName, record.getClass().getName())));
49
50 this.validationContext = validationContext;
51 this.name = fieldName;
52 this.value = (T)columnMapping.getField().getValue(record);
53
54 }
55
56
57
58
59
60 public String getName() {
61 return name;
62 }
63
64
65
66
67
68 @SuppressWarnings("unchecked")
69 public Class<T> getType() {
70 return (Class<T>) columnMapping.getField().getType();
71 }
72
73
74
75
76
77 public String getLabel() {
78 return columnMapping.getLabel();
79 }
80
81
82
83
84
85 public int getColumnNumber() {
86 return columnMapping.getNumber();
87 }
88
89
90
91
92
93
94
95 public boolean hasError(final CsvBindingErrors bindingErrors) {
96 Objects.requireNonNull(bindingErrors);
97 return bindingErrors.hasFieldErrors(name);
98 }
99
100
101
102
103
104
105
106
107 public boolean hasNotError(final CsvBindingErrors bindingErrors) {
108 return !hasError(bindingErrors);
109 }
110
111
112
113
114
115
116 public boolean isEmpty() {
117 if(value == null) {
118 return true;
119 }
120
121 if(value instanceof String) {
122 return ((String)value).isEmpty();
123 }
124
125 return false;
126 }
127
128
129
130
131
132
133 public boolean isNotEmpty() {
134 return !isEmpty();
135
136 }
137
138
139
140
141
142
143
144 public CsvField<T> add(final CsvFieldValidator<T> validator) {
145 Objects.requireNonNull(validator);
146
147 validators.add(validator);
148 return this;
149 }
150
151
152
153
154
155
156
157
158 public CsvField<T> validate(final CsvBindingErrors bindingErrors) {
159 Objects.requireNonNull(bindingErrors);
160
161 for(CsvFieldValidator<T> validator : getValidators()) {
162 if(hasError(bindingErrors)) {
163 return this;
164 }
165
166 validator.validate(bindingErrors, this);
167 }
168
169 return this;
170
171 }
172
173
174
175
176
177
178
179 public List<CsvFieldError> getFieldErrors(final CsvBindingErrors bindingErrors) {
180 Objects.requireNonNull(bindingErrors);
181 return bindingErrors.getFieldErrors(getName());
182 }
183
184
185
186
187
188 public T getValue() {
189 return value;
190 }
191
192
193
194
195
196 public ColumnMapping getColumnMapping() {
197 return columnMapping;
198 }
199
200
201
202
203
204 public ValidationContext<?> getValidationContext() {
205 return validationContext;
206 }
207
208
209
210
211
212 public List<CsvFieldValidator<T>> getValidators() {
213 return validators;
214 }
215
216 }