1 package fr.ifremer.tutti.persistence.service.util;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 import com.google.common.base.Preconditions;
26 import com.google.common.collect.Sets;
27 import fr.ifremer.adagio.core.dao.administration.user.DepartmentId;
28 import fr.ifremer.adagio.core.dao.data.batch.Batch;
29 import fr.ifremer.adagio.core.dao.data.batch.CatchBatchExtendDao;
30 import fr.ifremer.adagio.core.dao.data.batch.SortingBatch;
31 import fr.ifremer.adagio.core.dao.data.measure.GearUseMeasurement;
32 import fr.ifremer.adagio.core.dao.data.measure.Measurement;
33 import fr.ifremer.adagio.core.dao.data.measure.QuantificationMeasurement;
34 import fr.ifremer.adagio.core.dao.data.measure.SortingMeasurement;
35 import fr.ifremer.adagio.core.dao.data.measure.SurveyMeasurement;
36 import fr.ifremer.adagio.core.dao.data.measure.VesselUseMeasurement;
37 import fr.ifremer.adagio.core.dao.data.survey.fishingTrip.FishingTrip;
38 import fr.ifremer.adagio.core.dao.data.survey.scientificCruise.ScientificCruise;
39 import fr.ifremer.adagio.core.dao.data.vessel.feature.use.GearUseFeatures;
40 import fr.ifremer.adagio.core.dao.data.vessel.feature.use.VesselUseFeatures;
41 import fr.ifremer.adagio.core.dao.referential.QualityFlagCode;
42 import fr.ifremer.adagio.core.dao.referential.QualityFlagImpl;
43 import fr.ifremer.adagio.core.dao.referential.pmfm.Pmfm;
44 import fr.ifremer.adagio.core.dao.referential.pmfm.PmfmId;
45 import fr.ifremer.adagio.core.dao.referential.pmfm.PmfmImpl;
46 import fr.ifremer.adagio.core.dao.referential.pmfm.QualitativeValue;
47 import fr.ifremer.adagio.core.dao.referential.pmfm.QualitativeValueImpl;
48 import fr.ifremer.tutti.persistence.entities.referential.Caracteristic;
49 import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue;
50 import fr.ifremer.tutti.persistence.service.AbstractPersistenceService;
51 import fr.ifremer.tutti.persistence.service.referential.CaracteristicPersistenceService;
52 import org.springframework.stereotype.Component;
53
54 import javax.annotation.Resource;
55 import java.io.Serializable;
56 import java.util.Collection;
57 import java.util.Iterator;
58 import java.util.Set;
59
60
61
62
63
64
65
66 @Component("measurementPersistenceHelper")
67 public class MeasurementPersistenceHelper extends AbstractPersistenceService {
68
69 @Resource(name = "caracteristicPersistenceService")
70 private CaracteristicPersistenceService caracteristicService;
71
72 @Resource(name = "catchBatchDao")
73 protected CatchBatchExtendDao catchBatchDao;
74
75 public void setMeasurement(Measurement measurement,
76 Caracteristic caracteristic,
77 Serializable value) {
78 if (value == null) {
79 return;
80 }
81 switch (caracteristic.getCaracteristicType()) {
82
83 case NUMBER:
84 measurement.setNumericalValue((Float) value);
85 break;
86 case QUALITATIVE:
87 Integer qvId = null;
88 if (value instanceof CaracteristicQualitativeValue) {
89 qvId = Integer.valueOf(((CaracteristicQualitativeValue) value).getId());
90 } else if (value instanceof Integer) {
91 qvId = (Integer) value;
92 }else if (value instanceof String) {
93 qvId = Integer.valueOf((String)value);
94 }
95 QualitativeValue qv = load(QualitativeValueImpl.class, qvId);
96 measurement.setQualitativeValue(qv);
97 break;
98 case TEXT:
99 measurement.setAlphanumericalValue((String) value);
100 break;
101 }
102 }
103
104
105
106
107
108 public SortingMeasurement setSortingMeasurement(
109 SortingBatch sortingBatch,
110 Integer pmfmId,
111 Serializable value) {
112 Preconditions.checkNotNull(pmfmId);
113 Preconditions.checkNotNull(value);
114
115 Caracteristic caracteristic = caracteristicService.getCaracteristic(pmfmId);
116 SortingMeasurement sortingMeasurement = catchBatchDao.getSortingMeasurement(
117 sortingBatch, pmfmId, getRecorderDepartmentId(), true);
118 setMeasurement(sortingMeasurement,
119 caracteristic,
120 value);
121 return sortingMeasurement;
122 }
123
124 public QuantificationMeasurement setWeightMeasurementQuantificationMeasurement(Batch batch, Float weightValue) {
125
126 Collection<QuantificationMeasurement> quantificationMeasurements = batch.getQuantificationMeasurements();
127 Set<QuantificationMeasurement> notChangedQuantificationMeasurements = Sets.newHashSet();
128 if (quantificationMeasurements != null) {
129 notChangedQuantificationMeasurements.addAll(quantificationMeasurements);
130 }
131
132 QuantificationMeasurement quantificationMeasurement = catchBatchDao.setQuantificationMeasurement(batch, PmfmId.WEIGHT_MEASURED.getValue(), getRecorderDepartmentId(), weightValue, true);
133
134 notChangedQuantificationMeasurements.remove(quantificationMeasurement);
135
136 if (quantificationMeasurements != null) {
137 quantificationMeasurements.removeAll(notChangedQuantificationMeasurements);
138 }
139
140 return quantificationMeasurement;
141 }
142
143 public QuantificationMeasurement getWeightMeasurementQuantificationMeasurement(Batch batch) {
144 return catchBatchDao.getQuantificationMeasurement(batch, PmfmId.WEIGHT_MEASURED.getValue());
145 }
146
147 public void removeWeightMeasurementQuantificationMeasurement(Batch batch, QuantificationMeasurement quantificationMeasurement) {
148 Collection<QuantificationMeasurement> measurements = batch.getQuantificationMeasurements();
149 Iterator<QuantificationMeasurement> iterator = measurements.iterator();
150 while (iterator.hasNext()) {
151 QuantificationMeasurement next = iterator.next();
152 if (quantificationMeasurement.getId().equals(next.getId())) {
153 iterator.remove();
154 break;
155 }
156 }
157 }
158
159 public SortingMeasurement getInheritedSortingMeasurement(SortingBatch sortingBatch) {
160 return catchBatchDao.getInheritedSortingMeasurement(sortingBatch, PmfmId.SORTED_UNSORTED.getValue());
161 }
162
163
164
165
166
167 public VesselUseMeasurement setVesselUseMeasurement(ScientificCruise scientificCruise, VesselUseFeatures vesselUseFeatures,
168 Integer pmfmId,
169 Float numericalValue,
170 String alphanumericalValue,
171 Integer qualitativevalueId) {
172 VesselUseMeasurement vesselUseMeasurement = getVesselUseMeasurement(scientificCruise, vesselUseFeatures, pmfmId, true);
173
174 if (alphanumericalValue != null) {
175 vesselUseMeasurement.setAlphanumericalValue(alphanumericalValue);
176 } else if (numericalValue != null) {
177 vesselUseMeasurement.setNumericalValue(numericalValue);
178 } else if (qualitativevalueId != null) {
179 vesselUseMeasurement.setQualitativeValue(load(QualitativeValueImpl.class, qualitativevalueId));
180 }
181
182 return vesselUseMeasurement;
183 }
184
185 public VesselUseMeasurement setVesselUseMeasurement(ScientificCruise scientificCruise, VesselUseFeatures vesselUseFeatures,
186 Caracteristic caracteristic, Serializable value) {
187 VesselUseMeasurement vesselUseMeasurement = getVesselUseMeasurement(scientificCruise, vesselUseFeatures, Integer.valueOf(caracteristic.getId()), true);
188 setMeasurement(vesselUseMeasurement, caracteristic, value);
189 return vesselUseMeasurement;
190 }
191
192 public VesselUseMeasurement getVesselUseMeasurement(ScientificCruise scientificCruise, VesselUseFeatures vesselUseFeatures,
193 Integer pmfmId, boolean createIfNotExists) {
194 VesselUseMeasurement vesselUseMeasurement = null;
195 if (vesselUseFeatures.getVesselUseMeasurements() != null) {
196 for (VesselUseMeasurement vum : vesselUseFeatures.getVesselUseMeasurements()) {
197 if (pmfmId.equals(vum.getPmfm().getId())) {
198 vesselUseMeasurement = vum;
199 break;
200 }
201 }
202 }
203 if (vesselUseMeasurement == null) {
204 if (!createIfNotExists) {
205 return null;
206 }
207 vesselUseMeasurement = VesselUseMeasurement.Factory.newInstance();
208 vesselUseMeasurement.setVesselUseFeatures(vesselUseFeatures);
209 if (vesselUseFeatures.getVesselUseMeasurements() == null) {
210 vesselUseFeatures.setVesselUseMeasurements(Sets.newHashSet(vesselUseMeasurement));
211 } else {
212 vesselUseFeatures.getVesselUseMeasurements().add(vesselUseMeasurement);
213 }
214 vesselUseMeasurement.setQualityFlag(load(QualityFlagImpl.class, QualityFlagCode.NOTQUALIFIED.getValue()));
215 vesselUseMeasurement.setDepartment(scientificCruise.getRecorderDepartment());
216 vesselUseMeasurement.setPmfm(load(PmfmImpl.class, pmfmId));
217 }
218
219 return vesselUseMeasurement;
220 }
221
222 protected VesselUseMeasurement setVesselUseMeasurement(ScientificCruise scientificCruise, VesselUseFeatures vesselUseFeatures,
223 Integer pmfmId,
224 Serializable value) {
225 VesselUseMeasurement vesselUseMeasurement = getVesselUseMeasurement(scientificCruise, vesselUseFeatures, pmfmId, true);
226
227 if (value instanceof String) {
228 vesselUseMeasurement.setAlphanumericalValue((String) value);
229 } else if (value instanceof Float) {
230 vesselUseMeasurement.setNumericalValue((Float) value);
231 } else if (value instanceof Integer) {
232 vesselUseMeasurement.setQualitativeValue(load(QualitativeValueImpl.class, value));
233 }
234
235 return vesselUseMeasurement;
236 }
237
238
239
240
241
242 public GearUseMeasurement setGearUseMeasurement(ScientificCruise scientificCruise, GearUseFeatures gearUseFeatures,
243 Integer pmfmId,
244 Float numericalValue,
245 String alphanumericalValue,
246 Integer qualitativevalueId) {
247 GearUseMeasurement gearUseMeasurement = getGearUseMeasurement(scientificCruise, gearUseFeatures, pmfmId, true);
248
249 if (alphanumericalValue != null) {
250 gearUseMeasurement.setAlphanumericalValue(alphanumericalValue);
251 } else if (numericalValue != null) {
252 gearUseMeasurement.setNumericalValue(numericalValue);
253 } else if (qualitativevalueId != null) {
254 QualitativeValue qv = load(QualitativeValueImpl.class, qualitativevalueId);
255 gearUseMeasurement.setQualitativeValue(qv);
256 }
257
258 return gearUseMeasurement;
259 }
260
261 public GearUseMeasurement setGearUseMeasurement(ScientificCruise scientificCruise, GearUseFeatures gearUseFeatures,
262 Caracteristic caracteristic, Serializable value) {
263 GearUseMeasurement gearUseMeasurement = getGearUseMeasurement(scientificCruise, gearUseFeatures, Integer.valueOf(caracteristic.getId()), true);
264 setMeasurement(gearUseMeasurement, caracteristic, value);
265 return gearUseMeasurement;
266 }
267
268 protected GearUseMeasurement getGearUseMeasurement(ScientificCruise scientificCruise, GearUseFeatures gearUseFeatures,
269 Integer pmfmId, boolean createIfNotExists) {
270 GearUseMeasurement gearUseMeasurement = null;
271 if (gearUseFeatures.getGearUseMeasurements() != null) {
272 for (GearUseMeasurement vum : gearUseFeatures.getGearUseMeasurements()) {
273 if (pmfmId.equals(vum.getPmfm().getId())) {
274 gearUseMeasurement = vum;
275 break;
276 }
277 }
278 }
279 if (gearUseMeasurement == null) {
280 if (!createIfNotExists) {
281 return null;
282 }
283 gearUseMeasurement = GearUseMeasurement.Factory.newInstance();
284 gearUseMeasurement.setGearUseFeatures(gearUseFeatures);
285 if (gearUseFeatures.getGearUseMeasurements() == null) {
286 gearUseFeatures.setGearUseMeasurements(Sets.newHashSet(gearUseMeasurement));
287 } else {
288 gearUseFeatures.getGearUseMeasurements().add(gearUseMeasurement);
289 }
290 gearUseMeasurement.setQualityFlag(load(QualityFlagImpl.class, QualityFlagCode.NOTQUALIFIED.getValue()));
291 gearUseMeasurement.setDepartment(scientificCruise.getRecorderDepartment());
292 Pmfm pmfm = (Pmfm) getCurrentSession().load(PmfmImpl.class, pmfmId);
293 gearUseMeasurement.setPmfm(pmfm);
294 }
295
296 return gearUseMeasurement;
297 }
298
299
300
301
302
303
304 public String toString(Measurement measurement) {
305 Pmfm pmfm = load(PmfmImpl.class, measurement.getPmfm().getId());
306 String value = null;
307 if (measurement.getQualitativeValue() != null) {
308 QualitativeValue qualitativeValue = measurement.getQualitativeValue();
309 String qualitativeName = load(QualitativeValueImpl.class, qualitativeValue.getId()).getName();
310
311 value = qualitativeName + " (" + qualitativeValue.getId() + ")";
312 } else if (measurement.getNumericalValue() != null) {
313 value = "" + measurement.getNumericalValue();
314 } else if (measurement.getAlphanumericalValue() != null) {
315 value = measurement.getAlphanumericalValue();
316 }
317 return "[id:" + measurement.getId() + "] - " + pmfm.getParameter().getName() + " (" + pmfm.getId() + ") / " + value;
318 }
319
320
321
322
323
324 public SurveyMeasurement setSurveyMeasurement(FishingTrip fishingTrip,
325 Integer pmfmId,
326 Float numericalValue,
327 String alphanumericalValue,
328 Integer qualitativevalueId) {
329 SurveyMeasurement result = getSurveyMeasurement(fishingTrip, pmfmId);
330
331 if (result == null) {
332 result = createSurveyMeasurement(fishingTrip,
333 pmfmId,
334 numericalValue,
335 alphanumericalValue,
336 qualitativevalueId);
337 }
338
339 return result;
340 }
341
342 public SurveyMeasurement removeSurveyMeasurement(FishingTrip fishingTrip,
343 Integer pmfmId) {
344 SurveyMeasurement result = getSurveyMeasurement(fishingTrip, pmfmId);
345
346 if (result != null) {
347
348
349 result.setFishingTrip(null);
350 fishingTrip.getSurveyMeasurements().remove(result);
351 }
352
353 return result;
354 }
355
356 protected SurveyMeasurement createSurveyMeasurement(FishingTrip fishingTrip,
357 Integer pmfmId,
358 Float numericalValue,
359 String alphanumericalValue,
360 Integer qualitativevalueId) {
361
362 SurveyMeasurement result = SurveyMeasurement.Factory.newInstance();
363 result.setQualityFlag(load(QualityFlagImpl.class, QualityFlagCode.NOTQUALIFIED.getValue()));
364 result.setDepartment(fishingTrip.getRecorderDepartment());
365 Pmfm pmfm = load(PmfmImpl.class, pmfmId);
366 result.setPmfm(pmfm);
367 result.setFishingTrip(fishingTrip);
368
369 if (alphanumericalValue != null) {
370 result.setAlphanumericalValue(alphanumericalValue);
371 } else if (numericalValue != null) {
372 result.setNumericalValue(numericalValue);
373 } else if (qualitativevalueId != null) {
374 result.setQualitativeValue(load(QualitativeValueImpl.class, qualitativevalueId));
375 }
376
377
378 if (fishingTrip.getSurveyMeasurements() == null) {
379
380
381 fishingTrip.setSurveyMeasurements(Sets.<SurveyMeasurement>newHashSet());
382 }
383
384 fishingTrip.getSurveyMeasurements().add(result);
385
386 return result;
387 }
388
389 protected SurveyMeasurement getSurveyMeasurement(FishingTrip fishingTrip, Integer pmfmId) {
390 SurveyMeasurement result = null;
391
392 for (SurveyMeasurement vum : fishingTrip.getSurveyMeasurements()) {
393 if (pmfmId.equals(vum.getPmfm().getId())) {
394 result = vum;
395 break;
396 }
397 }
398
399 return result;
400 }
401
402 public Integer getRecorderDepartmentId() {
403
404 return DepartmentId.UNKNOWN_RECORDER_DEPARTMENT.getValue();
405 }
406 }