4 package eu
.etaxonomy
.cdm
.model
.description
;
6 import java
.util
.HashMap
;
7 import java
.util
.Iterator
;
10 import java
.util
.Map
.Entry
;
12 import javax
.persistence
.Entity
;
13 import javax
.persistence
.FetchType
;
14 import javax
.persistence
.OneToMany
;
15 import javax
.xml
.bind
.annotation
.XmlAccessType
;
16 import javax
.xml
.bind
.annotation
.XmlAccessorType
;
17 import javax
.xml
.bind
.annotation
.XmlElement
;
18 import javax
.xml
.bind
.annotation
.XmlRootElement
;
19 import javax
.xml
.bind
.annotation
.XmlType
;
20 import javax
.xml
.bind
.annotation
.adapters
.XmlJavaTypeAdapter
;
22 import org
.apache
.log4j
.Logger
;
23 import org
.hibernate
.annotations
.Cascade
;
24 import org
.hibernate
.annotations
.CascadeType
;
25 import org
.hibernate
.envers
.Audited
;
27 import eu
.etaxonomy
.cdm
.jaxb
.MultilanguageTextAdapter
;
28 import eu
.etaxonomy
.cdm
.model
.common
.DefinedTermBase
;
29 import eu
.etaxonomy
.cdm
.model
.common
.IMultiLanguageTextHolder
;
30 import eu
.etaxonomy
.cdm
.model
.common
.Language
;
31 import eu
.etaxonomy
.cdm
.model
.common
.LanguageString
;
32 import eu
.etaxonomy
.cdm
.model
.common
.MultilanguageTextHelper
;
33 import eu
.etaxonomy
.cdm
.model
.common
.TermBase
;
34 import eu
.etaxonomy
.cdm
.model
.common
.VersionableEntity
;
37 * This class represents a statement or a question within a (polytomous) key.
38 * Compare with SDD SimpleRepresentation.
43 @XmlAccessorType(XmlAccessType
.FIELD
)
44 @XmlType(name
= "KeyStatement", propOrder
= {
48 @XmlRootElement(name
= "KeyStatement")
51 public class KeyStatement
extends VersionableEntity
implements IMultiLanguageTextHolder
{
52 private static final long serialVersionUID
= 3771323100914695139L;
53 @SuppressWarnings("unused")
54 private static final Logger logger
= Logger
.getLogger(KeyStatement
.class);
57 @XmlElement(name
= "MultiLanguageText")
58 @XmlJavaTypeAdapter(MultilanguageTextAdapter
.class)
59 @OneToMany (fetch
= FetchType
.LAZY
)
60 @Cascade({CascadeType
.SAVE_UPDATE
,CascadeType
.MERGE
, CascadeType
.DELETE
, CascadeType
.DELETE_ORPHAN
})
62 private Map
<Language
, LanguageString
> label
= new HashMap
<Language
, LanguageString
>();
64 //private mediaObjects needs to be discussed (how to implement the role of the media)
68 public static KeyStatement
NewInstance(){
69 KeyStatement result
= new KeyStatement();
74 public static KeyStatement
NewInstance(String defaultLabel
){
75 KeyStatement result
= new KeyStatement();
76 result
.putLabel(Language
.DEFAULT(), defaultLabel
);
83 public KeyStatement() {
86 // ********************************* METHODS ***************************/
89 * Returns the label with the content of <i>this</i> key statement.
90 * The different {@link LanguageString language strings} (texts) contained in the
91 * label should all have the same meaning.
93 * @see #getText(Language)
95 public Map
<Language
, LanguageString
> getLabel() {
100 * Returns the label with the content of <i>this</i> key statement for
101 * a specific language.
103 * @param language the language in which the label is formulated
106 public LanguageString
getLabel(Language language
){
107 return label
.get(language
);
110 public void setLabel(Map
<Language
,LanguageString
> label
) {
115 * Returns the text string in the given {@link Language language} with the content
116 * of <i>this</i> key statement.
118 * @param language the language in which the label is formulated
119 * @see #getLabel(Language)
121 public String
getLabelText(Language language
) {
122 LanguageString languageString
= label
.get(language
);
123 if (languageString
== null){
126 return languageString
.getText();
131 * Returns the LanguageString in the preferred language. Preferred languages
132 * are specified by the parameter languages, which receives a list of
133 * Language instances in the order of preference. If no representation in
134 * any preferred languages is found the method falls back to return the
135 * Representation in Language.DEFAULT() and if necessary further falls back
136 * to return the first element found if any.
138 * TODO think about this fall-back strategy &
139 * see also {@link TermBase#getPreferredRepresentation(List)}
144 public LanguageString
getPreferredLanguageString(List
<Language
> languages
) {
145 return MultilanguageTextHelper
.getPreferredLanguageString(label
, languages
);
149 * Creates a {@link LanguageString language string} based on the given text string
150 * and the given {@link Language language}, returns it and adds it to the multilanguage
151 * text representing the content of <i>this</i> text data.
153 * @param text the string representing the content of the text data
154 * in a particular language
155 * @param language the language in which the text string is formulated
156 * @return the language string
157 * @see #getMultilanguageText()
158 * @see #putText(LanguageString)
159 * @deprecated should follow the put semantic of maps, this method will be removed in v4.0
160 * Use the {@link #putLabel(Language, String) putLabel} method
162 public LanguageString
putLabel(String label
, Language language
) {
163 return putLabel(language
, label
);
167 * Creates a {@link LanguageString language string} based on the given text string
168 * and the given {@link Language language}, returns it and adds it to the multilanguage
169 * text representing the content of <i>this</i> text data.
171 * @param language the language in which the text string is formulated
172 * @param text the string representing the content of the text data
173 * in a particular language
175 * @return the language string
177 * @see #putLabel(LanguageString)
180 public LanguageString
putLabel(Language language
, String label
) {
181 LanguageString result
= this.label
.put(language
, LanguageString
.NewInstance(label
, language
));
182 return (result
== null ?
null : result
);
185 * Adds a translated {@link LanguageString text in a particular language}
187 * The given language string will be returned.
189 * @param languageString the language string representing the content of
190 * the text data in a particular language
191 * @return the language string
193 * @see #putLabel(String, Language)
195 public LanguageString
putLabel(LanguageString languageString
) {
196 if (languageString
== null){
199 Language language
= languageString
.getLanguage();
200 return this.label
.put(language
, languageString
);
205 * Adds a translated {@link LanguageString text in a particular language}
207 * The given language string will be returned.
209 * @param languageString the language string representing the content of
210 * the text data in a particular language
211 * @return the language string
213 * @see #putLabel(String, Language)
214 * @deprecated This method will be removed in v4.0
215 * Use the {@link #putLabel(LanguageString) putLabel} method instead
217 public LanguageString
putText(LanguageString languageString
) {
218 return putLabel(languageString
);
222 * Removes from label the one {@link LanguageString language string}
223 * with the given {@link Language language}. Returns the removed
226 * @param language the language in which the language string to be removed
227 * has been formulated
228 * @return the language string associated with the given language
229 * @see #getLabelText()
230 * @deprecated This method will be removed in v4.0
231 * Use the {@link #removeLabel(Language)} method instead
233 public LanguageString
removeText(Language language
) {
234 return removeLabel(language
);
238 * Removes from label the one {@link LanguageString language string}
239 * with the given {@link Language language}. Returns the removed
242 * @param language the language in which the language string to be removed
243 * has been formulated
244 * @return the language string associated with the given language
245 * @see #getLabelText()
247 public LanguageString
removeLabel(Language language
) {
248 return this.label
.remove(language
);
253 * Returns the number of {@link Language languages} in which the label
254 * of <i>this</i> key statement has been formulated.
256 * @see #getMultilanguageText()
258 public int countLanguages(){
262 //*********************** CLONE ********************************************************/
265 * Clones <i>this</i> KeyStatement. This is a shortcut that enables to create
266 * a new instance that differs only slightly from <i>this</i> KeyStatement by
267 * modifying only some of the attributes.
269 * @see eu.etaxonomy.cdm.model.common.VersionableEntitity#clone()
270 * @see java.lang.Object#clone()
273 public Object
clone() {
276 result
= (KeyStatement
) super.clone();
278 result
.label
= new HashMap
<Language
, LanguageString
>();
281 for (Entry
<Language
,LanguageString
> entry
: this.label
.entrySet()){
283 result
.label
.put(entry
.getKey(), entry
.getValue());
287 }catch (CloneNotSupportedException e
) {
288 logger
.warn("Object does not implement cloneable");