View Javadoc
1   package fr.ifremer.dali.dao.data.measurement;
2   
3   /*
4    * #%L
5    * Dali :: Core
6    * $Id:$
7    * $HeadURL:$
8    * %%
9    * Copyright (C) 2014 - 2015 Ifremer
10   * %%
11   * This program is free software: you can redistribute it and/or modify
12   * it under the terms of the GNU Affero General Public License as published by
13   * the Free Software Foundation, either version 3 of the License, or
14   * (at your option) any later version.
15   * 
16   * This program is distributed in the hope that it will be useful,
17   * but WITHOUT ANY WARRANTY; without even the implied warranty of
18   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19   * GNU General Public License for more details.
20   * 
21   * You should have received a copy of the GNU Affero General Public License
22   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
23   * #L%
24   */
25  
26  import com.google.common.collect.Lists;
27  import fr.ifremer.dali.dao.administration.user.DaliDepartmentDao;
28  import fr.ifremer.dali.dao.referential.pmfm.DaliPmfmDao;
29  import fr.ifremer.dali.dao.referential.pmfm.DaliQualitativeValueDao;
30  import fr.ifremer.dali.dao.referential.taxon.DaliTaxonGroupDao;
31  import fr.ifremer.dali.dao.referential.taxon.DaliTaxonNameDao;
32  import fr.ifremer.dali.dao.technical.Daos;
33  import fr.ifremer.dali.dto.DaliBeanFactory;
34  import fr.ifremer.dali.dto.DaliBeans;
35  import fr.ifremer.dali.dto.data.measurement.MeasurementDTO;
36  import fr.ifremer.dali.service.DaliDataContext;
37  import fr.ifremer.quadrige3.core.dao.administration.program.Program;
38  import fr.ifremer.quadrige3.core.dao.administration.user.DepartmentImpl;
39  import fr.ifremer.quadrige3.core.dao.data.measurement.Measurement;
40  import fr.ifremer.quadrige3.core.dao.data.measurement.MeasurementDaoImpl;
41  import fr.ifremer.quadrige3.core.dao.data.measurement.TaxonMeasurement;
42  import fr.ifremer.quadrige3.core.dao.data.measurement.TaxonMeasurementDao;
43  import fr.ifremer.quadrige3.core.dao.data.samplingoperation.SamplingOperation;
44  import fr.ifremer.quadrige3.core.dao.data.samplingoperation.SamplingOperationImpl;
45  import fr.ifremer.quadrige3.core.dao.data.survey.Survey;
46  import fr.ifremer.quadrige3.core.dao.data.survey.SurveyImpl;
47  import fr.ifremer.quadrige3.core.dao.referential.ObjectTypeImpl;
48  import fr.ifremer.quadrige3.core.dao.referential.QualityFlag;
49  import fr.ifremer.quadrige3.core.dao.referential.QualityFlagCode;
50  import fr.ifremer.quadrige3.core.dao.referential.QualityFlagImpl;
51  import fr.ifremer.quadrige3.core.dao.referential.pmfm.PmfmImpl;
52  import fr.ifremer.quadrige3.core.dao.referential.pmfm.QualitativeValueImpl;
53  import fr.ifremer.quadrige3.core.dao.referential.taxon.ReferenceTaxonImpl;
54  import fr.ifremer.quadrige3.core.dao.referential.taxon.TaxonGroupImpl;
55  import fr.ifremer.quadrige3.core.dao.technical.Assert;
56  import org.apache.commons.collections4.CollectionUtils;
57  import org.apache.commons.lang3.ArrayUtils;
58  import org.apache.commons.lang3.StringUtils;
59  import org.hibernate.Query;
60  import org.hibernate.SessionFactory;
61  import org.hibernate.type.DateType;
62  import org.hibernate.type.IntegerType;
63  import org.springframework.beans.factory.annotation.Autowired;
64  import org.springframework.stereotype.Repository;
65  
66  import javax.annotation.Resource;
67  import java.util.*;
68  
69  /**
70   * <p>DaliMeasurementDaoImpl class.</p>
71   *
72   * @author Ludovic
73   */
74  @Repository("daliMeasurementDao")
75  public class DaliMeasurementDaoImpl extends MeasurementDaoImpl implements DaliMeasurementDao {
76  
77      @Resource(name = "daliPmfmDao")
78      protected DaliPmfmDao pmfmDao;
79  
80      @Resource(name = "daliQualitativeValueDao")
81      private DaliQualitativeValueDao qualitativeValueDao;
82  
83      @Resource(name = "daliTaxonGroupDao")
84      private DaliTaxonGroupDao taxonGroupDao;
85  
86      @Resource(name = "daliTaxonNameDao")
87      private DaliTaxonNameDao taxonNameDao;
88  
89      @Resource(name = "taxonMeasurementDao")
90      private TaxonMeasurementDao taxonMeasurementDao;
91  
92      @Resource(name = "daliDepartmentDao")
93      protected DaliDepartmentDao departmentDao;
94  
95      @Resource(name = "daliDataContext")
96      private DaliDataContext dataContext;
97  
98      /**
99       * <p>Constructor for DaliMeasurementDaoImpl.</p>
100      *
101      * @param sessionFactory a {@link org.hibernate.SessionFactory} object.
102      */
103     @Autowired
104     public DaliMeasurementDaoImpl(SessionFactory sessionFactory) {
105         super(sessionFactory);
106     }
107 
108     /**
109      * {@inheritDoc}
110      */
111     @Override
112     public Measurement getMeasurementEntityBySurveyId(int surveyId, int pmfmId, boolean createIfNotExists) {
113 
114         Measurement measurement = queryUniqueTyped("measurementEntityBySurveyId",
115                 "surveyId", IntegerType.INSTANCE, surveyId,
116                 "pmfmId", IntegerType.INSTANCE, pmfmId);
117 
118         if (measurement == null && createIfNotExists) {
119             measurement = Measurement.Factory.newInstance(surveyId,
120                     load(ObjectTypeImpl.class, Daos.SURVEY_OBJECT_TYPE),
121                     getDefaultQualityFlag(),
122                     load(PmfmImpl.class, pmfmId));
123 
124             // Survey
125             measurement.setSurvey(load(SurveyImpl.class, surveyId));
126         }
127 
128         return measurement;
129     }
130 
131     /**
132      * {@inheritDoc}
133      */
134     @Override
135     public void removeMeasurementBySurveyId(int surveyId, int pmfmId) {
136 
137         queryUpdate("deleteMeasurementsBySurveyId",
138                 "surveyId", IntegerType.INSTANCE, surveyId,
139                 "pmfmId", IntegerType.INSTANCE, pmfmId);
140     }
141 
142     /**
143      * {@inheritDoc}
144      */
145     @Override
146     public List<MeasurementDTO> getMeasurementsBySurveyId(int surveyId, Integer... excludePmfmId) {
147 
148         // return measurements of a survey from MEASUREMENT & TAXON_MEASUREMENT tables
149         List<MeasurementDTO> result = getMeasurementsByParentId("measurementsBySurveyId", "surveyId", surveyId, excludePmfmId);
150         result.addAll(getMeasurementsByParentId("taxonMeasurementsBySurveyId", "surveyId", surveyId, excludePmfmId));
151         return result;
152     }
153 
154     /**
155      * {@inheritDoc}
156      */
157     @Override
158     public List<MeasurementDTO> getMeasurementsBySamplingOperationId(int samplingOperationId, boolean withTaxonMeasurements, Integer... excludePmfmId) {
159 
160         // return measurements of a survey from MEASUREMENT & TAXON_MEASUREMENT tables
161         List<MeasurementDTO> result = getMeasurementsByParentId("measurementsBySamplingOperationId", "samplingOperationId", samplingOperationId, excludePmfmId);
162         if (withTaxonMeasurements) {
163             result.addAll(getMeasurementsByParentId("taxonMeasurementsBySamplingOperationId", "samplingOperationId", samplingOperationId, excludePmfmId));
164         }
165         return result;
166     }
167 
168     /**
169      * {@inheritDoc}
170      */
171     @Override
172     public void saveMeasurementsBySurveyId(int surveyId, Collection<MeasurementDTO> measurements, Integer... excludePmfmId) {
173 
174         // get already saved measurements and taxon measurements
175         List<Integer> existingMeasurementIds = DaliBeans.collectIds(getMeasurementsByParentId("measurementsBySurveyId", "surveyId", surveyId, excludePmfmId));
176         List<Integer> existingTaxonMeasurementIds = DaliBeans.collectIds(getMeasurementsByParentId("taxonMeasurementsBySurveyId", "surveyId", surveyId, excludePmfmId));
177 
178         Survey survey = get(SurveyImpl.class, surveyId);
179 
180         if (CollectionUtils.isNotEmpty(measurements)) {
181             for (MeasurementDTO measurement : measurements) {
182 
183                 Assert.notNull(measurement.getPmfm(), "measurement must have a pmfm");
184 
185                 // Don't save excluded pmfm id
186                 if (excludePmfmId != null && Arrays.asList(excludePmfmId).contains(measurement.getPmfm().getId())) {
187                     continue;
188                 }
189 
190                 if (DaliBeans.isTaxonMeasurement(measurement)) {
191                     // save the taxon measurement
192                     if (saveSurveyTaxonMeasurement(survey, measurement)) {
193                         // remove saved measurement
194                         existingTaxonMeasurementIds.remove(measurement.getId());
195                     }
196                 } else {
197                     // save the measurement
198                     if (saveSurveyMeasurement(survey, measurement)) {
199                         // remove saved measurement
200                         existingMeasurementIds.remove(measurement.getId());
201                     }
202                 }
203 
204             }
205         }
206 
207         // delete remaining measurements
208         removeMeasurementsByIds(existingMeasurementIds);
209         removeTaxonMeasurementsByIds(existingTaxonMeasurementIds);
210     }
211 
212     /**
213      * {@inheritDoc}
214      */
215     @Override
216     public void saveMeasurementsBySamplingOperationId(int samplingOperationId, Collection<MeasurementDTO> measurements, boolean withIndividual, Integer... excludePmfmId) {
217         List<Integer> existingMeasurementIds = DaliBeans.collectIds(getMeasurementsByParentId("measurementsBySamplingOperationId", "samplingOperationId", samplingOperationId, excludePmfmId));
218         List<Integer> existingTaxonMeasurementIds = DaliBeans.collectIds(getMeasurementsByParentId("taxonMeasurementsBySamplingOperationId", "samplingOperationId", samplingOperationId, excludePmfmId));
219 
220         SamplingOperation samplingOperation = get(SamplingOperationImpl.class, samplingOperationId);
221 
222         if (CollectionUtils.isNotEmpty(measurements)) {
223             for (MeasurementDTO measurement : measurements) {
224                 // TODO-EIS taxonomic = must have taxon ?
225                 Assert.notNull(measurement.getPmfm(), "measurement must have a pmfm");
226 
227                 // Don't save excluded pmfm id
228                 if (excludePmfmId != null && Arrays.asList(excludePmfmId).contains(measurement.getPmfm().getId())) {
229                     continue;
230                 }
231 
232                 if (DaliBeans.isTaxonMeasurement(measurement)) {
233                     // save the taxon measurement
234                     if (saveSamplingOperationTaxonMeasurement(samplingOperation, measurement)) {
235                         // remove saved measurement
236                         existingTaxonMeasurementIds.remove(measurement.getId());
237                     }
238                 } else {
239                     // save the measurement
240                     if (saveSamplingOperationMeasurement(samplingOperation, measurement)) {
241                         // remove saved measurement
242                         existingMeasurementIds.remove(measurement.getId());
243                     }
244                 }
245             }
246         }
247 
248         // delete remaining measurements
249         if (withIndividual) {
250 
251             // can delete all remaining
252             removeMeasurementsByIds(existingMeasurementIds);
253             removeTaxonMeasurementsByIds(existingTaxonMeasurementIds);
254 
255         } else {
256 
257             // individual measurement must NOT be delete
258             existingMeasurementIds.stream().distinct().forEach(measurementId -> {
259                 Measurement measurement = get(measurementId);
260                 if (measurement != null && measurement.getMeasIndivId() == null) {
261                     remove(measurement);
262                 }
263             });
264             existingTaxonMeasurementIds.stream().distinct().forEach(taxonMeasurementId -> {
265                 TaxonMeasurement taxonMeasurement = taxonMeasurementDao.get(taxonMeasurementId);
266                 if (taxonMeasurement != null && taxonMeasurement.getTaxonMeasIndivId() == null) {
267                     taxonMeasurementDao.remove(taxonMeasurement);
268                 }
269             });
270         }
271     }
272 
273     /**
274      * {@inheritDoc}
275      */
276     @Override
277     public void removeMeasurementsByIds(Collection<Integer> measurementIds) {
278         if (measurementIds == null) return;
279         // remove unitarily by using a Set to avoid multiple deletation
280         measurementIds.stream().distinct().forEach(this::remove);
281     }
282 
283     /**
284      * {@inheritDoc}
285      */
286     @Override
287     public void removeTaxonMeasurementsByIds(Collection<Integer> taxonMeasurementIds) {
288         if (taxonMeasurementIds == null) return;
289         // remove unitarily by using a Set to avoid multiple deletation
290         taxonMeasurementIds.stream().distinct().forEach(taxonMeasurementId -> taxonMeasurementDao.remove(taxonMeasurementId));
291     }
292 
293     /**
294      * {@inheritDoc}
295      */
296     @Override
297     public void removeAllMeasurementsBySurveyId(int surveyId) {
298 
299         // Delete common measurements
300         queryUpdate("deleteMeasurementsBySurveyId",
301                 "surveyId", IntegerType.INSTANCE, surveyId,
302                 "pmfmId", IntegerType.INSTANCE, null);
303 
304         // Delete taxon measurements
305         queryUpdate("deleteTaxonMeasurementsBySurveyId", "surveyId", IntegerType.INSTANCE, surveyId,
306                 "pmfmId", IntegerType.INSTANCE, null);
307     }
308 
309     /**
310      * {@inheritDoc}
311      */
312     @Override
313     public void removeAllMeasurementsBySamplingOperationId(int samplingOperationId) {
314 
315         // Delete common measurements
316         queryUpdate("deleteMeasurementsBySamplingOperationId", "samplingOperationId", IntegerType.INSTANCE, samplingOperationId,
317                 "pmfmId", IntegerType.INSTANCE, null);
318 
319         // Delete taxon measurements
320         queryUpdate("deleteTaxonMeasurementsBySamplingOperationId", "samplingOperationId", IntegerType.INSTANCE, samplingOperationId,
321                 "pmfmId", IntegerType.INSTANCE, null);
322     }
323 
324     @Override
325     public int validateAllMeasurementsBySurveyIds(Collection<Integer> surveyIds, Date validationDate) {
326         int nbUpdates = createQuery("validateSurveyMeasurementsBySurveyIds",
327                 "validationDate", DateType.INSTANCE, validationDate)
328                 .setParameterList("surveyIds", surveyIds).executeUpdate();
329         nbUpdates += createQuery("validateSamplingOperationMeasurementsBySurveyIds",
330                 "validationDate", DateType.INSTANCE, validationDate)
331                 .setParameterList("surveyIds", surveyIds).executeUpdate();
332         nbUpdates += createQuery("validateSurveyTaxonMeasurementsBySurveyIds",
333                 "validationDate", DateType.INSTANCE, validationDate)
334                 .setParameterList("surveyIds", surveyIds).executeUpdate();
335         nbUpdates += createQuery("validateSamplingOperationTaxonMeasurementsBySurveyIds",
336                 "validationDate", DateType.INSTANCE, validationDate)
337                 .setParameterList("surveyIds", surveyIds).executeUpdate();
338         return nbUpdates;
339     }
340 
341     @Override
342     public int unvalidateAllMeasurementsBySurveyIds(Collection<Integer> surveyIds) {
343         int nbUpdates = createQuery("unvalidateSurveyMeasurementsBySurveyIds")
344                 .setParameterList("surveyIds", surveyIds).executeUpdate();
345         nbUpdates += createQuery("unvalidateSamplingOperationMeasurementsBySurveyIds")
346                 .setParameterList("surveyIds", surveyIds).executeUpdate();
347         nbUpdates += createQuery("unvalidateSurveyTaxonMeasurementsBySurveyIds")
348                 .setParameterList("surveyIds", surveyIds).executeUpdate();
349         nbUpdates += createQuery("unvalidateSamplingOperationTaxonMeasurementsBySurveyIds")
350                 .setParameterList("surveyIds", surveyIds).executeUpdate();
351         return nbUpdates;
352     }
353 
354     @Override
355     public int qualifyAllMeasurementsBySurveyIds(List<Integer> surveyIds, Date qualificationDate) {
356         int nbUpdates = createQuery("qualifySurveyMeasurementsBySurveyIds",
357                 "qualificationDate", DateType.INSTANCE, qualificationDate)
358                 .setParameterList("surveyIds", surveyIds).executeUpdate();
359         nbUpdates += createQuery("qualifySamplingOperationMeasurementsBySurveyIds",
360                 "qualificationDate", DateType.INSTANCE, qualificationDate)
361                 .setParameterList("surveyIds", surveyIds).executeUpdate();
362         nbUpdates += createQuery("qualifySurveyTaxonMeasurementsBySurveyIds",
363                 "qualificationDate", DateType.INSTANCE, qualificationDate)
364                 .setParameterList("surveyIds", surveyIds).executeUpdate();
365         nbUpdates += createQuery("qualifySamplingOperationTaxonMeasurementsBySurveyIds",
366                 "qualificationDate", DateType.INSTANCE, qualificationDate)
367                 .setParameterList("surveyIds", surveyIds).executeUpdate();
368         return nbUpdates;
369     }
370 
371     /**
372      * {@inheritDoc}
373      */
374     @Override
375     public void updateMeasurementsControlDate(Collection<Integer> measurementIds, Date controlDate) {
376         createQuery("updateMeasurementControlDate")
377                 .setParameterList("measurementIds", measurementIds)
378                 .setParameter("controlDate", controlDate).executeUpdate();
379     }
380 
381     /**
382      * {@inheritDoc}
383      */
384     @Override
385     public void updateTaxonMeasurementsControlDate(Collection<Integer> taxonMeasurementIds, Date controlDate) {
386         createQuery("updateTaxonMeasurementControlDate")
387                 .setParameterList("taxonMeasurementIds", taxonMeasurementIds)
388                 .setParameter("controlDate", controlDate).executeUpdate();
389     }
390 
391     // PRIVATE METHODS
392     @SuppressWarnings("unchecked")
393     private List<MeasurementDTO> getMeasurementsByParentId(String queryName, String parentParameter, int parentId, Integer... excludePmfmIds) {
394 
395         Query query = createQuery(queryName, parentParameter, IntegerType.INSTANCE, parentId);
396 
397         List<Integer> pmfmIdsToExclude = ArrayUtils.isEmpty(excludePmfmIds) ? Lists.newArrayList(0) : Lists.newArrayList(excludePmfmIds);
398         query.setParameterList("pmfmIds", pmfmIdsToExclude);
399 
400         Iterator<Object[]> it = query.iterate();
401 
402         List<MeasurementDTO> result = Lists.newArrayList();
403 
404         while (it.hasNext()) {
405             Object[] row = it.next();
406             result.add(toMeasurement(Arrays.asList(row).iterator()));
407         }
408 
409         return result;
410     }
411 
412     private boolean saveSurveyMeasurement(Survey survey, MeasurementDTO measurement) {
413 
414         return saveMeasurement(measurement, survey, null);
415     }
416 
417     private boolean saveSurveyTaxonMeasurement(Survey survey, MeasurementDTO measurement) {
418 
419         return saveTaxonMeasurement(measurement, survey, null);
420     }
421 
422     private boolean saveSamplingOperationMeasurement(SamplingOperation samplingOperation, MeasurementDTO measurement) {
423 
424         return saveMeasurement(measurement, null, samplingOperation);
425     }
426 
427     private boolean saveSamplingOperationTaxonMeasurement(SamplingOperation samplingOperation, MeasurementDTO measurement) {
428 
429         return saveTaxonMeasurement(measurement, null, samplingOperation);
430 
431     }
432 
433     /**
434      * Save a measurement on a survey OR a samplingOperation
435      *
436      * @param measurement measurement to save
437      * @param survey the parent survey
438      * @param samplingOperation the parent operation
439      * @return true if success
440      */
441     private boolean saveMeasurement(MeasurementDTO measurement, Survey survey, SamplingOperation samplingOperation) {
442 
443         if (DaliBeans.isMeasurementEmpty(measurement)) {
444             return false;
445         }
446 
447         Integer objectId;
448         String objectType;
449         Collection<Program> programs;
450 
451         if (survey != null) {
452             Assert.isNull(samplingOperation, "if a survey is provided, samplingOperation must be null");
453             objectId = survey.getSurveyId();
454             objectType = Daos.SURVEY_OBJECT_TYPE;
455             programs = survey.getPrograms();
456         } else {
457             Assert.notNull(samplingOperation, "if a samplingOperation is provided, survey must be null");
458             objectId = samplingOperation.getSamplingOperId();
459             objectType = Daos.SAMPLING_OPERATION_OBJECT_TYPE;
460             programs = samplingOperation.getPrograms();
461         }
462 
463         Measurement target;
464         if (measurement.getId() == null || measurement.getId() < 0) {
465             target = Measurement.Factory.newInstance();
466         } else {
467             target = get(measurement.getId());
468         }
469 
470         target.setObjectType(load(ObjectTypeImpl.class, objectType));
471         target.setObjectId(objectId);
472 
473         // Survey
474         target.setSurvey(survey);
475         // SamplingOperation
476         target.setSamplingOperation(samplingOperation);
477 
478         if (CollectionUtils.isNotEmpty(programs)) {
479             for (Program program : programs) {
480                 target.addPrograms(program);
481             }
482         }
483 
484         // Recorder Department (Mantis #42614 Only if REC_DEP_ID is null)
485         if (target.getRecorderDepartment() == null) {
486             target.setRecorderDepartment(load(DepartmentImpl.class, dataContext.getRecorderDepartmentId()));
487         }
488 
489         target.setQualityFlag(getDefaultQualityFlag());
490         target.setPmfm(load(PmfmImpl.class, measurement.getPmfm().getId()));
491         target.setMeasIndivId(measurement.getIndividualId());
492         target.setMeasCm(measurement.getComment());
493 
494         if (measurement.getAnalyst() != null) {
495             target.setDepartment(load(DepartmentImpl.class, measurement.getAnalyst().getId()));
496         } else {
497             target.setDepartment(null);
498         }
499 
500         if (measurement.getPmfm().getParameter().isQualitative() && measurement.getQualitativeValue() != null) {
501             // save as qualitative value
502             target.setQualitativeValue(load(QualitativeValueImpl.class, measurement.getQualitativeValue().getId()));
503             target.setMeasNumerValue(null);
504             target.setMeasDigitNumber(null);
505             target.setMeasPrecisionValue(null);
506         } else {
507             // save as numeric value
508             target.setMeasNumerValue(measurement.getNumericalValue() == null ? null : measurement.getNumericalValue().floatValue());
509             target.setMeasPrecisionValue(measurement.getPrecision() == null ? null : measurement.getPrecision().floatValue());
510             target.setMeasDigitNumber(measurement.getDigitNb());
511             target.setQualitativeValue(null);
512         }
513 
514         getSession().save(target);
515         measurement.setId(target.getMeasId());
516         return true;
517     }
518 
519     /**
520      * Save a taxonMeasurement on a survey OR a samplingOperation
521      *
522      * @param measurement the taxon measurement to save
523      * @param survey the parent survey
524      * @param samplingOperation the parent operation
525      * @return true if success
526      */
527     private boolean saveTaxonMeasurement(MeasurementDTO measurement, Survey survey, SamplingOperation samplingOperation) {
528 
529         if (DaliBeans.isMeasurementEmpty(measurement)) {
530             return false;
531         }
532 
533         Integer objectId;
534         String objectType;
535         Collection<Program> programs;
536 
537         if (survey != null) {
538             Assert.isNull(samplingOperation, "if a survey is provided, samplingOperation must be null");
539             objectId = survey.getSurveyId();
540             objectType = Daos.SURVEY_OBJECT_TYPE;
541             programs = survey.getPrograms();
542         } else {
543             Assert.notNull(samplingOperation, "if a samplingOperation is provided, survey must be null");
544             objectId = samplingOperation.getSamplingOperId();
545             objectType = Daos.SAMPLING_OPERATION_OBJECT_TYPE;
546             programs = samplingOperation.getPrograms();
547         }
548 
549         TaxonMeasurement target;
550         boolean isNew;
551         if (measurement.getId() == null || measurement.getId() < 0) {
552             target = TaxonMeasurement.Factory.newInstance();
553             isNew = true;
554         } else {
555             target = taxonMeasurementDao.get(measurement.getId());
556             isNew = false;
557         }
558 
559         target.setObjectType(load(ObjectTypeImpl.class, objectType));
560         target.setObjectId(objectId);
561 
562         // Survey
563         target.setSurvey(survey);
564         // SamplingOperation
565         target.setSamplingOperation(samplingOperation);
566 
567         if (CollectionUtils.isNotEmpty(programs)) {
568             for (Program program : programs) {
569                 target.addPrograms(program);
570             }
571         }
572 
573         // Recorder Department (Mantis #42614 Only if REC_DEP_ID is null)
574         if (target.getRecorderDepartment() == null) {
575             target.setRecorderDepartment(load(DepartmentImpl.class, dataContext.getRecorderDepartmentId()));
576         }
577 
578         target.setQualityFlag(getDefaultQualityFlag());
579         target.setPmfm(load(PmfmImpl.class, measurement.getPmfm().getId()));
580         target.setTaxonMeasIndivId(measurement.getIndividualId());
581         target.setTaxonMeasCm(measurement.getComment());
582 
583         if (measurement.getAnalyst() != null) {
584             target.setDepartment(load(DepartmentImpl.class, measurement.getAnalyst().getId()));
585         } else {
586             target.setDepartment(null);
587         }
588 
589         if (measurement.getTaxonGroup() == null) {
590             target.setTaxonGroup(null);
591         } else {
592             target.setTaxonGroup(load(TaxonGroupImpl.class, measurement.getTaxonGroup().getId()));
593         }
594 
595         if (measurement.getTaxon() == null) {
596             target.setReferenceTaxon(null);
597         } else {
598             target.setReferenceTaxon(load(ReferenceTaxonImpl.class, measurement.getTaxon().getReferenceTaxonId()));
599         }
600 
601         // set input taxon information if null
602         if (measurement.getTaxon() != null) {
603             if (measurement.getInputTaxonId() == null) {
604                 measurement.setInputTaxonId(measurement.getTaxon().getId());
605             }
606             if (StringUtils.isBlank(measurement.getInputTaxonName())) {
607                 measurement.setInputTaxonName(measurement.getTaxon().getName());
608             }
609         } else {
610             measurement.setInputTaxonId(null);
611             measurement.setInputTaxonName(null);
612         }
613 
614         // add the input taxon name and ID (Mantis #34705 + #36232)
615         target.setTaxonNameId(measurement.getInputTaxonId());
616         target.setTaxonNameNm(measurement.getInputTaxonName());
617 
618         if (measurement.getPmfm().getParameter().isQualitative() && measurement.getQualitativeValue() != null) {
619             // save as qualitative value
620             target.setQualitativeValue(load(QualitativeValueImpl.class, measurement.getQualitativeValue().getId()));
621             target.setTaxonMeasNumerValue(null);
622             target.setTaxonMeasDigitNumber(null);
623             target.setTaxonMeasPrecisionValue(null);
624         } else {
625             // save as numeric value
626             target.setTaxonMeasNumerValue(measurement.getNumericalValue() == null ? null : measurement.getNumericalValue().floatValue());
627             target.setTaxonMeasPrecisionValue(measurement.getPrecision() == null ? null : measurement.getPrecision().floatValue());
628             target.setTaxonMeasDigitNumber(measurement.getDigitNb());
629             target.setQualitativeValue(null);
630         }
631 
632         // Save or update
633         if (isNew) {
634             getSession().save(target);
635             // Update identifier
636             measurement.setId(target.getTaxonMeasId());
637         } else {
638             getSession().update(target);
639         }
640 
641         return true;
642     }
643 
644     /**
645      * return the default quality flag
646      *
647      * @return the default quality flag
648      */
649     private QualityFlag getDefaultQualityFlag() {
650         return load(QualityFlagImpl.class, QualityFlagCode.NOT_QUALIFIED.getValue()); // = non qualifié
651     }
652 
653     private MeasurementDTO toMeasurement(Iterator<Object> it) {
654         MeasurementDTO result = DaliBeanFactory.newMeasurementDTO();
655         Integer pmfmId = (Integer) it.next();
656         Assert.notNull(pmfmId);
657         result.setPmfm(pmfmDao.getPmfmById(pmfmId));
658         result.setId((Integer) it.next());
659         Double value = Daos.convertToDouble((Float) it.next());
660         result.setPrecision(Daos.convertToInteger((Number) it.next()));
661         result.setDigitNb(Daos.convertToInteger((Number) it.next()));
662 
663         // convert to BigDecimal
664         result.setNumericalValue(Daos.convertToBigDecimal(value, result.getDigitNb()));
665 
666         result.setIndividualId((Integer) it.next());
667         result.setComment((String) it.next());
668         result.setControlDate(Daos.convertToDate(it.next()));
669         result.setValidationDate(Daos.convertToDate(it.next()));
670         result.setQualificationDate(Daos.convertToDate(it.next()));
671         result.setQualificationComment((String) it.next());
672         Integer departmentId = (Integer) it.next();
673         if (departmentId != null) {
674             result.setAnalyst(departmentDao.getDepartmentById(departmentId));
675         }
676         Integer qualitativeValueId = (Integer) it.next();
677         if (qualitativeValueId != null) {
678             result.setQualitativeValue(qualitativeValueDao.getQualitativeValueById(qualitativeValueId));
679         }
680         if (it.hasNext()) {
681             // if has more element, it is taxonGroupId and referenceTaxonId (comes from TaxonMeasurements)
682             // and input taxon (Mantis #34705)
683             Integer taxonGroupId = (Integer) it.next();
684             if (taxonGroupId != null) {
685                 result.setTaxonGroup(taxonGroupDao.getTaxonGroupById(taxonGroupId));
686             }
687             Integer refTaxonId = (Integer) it.next();
688             if (refTaxonId != null) {
689                 result.setTaxon(taxonNameDao.getTaxonNameByReferenceId(refTaxonId));
690             }
691             // Input taxon id and name (Mantis #36232)
692             result.setInputTaxonId((Integer) it.next());
693             result.setInputTaxonName((String) it.next());
694         }
695         return result;
696     }
697 
698 }