Project

General

Profile

Download (10.2 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
 *
3
 */
4
package eu.etaxonomy.cdm.model.description;
5

    
6
import java.util.HashMap;
7
import java.util.List;
8
import java.util.Map;
9

    
10
import javax.persistence.Entity;
11
import javax.persistence.FetchType;
12
import javax.persistence.MapKeyJoinColumn;
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;
20

    
21
import org.apache.log4j.Logger;
22
import org.hibernate.annotations.Cascade;
23
import org.hibernate.annotations.CascadeType;
24
import org.hibernate.envers.Audited;
25

    
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.VersionableEntity;
32
import eu.etaxonomy.cdm.model.term.TermBase;
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
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);
52

    
53

    
54
	@XmlElement(name = "MultiLanguageText")
55
    @XmlJavaTypeAdapter(MultilanguageTextAdapter.class)
56
    @OneToMany (fetch= FetchType.LAZY, orphanRemoval=true)
57
	@MapKeyJoinColumn(name="label_mapkey_id")
58
    @Cascade({CascadeType.SAVE_UPDATE,CascadeType.MERGE, CascadeType.DELETE })
59
//    @IndexedEmbedded
60
    private Map<Language, LanguageString> label = new HashMap<Language, LanguageString>();
61

    
62
	//private mediaObjects needs to be discussed (how to implement the role of the media)
63

    
64

    
65

    
66
	public static KeyStatement NewInstance(){
67
		KeyStatement result = new KeyStatement();
68
		return result;
69
	}
70

    
71

    
72
	public static KeyStatement NewInstance(String defaultLanguageLabel){
73
		KeyStatement result = new KeyStatement();
74
		result.putLabel(Language.DEFAULT(), defaultLanguageLabel);
75
		return result;
76
	}
77

    
78
	/**
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.
82
	 * @return
83
	 */
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);
88
		return result;
89
	}
90

    
91
	/**
92
	 *
93
	 */
94
	public KeyStatement() {
95
	}
96

    
97
// ********************************* METHODS ***************************/
98

    
99
	/**
100
	 * Returns the label with the content of <i>this</i> key statement.
101
	 * The different {@link LanguageString language strings} (texts) contained in the
102
	 * label should all have the same meaning.
103
	 *
104
	 * @see	#getText(Language)
105
	 */
106
    public Map<Language, LanguageString> getLabel() {
107
		return label;
108
	}
109

    
110
    /**
111
     * Returns the label with the content of <i>this</i> key statement for
112
     * a specific language.
113
     *
114
     * @param language the language in which the label is formulated
115
     * @return
116
     */
117
    public LanguageString getLabel(Language language){
118
    	return label.get(language);
119
    }
120

    
121
    public void setLabel(Map<Language,LanguageString> label) {
122
    	this.label = label;
123
    }
124

    
125
	/**
126
	 * Returns the text string in the given {@link Language language} with the content
127
	 * of <i>this</i> key statement.
128
	 *
129
	 * @param language	the language in which the label is formulated
130
	 * @see				#getLabel(Language)
131
	 */
132
	public String getLabelText(Language language) {
133
		LanguageString languageString = label.get(language);
134
		if (languageString == null){
135
			return null;
136
		}else{
137
			return languageString.getText();
138
		}
139
	}
140

    
141
    /**
142
	 * Returns the LanguageString in the preferred language. Preferred languages
143
	 * are specified by the parameter languages, which receives a list of
144
	 * Language instances in the order of preference. If no representation in
145
	 * any preferred languages is found the method falls back to return the
146
	 * Representation in Language.DEFAULT() and if necessary further falls back
147
	 * to return the first element found if any.
148
	 *
149
	 * TODO think about this fall-back strategy &
150
	 * see also {@link TermBase#getPreferredRepresentation(List)}
151
	 *
152
	 * @param languages
153
	 * @return
154
	 */
155
	public LanguageString getPreferredLanguageString(List<Language> languages) {
156
		return MultilanguageTextHelper.getPreferredLanguageString(label, languages);
157
	}
158

    
159
	/**
160
	 * Creates a {@link LanguageString language string} based on the given text string
161
	 * and the given {@link Language language}, returns it and adds it to the multilanguage
162
	 * text representing the content of <i>this</i> text data.
163
	 *
164
	 * @param text		the string representing the content of the text data
165
	 * 					in a particular language
166
	 * @param language	the language in which the text string is formulated
167
	 * @return			the language string
168
	 * @see    	   		#getMultilanguageText()
169
	 * @see    	   		#putText(LanguageString)
170
	 * @deprecated 		should follow the put semantic of maps, this method will be removed in v4.0
171
	 * 					Use the {@link #putLabel(Language, String) putLabel} method
172
	 */
173
	@Deprecated
174
    public LanguageString putLabel(String label, Language language) {
175
		return putLabel(language, label);
176
	}
177

    
178
	/**
179
	 * Creates a {@link LanguageString language string} based on the given text string
180
	 * and the given {@link Language language}, returns it and adds it to the multilanguage
181
	 * text representing the content of <i>this</i> text data.
182
	 *
183
	 * @param language	the language in which the text string is formulated
184
	 * @param text		the string representing the content of the text data
185
	 * 					in a particular language
186
	 *
187
	 * @return			the language string
188
	 * @see    	   		#getLabel()
189
	 * @see    	   		#putLabel(LanguageString)
190
	 *
191
	 */
192
	public LanguageString putLabel(Language language, String label) {
193
		LanguageString result = this.label.put(language , LanguageString.NewInstance(label, language));
194
		return (result == null ? null : result);
195
	}
196
	/**
197
	 * Adds a translated {@link LanguageString text in a particular language}
198
	 * to the label.
199
	 * The given language string will be returned.
200
	 *
201
	 * @param languageString	the language string representing the content of
202
	 * 							the text data in a particular language
203
	 * @return					the language string
204
	 * @see    	   				#getLabel()
205
	 * @see    	   				#putLabel(String, Language)
206
	 */
207
	public LanguageString putLabel(LanguageString languageString) {
208
		if (languageString == null){
209
			return null;
210
		}else{
211
			Language language = languageString.getLanguage();
212
			return this.label.put(language, languageString);
213
		}
214
	}
215

    
216
	/**
217
	 * Adds a translated {@link LanguageString text in a particular language}
218
	 * to the label.
219
	 * The given language string will be returned.
220
	 *
221
	 * @param languageString	the language string representing the content of
222
	 * 							the text data in a particular language
223
	 * @return					the language string
224
	 * @see    	   				#getLabel()
225
	 * @see    	   				#putLabel(String, Language)
226
	 * @deprecated				This method will be removed in v4.0
227
	 * 							Use the {@link #putLabel(LanguageString) putLabel} method instead
228
	 */
229
	@Deprecated
230
    public LanguageString putText(LanguageString languageString) {
231
		return putLabel(languageString);
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
	 * @deprecated		This method will be removed in v4.0
244
	 * 					Use the {@link #removeLabel(Language)} method instead
245
	 */
246
	@Deprecated
247
    public LanguageString removeText(Language language) {
248
		return removeLabel(language);
249
	}
250

    
251
	/**
252
	 * Removes from label the one {@link LanguageString language string}
253
	 * with the given {@link Language language}. Returns the removed
254
	 * language string.
255
	 *
256
	 * @param  language	the language in which the language string to be removed
257
	 * 					has been formulated
258
	 * @return			the language string associated with the given language
259
	 * @see     		#getLabelText()
260
	 */
261
	public LanguageString removeLabel(Language language) {
262
		return this.label.remove(language);
263
	}
264

    
265

    
266
	/**
267
	 * Returns the number of {@link Language languages} in which the label
268
	 * of <i>this</i> key statement has been formulated.
269
	 *
270
	 * @see	#getMultilanguageText()
271
	 */
272
	public int countLanguages(){
273
		return label.size();
274
	}
275

    
276
//*********************** CLONE ********************************************************/
277

    
278
	/**
279
	 * Clones <i>this</i> KeyStatement. This is a shortcut that enables to create
280
	 * a new instance that differs only slightly from <i>this</i> KeyStatement by
281
	 * modifying only some of the attributes.
282
	 *
283
	 * @see eu.etaxonomy.cdm.model.common.VersionableEntitity#clone()
284
	 * @see java.lang.Object#clone()
285
	 */
286
	@Override
287
	public Object clone() {
288
		KeyStatement result;
289
		try {
290
			result = (KeyStatement) super.clone();
291

    
292
			result.label = cloneLanguageString(this.label);
293

    
294
			return result;
295
		}catch (CloneNotSupportedException e) {
296
			logger.warn("Object does not implement cloneable");
297
			e.printStackTrace();
298
			return null;
299
		}
300
	}
301

    
302
//********************* toString() *************************************/
303

    
304
	@Override
305
	public String toString(){
306
		if (label != null && ! label.isEmpty()){
307
			String result = label.values().iterator().next().getText();
308
			return result;
309
		}else{
310
			return super.toString();
311
		}
312

    
313
	}
314

    
315
}
(17-17/37)