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