(no commit message)
[cdmlib.git] / cdmlib-model / src / main / java / eu / etaxonomy / cdm / model / name / HomotypicalGroup.java
1 /**
2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
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.
8 */
9
10 package eu.etaxonomy.cdm.model.name;
11
12 import java.util.ArrayList;
13 import java.util.HashSet;
14 import java.util.List;
15 import java.util.Set;
16
17 import javax.persistence.Entity;
18 import javax.persistence.FetchType;
19 import javax.persistence.OneToMany;
20 import javax.persistence.Transient;
21
22 import org.apache.log4j.Logger;
23 import org.hibernate.annotations.Cascade;
24 import org.hibernate.annotations.CascadeType;
25
26 import eu.etaxonomy.cdm.model.common.AnnotatableEntity;
27 import eu.etaxonomy.cdm.model.occurrence.Specimen;
28 import eu.etaxonomy.cdm.model.reference.ReferenceBase;
29 import eu.etaxonomy.cdm.model.taxon.Synonym;
30
31
32 /**
33 * A homotypical group represents all names that share the same type specimens.
34 * This also includes supergeneric names like genera or families which usually have a name type designation
35 * that finally (a name type designation can also point to another supergeneric name) points to a species name,
36 * which in turn has a (set of) physical type specimen(s).
37 * @author m.doering
38 *
39 */
40 @Entity
41 public class HomotypicalGroup extends AnnotatableEntity {
42 static Logger logger = Logger.getLogger(HomotypicalGroup.class);
43
44 protected Set<TaxonNameBase> typifiedNames = new HashSet();
45 protected Set<SpecimenTypeDesignation> typeDesignations = new HashSet();
46
47 public static HomotypicalGroup NewInstance(){
48 return new HomotypicalGroup();
49 }
50
51
52 public HomotypicalGroup() {
53 super();
54 }
55
56
57 @OneToMany(mappedBy="homotypicalGroup", fetch=FetchType.EAGER)
58 public Set<TaxonNameBase> getTypifiedNames() {
59 return typifiedNames;
60 }
61 protected void setTypifiedNames(Set<TaxonNameBase> typifiedNames) {
62 this.typifiedNames = typifiedNames;
63 }
64 public void addTypifiedName(TaxonNameBase typifiedName) {
65 typifiedName.setHomotypicalGroup(this);
66 }
67 public void removeTypifiedName(TaxonNameBase typifiedName) {
68 typifiedName.setHomotypicalGroup(null);
69 }
70
71
72 @OneToMany
73 @Cascade({CascadeType.SAVE_UPDATE})
74 public Set<SpecimenTypeDesignation> getTypeDesignations() {
75 return typeDesignations;
76 }
77 protected void setTypeDesignations(Set<SpecimenTypeDesignation> typeDesignations) {
78 this.typeDesignations = typeDesignations;
79 }
80 public void addTypeDesignation(SpecimenTypeDesignation typeDesignation) {
81 typeDesignation.setHomotypicalGroup(this);
82 }
83 public void removeTypeDesignation(SpecimenTypeDesignation typeDesignation) {
84 typeDesignation.setHomotypicalGroup(null);
85 }
86 public void addTypeDesignation(Specimen typeSpecimen, TypeDesignationStatus status, ReferenceBase citation, String citationMicroReference, String originalNameString) {
87 SpecimenTypeDesignation td = new SpecimenTypeDesignation(this, typeSpecimen, status, citation, citationMicroReference, originalNameString);
88 td.setHomotypicalGroup(this);
89 }
90
91 /**
92 * Retrieves the synonyms of reference sec that are part of this homotypical group.
93 * If other names are part of this group that are not considered synonyms in the respective sec-reference,
94 * then they will not be included in the resultset.
95 * @param sec
96 * @return
97 */
98 @Transient
99 public List<Synonym> getSynonymsInGroup(ReferenceBase sec){
100 List<Synonym> result = new ArrayList();
101 for (TaxonNameBase<TaxonNameBase> n:this.getTypifiedNames()){
102 for (Synonym s:n.getSynonyms()){
103 if ( (s.getSec() == null && sec == null) ||
104 s.getSec().equals(sec)){
105 result.add(s);
106 }
107 }
108 }
109 // TODO: sort result list according to date first published, see nomenclatural reference
110 return result;
111 }
112 }