CHANGES TO THE CDMLIB-MODEL: Media and DefinedTermBase become IdentifiableEntity...
[cdmlib.git] / cdmlib-model / src / main / java / eu / etaxonomy / cdm / model / common / Language.java
1 /**
2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
8 */
9
10 package eu.etaxonomy.cdm.model.common;
11
12
13 import java.util.List;
14 import java.util.Map;
15 import java.util.UUID;
16
17 import javax.persistence.Column;
18 import javax.persistence.Entity;
19 import javax.xml.bind.annotation.XmlAccessType;
20 import javax.xml.bind.annotation.XmlAccessorType;
21 import javax.xml.bind.annotation.XmlAttribute;
22 import javax.xml.bind.annotation.XmlRootElement;
23 import javax.xml.bind.annotation.XmlType;
24
25 import org.apache.log4j.Logger;
26 import org.hibernate.envers.Audited;
27
28 import au.com.bytecode.opencsv.CSVWriter;
29
30 /**
31 * list of languages according to current internet best practices as given by IANA
32 * or ISO codes. http://www.ietf.org/rfc/rfc4646.txt
33 * http://www.loc.gov/standards/iso639-2/php/English_list.php
34 * @author m.doering
35 * @version 1.0
36 * @created 08-Nov-2007 13:06:31
37 */
38 @XmlAccessorType(XmlAccessType.FIELD)
39 @XmlType(name = "Language")
40 @XmlRootElement(name = "Language")
41 @Entity
42 @Audited
43 public class Language extends DefinedTermBase<Language> {
44 private static final long serialVersionUID = -5030610079904074217L;
45 private static final Logger logger = Logger.getLogger(Language.class);
46
47 private static final UUID uuidChinese = UUID.fromString("a9fc2782-5b2a-466f-b9c3-64d9ca6614c4");
48 public static final UUID uuidEnglish = UUID.fromString("e9f8cdb7-6819-44e8-95d3-e2d0690c3523");
49 private static final UUID uuidSpanish = UUID.fromString("511d8125-f5e6-445d-aee2-6327375238be");
50 private static final UUID uuidHindi = UUID.fromString("0a1d9d1d-135d-4575-b172-669b51673c39");
51 private static final UUID uuidArabic = UUID.fromString("4d3ec2eb-536f-4aab-81c5-34e37a3edbba");
52 private static final UUID uuidRussian = UUID.fromString("64ea9354-cbf8-40de-9f6e-387d24896f50");
53 private static final UUID uuidPortuguese = UUID.fromString("c2c08339-2405-4d7d-bd25-cbe01fb7ce09");
54 private static final UUID uuidJapanese = UUID.fromString("6778c7fb-c195-4dc1-ae3f-164201314e51");
55 private static final UUID uuidGerman = UUID.fromString("d1131746-e58b-4e80-a865-f5182c9c3073");
56 private static final UUID uuidFrench = UUID.fromString("7759a1d8-a5ea-454a-8c93-1dcfaae8cc21");
57 private static final UUID uuidItalian = UUID.fromString("fecbf0c7-fea9-465b-8a16-950517c5c0c4");
58 private static final UUID uuidDutch = UUID.fromString("9965d79a-acf9-4921-a2c0-863b8c16c056");
59 private static final UUID uuidPolish = UUID.fromString("3fdca387-f1b0-4ec1-808f-1bc3dc482194");
60 private static final UUID uuidLatin = UUID.fromString("160a5b6c-87f5-4422-9bda-78cd404c179e");
61 private static Language ENGLISH;
62 private static Language LATIN;
63 private static Language POLISH;
64 private static Language DUTCH;
65 private static Language ITALIAN;
66 private static Language FRENCH;
67 private static Language GERMAN;
68 private static Language JAPANESE;
69 private static Language PORTUGUESE;
70 private static Language RUSSIAN;
71 private static Language ARABIC;
72 private static Language HINDI;
73 private static Language SPANISH;
74 private static Language CHINESE;
75
76 public static Language NewInstance(){
77 return new Language();
78 }
79
80 public static Language NewInstance(UUID uuid){
81 return new Language(uuid);
82 }
83
84 @XmlAttribute(name = "iso639_1")
85 //TODO create userDefinedType ?
86 @Column(length=2)
87 private String iso639_1;
88
89 @XmlAttribute(name = "iso639_2")
90 //TODO create userDefinedType ?
91 @Column(length=3)
92 private String iso639_2;
93
94 public Language() {
95 super();
96 }
97 public Language(UUID uuid) {
98 super();
99 this.setUuid(uuid);
100 }
101 public Language(String iso639_1, String iso639_2, String englishLabel, String frenchLabel) throws Exception {
102 super();
103 if(iso639_1 != null && iso639_1.length() > 2){
104 logger.warn("iso639_1 too long: "+iso639_1.toString());
105 }
106 if(iso639_1 != null && iso639_2.length() > 3){
107 logger.warn("iso639_2 too long: "+iso639_2.toString());
108 }
109 this.iso639_1=iso639_1;
110 this.iso639_2=iso639_2;
111 String textEnglish = englishLabel;
112 String textFrench = englishLabel;
113 String label = iso639_2;
114 String labelAbbrev = null;
115 this.addRepresentation(new Representation(textEnglish, label, labelAbbrev, Language.ENGLISH()));
116 this.addRepresentation(new Representation(textFrench, label, labelAbbrev, Language.FRENCH()));
117 }
118 public Language(String text, String label, String labelAbbrev, Language lang) {
119 super();
120 this.addRepresentation(new Representation(text,label,labelAbbrev, lang));
121 }
122 public Language(String label, String text, String labelAbbrev) {
123 this(label,text,labelAbbrev, DEFAULT());
124 }
125
126 public static final Language DEFAULT(){
127 return ENGLISH;
128 }
129
130 public static final Language CHINESE(){
131 return CHINESE;
132 }
133
134 public static final Language ENGLISH(){
135 return ENGLISH;
136 }
137
138 public static final Language SPANISH(){
139 return SPANISH;
140 }
141
142 public static final Language HINDI(){
143 return HINDI;
144 }
145
146 public static final Language ARABIC(){
147 return ARABIC;
148 }
149
150 public static final Language RUSSIAN(){
151 return RUSSIAN;
152 }
153
154 public static final Language PORTUGUESE(){
155 return PORTUGUESE;
156 }
157
158 public static final Language JAPANESE(){
159 return JAPANESE;
160 }
161
162 public static final Language GERMAN(){
163 return GERMAN;
164 }
165
166 public static final Language FRENCH(){
167 return FRENCH;
168 }
169
170 public static final Language ITALIAN(){
171 return ITALIAN;
172 }
173
174 public static final Language DUTCH(){
175 return DUTCH;
176 }
177
178 public static final Language POLISH(){
179 return POLISH;
180 }
181
182 public static final Language LATIN(){
183 return LATIN;
184 }
185
186 /**
187 * Get the according iso639-1 alpha-2 language code
188 * http://www.loc.gov/standards/iso639-2/
189 *
190 * @return the iso639 alpha-2 language code or null if not available
191 */
192 public String getIso639_1() {
193 return iso639_1;
194 }
195
196 public void setIso639_1(String iso639_1) {
197 iso639_1 = iso639_1.trim();
198 if(iso639_1.length() > 2){
199 logger.warn("Iso639-1: "+iso639_1+" too long");
200 }
201 this.iso639_1 = iso639_1;
202 }
203
204 /**
205 * Get the according iso639-2 alpha-3 language code
206 * http://www.loc.gov/standards/iso639-2/
207 *
208 * @return the iso639 alpha-3 language code or null if not available
209 */
210 public String getIso639_2() {
211 return iso639_2;
212 }
213
214 public void setIso639_2(String iso639_2) {
215 iso639_2 = iso639_2.trim();
216 if(iso639_2.length() > 3 ){
217 logger.warn("Iso639-2: "+iso639_2+" too long");
218 }
219 this.iso639_2 = iso639_2;
220 }
221
222 @Override
223 public Language readCsvLine(Class<Language> termClass, List<String> csvLine, Map<UUID,DefinedTermBase> terms) {
224 try {
225 Language newInstance = Language.class.newInstance();
226 if ( UUID.fromString(csvLine.get(0).toString()).equals(Language.uuidEnglish)){
227 DefinedTermBase.readCsvLine(newInstance, csvLine, newInstance);
228 }else{
229 DefinedTermBase.readCsvLine(newInstance,csvLine,(Language)terms.get(Language.uuidEnglish));
230 }
231
232 newInstance.setIso639_1(csvLine.get(5).trim());
233 newInstance.setIso639_2(csvLine.get(4).trim());
234 //TODO could replace with generic validation
235 if(iso639_1 != null && iso639_1.length() > 2){
236 logger.warn("Iso639-1: "+ newInstance.getIso639_1() +" from "+csvLine.get(3)+" ,"+csvLine.get(2)+" too long");
237 }
238 if(iso639_2 != null && iso639_2.length() > 3 ){
239 logger.warn("Iso639-2: "+newInstance.getIso639_2()+" from "+csvLine.get(3)+" ,"+csvLine.get(2)+" too long");
240 }
241
242 return newInstance;
243 } catch (Exception e) {
244 logger.error(e);
245 return null;
246 }
247 }
248
249 @Override
250 public void writeCsvLine(CSVWriter writer, Language language) {
251 String [] line = new String[6];
252 line[0] = language.getUuid().toString();
253 line[1] = language.getUri();
254 line[2] = language.getLabel(Language.ENGLISH());
255 line[3] = language.getDescription(Language.ENGLISH());
256 line[4] = language.getIso639_1();
257 line[5] = language.getIso639_2();
258 writer.writeNext(line);
259 }
260
261 /* (non-Javadoc)
262 * @see eu.etaxonomy.cdm.model.common.TermBase#toString()
263 */
264 @Override
265 public String toString() {
266 if (this.getLabel() != null){
267 return this.getLabel();
268 }else{
269 return super.toString();
270 }
271 }
272
273 @Override
274 protected void setDefaultTerms(TermVocabulary<Language> termVocabulary) {
275 Language.ARABIC = termVocabulary.findTermByUuid(Language.uuidArabic);
276 Language.CHINESE = termVocabulary.findTermByUuid(Language.uuidChinese);
277 Language.DUTCH = termVocabulary.findTermByUuid(Language.uuidDutch);
278 Language.ENGLISH = termVocabulary.findTermByUuid(Language.uuidEnglish);
279 Language.FRENCH = termVocabulary.findTermByUuid(Language.uuidFrench);
280 Language.GERMAN = termVocabulary.findTermByUuid(Language.uuidGerman);
281 Language.HINDI = termVocabulary.findTermByUuid(Language.uuidHindi);
282 Language.ITALIAN = termVocabulary.findTermByUuid(Language.uuidItalian);
283 Language.JAPANESE = termVocabulary.findTermByUuid(Language.uuidJapanese);
284 Language.LATIN = termVocabulary.findTermByUuid(Language.uuidLatin);
285 Language.POLISH = termVocabulary.findTermByUuid(Language.uuidPolish);
286 Language.PORTUGUESE = termVocabulary.findTermByUuid(Language.uuidPortuguese);
287 Language.RUSSIAN = termVocabulary.findTermByUuid(Language.uuidRussian);
288 Language.SPANISH = termVocabulary.findTermByUuid(Language.uuidSpanish);
289 addLanguageForVocabularyRepresentation(termVocabulary);
290 }
291
292 private void addLanguageForVocabularyRepresentation(TermVocabulary<Language> termVocabulary){
293 for (Representation repr : termVocabulary.getRepresentations()){
294 Language lang = repr.getLanguage();
295 if (lang == null){
296 repr.setLanguage(Language.DEFAULT());
297 }
298 }
299 }
300
301 public int compareTo(Object o) {
302 return 0;
303 }
304
305 }