root/trunk/cdmlib/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/description/KeyStatement.java

Revision 12665, 9.6 kB (checked in by a.mueller, 10 months ago)

minor

Line 
1/**
2 *
3 */
4package eu.etaxonomy.cdm.model.description;
5
6import java.util.HashMap;
7import java.util.List;
8import java.util.Map;
9import java.util.Map.Entry;
10
11import javax.persistence.Entity;
12import javax.persistence.FetchType;
13import javax.persistence.OneToMany;
14import javax.xml.bind.annotation.XmlAccessType;
15import javax.xml.bind.annotation.XmlAccessorType;
16import javax.xml.bind.annotation.XmlElement;
17import javax.xml.bind.annotation.XmlRootElement;
18import javax.xml.bind.annotation.XmlType;
19import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
20
21import org.apache.log4j.Logger;
22import org.hibernate.annotations.Cascade;
23import org.hibernate.annotations.CascadeType;
24import org.hibernate.envers.Audited;
25
26import eu.etaxonomy.cdm.jaxb.MultilanguageTextAdapter;
27import eu.etaxonomy.cdm.model.common.IMultiLanguageTextHolder;
28import eu.etaxonomy.cdm.model.common.Language;
29import eu.etaxonomy.cdm.model.common.LanguageString;
30import eu.etaxonomy.cdm.model.common.MultilanguageTextHelper;
31import eu.etaxonomy.cdm.model.common.TermBase;
32import eu.etaxonomy.cdm.model.common.VersionableEntity;
33
34/**
35 * This class represents a statement or a question within a (polytomous) key.
36 * Compare with SDD SimpleRepresentation.
37 *
38 * @author a.mueller
39 *
40 */
41@XmlAccessorType(XmlAccessType.FIELD)
42@XmlType(name = "KeyStatement", propOrder = {
43    "label"
44//    ,"mediaObject"
45})
46@XmlRootElement(name = "KeyStatement")
47@Entity
48@Audited
49public class KeyStatement extends VersionableEntity implements IMultiLanguageTextHolder{
50        private static final long serialVersionUID = 3771323100914695139L;
51        private static final Logger logger = Logger.getLogger(KeyStatement.class);
52 
53       
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 })
58//    @IndexedEmbedded
59    private Map<Language, LanguageString> label = new HashMap<Language, LanguageString>();
60       
61        //private mediaObjects needs to be discussed (how to implement the role of the media)
62
63       
64           
65        public static KeyStatement NewInstance(){
66                KeyStatement result = new KeyStatement();
67                return result;
68        }
69
70       
71        public static KeyStatement NewInstance(String defaultLanguageLabel){
72                KeyStatement result = new KeyStatement();
73                result.putLabel(Language.DEFAULT(), defaultLanguageLabel);
74                return result;
75        }
76       
77        /**
78         *
79         */
80        public KeyStatement() {
81        }
82
83// ********************************* METHODS ***************************/
84       
85        /**
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.
89         *
90         * @see #getText(Language)
91         */
92    public Map<Language, LanguageString> getLabel() {
93                return label;
94        }
95   
96    /**
97     * Returns the label with the content of <i>this</i> key statement for
98     * a specific language.
99     *
100     * @param language the language in which the label is formulated
101     * @return
102     */
103    public LanguageString getLabel(Language language){
104        return label.get(language);
105    }
106   
107    public void setLabel(Map<Language,LanguageString> label) {
108        this.label = label;
109    }
110
111        /**
112         * Returns the text string in the given {@link Language language} with the content
113         * of <i>this</i> key statement.
114         *
115         * @param language      the language in which the label is formulated
116         * @see                         #getLabel(Language)
117         */ 
118        public String getLabelText(Language language) {
119                LanguageString languageString = label.get(language);
120                if (languageString == null){
121                        return null;
122                }else{
123                        return languageString.getText();
124                }
125        }
126   
127    /**
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.
134         *
135         * TODO think about this fall-back strategy &
136         * see also {@link TermBase#getPreferredRepresentation(List)}
137         *
138         * @param languages
139         * @return
140         */
141        public LanguageString getPreferredLanguageString(List<Language> languages) {
142                return MultilanguageTextHelper.getPreferredLanguageString(label, languages);
143        }
144       
145        /**
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.
149         *
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
158         */
159        public LanguageString putLabel(String label, Language language) {
160                return putLabel(language, label);
161        }
162       
163        /**
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.
167         *
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
171         *
172         * @return                      the language string
173         * @see                         #getLabel()
174         * @see                         #putLabel(LanguageString)
175         *
176         */
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);
180        }
181        /**
182         * Adds a translated {@link LanguageString text in a particular language}
183         * to the label.
184         * The given language string will be returned.
185         *
186         * @param languageString        the language string representing the content of
187         *                                                      the text data in a particular language
188         * @return                                      the language string
189         * @see                                         #getLabel()
190         * @see                                         #putLabel(String, Language)
191         */
192        public LanguageString putLabel(LanguageString languageString) {
193                if (languageString == null){
194                        return null;
195                }else{
196                        Language language = languageString.getLanguage();
197                        return this.label.put(language, languageString);
198                }
199        }
200       
201        /**
202         * Adds a translated {@link LanguageString text in a particular language}
203         * to the label.
204         * The given language string will be returned.
205         *
206         * @param languageString        the language string representing the content of
207         *                                                      the text data in a particular language
208         * @return                                      the language string
209         * @see                                         #getLabel()
210         * @see                                         #putLabel(String, Language)
211         * @deprecated                          This method will be removed in v4.0
212         *                                                      Use the {@link #putLabel(LanguageString) putLabel} method instead
213         */
214        public LanguageString putText(LanguageString languageString) {
215                return putLabel(languageString);
216        }
217       
218        /**
219         * Removes from label the one {@link LanguageString language string}
220         * with the given {@link Language language}. Returns the removed
221         * language string.
222         *
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
229         */
230        public LanguageString removeText(Language language) {
231                return removeLabel(language);
232        }
233
234        /**
235         * Removes from label the one {@link LanguageString language string}
236         * with the given {@link Language language}. Returns the removed
237         * language string.
238         *
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()
243         */
244        public LanguageString removeLabel(Language language) {
245                return this.label.remove(language);
246        }
247       
248       
249        /**
250         * Returns the number of {@link Language languages} in which the label
251         * of <i>this</i> key statement has been formulated.
252         *
253         * @see #getMultilanguageText()
254         */
255        public int countLanguages(){
256                return label.size();
257        }
258       
259//*********************** CLONE ********************************************************/
260       
261        /**
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.
265         *
266         * @see eu.etaxonomy.cdm.model.common.VersionableEntitity#clone()
267         * @see java.lang.Object#clone()
268         */
269        @Override
270        public Object clone() {
271                KeyStatement result;
272                try {
273                        result = (KeyStatement) super.clone();
274                       
275                        result.label = new HashMap<Language, LanguageString>();
276                       
277                       
278                        for (Entry<Language,LanguageString> entry: this.label.entrySet()){
279                               
280                                result.label.put(entry.getKey(), entry.getValue());
281                        }
282                       
283                        return result;
284                }catch (CloneNotSupportedException e) {
285                        logger.warn("Object does not implement cloneable");
286                        e.printStackTrace();
287                        return null;
288                }
289        }
290
291}
Note: See TracBrowser for help on using the browser.