View Javadoc
1   package fr.ifremer.dali.service.referential;
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.config.DaliConfiguration;
28  import fr.ifremer.dali.dao.administration.user.DaliDepartmentDao;
29  import fr.ifremer.dali.dao.referential.DaliAnalysisInstrumentDao;
30  import fr.ifremer.dali.dao.referential.DaliReferentialDao;
31  import fr.ifremer.dali.dao.referential.DaliSamplingEquipmentDao;
32  import fr.ifremer.dali.dao.referential.DaliUnitDao;
33  import fr.ifremer.dali.dao.referential.monitoringLocation.DaliMonitoringLocationDao;
34  import fr.ifremer.dali.dao.referential.pmfm.*;
35  import fr.ifremer.dali.dao.referential.taxon.DaliTaxonGroupDao;
36  import fr.ifremer.dali.dao.referential.taxon.DaliTaxonNameDao;
37  import fr.ifremer.dali.dto.DaliBeanFactory;
38  import fr.ifremer.dali.dto.ParameterTypeDTO;
39  import fr.ifremer.dali.dto.configuration.filter.department.DepartmentCriteriaDTO;
40  import fr.ifremer.dali.dto.configuration.filter.location.LocationCriteriaDTO;
41  import fr.ifremer.dali.dto.configuration.filter.person.PersonCriteriaDTO;
42  import fr.ifremer.dali.dto.configuration.filter.taxon.TaxonCriteriaDTO;
43  import fr.ifremer.dali.dto.configuration.filter.taxongroup.TaxonGroupCriteriaDTO;
44  import fr.ifremer.dali.dto.enums.ParameterTypeValues;
45  import fr.ifremer.dali.dto.referential.*;
46  import fr.ifremer.dali.dto.referential.pmfm.*;
47  import fr.ifremer.dali.service.DaliTechnicalException;
48  import fr.ifremer.dali.service.StatusFilter;
49  import fr.ifremer.dali.service.administration.user.UserService;
50  import fr.ifremer.quadrige3.core.dao.referential.QualityFlagCode;
51  import fr.ifremer.quadrige3.core.dao.technical.Assert;
52  import fr.ifremer.quadrige3.core.service.technical.CacheService;
53  import fr.ifremer.quadrige3.ui.core.dto.referential.StatusDTO;
54  import org.apache.commons.collections4.CollectionUtils;
55  import org.apache.commons.lang3.StringUtils;
56  import org.springframework.beans.factory.annotation.Autowired;
57  import org.springframework.stereotype.Service;
58  
59  import javax.annotation.Resource;
60  import java.time.LocalDate;
61  import java.util.ArrayList;
62  import java.util.Collection;
63  import java.util.List;
64  import java.util.stream.Collectors;
65  
66  /**
67   * Implémentation des services pour les données de reference
68   */
69  @Service("daliReferentialService")
70  public class ReferentialServiceImpl implements ReferentialService {
71  
72      @Autowired
73      protected CacheService cacheService;
74  
75      @Resource
76      protected DaliConfiguration config;
77  
78      @Resource(name = "daliReferentialDao")
79      private DaliReferentialDao referentialDao;
80  
81      @Resource(name = "daliDepartmentDao")
82      protected DaliDepartmentDao departmentDao;
83  
84      @Resource(name = "daliMonitoringLocationDao")
85      private DaliMonitoringLocationDao monitoringLocationDao;
86  
87      @Resource(name = "daliTaxonGroupDao")
88      private DaliTaxonGroupDao taxonGroupDao;
89  
90      @Resource(name = "daliTaxonNameDao")
91      private DaliTaxonNameDao taxonNameDao;
92  
93      @Resource(name = "daliPmfmDao")
94      protected DaliPmfmDao pmfmDao;
95  
96      @Resource(name = "daliQualitativeValueDao")
97      private DaliQualitativeValueDao qualitativeValueDao;
98  
99      @Resource(name = "daliParameterDao")
100     private DaliParameterDao parameterDao;
101 
102     @Resource(name = "daliMatrixDao")
103     private DaliMatrixDao matrixDao;
104 
105     @Resource(name = "daliFractionDao")
106     private DaliFractionDao fractionDao;
107 
108     @Resource(name = "daliMethodDao")
109     private DaliMethodDao methodDao;
110 
111     @Resource(name = "daliAnalysisInstrumentDao")
112     private DaliAnalysisInstrumentDao analysisInstrumentDao;
113 
114     @Resource(name = "daliSamplingEquipmentDao")
115     private DaliSamplingEquipmentDao samplingEquipmentDao;
116 
117     @Resource(name = "daliUnitDao")
118     private DaliUnitDao unitDao;
119 
120     @Resource(name = "daliUserService")
121     private UserService userService;
122 
123     private List<ParameterTypeDTO> parameterTypeList;
124 
125     /**
126      * {@inheritDoc}
127      */
128     @Override
129     public List<SamplingEquipmentDTO> getSamplingEquipments(StatusFilter statusFilter) {
130         return new ArrayList<>(samplingEquipmentDao.getAllSamplingEquipments(statusFilter.toStatusCodes()));
131     }
132 
133     /**
134      * {@inheritDoc}
135      */
136     @Override
137     public List<UnitDTO> getUnits(StatusFilter statusFilter) {
138         return new ArrayList<>(unitDao.getAllUnits(statusFilter.toStatusCodes()));
139     }
140 
141     /**
142      * {@inheritDoc}
143      */
144     @Override
145     public List<DepartmentDTO> getDepartments(StatusFilter statusFilter) {
146         return new ArrayList<>(departmentDao.getAllDepartments(statusFilter.toStatusCodes()));
147     }
148 
149     /**
150      * {@inheritDoc}
151      */
152     @Override
153     public DepartmentDTO getDepartmentById(int departmentId) {
154         return departmentDao.getDepartmentById(departmentId);
155     }
156 
157     /**
158      * {@inheritDoc}
159      */
160     @Override
161     public List<AnalysisInstrumentDTO> getAnalysisInstruments(StatusFilter statusFilter) {
162         return new ArrayList<>(analysisInstrumentDao.getAllAnalysisInstruments(statusFilter.toStatusCodes()));
163     }
164 
165     /**
166      * {@inheritDoc}
167      */
168     @Override
169     public List<StatusDTO> getStatus(StatusFilter statusFilter) {
170         return referentialDao.getStatusByCodes(statusFilter.toStatusCodes());
171     }
172 
173     /**
174      * {@inheritDoc}
175      */
176     @Override
177     public List<LocationDTO> getLocations(StatusFilter statusFilter) {
178         Assert.notNull(statusFilter);
179         return new ArrayList<>(monitoringLocationDao.getAllLocations(statusFilter.toStatusCodes()));
180     }
181 
182     /**
183      * {@inheritDoc}
184      */
185     @Override
186     public LocationDTO getLocation(int locationId) {
187         return monitoringLocationDao.getLocationById(locationId);
188     }
189 
190     /**
191      * {@inheritDoc}
192      */
193     @Override
194     public List<LocationDTO> getLocations(Integer campaignId, String programCode) {
195         if (campaignId == null && programCode == null) {
196             return getLocations(StatusFilter.ACTIVE);
197         }
198         return new ArrayList<>(monitoringLocationDao.getLocationsByCampaignAndProgram(campaignId, programCode));
199     }
200 
201     /**
202      * {@inheritDoc}
203      */
204     @Override
205     public List<HarbourDTO> getHarbours(StatusFilter statusFilter) {
206         Assert.notNull(statusFilter);
207         return monitoringLocationDao.getAllHarbours(statusFilter.toStatusCodes());
208     }
209 
210     /**
211      * {@inheritDoc}
212      */
213     @Override
214     public List<TaxonGroupDTO> getTaxonGroups() {
215         return new ArrayList<>(taxonGroupDao.getAllTaxonGroups());
216     }
217 
218     /**
219      * {@inheritDoc}
220      */
221     @Override
222     public TaxonGroupDTO getTaxonGroup(int taxonGroupId) {
223         return taxonGroupDao.getTaxonGroupById(taxonGroupId);
224     }
225 
226     /**
227      * {@inheritDoc}
228      */
229     @Override
230     public List<TaxonGroupDTO> getFullTaxonGroups(List<TaxonGroupDTO> taxonGroups) {
231         List<TaxonGroupDTO> result = Lists.newArrayList();
232         if (CollectionUtils.isNotEmpty(taxonGroups)) {
233             for (TaxonGroupDTO taxonGroup : taxonGroups) {
234                 if (taxonGroup.getId() == null) {
235                     // if happens, add it directly
236                     result.add(taxonGroup);
237                 } else {
238 
239                     // reload this taxon group from cache (or get it from db)
240                     result.add(taxonGroupDao.getTaxonGroupById(taxonGroup.getId()));
241                 }
242             }
243         }
244         return result;
245     }
246 
247     /**
248      * {@inheritDoc}
249      */
250     @Override
251     public List<TaxonDTO> getTaxons(Integer taxonGroupId) {
252         if (taxonGroupId == null) {
253             return new ArrayList<>(taxonNameDao.getAllTaxonNames());
254         } else {
255             return new ArrayList<>(taxonNameDao.getAllTaxonNamesMapByTaxonGroupId(LocalDate.now()).get(taxonGroupId));
256         }
257     }
258 
259     /**
260      * {@inheritDoc}
261      */
262     @Override
263     public TaxonDTO getTaxon(int taxonId) {
264         return taxonNameDao.getTaxonNameById(taxonId);
265     }
266 
267     /**
268      * {@inheritDoc}
269      */
270     @Override
271     public void fillTaxonsProperties(List<TaxonDTO> taxons) {
272         taxonNameDao.fillTaxonsProperties(taxons);
273     }
274 
275     /**
276      * {@inheritDoc}
277      */
278     @Override
279     public void fillReferentTaxons(List<TaxonDTO> taxons) {
280         taxonNameDao.fillReferents(taxons);
281     }
282 
283     /**
284      * {@inheritDoc}
285      */
286     @Override
287     public List<TaxonomicLevelDTO> getTaxonomicLevels() {
288         return new ArrayList<>(referentialDao.getAllTaxonomicLevels());
289     }
290 
291     /**
292      * {@inheritDoc}
293      */
294     @Override
295     public List<CitationDTO> getCitations() {
296         return new ArrayList<>(referentialDao.getAllCitations());
297     }
298 
299     /**
300      * {@inheritDoc}
301      */
302     @Override
303     public List<PositioningSystemDTO> getPositioningSystems() {
304         return new ArrayList<>(referentialDao.getAllPositioningSystems());
305     }
306 
307     /**
308      * {@inheritDoc}
309      */
310     @Override
311     public List<ParameterGroupDTO> getParameterGroup(StatusFilter statusFilter) {
312         Assert.notNull(statusFilter);
313         return new ArrayList<>(parameterDao.getAllParameterGroups(statusFilter.toStatusCodes()));
314     }
315 
316     /**
317      * {@inheritDoc}
318      */
319     @Override
320     public List<ParameterDTO> getParameters(StatusFilter statusFilter) {
321         Assert.notNull(statusFilter);
322         return new ArrayList<>(parameterDao.getAllParameters(statusFilter.toStatusCodes()));
323     }
324 
325     /**
326      * {@inheritDoc}
327      */
328     @Override
329     public List<ParameterDTO> searchParameters(StatusFilter statusFilter, String parameterCode, String statusCode, ParameterGroupDTO parameterGroup) {
330         Assert.notNull(statusFilter);
331         Integer parameterGroupId = parameterGroup == null ? null : parameterGroup.getId();
332         return parameterDao.findParameters(parameterCode, parameterGroupId, statusFilter.intersect(statusCode));
333     }
334 
335     /**
336      * {@inheritDoc}
337      */
338     @Override
339     public List<MatrixDTO> getMatrices(StatusFilter statusFilter) {
340         Assert.notNull(statusFilter);
341         return new ArrayList<>(matrixDao.getAllMatrices(statusFilter.toStatusCodes()));
342     }
343 
344     /**
345      * {@inheritDoc}
346      */
347     @Override
348     public List<MatrixDTO> searchMatrices(StatusFilter statusFilter, Integer matrixId, String statusCode) {
349         Assert.notNull(statusFilter);
350         return matrixDao.findMatrices(matrixId, statusFilter.intersect(statusCode));
351     }
352 
353     /**
354      * {@inheritDoc}
355      */
356     @Override
357     public List<FractionDTO> getFractions(StatusFilter statusFilter) {
358         Assert.notNull(statusFilter);
359         return new ArrayList<>(fractionDao.getAllFractions(statusFilter.toStatusCodes()));
360     }
361 
362     /**
363      * {@inheritDoc}
364      */
365     @Override
366     public List<FractionDTO> searchFractions(StatusFilter statusFilter, Integer fractionId, String statusCode) {
367         Assert.notNull(statusFilter);
368         return fractionDao.findFractions(fractionId, statusFilter.intersect(statusCode));
369     }
370 
371     /**
372      * {@inheritDoc}
373      */
374     @Override
375     public List<MethodDTO> getMethods(StatusFilter statusFilter) {
376         Assert.notNull(statusFilter);
377         return new ArrayList<>(methodDao.getAllMethods(statusFilter.toStatusCodes()));
378     }
379 
380     /**
381      * {@inheritDoc}
382      */
383     @Override
384     public List<MethodDTO> searchMethods(StatusFilter statusFilter, Integer methodId, String statusCode) {
385         Assert.notNull(statusFilter);
386         return methodDao.findMethods(methodId, statusFilter.intersect(statusCode));
387     }
388 
389     /**
390      * {@inheritDoc}
391      */
392     @Override
393     public List<PmfmDTO> getPmfms(StatusFilter statusFilter) {
394         Assert.notNull(statusFilter);
395         return new ArrayList<>(pmfmDao.getAllPmfms(statusFilter.toStatusCodes()));
396     }
397 
398     /**
399      * {@inheritDoc}
400      */
401     @Override
402     public PmfmDTO getPmfm(int pmfmId) {
403         return pmfmDao.getPmfmById(pmfmId);
404     }
405 
406     /**
407      * {@inheritDoc}
408      */
409     @Override
410     public List<PmfmDTO> searchPmfms(StatusFilter statusFilter, String parameterCode, Integer matrixId, Integer fractionId, Integer methodId, Integer unitId, String pmfmName, String statusCode) {
411         return pmfmDao.findPmfms(parameterCode, matrixId, fractionId, methodId, unitId, pmfmName, statusFilter.intersect(statusCode));
412     }
413 
414     @Override
415     public Integer getUniquePmfmIdFromPmfm(PmfmDTO pmfm) {
416         List<PmfmDTO> pmfms = pmfmDao.findPmfms(pmfm.getParameter().getCode(),
417                 pmfm.getMatrix() != null ? pmfm.getMatrix().getId() : null,
418                 pmfm.getFraction() != null ? pmfm.getFraction().getId() : null,
419                 pmfm.getMethod() != null ? pmfm.getMethod().getId() : null,
420                 pmfm.getUnit() != null ? pmfm.getUnit().getId() : null,
421                 null, StatusFilter.ALL.toStatusCodes());
422         if (CollectionUtils.size(pmfms) != 1) {
423             throw new DaliTechnicalException("Should found only 1 PMFM");
424         }
425         return pmfms.get(0).getId();
426     }
427 
428     @Override
429     public PmfmDTO getUniquePmfmFromPmfm(PmfmDTO pmfm) {
430         return getPmfm(getUniquePmfmIdFromPmfm(pmfm));
431     }
432 
433     @Override
434     public QualitativeValueDTO getQualitativeValue(int qualitativeValueId) {
435         return qualitativeValueDao.getQualitativeValueById(qualitativeValueId);
436     }
437 
438     @Override
439     public List<QualitativeValueDTO> getQualitativeValues(Collection<Integer> qualitativeValueIds) {
440         if (CollectionUtils.isEmpty(qualitativeValueIds)) return new ArrayList<>();
441         return qualitativeValueIds.stream().map(qvId -> qualitativeValueDao.getQualitativeValueById(qvId)).collect(Collectors.toList());
442     }
443 
444     /**
445      * {@inheritDoc}
446      */
447     @Override
448     public List<LevelDTO> getLevels() {
449         return new ArrayList<>(referentialDao.getAllDepthLevels());
450     }
451 
452     @Override
453     public QualityLevelDTO getNotQualityLevel() {
454         return referentialDao.getQualityFlagByCode(QualityFlagCode.NOT_QUALIFIED.getValue());
455     }
456 
457     /**
458      * {@inheritDoc}
459      */
460     @Override
461     public List<QualityLevelDTO> getQualityLevels(StatusFilter statusFilter) {
462         Assert.notNull(statusFilter);
463         return new ArrayList<>(referentialDao.getAllQualityFlags(statusFilter.toStatusCodes()));
464     }
465 
466     /**
467      * {@inheritDoc}
468      */
469     @Override
470     public List<AnalysisInstrumentDTO> searchAnalysisInstruments(StatusFilter statusFilter, Integer analysisInstrumentId, String statusCode) {
471         Assert.notNull(statusFilter);
472         return analysisInstrumentDao.findAnalysisInstruments(statusFilter.intersect(statusCode), analysisInstrumentId);
473     }
474 
475     /**
476      * {@inheritDoc}
477      */
478     @Override
479     public List<SamplingEquipmentDTO> searchSamplingEquipments(StatusFilter statusFilter, Integer samplingEquipmentId, String statusCode, Integer unitId) {
480         Assert.notNull(statusFilter);
481         return samplingEquipmentDao.findSamplingEquipments(statusFilter.intersect(statusCode), samplingEquipmentId, unitId);
482     }
483 
484     /**
485      * {@inheritDoc}
486      */
487     @Override
488     public List<SamplingEquipmentDTO> searchSamplingEquipments(StatusFilter statusFilter, String equipmentName, String statusCode) {
489         return samplingEquipmentDao.findSamplingEquipmentsByName(statusFilter.intersect(statusCode), equipmentName);
490     }
491 
492     /**
493      * {@inheritDoc}
494      */
495     @Override
496     public List<UnitDTO> searchUnits(StatusFilter statusFilter, Integer unitId, String statusCode) {
497         Assert.notNull(statusFilter);
498         return unitDao.findUnits(unitId, statusFilter.intersect(statusCode));
499     }
500 
501     /**
502      * {@inheritDoc}
503      */
504     @Override
505     public List<PersonDTO> getUsersInSameDepartment(PersonDTO person) {
506         PersonCriteriaDTO searchCriteria = DaliBeanFactory.newPersonCriteriaDTO();
507         if (person != null && person.getDepartment() != null) {
508             searchCriteria.setDepartment(person.getDepartment());
509         }
510         return userService.searchUser(searchCriteria);
511     }
512 
513     /**
514      * {@inheritDoc}
515      */
516     @Override
517     public List<GroupingTypeDTO> getGroupingTypes() {
518         return new ArrayList<>(referentialDao.getAllGroupingTypes());
519     }
520 
521     /**
522      * {@inheritDoc}
523      */
524     @Override
525     public List<LocationDTO> searchLocations(LocationCriteriaDTO searchCriteria) {
526         List<String> statusCodes = StatusFilter.ALL.intersect(searchCriteria.getStatus());
527 
528         String orderItemTypeCode = searchCriteria.getGroupingType() == null ? null : searchCriteria.getGroupingType().getCode();
529         Integer orderItemId = searchCriteria.getGrouping() == null ? null : searchCriteria.getGrouping().getId();
530         String programCode = searchCriteria.getProgram() == null ? null : searchCriteria.getProgram().getCode();
531 
532         return monitoringLocationDao.findLocations(statusCodes,
533                 orderItemTypeCode,
534                 orderItemId,
535                 programCode,
536                 searchCriteria.getLabel(),
537                 searchCriteria.getName(),
538                 searchCriteria.isStrictName());
539     }
540 
541     /**
542      * {@inheritDoc}
543      */
544     @Override
545     public List<DepartmentDTO> searchDepartments(DepartmentCriteriaDTO searchCriteria) {
546         List<String> statusCodes = StatusFilter.ALL.intersect(searchCriteria.getStatus());
547         Integer parentId = searchCriteria.getParentDepartment() == null ?
548                 null : searchCriteria.getParentDepartment().getId();
549         return departmentDao.findDepartmentsByCodeAndName(
550                 searchCriteria.getCode(),
551                 searchCriteria.getName(),
552                 searchCriteria.isStrictName(),
553                 parentId,
554                 statusCodes);
555     }
556 
557     /**
558      * {@inheritDoc}
559      */
560     @Override
561     public List<AnalysisInstrumentDTO> searchAnalysisInstruments(StatusFilter statusFilter, String instrumentName) {
562         return analysisInstrumentDao.findAnalysisInstrumentsByName(statusFilter.toStatusCodes(), instrumentName);
563     }
564 
565     /**
566      * {@inheritDoc}
567      */
568     @Override
569     public List<TaxonDTO> searchTaxons(TaxonCriteriaDTO taxonCriteria) {
570         String levelCode = taxonCriteria.getLevel() == null ? null : taxonCriteria.getLevel().getCode();
571         String name = StringUtils.isBlank(taxonCriteria.getName()) ? null : taxonCriteria.getName();
572         if (taxonCriteria.isFullProperties()) {
573             return taxonNameDao.findFullTaxonNamesByCriteria(levelCode, name, taxonCriteria.isStrictName());
574         } else {
575             return taxonNameDao.findTaxonNamesByCriteria(levelCode, name, taxonCriteria.isStrictName());
576         }
577 
578     }
579 
580     /**
581      * {@inheritDoc}
582      */
583     @Override
584     public List<TaxonGroupDTO> searchTaxonGroups(TaxonGroupCriteriaDTO searchCriteria) {
585         List<String> statusCodes = StatusFilter.ALL.intersect(searchCriteria.getStatus());
586         Integer parentTaxonGroupId = searchCriteria.getParentTaxonGroup() == null ? null : searchCriteria.getParentTaxonGroup().getId();
587         return taxonGroupDao.findTaxonGroups(parentTaxonGroupId,
588                 searchCriteria.getLabel(),
589                 searchCriteria.getName(),
590                 searchCriteria.isStrictName(),
591                 statusCodes);
592     }
593 
594     /**
595      * {@inheritDoc}
596      */
597     @Override
598     public List<PhotoTypeDTO> getPhotoTypes() {
599         return new ArrayList<>(referentialDao.getAllPhotoTypes());
600     }
601 
602     /**
603      * {@inheritDoc}
604      */
605     @Override
606     public List<ParameterTypeDTO> getParameterTypes() {
607         // If list not exist, create it
608         if (parameterTypeList == null) {
609             parameterTypeList = Lists.newArrayList();
610 
611             // Add all values
612             for (ParameterTypeValues parameterTypeValue : ParameterTypeValues.values()) {
613 
614                 // DTO
615                 ParameterTypeDTO parameterType = DaliBeanFactory.newParameterTypeDTO();
616 
617                 // Add ID
618                 parameterType.setId(parameterTypeValue.ordinal());
619 
620                 // Add parameterType label
621                 parameterType.setKeyLabel(parameterTypeValue.getLabel());
622 
623                 // Add to list
624                 parameterTypeList.add(parameterType);
625             }
626         }
627         return parameterTypeList;
628     }
629 
630 }