2 * Copyright (C) 2009 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
9 package eu
.etaxonomy
.cdm
.validation
.constraint
;
11 import java
.util
.HashSet
;
12 import java
.util
.List
;
13 import java
.util
.Objects
;
15 import java
.util
.stream
.Collectors
;
17 import javax
.validation
.ConstraintValidator
;
18 import javax
.validation
.ConstraintValidatorContext
;
20 import org
.springframework
.beans
.factory
.annotation
.Autowired
;
22 import eu
.etaxonomy
.cdm
.api
.service
.INameService
;
23 import eu
.etaxonomy
.cdm
.model
.name
.TaxonName
;
24 import eu
.etaxonomy
.cdm
.validation
.annotation
.NoDuplicateNames
;
26 public class NoDuplicateNamesValidator
implements
27 ConstraintValidator
<NoDuplicateNames
,TaxonName
> {
29 private static Set
<String
> includeProperties
;
32 includeProperties
= new HashSet
<>();
33 includeProperties
.add("genusOrUninomial");
34 includeProperties
.add("infraGenericEpithet");
35 includeProperties
.add("specificEpithet");
36 includeProperties
.add("infraSpecificEpithet");
37 includeProperties
.add("rank");
38 // includeProperties.add("nomenclaturalSource.citation"); //handled in method now since #6581
39 // includeProperties.add("nomenclaturalSource.citationMicroReference"); //handled in method now since #6581
40 includeProperties
.add("basionymAuthorship");
41 includeProperties
.add("exBasionymAuthorship");
42 includeProperties
.add("combinationAuthorship");
43 includeProperties
.add("exCombinationAuthorship");
46 private INameService nameService
;
49 public void setNameService(INameService nameService
) {
50 this.nameService
= nameService
;
54 public void initialize(NoDuplicateNames noDuplicateNames
) { }
57 public boolean isValid(TaxonName name
, ConstraintValidatorContext constraintContext
) {
61 List
<TaxonName
> matchingNames
= nameService
.list(name
, includeProperties
, null, null, null, null);
62 matchingNames
= matchingNames
.stream().filter(existing
->
63 Objects
.equals(existing
.getNomenclaturalReference(),name
.getNomenclaturalReference())
64 && Objects
.equals(existing
.getNomenclaturalMicroReference(), name
.getNomenclaturalMicroReference())
65 && !existing
.equals(name
)
66 ).collect(Collectors
.toList());
68 if(matchingNames
.size() > 0) {
69 if(matchingNames
.size() == 1 && matchingNames
.get(0).equals(name
)) {