3 * Copyright (C) 2007 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
11 package eu
.etaxonomy
.cdm
.model
.description
;
13 import java
.util
.HashSet
;
14 import java
.util
.Iterator
;
15 import java
.util
.List
;
18 import javax
.persistence
.Entity
;
19 import javax
.persistence
.FetchType
;
20 import javax
.persistence
.ManyToMany
;
21 import javax
.persistence
.ManyToOne
;
22 import javax
.persistence
.OneToMany
;
23 import javax
.persistence
.Transient
;
24 import javax
.xml
.bind
.annotation
.XmlAccessType
;
25 import javax
.xml
.bind
.annotation
.XmlAccessorType
;
26 import javax
.xml
.bind
.annotation
.XmlElement
;
27 import javax
.xml
.bind
.annotation
.XmlElementWrapper
;
28 import javax
.xml
.bind
.annotation
.XmlIDREF
;
29 import javax
.xml
.bind
.annotation
.XmlRootElement
;
30 import javax
.xml
.bind
.annotation
.XmlSchemaType
;
31 import javax
.xml
.bind
.annotation
.XmlType
;
33 import org
.apache
.log4j
.Logger
;
34 import org
.hibernate
.annotations
.Cascade
;
35 import org
.hibernate
.annotations
.CascadeType
;
36 import org
.hibernate
.envers
.Audited
;
38 import eu
.etaxonomy
.cdm
.model
.common
.AnnotatableEntity
;
39 import eu
.etaxonomy
.cdm
.model
.common
.Language
;
40 import eu
.etaxonomy
.cdm
.model
.common
.Representation
;
44 * The working set class allows the demarcation of a set of descriptions
45 * associated with representations and a set of features and their
53 @XmlAccessorType(XmlAccessType
.FIELD
)
54 @XmlType(name
= "WorkingSet", propOrder
= {
59 @XmlRootElement(name
= "WorkingSet")
63 public class WorkingSet
extends AnnotatableEntity
{
64 private static final long serialVersionUID
= 3256448866757415686L;
65 private static final Logger logger
= Logger
.getLogger(WorkingSet
.class);
67 @XmlElementWrapper(name
= "Representations")
68 @XmlElement(name
= "Representation")
69 @OneToMany(fetch
=FetchType
.EAGER
)
70 @Cascade( { CascadeType
.SAVE_UPDATE
, CascadeType
.MERGE
, CascadeType
.DELETE
})
71 private Set
<Representation
> representations
= new HashSet
<Representation
>();
73 @XmlElement(name
= "DescriptiveSystem")
75 @XmlSchemaType(name
= "IDREF")
76 @ManyToOne(fetch
= FetchType
.LAZY
)
77 @Cascade({CascadeType
.SAVE_UPDATE
})
78 private FeatureTree descriptiveSystem
;
80 @XmlElementWrapper(name
= "Descriptions")
81 @XmlElement(name
= "Description")
83 @XmlSchemaType(name
= "IDREF")
84 @ManyToMany(fetch
= FetchType
.LAZY
)
85 @Cascade(CascadeType
.SAVE_UPDATE
)
86 private Set
<DescriptionBase
> descriptions
= new HashSet
<DescriptionBase
>();
89 * Class constructor: creates a new empty working set instance.
91 protected WorkingSet() {
96 * Creates a new empty working set instance.
98 public static WorkingSet
NewInstance(){
99 return new WorkingSet();
102 public Set
<Representation
> getRepresentations() {
103 return this.representations
;
106 public void addRepresentation(Representation representation
) {
107 this.representations
.add(representation
);
110 public void removeRepresentation(Representation representation
) {
111 this.representations
.remove(representation
);
114 public Representation
getRepresentation(Language lang
) {
115 for (Representation repr
: representations
){
116 Language reprLanguage
= repr
.getLanguage();
117 if (reprLanguage
!= null && reprLanguage
.equals(lang
)){
125 * @see #getPreferredRepresentation(Language)
129 public Representation
getPreferredRepresentation(Language language
) {
130 Representation repr
= getRepresentation(language
);
132 repr
= getRepresentation(Language
.DEFAULT());
135 repr
= getRepresentations().iterator().next();
141 * Returns the Representation in the preferred language. Preferred languages
142 * are specified by the parameter languages, which receives a list of
143 * Language instances in the order of preference. If no representation in
144 * any preferred languages is found the method falls back to return the
145 * Representation in Language.DEFAULT() and if necessary further falls back
146 * to return the first element found if any.
148 * TODO think about this fall-back strategy &
149 * see also {@link TextData#getPreferredLanguageString(List)}
154 public Representation
getPreferredRepresentation(List
<Language
> languages
) {
155 Representation repr
= null;
156 if(languages
!= null){
157 for(Language language
: languages
) {
158 repr
= getRepresentation(language
);
165 repr
= getRepresentation(Language
.DEFAULT());
168 Iterator
<Representation
> it
= getRepresentations().iterator();
170 repr
= getRepresentations().iterator().next();
177 public String
getLabel() {
178 if(getLabel(Language
.DEFAULT())!=null){
179 Representation repr
= getRepresentation(Language
.DEFAULT());
180 return (repr
== null)?
null :repr
.getLabel();
182 for (Representation r
: representations
){
186 return super.getUuid().toString();
189 public String
getLabel(Language lang
) {
190 Representation repr
= this.getRepresentation(lang
);
191 return (repr
== null) ?
null : repr
.getLabel();
194 public void setLabel(String label
){
195 Language lang
= Language
.DEFAULT();
196 setLabel(label
, lang
);
199 public void setLabel(String label
, Language language
){
200 if (language
!= null){
201 Representation repr
= getRepresentation(language
);
203 repr
.setLabel(label
);
205 repr
= Representation
.NewInstance(null, label
, null, language
);
207 this.addRepresentation(repr
);
211 public FeatureTree
getDescriptiveSystem() {
212 return descriptiveSystem
;
214 protected void setDescriptiveSystem(FeatureTree descriptiveSystem
) {
215 this.descriptiveSystem
= descriptiveSystem
;
219 * Returns the {@link DescriptionBase descriptions} of
220 * <i>this</i> working set.
222 * @see #addDescription(DescriptionBase)
223 * @see #removeDescription(DescriptionBase)
225 public Set
<DescriptionBase
> getDescriptions() {
230 * Adds an existing {@link DescriptionBase description} to the set of
231 * {@link #getDescriptions() descriptions} of <i>this</i>
234 * @param description the description to be added to <i>this</i> working set
235 * @see #getDescriptions()
236 * @see WorkingSet#addDescription(DescriptionBase)
238 public void addDescription(DescriptionBase description
) {
239 logger
.debug("addDescription");
240 this.descriptions
.add(description
);
244 * Removes one element from the set of {@link #getDescriptions() descriptions} involved
245 * in <i>this</i> working set.<BR>
247 * @param description the description which should be removed
248 * @see #getDescriptions()
249 * @see #addDescription(DescriptionBase)
250 * @see WorkingSet#removeDescription(DescriptionBase)
252 public void removeDescription(DescriptionBase description
) {
253 this.descriptions
.remove(description
);