1 package fr.ifremer.dali.service.referential;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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
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
127
128 @Override
129 public List<SamplingEquipmentDTO> getSamplingEquipments(StatusFilter statusFilter) {
130 return new ArrayList<>(samplingEquipmentDao.getAllSamplingEquipments(statusFilter.toStatusCodes()));
131 }
132
133
134
135
136 @Override
137 public List<UnitDTO> getUnits(StatusFilter statusFilter) {
138 return new ArrayList<>(unitDao.getAllUnits(statusFilter.toStatusCodes()));
139 }
140
141
142
143
144 @Override
145 public List<DepartmentDTO> getDepartments(StatusFilter statusFilter) {
146 return new ArrayList<>(departmentDao.getAllDepartments(statusFilter.toStatusCodes()));
147 }
148
149
150
151
152 @Override
153 public DepartmentDTO getDepartmentById(int departmentId) {
154 return departmentDao.getDepartmentById(departmentId);
155 }
156
157
158
159
160 @Override
161 public List<AnalysisInstrumentDTO> getAnalysisInstruments(StatusFilter statusFilter) {
162 return new ArrayList<>(analysisInstrumentDao.getAllAnalysisInstruments(statusFilter.toStatusCodes()));
163 }
164
165
166
167
168 @Override
169 public List<StatusDTO> getStatus(StatusFilter statusFilter) {
170 return referentialDao.getStatusByCodes(statusFilter.toStatusCodes());
171 }
172
173
174
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
184
185 @Override
186 public LocationDTO getLocation(int locationId) {
187 return monitoringLocationDao.getLocationById(locationId);
188 }
189
190
191
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
203
204 @Override
205 public List<HarbourDTO> getHarbours(StatusFilter statusFilter) {
206 Assert.notNull(statusFilter);
207 return monitoringLocationDao.getAllHarbours(statusFilter.toStatusCodes());
208 }
209
210
211
212
213 @Override
214 public List<TaxonGroupDTO> getTaxonGroups() {
215 return new ArrayList<>(taxonGroupDao.getAllTaxonGroups());
216 }
217
218
219
220
221 @Override
222 public TaxonGroupDTO getTaxonGroup(int taxonGroupId) {
223 return taxonGroupDao.getTaxonGroupById(taxonGroupId);
224 }
225
226
227
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
236 result.add(taxonGroup);
237 } else {
238
239
240 result.add(taxonGroupDao.getTaxonGroupById(taxonGroup.getId()));
241 }
242 }
243 }
244 return result;
245 }
246
247
248
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
261
262 @Override
263 public TaxonDTO getTaxon(int taxonId) {
264 return taxonNameDao.getTaxonNameById(taxonId);
265 }
266
267
268
269
270 @Override
271 public void fillTaxonsProperties(List<TaxonDTO> taxons) {
272 taxonNameDao.fillTaxonsProperties(taxons);
273 }
274
275
276
277
278 @Override
279 public void fillReferentTaxons(List<TaxonDTO> taxons) {
280 taxonNameDao.fillReferents(taxons);
281 }
282
283
284
285
286 @Override
287 public List<TaxonomicLevelDTO> getTaxonomicLevels() {
288 return new ArrayList<>(referentialDao.getAllTaxonomicLevels());
289 }
290
291
292
293
294 @Override
295 public List<CitationDTO> getCitations() {
296 return new ArrayList<>(referentialDao.getAllCitations());
297 }
298
299
300
301
302 @Override
303 public List<PositioningSystemDTO> getPositioningSystems() {
304 return new ArrayList<>(referentialDao.getAllPositioningSystems());
305 }
306
307
308
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
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
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
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
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
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
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
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
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
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
400
401 @Override
402 public PmfmDTO getPmfm(int pmfmId) {
403 return pmfmDao.getPmfmById(pmfmId);
404 }
405
406
407
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
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
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
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
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
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
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
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
515
516 @Override
517 public List<GroupingTypeDTO> getGroupingTypes() {
518 return new ArrayList<>(referentialDao.getAllGroupingTypes());
519 }
520
521
522
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
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
559
560 @Override
561 public List<AnalysisInstrumentDTO> searchAnalysisInstruments(StatusFilter statusFilter, String instrumentName) {
562 return analysisInstrumentDao.findAnalysisInstrumentsByName(statusFilter.toStatusCodes(), instrumentName);
563 }
564
565
566
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
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
596
597 @Override
598 public List<PhotoTypeDTO> getPhotoTypes() {
599 return new ArrayList<>(referentialDao.getAllPhotoTypes());
600 }
601
602
603
604
605 @Override
606 public List<ParameterTypeDTO> getParameterTypes() {
607
608 if (parameterTypeList == null) {
609 parameterTypeList = Lists.newArrayList();
610
611
612 for (ParameterTypeValues parameterTypeValue : ParameterTypeValues.values()) {
613
614
615 ParameterTypeDTO parameterType = DaliBeanFactory.newParameterTypeDTO();
616
617
618 parameterType.setId(parameterTypeValue.ordinal());
619
620
621 parameterType.setKeyLabel(parameterTypeValue.getLabel());
622
623
624 parameterTypeList.add(parameterType);
625 }
626 }
627 return parameterTypeList;
628 }
629
630 }