Project

General

Profile

Download (10.4 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
import java.util.Map.Entry;
10

    
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;
21

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

    
27
import eu.etaxonomy.cdm.jaxb.MultilanguageTextAdapter;
28
import eu.etaxonomy.cdm.model.common.IMultiLanguageTextHolder;
29
import eu.etaxonomy.cdm.model.common.Language;
30
import eu.etaxonomy.cdm.model.common.LanguageString;
31
import eu.etaxonomy.cdm.model.common.MultilanguageTextHelper;
32
import eu.etaxonomy.cdm.model.common.TermBase;
33
import eu.etaxonomy.cdm.model.common.VersionableEntity;
34

    
35
/**
36
 * This class represents a statement or a question within a (polytomous) key.
37
 * Compare with SDD SimpleRepresentation.
38
 *
39
 * @author a.mueller
40
 *
41
 */
42
@XmlAccessorType(XmlAccessType.FIELD)
43
@XmlType(name = "KeyStatement", propOrder = {
44
    "label"
45
//    ,"mediaObject"
46
})
47
@XmlRootElement(name = "KeyStatement")
48
@Entity
49
@Audited
50
public class KeyStatement extends VersionableEntity implements IMultiLanguageTextHolder{
51
	private static final long serialVersionUID = 3771323100914695139L;
52
	private static final Logger logger = Logger.getLogger(KeyStatement.class);
53

    
54

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

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

    
65

    
66

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

    
72

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

    
79
	/**
80
	 * Factory method for a key statement.
81
	 * @param language the language of the first representation of the statement. Must not be <code>null</code>.
82
	 * @param label the text of statement in the given language.
83
	 * @return
84
	 */
85
	public static KeyStatement NewInstance(Language language, String label){
86
		assert language != null : "Language for KeyStatement must not be null";
87
		KeyStatement result = new KeyStatement();
88
		result.putLabel(language, label);
89
		return result;
90
	}
91

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

    
98
// ********************************* METHODS ***************************/
99

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

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

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

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

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

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

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

    
217
	/**
218
	 * Adds a translated {@link LanguageString text in a particular language}
219
	 * to the label.
220
	 * The given language string will be returned.
221
	 *
222
	 * @param languageString	the language string representing the content of
223
	 * 							the text data in a particular language
224
	 * @return					the language string
225
	 * @see    	   				#getLabel()
226
	 * @see    	   				#putLabel(String, Language)
227
	 * @deprecated				This method will be removed in v4.0
228
	 * 							Use the {@link #putLabel(LanguageString) putLabel} method instead
229
	 */
230
	@Deprecated
231
    public LanguageString putText(LanguageString languageString) {
232
		return putLabel(languageString);
233
	}
234

    
235
	/**
236
	 * Removes from label the one {@link LanguageString language string}
237
	 * with the given {@link Language language}. Returns the removed
238
	 * language string.
239
	 *
240
	 * @param  language	the language in which the language string to be removed
241
	 * 					has been formulated
242
	 * @return			the language string associated with the given language
243
	 * @see     		#getLabelText()
244
	 * @deprecated		This method will be removed in v4.0
245
	 * 					Use the {@link #removeLabel(Language)} method instead
246
	 */
247
	@Deprecated
248
    public LanguageString removeText(Language language) {
249
		return removeLabel(language);
250
	}
251

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

    
266

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

    
277
//*********************** CLONE ********************************************************/
278

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

    
293
			result.label = new HashMap<Language, LanguageString>();
294

    
295

    
296
			for (Entry<Language,LanguageString> entry: this.label.entrySet()){
297

    
298
				result.label.put(entry.getKey(), entry.getValue());
299
			}
300

    
301
			return result;
302
		}catch (CloneNotSupportedException e) {
303
			logger.warn("Object does not implement cloneable");
304
			e.printStackTrace();
305
			return null;
306
		}
307
	}
308

    
309
//********************* toString() *************************************/
310

    
311
	@Override
312
	public String toString(){
313
		if (label != null && ! label.isEmpty()){
314
			String result = label.values().iterator().next().getText();
315
			return result;
316
		}else{
317
			return super.toString();
318
		}
319

    
320
	}
321

    
322
}
(15-15/36)