1 package fr.ifremer.tutti.service.genericformat;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 import fr.ifremer.tutti.persistence.entities.data.Cruise;
28 import fr.ifremer.tutti.persistence.entities.data.FishingOperation;
29 import fr.ifremer.tutti.persistence.entities.referential.Gear;
30 import fr.ifremer.tutti.service.TuttiValidationDataContextSupport;
31 import fr.ifremer.tutti.service.ValidationService;
32 import fr.ifremer.tutti.service.csv.CsvComsumer;
33 import fr.ifremer.tutti.service.genericformat.consumer.CruiseNotFoundException;
34 import fr.ifremer.tutti.service.genericformat.consumer.FishingOperationNotFoundInCruiseException;
35 import fr.ifremer.tutti.service.genericformat.consumer.GearNotFoundInCruiseException;
36 import fr.ifremer.tutti.service.genericformat.csv.RowWithCruiseContextSupport;
37 import fr.ifremer.tutti.service.genericformat.csv.RowWithOperationContextSupport;
38 import org.apache.commons.io.IOUtils;
39 import org.nuiton.csv.ImportRow;
40 import org.nuiton.validator.NuitonValidatorResult;
41 import org.nuiton.validator.NuitonValidatorScope;
42
43 import java.io.Closeable;
44 import java.util.ArrayList;
45 import java.util.LinkedHashSet;
46 import java.util.List;
47 import java.util.Set;
48 import java.util.StringTokenizer;
49
50 import static org.nuiton.i18n.I18n.t;
51
52
53
54
55
56
57
58 public class GenericFormatImportValidationHelper implements Closeable {
59
60 private final ValidationService validationService;
61
62 private final TuttiValidationDataContextSupport originalValidationDataContextSupport;
63
64 private final GenericFormatImportValidationDataContext validationDataContext;
65
66 public GenericFormatImportValidationHelper(GenericFormatContextSupport importContext, ValidationService validationService) {
67 this.validationService = validationService;
68 this.validationDataContext = new GenericFormatImportValidationDataContext(importContext);
69 this.originalValidationDataContextSupport = TuttiValidationDataContextSupport.setValidationContext(validationDataContext, true);
70 }
71
72 public static String getMessage(String prefix, Set<String> messages) {
73
74 StringBuilder builder = new StringBuilder(prefix);
75 builder.append("<ul>");
76 for (String message : messages) {
77 builder.append("<li>").append(message).append("</li>");
78
79 }
80 builder.append("</ul>");
81 return builder.toString();
82
83 }
84
85 public Set<String> getMessages(NuitonValidatorResult validatorResult, NuitonValidatorScope scope) {
86
87 Set<String> result = null;
88 if (validatorResult.hasMessagesForScope(scope)) {
89
90 result = new LinkedHashSet<>();
91
92 List<String> messagesForScope = validatorResult.getMessagesForScope(scope);
93 for (String message : messagesForScope) {
94
95 String i18nError = getI18nError(message);
96 result.add(i18nError);
97 }
98
99 }
100 return result;
101
102 }
103
104 protected String getI18nError(String error) {
105 String text;
106 if (!error.contains("##")) {
107 text = t(error);
108 } else {
109 StringTokenizer stk = new StringTokenizer(error, "##");
110 String errorName = stk.nextToken();
111 List<String> args = new ArrayList<>();
112 while (stk.hasMoreTokens()) {
113 args.add(stk.nextToken());
114 }
115 text = t(errorName, args.toArray());
116 }
117 return text;
118 }
119
120 @Override
121 public void close() {
122
123 IOUtils.closeQuietly(validationService);
124
125 TuttiValidationDataContextSupport.setValidationContext(originalValidationDataContextSupport, true);
126
127 }
128
129
130
131
132
133 public NuitonValidatorResult validateCruise(Cruise cruise) {
134 return validationService.validateEditCruise(cruise);
135 }
136
137 public NuitonValidatorResult validateFishingOperation(FishingOperation fishingOperation) {
138
139 Cruise previousCruise = validationDataContext.getCruise();
140 try {
141 Cruise cruise = fishingOperation.getCruise();
142 validationDataContext.setCruise(cruise);
143 validationDataContext.setFishingOperation(fishingOperation);
144 return validationService.validateEditFishingOperation(fishingOperation);
145 } finally {
146 validationDataContext.setCruise(previousCruise);
147 }
148 }
149
150 public <R extends RowWithCruiseContextSupport> GenericFormatImportCruiseContext getCruise(CsvComsumer<R, ?> consumer, ImportRow<R> row, GenericFormatContextSupport importContext) {
151
152 GenericFormatImportCruiseContext cruiseContext = null;
153
154 if (row.isValid()) {
155
156 R bean = row.getBean();
157
158 boolean cruiseSkipped = importContext instanceof GenericFormatImportContext
159 && importContext.isCruiseSkipped(bean);
160
161 if (!cruiseSkipped) {
162
163 cruiseContext = importContext.getCruiseContext(bean);
164
165 if (cruiseContext == null) {
166
167 consumer.addCheckError(row, new CruiseNotFoundException(bean.getCruise()));
168
169 } else {
170
171 Cruise cruise = cruiseContext.getCruise();
172 bean.setCruise(cruise);
173 if (bean instanceof RowWithOperationContextSupport) {
174 ((RowWithOperationContextSupport) bean).getFishingOperation().setCruise(cruise);
175
176 }
177
178 }
179
180 }
181
182 }
183
184 return cruiseContext;
185
186 }
187
188 public <R extends RowWithOperationContextSupport> GenericFormatImportOperationContext getFishingOperationContext(CsvComsumer<R, ?> consumer, ImportRow<R> row, GenericFormatContextSupport importContext) {
189
190 GenericFormatImportOperationContext fishingOperationContext = null;
191
192 GenericFormatImportCruiseContext cruiseContext = getCruise(consumer, row, importContext);
193
194 if (cruiseContext != null) {
195
196 R bean = row.getBean();
197
198 boolean fishingOperationSkipped = importContext instanceof GenericFormatImportContext
199 && cruiseContext.isFishingOperationSkipped(bean);
200
201 if (!fishingOperationSkipped) {
202
203 fishingOperationContext = cruiseContext.getFishingOperationContext(bean);
204
205 if (fishingOperationContext == null) {
206
207 consumer.addCheckError(row, new FishingOperationNotFoundInCruiseException(bean.getFishingOperation()));
208
209 } else {
210
211 bean.setFishingOperation(fishingOperationContext.getFishingOperation());
212
213 }
214
215 }
216
217 }
218
219 return fishingOperationContext;
220
221 }
222
223 public <R extends RowWithCruiseContextSupport> Gear getGear(CsvComsumer<R, ?> consumer, GenericFormatContextSupport importContext, ImportRow<R> row, Gear gear, short rankOrder) {
224
225 Gear cruiseGear = null;
226
227 Cruise cruise = row.getBean().getCruise();
228 GenericFormatImportCruiseContext cruiseContext = importContext.getCruiseContext(cruise);
229 if (cruiseContext != null) {
230 cruiseGear = cruiseContext.getGear(gear, rankOrder);
231 if (cruiseGear == null) {
232 consumer.addCheckError(row, new GearNotFoundInCruiseException(cruise, gear, rankOrder));
233 }
234 }
235
236 return cruiseGear;
237
238 }
239
240 }