4 package eu
.etaxonomy
.cdm
.model
.description
;
6 import java
.util
.Arrays
;
7 import java
.util
.HashMap
;
11 import javax
.persistence
.Entity
;
12 import javax
.persistence
.FetchType
;
13 import javax
.persistence
.MapKeyJoinColumn
;
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
.logging
.log4j
.LogManager
;
23 import org
.apache
.logging
.log4j
.Logger
;
24 import org
.hibernate
.annotations
.Cascade
;
25 import org
.hibernate
.annotations
.CascadeType
;
26 import org
.hibernate
.envers
.Audited
;
28 import eu
.etaxonomy
.cdm
.jaxb
.MultilanguageTextAdapter
;
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
.VersionableEntity
;
34 import eu
.etaxonomy
.cdm
.model
.term
.TermBase
;
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
{
53 private static final long serialVersionUID
= 3771323100914695139L;
54 private static final Logger logger
= LogManager
.getLogger();
57 @XmlElement(name
= "MultiLanguageText")
58 @XmlJavaTypeAdapter(MultilanguageTextAdapter
.class)
59 @OneToMany (fetch
= FetchType
.LAZY
, orphanRemoval
=true)
60 @MapKeyJoinColumn(name
="label_mapkey_id")
61 @Cascade({CascadeType
.SAVE_UPDATE
,CascadeType
.MERGE
, CascadeType
.DELETE
})
63 private Map
<Language
, LanguageString
> label
= new HashMap
<>();
65 //private mediaObjects needs to be discussed (how to implement the role of the media)
67 public static KeyStatement
NewInstance(){
68 KeyStatement result
= new KeyStatement();
72 public static KeyStatement
NewInstance(String defaultLanguageLabel
){
73 KeyStatement result
= new KeyStatement();
74 result
.putLabel(Language
.DEFAULT(), defaultLanguageLabel
);
79 * Factory method for a key statement.
80 * @param language the language of the first representation of the statement. Must not be <code>null</code>.
81 * @param label the text of statement in the given language.
84 public static KeyStatement
NewInstance(Language language
, String label
){
85 assert language
!= null : "Language for KeyStatement must not be null";
86 KeyStatement result
= new KeyStatement();
87 result
.putLabel(language
, label
);
91 //*************************** CONSTRUCTOR ***********************************/
93 public KeyStatement() {
96 // ********************************* METHODS ***************************/
99 * Returns the label with the content of <i>this</i> key statement.
100 * The different {@link LanguageString language strings} (texts) contained in the
101 * label should all have the same meaning.
103 * @see #getText(Language)
105 public Map
<Language
, LanguageString
> getLabel() {
110 * Returns the label with the content of <i>this</i> key statement for
111 * a specific language.
113 * @param language the language in which the label is formulated
116 public LanguageString
getLabel(Language language
){
117 return label
.get(language
);
120 public void setLabel(Map
<Language
,LanguageString
> label
) {
125 * Returns the text string in the given {@link Language language} with the content
126 * of <i>this</i> key statement.
128 * @param language the language in which the label is formulated
129 * @see #getLabel(Language)
131 public String
getLabelText(Language language
) {
132 LanguageString languageString
= label
.get(language
);
133 if (languageString
== null){
136 return languageString
.getText();
141 * Returns the LanguageString 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 TermBase#getPreferredRepresentation(List)}
154 public LanguageString
getPreferredLanguageString(List
<Language
> languages
) {
155 return MultilanguageTextHelper
.getPreferredLanguageString(label
, languages
);
159 * @see #getPreferredLanguageString(List)
161 public LanguageString
getPreferredLanguageString(Language language
) {
162 return MultilanguageTextHelper
.getPreferredLanguageString(label
, Arrays
.asList(language
));
166 * Creates a {@link LanguageString language string} based on the given text string
167 * and the given {@link Language language}, returns it and adds it to the multilanguage
168 * text representing the content of <i>this</i> text data.
170 * @param language the language in which the text string is formulated
171 * @param text the string representing the content of the text data
172 * in a particular language
174 * @return the language string
176 * @see #putLabel(LanguageString)
179 public LanguageString
putLabel(Language language
, String label
) {
180 LanguageString result
= this.label
.put(language
, LanguageString
.NewInstance(label
, language
));
181 return (result
== null ?
null : result
);
184 * Adds a translated {@link LanguageString text in a particular language}
186 * The given language string will be returned.
188 * @param languageString the language string representing the content of
189 * the text data in a particular language
190 * @return the language string
192 * @see #putLabel(String, Language)
194 public LanguageString
putLabel(LanguageString languageString
) {
195 if (languageString
== null){
198 Language language
= languageString
.getLanguage();
199 return this.label
.put(language
, languageString
);
204 * Removes from label the one {@link LanguageString language string}
205 * with the given {@link Language language}. Returns the removed
208 * @param language the language in which the language string to be removed
209 * has been formulated
210 * @return the language string associated with the given language
211 * @see #getLabelText()
213 public LanguageString
removeLabel(Language language
) {
214 return this.label
.remove(language
);
219 * Returns the number of {@link Language languages} in which the label
220 * of <i>this</i> key statement has been formulated.
222 * @see #getMultilanguageText()
224 public int countLanguages(){
228 //*********************** CLONE ********************************************************/
231 * Clones <i>this</i> KeyStatement. This is a shortcut that enables to create
232 * a new instance that differs only slightly from <i>this</i> KeyStatement by
233 * modifying only some of the attributes.
235 * @see eu.etaxonomy.cdm.model.common.VersionableEntitity#clone()
236 * @see java.lang.Object#clone()
239 public KeyStatement
clone() {
243 result
= (KeyStatement
) super.clone();
245 result
.label
= cloneLanguageString(this.label
);
248 }catch (CloneNotSupportedException e
) {
249 logger
.warn("Object does not implement cloneable");
255 //********************* toString() *************************************/
258 public String
toString(){
259 if (label
!= null && ! label
.isEmpty()){
260 String result
= label
.values().iterator().next().getText();
263 return super.toString();