LazyInitError in Representation.getLanguage and minor changes
[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.LazyInitializationException;
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 private char[] iso639_1 = new char[2];
86 @XmlAttribute(name = "iso639_2")
87 private char[] iso639_2 = new char[3];
88
89 public Language() {
90 super();
91 }
92 public Language(UUID uuid) {
93 super();
94 this.setUuid(uuid);
95 }
96 public Language(char[] iso639_1, char[] iso639_2, String englishLabel, String frenchLabel) throws Exception {
97 super();
98 if(iso639_1.length > 2){
99 logger.warn("iso639_1 too long: "+iso639_1.toString());
100 }
101 if(iso639_2.length > 3){
102 logger.warn("iso639_2 too long: "+iso639_2.toString());
103 }
104 this.iso639_1=iso639_1;
105 this.iso639_2=iso639_2;
106 String textEnglish = englishLabel;
107 String textFrench = englishLabel;
108 String label = String.valueOf(iso639_2);
109 String labelAbbrev = null;
110 this.addRepresentation(new Representation(textEnglish, label, labelAbbrev, Language.ENGLISH()));
111 this.addRepresentation(new Representation(textFrench, label, labelAbbrev, Language.FRENCH()));
112 }
113 public Language(String text, String label, String labelAbbrev, Language lang) {
114 super();
115 this.addRepresentation(new Representation(text,label,labelAbbrev, lang));
116 }
117 public Language(String label, String text, String labelAbbrev) {
118 this(label,text,labelAbbrev, DEFAULT());
119 }
120
121 public static final Language DEFAULT(){
122 return ENGLISH;
123 }
124
125 public static final Language CHINESE(){
126 return CHINESE;
127 }
128
129 public static final Language ENGLISH(){
130 return ENGLISH;
131 }
132
133 public static final Language SPANISH(){
134 return SPANISH;
135 }
136
137 public static final Language HINDI(){
138 return HINDI;
139 }
140
141 public static final Language ARABIC(){
142 return ARABIC;
143 }
144
145 public static final Language RUSSIAN(){
146 return RUSSIAN;
147 }
148
149 public static final Language PORTUGUESE(){
150 return PORTUGUESE;
151 }
152
153 public static final Language JAPANESE(){
154 return JAPANESE;
155 }
156
157 public static final Language GERMAN(){
158 return GERMAN;
159 }
160
161 public static final Language FRENCH(){
162 return FRENCH;
163 }
164
165 public static final Language ITALIAN(){
166 return ITALIAN;
167 }
168
169 public static final Language DUTCH(){
170 return DUTCH;
171 }
172
173 public static final Language POLISH(){
174 return POLISH;
175 }
176
177 public static final Language LATIN(){
178 return LATIN;
179 }
180
181 /**
182 * Get the according iso639-1 alpha-2 language code
183 * http://www.loc.gov/standards/iso639-2/
184 *
185 * @return the iso639 alpha-2 language code or null if not available
186 */
187 //TODO create userDefinedType ?
188 @Column(length=2)
189 public String getIso639_1() {
190
191 return String.valueOf(iso639_1);
192 }
193
194 public void setIso639_1(String iso639_1) {
195 iso639_1 = iso639_1.trim();
196 if(iso639_1.length() > 2){
197 logger.warn("Iso639-1: "+iso639_1+" too long");
198 }
199 this.iso639_1 = iso639_1.toCharArray();
200 }
201
202 /**
203 * Get the according iso639-2 alpha-3 language code
204 * http://www.loc.gov/standards/iso639-2/
205 *
206 * @return the iso639 alpha-3 language code or null if not available
207 */
208 //TODO create userDefinedType ?
209 @Column(length=3)
210 public String getIso639_2() {
211 return String.valueOf(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.toCharArray();
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.length > 2){
236 logger.warn("Iso639-1: "+ newInstance.getIso639_1() +" from "+csvLine.get(3)+" ,"+csvLine.get(2)+" too long");
237 }
238 if(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 try {
267 return this.getLabel();
268 } catch (LazyInitializationException e) {
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 }
290
291
292
293 }