2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
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.
10 package eu
.etaxonomy
.cdm
.model
.common
;
13 import java
.util
.List
;
15 import java
.util
.UUID
;
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
;
25 import org
.apache
.log4j
.Logger
;
26 import org
.hibernate
.envers
.Audited
;
28 import au
.com
.bytecode
.opencsv
.CSVWriter
;
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
36 * @created 08-Nov-2007 13:06:31
38 @XmlAccessorType(XmlAccessType
.FIELD
)
39 @XmlType(name
= "Language")
40 @XmlRootElement(name
= "Language")
43 public class Language
extends DefinedTermBase
<Language
> {
44 private static final long serialVersionUID
= -5030610079904074217L;
45 private static final Logger logger
= Logger
.getLogger(Language
.class);
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
;
76 public static Language
NewInstance(){
77 return new Language();
80 public static Language
NewInstance(UUID uuid
){
81 return new Language(uuid
);
84 @XmlAttribute(name
= "iso639_1")
85 //TODO create userDefinedType ?
87 private String iso639_1
;
89 @XmlAttribute(name
= "iso639_2")
90 //TODO create userDefinedType ?
92 private String iso639_2
;
97 public Language(UUID uuid
) {
101 public Language(String iso639_1
, String iso639_2
, String englishLabel
, String frenchLabel
) throws Exception
{
103 if(iso639_1
!= null && iso639_1
.length() > 2){
104 logger
.warn("iso639_1 too long: "+iso639_1
.toString());
106 if(iso639_1
!= null && iso639_2
.length() > 3){
107 logger
.warn("iso639_2 too long: "+iso639_2
.toString());
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()));
118 public Language(String text
, String label
, String labelAbbrev
, Language lang
) {
120 this.addRepresentation(new Representation(text
,label
,labelAbbrev
, lang
));
122 public Language(String label
, String text
, String labelAbbrev
) {
123 this(label
,text
,labelAbbrev
, DEFAULT());
126 public static final Language
DEFAULT(){
130 public static final Language
CHINESE(){
134 public static final Language
ENGLISH(){
138 public static final Language
SPANISH(){
142 public static final Language
HINDI(){
146 public static final Language
ARABIC(){
150 public static final Language
RUSSIAN(){
154 public static final Language
PORTUGUESE(){
158 public static final Language
JAPANESE(){
162 public static final Language
GERMAN(){
166 public static final Language
FRENCH(){
170 public static final Language
ITALIAN(){
174 public static final Language
DUTCH(){
178 public static final Language
POLISH(){
182 public static final Language
LATIN(){
187 * Get the according iso639-1 alpha-2 language code
188 * http://www.loc.gov/standards/iso639-2/
190 * @return the iso639 alpha-2 language code or null if not available
192 public String
getIso639_1() {
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");
201 this.iso639_1
= iso639_1
;
205 * Get the according iso639-2 alpha-3 language code
206 * http://www.loc.gov/standards/iso639-2/
208 * @return the iso639 alpha-3 language code or null if not available
210 public String
getIso639_2() {
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");
219 this.iso639_2
= iso639_2
;
223 public Language
readCsvLine(Class
<Language
> termClass
, List
<String
> csvLine
, Map
<UUID
,DefinedTermBase
> terms
) {
225 Language newInstance
= Language
.class.newInstance();
226 if ( UUID
.fromString(csvLine
.get(0).toString()).equals(Language
.uuidEnglish
)){
227 DefinedTermBase
.readCsvLine(newInstance
, csvLine
, newInstance
);
229 DefinedTermBase
.readCsvLine(newInstance
,csvLine
,(Language
)terms
.get(Language
.uuidEnglish
));
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");
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");
243 } catch (Exception e
) {
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
);
262 * @see eu.etaxonomy.cdm.model.common.TermBase#toString()
265 public String
toString() {
266 if (this.getLabel() != null){
267 return this.getLabel();
269 return super.toString();
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
);
292 private void addLanguageForVocabularyRepresentation(TermVocabulary
<Language
> termVocabulary
){
293 for (Representation repr
: termVocabulary
.getRepresentations()){
294 Language lang
= repr
.getLanguage();
296 repr
.setLanguage(Language
.DEFAULT());
301 public int compareTo(Object o
) {