Project

General

Profile

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

    
6
import java.util.Arrays;
7
import java.util.HashMap;
8
import java.util.List;
9
import java.util.Map;
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.logging.log4j.LogManager;import org.apache.logging.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.VersionableEntity;
33
import eu.etaxonomy.cdm.model.term.TermBase;
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

    
52
    private static final long serialVersionUID = 3771323100914695139L;
53
	private static final Logger logger = LogManager.getLogger(KeyStatement.class);
54

    
55

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

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

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

    
90
//*************************** CONSTRUCTOR ***********************************/
91

    
92
	public KeyStatement() {
93
	}
94

    
95
// ********************************* METHODS ***************************/
96

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

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

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

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

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

    
157
    /**
158
     * @see #getPreferredLanguageString(List)
159
     */
160
    public LanguageString getPreferredLanguageString(Language language) {
161
        return MultilanguageTextHelper.getPreferredLanguageString(label, Arrays.asList(language));
162
    }
163

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

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

    
216

    
217
	/**
218
	 * Returns the number of {@link Language languages} in which the label
219
	 * of <i>this</i> key statement has been formulated.
220
	 *
221
	 * @see	#getMultilanguageText()
222
	 */
223
	public int countLanguages(){
224
		return label.size();
225
	}
226

    
227
//*********************** CLONE ********************************************************/
228

    
229
	/**
230
	 * Clones <i>this</i> KeyStatement. This is a shortcut that enables to create
231
	 * a new instance that differs only slightly from <i>this</i> KeyStatement by
232
	 * modifying only some of the attributes.
233
	 *
234
	 * @see eu.etaxonomy.cdm.model.common.VersionableEntitity#clone()
235
	 * @see java.lang.Object#clone()
236
	 */
237
	@Override
238
	public KeyStatement clone() {
239

    
240
	    KeyStatement result;
241
		try {
242
			result = (KeyStatement) super.clone();
243

    
244
			result.label = cloneLanguageString(this.label);
245

    
246
			return result;
247
		}catch (CloneNotSupportedException e) {
248
			logger.warn("Object does not implement cloneable");
249
			e.printStackTrace();
250
			return null;
251
		}
252
	}
253

    
254
//********************* toString() *************************************/
255

    
256
	@Override
257
	public String toString(){
258
		if (label != null && ! label.isEmpty()){
259
			String result = label.values().iterator().next().getText();
260
			return result;
261
		}else{
262
			return super.toString();
263
		}
264
	}
265
}
(17-17/38)