4 package eu
.etaxonomy
.cdm
.model
.description
;
6 import java
.util
.HashMap
;
9 import java
.util
.Map
.Entry
;
11 import javax
.persistence
.Entity
;
12 import javax
.persistence
.FetchType
;
13 import javax
.persistence
.OneToMany
;
14 import javax
.xml
.bind
.annotation
.XmlAccessType
;
15 import javax
.xml
.bind
.annotation
.XmlAccessorType
;
16 import javax
.xml
.bind
.annotation
.XmlElement
;
17 import javax
.xml
.bind
.annotation
.XmlRootElement
;
18 import javax
.xml
.bind
.annotation
.XmlType
;
19 import javax
.xml
.bind
.annotation
.adapters
.XmlJavaTypeAdapter
;
21 import org
.apache
.log4j
.Logger
;
22 import org
.hibernate
.annotations
.Cascade
;
23 import org
.hibernate
.annotations
.CascadeType
;
24 import org
.hibernate
.envers
.Audited
;
26 import eu
.etaxonomy
.cdm
.jaxb
.MultilanguageTextAdapter
;
27 import eu
.etaxonomy
.cdm
.model
.common
.IMultiLanguageTextHolder
;
28 import eu
.etaxonomy
.cdm
.model
.common
.Language
;
29 import eu
.etaxonomy
.cdm
.model
.common
.LanguageString
;
30 import eu
.etaxonomy
.cdm
.model
.common
.MultilanguageTextHelper
;
31 import eu
.etaxonomy
.cdm
.model
.common
.TermBase
;
32 import eu
.etaxonomy
.cdm
.model
.common
.VersionableEntity
;
35 * This class represents a statement or a question within a (polytomous) key.
36 * Compare with SDD SimpleRepresentation.
41 @XmlAccessorType(XmlAccessType
.FIELD
)
42 @XmlType(name
= "KeyStatement", propOrder
= {
46 @XmlRootElement(name
= "KeyStatement")
49 public class KeyStatement
extends VersionableEntity
implements IMultiLanguageTextHolder
{
50 private static final long serialVersionUID
= 3771323100914695139L;
51 private static final Logger logger
= Logger
.getLogger(KeyStatement
.class);
54 @XmlElement(name
= "MultiLanguageText")
55 @XmlJavaTypeAdapter(MultilanguageTextAdapter
.class)
56 @OneToMany (fetch
= FetchType
.LAZY
)
57 @Cascade({CascadeType
.SAVE_UPDATE
,CascadeType
.MERGE
, CascadeType
.DELETE
, CascadeType
.DELETE_ORPHAN
})
59 private Map
<Language
, LanguageString
> label
= new HashMap
<Language
, LanguageString
>();
61 //private mediaObjects needs to be discussed (how to implement the role of the media)
65 public static KeyStatement
NewInstance(){
66 KeyStatement result
= new KeyStatement();
71 public static KeyStatement
NewInstance(String defaultLanguageLabel
){
72 KeyStatement result
= new KeyStatement();
73 result
.putLabel(Language
.DEFAULT(), defaultLanguageLabel
);
80 public KeyStatement() {
83 // ********************************* METHODS ***************************/
86 * Returns the label with the content of <i>this</i> key statement.
87 * The different {@link LanguageString language strings} (texts) contained in the
88 * label should all have the same meaning.
90 * @see #getText(Language)
92 public Map
<Language
, LanguageString
> getLabel() {
97 * Returns the label with the content of <i>this</i> key statement for
98 * a specific language.
100 * @param language the language in which the label is formulated
103 public LanguageString
getLabel(Language language
){
104 return label
.get(language
);
107 public void setLabel(Map
<Language
,LanguageString
> label
) {
112 * Returns the text string in the given {@link Language language} with the content
113 * of <i>this</i> key statement.
115 * @param language the language in which the label is formulated
116 * @see #getLabel(Language)
118 public String
getLabelText(Language language
) {
119 LanguageString languageString
= label
.get(language
);
120 if (languageString
== null){
123 return languageString
.getText();
128 * Returns the LanguageString in the preferred language. Preferred languages
129 * are specified by the parameter languages, which receives a list of
130 * Language instances in the order of preference. If no representation in
131 * any preferred languages is found the method falls back to return the
132 * Representation in Language.DEFAULT() and if necessary further falls back
133 * to return the first element found if any.
135 * TODO think about this fall-back strategy &
136 * see also {@link TermBase#getPreferredRepresentation(List)}
141 public LanguageString
getPreferredLanguageString(List
<Language
> languages
) {
142 return MultilanguageTextHelper
.getPreferredLanguageString(label
, languages
);
146 * Creates a {@link LanguageString language string} based on the given text string
147 * and the given {@link Language language}, returns it and adds it to the multilanguage
148 * text representing the content of <i>this</i> text data.
150 * @param text the string representing the content of the text data
151 * in a particular language
152 * @param language the language in which the text string is formulated
153 * @return the language string
154 * @see #getMultilanguageText()
155 * @see #putText(LanguageString)
156 * @deprecated should follow the put semantic of maps, this method will be removed in v4.0
157 * Use the {@link #putLabel(Language, String) putLabel} method
159 public LanguageString
putLabel(String label
, Language language
) {
160 return putLabel(language
, label
);
164 * Creates a {@link LanguageString language string} based on the given text string
165 * and the given {@link Language language}, returns it and adds it to the multilanguage
166 * text representing the content of <i>this</i> text data.
168 * @param language the language in which the text string is formulated
169 * @param text the string representing the content of the text data
170 * in a particular language
172 * @return the language string
174 * @see #putLabel(LanguageString)
177 public LanguageString
putLabel(Language language
, String label
) {
178 LanguageString result
= this.label
.put(language
, LanguageString
.NewInstance(label
, language
));
179 return (result
== null ?
null : result
);
182 * Adds a translated {@link LanguageString text in a particular language}
184 * The given language string will be returned.
186 * @param languageString the language string representing the content of
187 * the text data in a particular language
188 * @return the language string
190 * @see #putLabel(String, Language)
192 public LanguageString
putLabel(LanguageString languageString
) {
193 if (languageString
== null){
196 Language language
= languageString
.getLanguage();
197 return this.label
.put(language
, languageString
);
202 * Adds a translated {@link LanguageString text in a particular language}
204 * The given language string will be returned.
206 * @param languageString the language string representing the content of
207 * the text data in a particular language
208 * @return the language string
210 * @see #putLabel(String, Language)
211 * @deprecated This method will be removed in v4.0
212 * Use the {@link #putLabel(LanguageString) putLabel} method instead
214 public LanguageString
putText(LanguageString languageString
) {
215 return putLabel(languageString
);
219 * Removes from label the one {@link LanguageString language string}
220 * with the given {@link Language language}. Returns the removed
223 * @param language the language in which the language string to be removed
224 * has been formulated
225 * @return the language string associated with the given language
226 * @see #getLabelText()
227 * @deprecated This method will be removed in v4.0
228 * Use the {@link #removeLabel(Language)} method instead
230 public LanguageString
removeText(Language language
) {
231 return removeLabel(language
);
235 * Removes from label the one {@link LanguageString language string}
236 * with the given {@link Language language}. Returns the removed
239 * @param language the language in which the language string to be removed
240 * has been formulated
241 * @return the language string associated with the given language
242 * @see #getLabelText()
244 public LanguageString
removeLabel(Language language
) {
245 return this.label
.remove(language
);
250 * Returns the number of {@link Language languages} in which the label
251 * of <i>this</i> key statement has been formulated.
253 * @see #getMultilanguageText()
255 public int countLanguages(){
259 //*********************** CLONE ********************************************************/
262 * Clones <i>this</i> KeyStatement. This is a shortcut that enables to create
263 * a new instance that differs only slightly from <i>this</i> KeyStatement by
264 * modifying only some of the attributes.
266 * @see eu.etaxonomy.cdm.model.common.VersionableEntitity#clone()
267 * @see java.lang.Object#clone()
270 public Object
clone() {
273 result
= (KeyStatement
) super.clone();
275 result
.label
= new HashMap
<Language
, LanguageString
>();
278 for (Entry
<Language
,LanguageString
> entry
: this.label
.entrySet()){
280 result
.label
.put(entry
.getKey(), entry
.getValue());
284 }catch (CloneNotSupportedException e
) {
285 logger
.warn("Object does not implement cloneable");