Project

General

Profile

Download (8.17 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<>();
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
//*************************** CONSTRUCTOR ***********************************/
92

    
93
	public KeyStatement() {
94
	}
95

    
96
// ********************************* METHODS ***************************/
97

    
98
	/**
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.
102
	 *
103
	 * @see	#getText(Language)
104
	 */
105
    public Map<Language, LanguageString> getLabel() {
106
		return label;
107
	}
108

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

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

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

    
140
    /**
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.
147
	 *
148
	 * TODO think about this fall-back strategy &
149
	 * see also {@link TermBase#getPreferredRepresentation(List)}
150
	 *
151
	 * @param languages
152
	 * @return
153
	 */
154
	public LanguageString getPreferredLanguageString(List<Language> languages) {
155
		return MultilanguageTextHelper.getPreferredLanguageString(label, languages);
156
	}
157

    
158
	/**
159
	 * Creates a {@link LanguageString language string} based on the given text string
160
	 * and the given {@link Language language}, returns it and adds it to the multilanguage
161
	 * text representing the content of <i>this</i> text data.
162
	 *
163
	 * @param language	the language in which the text string is formulated
164
	 * @param text		the string representing the content of the text data
165
	 * 					in a particular language
166
	 *
167
	 * @return			the language string
168
	 * @see    	   		#getLabel()
169
	 * @see    	   		#putLabel(LanguageString)
170
	 *
171
	 */
172
	public LanguageString putLabel(Language language, String label) {
173
		LanguageString result = this.label.put(language , LanguageString.NewInstance(label, language));
174
		return (result == null ? null : result);
175
	}
176
	/**
177
	 * Adds a translated {@link LanguageString text in a particular language}
178
	 * to the label.
179
	 * The given language string will be returned.
180
	 *
181
	 * @param languageString	the language string representing the content of
182
	 * 							the text data in a particular language
183
	 * @return					the language string
184
	 * @see    	   				#getLabel()
185
	 * @see    	   				#putLabel(String, Language)
186
	 */
187
	public LanguageString putLabel(LanguageString languageString) {
188
		if (languageString == null){
189
			return null;
190
		}else{
191
			Language language = languageString.getLanguage();
192
			return this.label.put(language, languageString);
193
		}
194
	}
195

    
196
	/**
197
	 * Removes from label the one {@link LanguageString language string}
198
	 * with the given {@link Language language}. Returns the removed
199
	 * language string.
200
	 *
201
	 * @param  language	the language in which the language string to be removed
202
	 * 					has been formulated
203
	 * @return			the language string associated with the given language
204
	 * @see     		#getLabelText()
205
	 */
206
	public LanguageString removeLabel(Language language) {
207
		return this.label.remove(language);
208
	}
209

    
210

    
211
	/**
212
	 * Returns the number of {@link Language languages} in which the label
213
	 * of <i>this</i> key statement has been formulated.
214
	 *
215
	 * @see	#getMultilanguageText()
216
	 */
217
	public int countLanguages(){
218
		return label.size();
219
	}
220

    
221
//*********************** CLONE ********************************************************/
222

    
223
	/**
224
	 * Clones <i>this</i> KeyStatement. This is a shortcut that enables to create
225
	 * a new instance that differs only slightly from <i>this</i> KeyStatement by
226
	 * modifying only some of the attributes.
227
	 *
228
	 * @see eu.etaxonomy.cdm.model.common.VersionableEntitity#clone()
229
	 * @see java.lang.Object#clone()
230
	 */
231
	@Override
232
	public Object clone() {
233
		KeyStatement result;
234
		try {
235
			result = (KeyStatement) super.clone();
236

    
237
			result.label = cloneLanguageString(this.label);
238

    
239
			return result;
240
		}catch (CloneNotSupportedException e) {
241
			logger.warn("Object does not implement cloneable");
242
			e.printStackTrace();
243
			return null;
244
		}
245
	}
246

    
247
//********************* toString() *************************************/
248

    
249
	@Override
250
	public String toString(){
251
		if (label != null && ! label.isEmpty()){
252
			String result = label.values().iterator().next().getText();
253
			return result;
254
		}else{
255
			return super.toString();
256
		}
257

    
258
	}
259

    
260
}
(17-17/37)