#445: Added missing term vocabularies
[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 }
96 public Language(UUID uuid) {
97 this.setUuid(uuid);
98 }
99 public Language(String iso639_1, String iso639_2, String englishLabel, String frenchLabel) throws Exception {
100 super();
101 if(iso639_1 != null && iso639_1.length() > 2){
102 logger.warn("iso639_1 too long: "+iso639_1.toString());
103 }
104 if(iso639_1 != null && iso639_2.length() > 3){
105 logger.warn("iso639_2 too long: "+iso639_2.toString());
106 }
107 this.iso639_1=iso639_1;
108 this.iso639_2=iso639_2;
109 String textEnglish = englishLabel;
110 String textFrench = englishLabel;
111 String label = iso639_2;
112 String labelAbbrev = null;
113 this.addRepresentation(new Representation(textEnglish, label, labelAbbrev, Language.ENGLISH()));
114 this.addRepresentation(new Representation(textFrench, label, labelAbbrev, Language.FRENCH()));
115 }
116 public Language(String text, String label, String labelAbbrev, Language lang) {
117 this.addRepresentation(new Representation(text,label,labelAbbrev, lang));
118 }
119 public Language(String label, String text, String labelAbbrev) {
120 this(label,text,labelAbbrev, DEFAULT());
121 }
122
123 public static final Language DEFAULT(){
124 return ENGLISH;
125 }
126
127 public static final Language CHINESE(){
128 return CHINESE;
129 }
130
131 public static final Language ENGLISH(){
132 return ENGLISH;
133 }
134
135 public static final Language SPANISH(){
136 return SPANISH;
137 }
138
139 public static final Language HINDI(){
140 return HINDI;
141 }
142
143 public static final Language ARABIC(){
144 return ARABIC;
145 }
146
147 public static final Language RUSSIAN(){
148 return RUSSIAN;
149 }
150
151 public static final Language PORTUGUESE(){
152 return PORTUGUESE;
153 }
154
155 public static final Language JAPANESE(){
156 return JAPANESE;
157 }
158
159 public static final Language GERMAN(){
160 return GERMAN;
161 }
162
163 public static final Language FRENCH(){
164 return FRENCH;
165 }
166
167 public static final Language ITALIAN(){
168 return ITALIAN;
169 }
170
171 public static final Language DUTCH(){
172 return DUTCH;
173 }
174
175 public static final Language POLISH(){
176 return POLISH;
177 }
178
179 public static final Language LATIN(){
180 return LATIN;
181 }
182
183 /**
184 * Get the according iso639-1 alpha-2 language code
185 * http://www.loc.gov/standards/iso639-2/
186 *
187 * @return the iso639 alpha-2 language code or null if not available
188 */
189 public String getIso639_1() {
190 return iso639_1;
191 }
192
193 public void setIso639_1(String iso639_1) {
194 iso639_1 = iso639_1.trim();
195 if(iso639_1.length() > 2){
196 logger.warn("Iso639-1: "+iso639_1+" too long");
197 }
198 this.iso639_1 = iso639_1;
199 }
200
201 /**
202 * Get the according iso639-2 alpha-3 language code
203 * http://www.loc.gov/standards/iso639-2/
204 *
205 * @return the iso639 alpha-3 language code or null if not available
206 */
207 public String getIso639_2() {
208 return iso639_2;
209 }
210
211 public void setIso639_2(String iso639_2) {
212 iso639_2 = iso639_2.trim();
213 if(iso639_2.length() > 3 ){
214 logger.warn("Iso639-2: "+iso639_2+" too long");
215 }
216 this.iso639_2 = iso639_2;
217 }
218
219 @Override
220 public Language readCsvLine(Class<Language> termClass, List<String> csvLine, Map<UUID,DefinedTermBase> terms) {
221 try {
222 Language newInstance = Language.class.newInstance();
223 if ( UUID.fromString(csvLine.get(0).toString()).equals(Language.uuidEnglish)){
224 DefinedTermBase.readCsvLine(newInstance, csvLine, newInstance);
225 }else{
226 DefinedTermBase.readCsvLine(newInstance,csvLine,(Language)terms.get(Language.uuidEnglish));
227 }
228
229 newInstance.setIso639_1(csvLine.get(5).trim());
230 newInstance.setIso639_2(csvLine.get(4).trim());
231 //TODO could replace with generic validation
232 if(iso639_1 != null && iso639_1.length() > 2){
233 logger.warn("Iso639-1: "+ newInstance.getIso639_1() +" from "+csvLine.get(3)+" ,"+csvLine.get(2)+" too long");
234 }
235 if(iso639_2 != null && iso639_2.length() > 3 ){
236 logger.warn("Iso639-2: "+newInstance.getIso639_2()+" from "+csvLine.get(3)+" ,"+csvLine.get(2)+" too long");
237 }
238
239 return newInstance;
240 } catch (Exception e) {
241 logger.error(e);
242 return null;
243 }
244 }
245
246 @Override
247 public void writeCsvLine(CSVWriter writer, Language language) {
248 String [] line = new String[6];
249 line[0] = language.getUuid().toString();
250 line[1] = language.getUri();
251 line[2] = language.getLabel(Language.ENGLISH());
252 line[3] = language.getDescription(Language.ENGLISH());
253 line[4] = language.getIso639_1();
254 line[5] = language.getIso639_2();
255 writer.writeNext(line);
256 }
257
258 /* (non-Javadoc)
259 * @see eu.etaxonomy.cdm.model.common.TermBase#toString()
260 */
261 @Override
262 public String toString() {
263 if (this.getLabel() != null){
264 return this.getLabel();
265 }else{
266 return super.toString();
267 }
268 }
269
270 @Override
271 protected void setDefaultTerms(TermVocabulary<Language> termVocabulary) {
272 Language.ARABIC = termVocabulary.findTermByUuid(Language.uuidArabic);
273 Language.CHINESE = termVocabulary.findTermByUuid(Language.uuidChinese);
274 Language.DUTCH = termVocabulary.findTermByUuid(Language.uuidDutch);
275 Language.ENGLISH = termVocabulary.findTermByUuid(Language.uuidEnglish);
276 Language.FRENCH = termVocabulary.findTermByUuid(Language.uuidFrench);
277 Language.GERMAN = termVocabulary.findTermByUuid(Language.uuidGerman);
278 Language.HINDI = termVocabulary.findTermByUuid(Language.uuidHindi);
279 Language.ITALIAN = termVocabulary.findTermByUuid(Language.uuidItalian);
280 Language.JAPANESE = termVocabulary.findTermByUuid(Language.uuidJapanese);
281 Language.LATIN = termVocabulary.findTermByUuid(Language.uuidLatin);
282 Language.POLISH = termVocabulary.findTermByUuid(Language.uuidPolish);
283 Language.PORTUGUESE = termVocabulary.findTermByUuid(Language.uuidPortuguese);
284 Language.RUSSIAN = termVocabulary.findTermByUuid(Language.uuidRussian);
285 Language.SPANISH = termVocabulary.findTermByUuid(Language.uuidSpanish);
286 addLanguageForVocabularyRepresentation(termVocabulary);
287 }
288
289 private void addLanguageForVocabularyRepresentation(TermVocabulary<Language> termVocabulary){
290 for (Representation repr : termVocabulary.getRepresentations()){
291 Language lang = repr.getLanguage();
292 if (lang == null){
293 repr.setLanguage(Language.DEFAULT());
294 }
295 }
296 }
297
298 }