View Javadoc
1   package fr.ifremer.tutti.persistence.service.util;
2   
3   /*
4    * #%L
5    * Tutti :: Persistence
6    * %%
7    * Copyright (C) 2012 - 2014 Ifremer
8    * %%
9    * This program is free software: you can redistribute it and/or modify
10   * it under the terms of the GNU General Public License as
11   * published by the Free Software Foundation, either version 3 of the 
12   * License, or (at your option) any later version.
13   * 
14   * This program is distributed in the hope that it will be useful,
15   * but WITHOUT ANY WARRANTY; without even the implied warranty of
16   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17   * GNU General Public License for more details.
18   * 
19   * You should have received a copy of the GNU General Public 
20   * License along with this program.  If not, see
21   * <http://www.gnu.org/licenses/gpl-3.0.html>.
22   * #L%
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   * Helper around {@link Measurement}.
62   *
63   * @author Tony Chemit - chemit@codelutin.com
64   * @since 2.0
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     //-- SortingMeasurement                                                 --//
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         // Removed not changed measurements (in sorting and quantification measurement lists)
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     //-- VesselUseUseMeasurement                                            --//
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     //-- GearUseMeasurement                                                 --//
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     //-- Misc                                                               --//
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     //-- SurveyMeasurement                                                  --//
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             // measurement found, remove it
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         // add it to fishingTrip
378         if (fishingTrip.getSurveyMeasurements() == null) {
379 
380             //create new set of measurements
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         // TODO BL : voir si on peut récupérer le departement (du 1er saisisseur ?)
404         return DepartmentId.UNKNOWN_RECORDER_DEPARTMENT.getValue();
405     }
406 }