1 package fr.ifremer.tutti.service.operationimport;
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.CaracteristicMap;
28 import fr.ifremer.tutti.persistence.entities.TuttiEntities;
29 import fr.ifremer.tutti.persistence.entities.data.FishingOperation;
30 import fr.ifremer.tutti.persistence.entities.data.FishingOperations;
31 import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow;
32 import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicType;
33 import fr.ifremer.tutti.persistence.entities.protocol.OperationFieldMappingRow;
34 import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol;
35 import fr.ifremer.tutti.persistence.entities.referential.Caracteristic;
36 import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue;
37 import fr.ifremer.tutti.persistence.entities.referential.Gear;
38 import fr.ifremer.tutti.persistence.entities.referential.Person;
39 import fr.ifremer.tutti.persistence.entities.referential.TuttiLocation;
40 import fr.ifremer.tutti.persistence.entities.referential.Vessel;
41 import fr.ifremer.tutti.service.PersistenceService;
42 import fr.ifremer.tutti.service.csv.TuttiCsvUtil;
43 import fr.ifremer.tutti.service.TuttiDataContext;
44 import fr.ifremer.tutti.service.csv.AbstractTuttiImportModel;
45 import org.apache.commons.lang3.StringUtils;
46 import org.nuiton.csv.ValueParser;
47 import org.nuiton.csv.ValueSetter;
48 import org.nuiton.util.DateUtil;
49
50 import java.io.Serializable;
51 import java.util.ArrayList;
52 import java.util.Collection;
53 import java.util.Date;
54 import java.util.List;
55 import java.util.Map;
56 import java.util.Set;
57
58
59
60
61
62
63
64 public class ImportFromColumnFileModel extends AbstractTuttiImportModel<FishingOperation> {
65
66 private final FishingOperation fishingOperation;
67
68 public ImportFromColumnFileModel(char separator, Set<String> headers,
69 PersistenceService persistenceService,
70 TuttiDataContext dataContext,
71 FishingOperation fishingOperation) throws ImportFromColumnFileMissingHeaderException {
72 super(separator);
73 this.fishingOperation = fishingOperation;
74
75 TuttiProtocol protocol = dataContext.getProtocol();
76 Collection<OperationFieldMappingRow> operationFieldMapping = protocol.getOperationFieldMapping();
77
78 String zoneId = dataContext.getProgram().getZone().getId();
79
80 for (OperationFieldMappingRow mappingRow : operationFieldMapping) {
81 String importColumn = mappingRow.getImportColumn();
82 boolean importColumnsInHeaders = headers.remove(importColumn);
83 if (StringUtils.isNotBlank(importColumn) && importColumnsInHeaders) {
84
85 String field = mappingRow.getField();
86 ValueSetter valueSetter = null;
87 ValueParser valueParser;
88 switch (field) {
89 case FishingOperation.PROPERTY_FISHING_OPERATION_NUMBER:
90 case FishingOperation.PROPERTY_TRAWL_DISTANCE:
91 valueParser = TuttiCsvUtil.INTEGER;
92 break;
93
94 case FishingOperation.PROPERTY_GEAR_SHOOTING_START_LATITUDE:
95 case FishingOperation.PROPERTY_GEAR_SHOOTING_START_LONGITUDE:
96 case FishingOperation.PROPERTY_GEAR_SHOOTING_END_LATITUDE:
97 case FishingOperation.PROPERTY_GEAR_SHOOTING_END_LONGITUDE:
98 valueParser = TuttiCsvUtil.FLOAT;
99 break;
100
101 case FishingOperations.PROPERTY_GEAR_SHOOTING_START_DAY:
102 valueParser = TuttiCsvUtil.DAY;
103 valueSetter = new ValueSetter<FishingOperation, Date>() {
104 @Override
105 public void set(FishingOperation bean, Date value) throws Exception {
106 Date date = bean.getGearShootingStartDate();
107 if (date == null) {
108 date = value;
109
110 } else {
111 date = DateUtil.getDateAndTime(value, date, false, false);
112 }
113 bean.setGearShootingStartDate(date);
114 }
115 };
116 break;
117 case FishingOperations.PROPERTY_GEAR_SHOOTING_END_DAY:
118 valueParser = TuttiCsvUtil.DAY;
119 valueSetter = new ValueSetter<FishingOperation, Date>() {
120 @Override
121 public void set(FishingOperation bean, Date value) throws Exception {
122 Date date = bean.getGearShootingEndDate();
123 if (date == null) {
124 date = value;
125
126 } else {
127 date = DateUtil.getDateAndTime(value, date, false, false);
128 }
129 bean.setGearShootingEndDate(date);
130 }
131 };
132 break;
133
134 case FishingOperations.PROPERTY_GEAR_SHOOTING_START_TIME:
135 valueParser = TuttiCsvUtil.TIME;
136 valueSetter = new ValueSetter<FishingOperation, Date>() {
137 @Override
138 public void set(FishingOperation bean, Date value) throws Exception {
139 Date date = bean.getGearShootingStartDate();
140 if (date == null) {
141 date = value;
142
143 } else {
144 date = DateUtil.getDateAndTime(date, value, false, false);
145 }
146 bean.setGearShootingStartDate(date);
147 }
148 };
149 break;
150 case FishingOperations.PROPERTY_GEAR_SHOOTING_END_TIME:
151 valueParser = TuttiCsvUtil.TIME;
152 valueSetter = new ValueSetter<FishingOperation, Date>() {
153 @Override
154 public void set(FishingOperation bean, Date value) throws Exception {
155 Date date = bean.getGearShootingEndDate();
156 if (date == null) {
157 date = value;
158
159 } else {
160 date = DateUtil.getDateAndTime(date, value, false, false);
161 }
162 bean.setGearShootingEndDate(date);
163 }
164 };
165 break;
166
167 case FishingOperation.PROPERTY_FISHING_OPERATION_RECTILIGNE:
168 valueParser = TuttiCsvUtil.PRIMITIVE_BOOLEAN;
169 break;
170
171 case FishingOperation.PROPERTY_FISHING_OPERATION_VALID:
172 valueParser = TuttiCsvUtil.BOOLEAN;
173 break;
174
175 case FishingOperation.PROPERTY_GEAR:
176 List<Gear> gears = new ArrayList<>(dataContext.getFishingGears());
177 gears.addAll(dataContext.getScientificGears());
178 Map<String, Gear> gearUniverse = TuttiEntities.splitById(gears);
179 valueParser = newForeignKeyParserFormatter(Gear.class, field, gearUniverse);
180 break;
181
182 case FishingOperation.PROPERTY_VESSEL:
183 List<Vessel> vessels = new ArrayList<>(dataContext.getFishingVessels());
184 vessels.addAll(dataContext.getScientificVessels());
185 Map<String, Vessel> vesselUniverse = TuttiEntities.splitById(vessels);
186 valueParser = newForeignKeyParserFormatter(Vessel.class, field, vesselUniverse);
187 break;
188
189 case FishingOperation.PROPERTY_SECONDARY_VESSEL:
190 vessels = new ArrayList<>(dataContext.getFishingVessels());
191 vessels.addAll(dataContext.getScientificVessels());
192 vesselUniverse = TuttiEntities.splitById(vessels);
193 valueParser = newForeignKeyListParserFormatter(Vessel.class, field, vesselUniverse);
194 break;
195
196 case FishingOperation.PROPERTY_STRATA:
197 Map<String, TuttiLocation> strataUniverse = TuttiEntities.splitById(
198 persistenceService.getAllFishingOperationStrata(zoneId));
199 valueParser = newForeignKeyParserFormatter(TuttiLocation.class, field, strataUniverse);
200 break;
201
202 case FishingOperation.PROPERTY_SUB_STRATA:
203 Map<String, TuttiLocation> subStrataUniverse = TuttiEntities.splitById(
204 persistenceService.getAllFishingOperationSubStrata(zoneId, null));
205 valueParser = newForeignKeyParserFormatter(TuttiLocation.class, field, subStrataUniverse);
206 break;
207
208 case FishingOperation.PROPERTY_LOCATION:
209 Map<String, TuttiLocation> locationUniverse = TuttiEntities.splitById(
210 persistenceService.getAllFishingOperationLocation(zoneId, null, null));
211 valueParser = newForeignKeyParserFormatter(TuttiLocation.class, field, locationUniverse);
212 break;
213
214 case FishingOperation.PROPERTY_RECORDER_PERSON:
215 Map<String, Person> personUniverse = TuttiEntities.splitById(dataContext.getPersons());
216 valueParser = newForeignKeyListParserFormatter(Person.class, field, personUniverse);
217 break;
218
219 default:
220 valueParser = TuttiCsvUtil.STRING;
221
222 }
223
224 if (valueSetter == null) {
225 newMandatoryColumn(importColumn, field, valueParser);
226
227 } else {
228 newMandatoryColumn(importColumn, valueParser, valueSetter);
229 }
230
231 } else if (!importColumnsInHeaders) {
232 throw new ImportFromColumnFileMissingHeaderException(importColumn);
233 }
234 }
235
236 Collection<CaracteristicMappingRow> caracteristicMappingRows = protocol.getCaracteristicMapping();
237 for (final CaracteristicMappingRow mappingRow : caracteristicMappingRows) {
238 String importColumn = mappingRow.getImportColumn();
239 if (StringUtils.isNotBlank(importColumn) && headers.remove(importColumn)) {
240
241 int pmfmId = Integer.parseInt(mappingRow.getPmfmId());
242 final Caracteristic caracteristic = persistenceService.getCaracteristic(pmfmId);
243
244 ValueSetter<FishingOperation, String> setter = (fishingOperation1, value) -> {
245
246 Serializable realValue = null;
247 if (StringUtils.isNotBlank(value)) {
248 switch (caracteristic.getCaracteristicType()) {
249 case QUALITATIVE:
250 for (CaracteristicQualitativeValue cqv : caracteristic.getQualitativeValue()) {
251 if (value.equals(cqv.getId())) {
252 realValue = cqv;
253 break;
254 }
255 }
256 break;
257
258 case NUMBER:
259 realValue = Float.parseFloat(value);
260 break;
261
262 default:
263 realValue = value;
264 }
265 }
266
267 CaracteristicMap caracteristicMap;
268 if (CaracteristicType.GEAR_USE_FEATURE.toString().equals(mappingRow.getTab())) {
269 caracteristicMap = fishingOperation1.getGearUseFeatures();
270 if (caracteristicMap == null) {
271 caracteristicMap = new CaracteristicMap();
272 fishingOperation1.setGearUseFeatures(caracteristicMap);
273 }
274
275 } else {
276 caracteristicMap = fishingOperation1.getVesselUseFeatures();
277 if (caracteristicMap == null) {
278 caracteristicMap = new CaracteristicMap();
279 fishingOperation1.setVesselUseFeatures(caracteristicMap);
280 }
281 }
282 caracteristicMap.put(caracteristic, realValue);
283
284 };
285 newMandatoryColumn(importColumn, setter);
286
287 }
288 }
289
290
291 for (String header : headers) {
292 newIgnoredColumn(header);
293 }
294 }
295
296 @Override
297 public FishingOperation newEmptyInstance() {
298
299
300
301 return fishingOperation;
302 }
303 }