package eu.etaxonomy.cdm.model.common;
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
-import au.com.bytecode.opencsv.CSVWriter;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
-import java.util.*;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
-import javax.persistence.*;
+import org.apache.log4j.Logger;
+import org.hibernate.envers.Audited;
+
+import au.com.bytecode.opencsv.CSVWriter;
/**
* list of languages according to current internet best practices as given by IANA
* @version 1.0
* @created 08-Nov-2007 13:06:31
*/
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "Language")
+@XmlRootElement(name = "Language")
@Entity
-@Component
-public class Language extends DefinedTermBase {
- static Logger logger = Logger.getLogger(Language.class);
+@Audited
+public class Language extends DefinedTermBase<Language> {
+ private static final long serialVersionUID = -5030610079904074217L;
+ private static final Logger logger = Logger.getLogger(Language.class);
private static final UUID uuidChinese = UUID.fromString("a9fc2782-5b2a-466f-b9c3-64d9ca6614c4");
- private static final UUID uuidEnglish = UUID.fromString("e9f8cdb7-6819-44e8-95d3-e2d0690c3523");
+ public static final UUID uuidEnglish = UUID.fromString("e9f8cdb7-6819-44e8-95d3-e2d0690c3523");
private static final UUID uuidSpanish = UUID.fromString("511d8125-f5e6-445d-aee2-6327375238be");
private static final UUID uuidHindi = UUID.fromString("0a1d9d1d-135d-4575-b172-669b51673c39");
private static final UUID uuidArabic = UUID.fromString("4d3ec2eb-536f-4aab-81c5-34e37a3edbba");
private static final UUID uuidItalian = UUID.fromString("fecbf0c7-fea9-465b-8a16-950517c5c0c4");
private static final UUID uuidDutch = UUID.fromString("9965d79a-acf9-4921-a2c0-863b8c16c056");
private static final UUID uuidPolish = UUID.fromString("3fdca387-f1b0-4ec1-808f-1bc3dc482194");
+ private static final UUID uuidLatin = UUID.fromString("160a5b6c-87f5-4422-9bda-78cd404c179e");
+ private static Language ENGLISH;
+ private static Language LATIN;
+ private static Language POLISH;
+ private static Language DUTCH;
+ private static Language ITALIAN;
+ private static Language FRENCH;
+ private static Language GERMAN;
+ private static Language JAPANESE;
+ private static Language PORTUGUESE;
+ private static Language RUSSIAN;
+ private static Language ARABIC;
+ private static Language HINDI;
+ private static Language SPANISH;
+ private static Language CHINESE;
+ public static Language NewInstance(){
+ return new Language();
+ }
+
+ public static Language NewInstance(UUID uuid){
+ return new Language(uuid);
+ }
+ @XmlAttribute(name = "iso639_1")
+ //TODO create userDefinedType ?
+ @Column(length=2)
+ private String iso639_1;
- private char[] iso639_1 = new char[2];
- private char[] iso639_2 = new char[3];
+ @XmlAttribute(name = "iso639_2")
+ //TODO create userDefinedType ?
+ @Column(length=3)
+ private String iso639_2;
-
public Language() {
super();
}
super();
this.setUuid(uuid);
}
- public Language(char[] iso639_1, char[] iso639_2, String englishLabel, String frenchLabel) {
+ public Language(String iso639_1, String iso639_2, String englishLabel, String frenchLabel) throws Exception {
super();
+ if(iso639_1 != null && iso639_1.length() > 2){
+ logger.warn("iso639_1 too long: "+iso639_1.toString());
+ }
+ if(iso639_1 != null && iso639_2.length() > 3){
+ logger.warn("iso639_2 too long: "+iso639_2.toString());
+ }
this.iso639_1=iso639_1;
this.iso639_2=iso639_2;
- this.addRepresentation(new Representation(englishLabel, String.valueOf(iso639_2), Language.ENGLISH()));
- this.addRepresentation(new Representation(frenchLabel, String.valueOf(iso639_2), Language.FRENCH()));
+ String textEnglish = englishLabel;
+ String textFrench = englishLabel;
+ String label = iso639_2;
+ String labelAbbrev = null;
+ this.addRepresentation(new Representation(textEnglish, label, labelAbbrev, Language.ENGLISH()));
+ this.addRepresentation(new Representation(textFrench, label, labelAbbrev, Language.FRENCH()));
}
- public Language(String text, String label, Language lang) {
+ public Language(String text, String label, String labelAbbrev, Language lang) {
super();
- this.addRepresentation(new Representation(text,label,lang));
+ this.addRepresentation(new Representation(text,label,labelAbbrev, lang));
}
- public Language(String label, String text) {
- this(label,text, DEFAULT());
+ public Language(String label, String text, String labelAbbrev) {
+ this(label,text,labelAbbrev, DEFAULT());
}
-
- public static final Language getUUID(UUID uuid){
- return (Language)findByUuid(uuid);
- }
-
public static final Language DEFAULT(){
- return ENGLISH();
+ return ENGLISH;
}
-
public static final Language CHINESE(){
- return getUUID(uuidChinese);
+ return CHINESE;
}
public static final Language ENGLISH(){
- return getUUID(uuidEnglish);
+ return ENGLISH;
}
public static final Language SPANISH(){
- return getUUID(uuidSpanish);
+ return SPANISH;
}
public static final Language HINDI(){
- return getUUID(uuidHindi);
+ return HINDI;
}
public static final Language ARABIC(){
- return getUUID(uuidArabic);
+ return ARABIC;
}
public static final Language RUSSIAN(){
- return getUUID(uuidRussian);
+ return RUSSIAN;
}
public static final Language PORTUGUESE(){
- return getUUID(uuidPortuguese);
+ return PORTUGUESE;
}
public static final Language JAPANESE(){
- return getUUID(uuidJapanese);
+ return JAPANESE;
}
public static final Language GERMAN(){
- return getUUID(uuidGerman);
+ return GERMAN;
}
public static final Language FRENCH(){
- return getUUID(uuidFrench);
+ return FRENCH;
}
public static final Language ITALIAN(){
- return getUUID(uuidItalian);
+ return ITALIAN;
}
public static final Language DUTCH(){
- return getUUID(uuidDutch);
+ return DUTCH;
}
public static final Language POLISH(){
- return getUUID(uuidPolish);
+ return POLISH;
+ }
+
+ public static final Language LATIN(){
+ return LATIN;
+ }
+
+ /**
+ * Get the according iso639-1 alpha-2 language code
+ * http://www.loc.gov/standards/iso639-2/
+ *
+ * @return the iso639 alpha-2 language code or null if not available
+ */
+ public String getIso639_1() {
+ return iso639_1;
+ }
+
+ public void setIso639_1(String iso639_1) {
+ iso639_1 = iso639_1.trim();
+ if(iso639_1.length() > 2){
+ logger.warn("Iso639-1: "+iso639_1+" too long");
+ }
+ this.iso639_1 = iso639_1;
+ }
+
+ /**
+ * Get the according iso639-2 alpha-3 language code
+ * http://www.loc.gov/standards/iso639-2/
+ *
+ * @return the iso639 alpha-3 language code or null if not available
+ */
+ public String getIso639_2() {
+ return iso639_2;
+ }
+
+ public void setIso639_2(String iso639_2) {
+ iso639_2 = iso639_2.trim();
+ if(iso639_2.length() > 3 ){
+ logger.warn("Iso639-2: "+iso639_2+" too long");
+ }
+ this.iso639_2 = iso639_2;
}
- public void readCsvLine(List csvLine) {
- // read UUID, URI, english label+description
- List<String> csvLineString = csvLine;
- super.readCsvLine(csvLine);
- // iso codes extra
- this.iso639_1=csvLineString.get(4).trim().toCharArray();
- this.iso639_2=csvLineString.get(5).trim().toCharArray();
- }
- public void writeCsvLine(CSVWriter writer) {
+ @Override
+ public Language readCsvLine(Class<Language> termClass, List<String> csvLine, Map<UUID,DefinedTermBase> terms) {
+ try {
+ Language newInstance = Language.class.newInstance();
+ if ( UUID.fromString(csvLine.get(0).toString()).equals(Language.uuidEnglish)){
+ DefinedTermBase.readCsvLine(newInstance, csvLine, newInstance);
+ }else{
+ DefinedTermBase.readCsvLine(newInstance,csvLine,(Language)terms.get(Language.uuidEnglish));
+ }
+
+ newInstance.setIso639_1(csvLine.get(5).trim());
+ newInstance.setIso639_2(csvLine.get(4).trim());
+ //TODO could replace with generic validation
+ if(iso639_1 != null && iso639_1.length() > 2){
+ logger.warn("Iso639-1: "+ newInstance.getIso639_1() +" from "+csvLine.get(3)+" ,"+csvLine.get(2)+" too long");
+ }
+ if(iso639_2 != null && iso639_2.length() > 3 ){
+ logger.warn("Iso639-2: "+newInstance.getIso639_2()+" from "+csvLine.get(3)+" ,"+csvLine.get(2)+" too long");
+ }
+
+ return newInstance;
+ } catch (Exception e) {
+ logger.error(e);
+ return null;
+ }
+ }
+
+ @Override
+ public void writeCsvLine(CSVWriter writer, Language language) {
String [] line = new String[6];
- line[0] = getUuid().toString();
- line[1] = getUri();
- line[2] = getLabel(Language.ENGLISH());
- line[3] = getDescription(Language.ENGLISH());
- line[4] = String.valueOf(this.iso639_1);
- line[5] = String.valueOf(this.iso639_2);
+ line[0] = language.getUuid().toString();
+ line[1] = language.getUri();
+ line[2] = language.getLabel(Language.ENGLISH());
+ line[3] = language.getDescription(Language.ENGLISH());
+ line[4] = language.getIso639_1();
+ line[5] = language.getIso639_2();
writer.writeNext(line);
}
+
+ /* (non-Javadoc)
+ * @see eu.etaxonomy.cdm.model.common.TermBase#toString()
+ */
+ @Override
+ public String toString() {
+ if (this.getLabel() != null){
+ return this.getLabel();
+ }else{
+ return super.toString();
+ }
+ }
+
+ @Override
+ protected void setDefaultTerms(TermVocabulary<Language> termVocabulary) {
+ Language.ARABIC = termVocabulary.findTermByUuid(Language.uuidArabic);
+ Language.CHINESE = termVocabulary.findTermByUuid(Language.uuidChinese);
+ Language.DUTCH = termVocabulary.findTermByUuid(Language.uuidDutch);
+ Language.ENGLISH = termVocabulary.findTermByUuid(Language.uuidEnglish);
+ Language.FRENCH = termVocabulary.findTermByUuid(Language.uuidFrench);
+ Language.GERMAN = termVocabulary.findTermByUuid(Language.uuidGerman);
+ Language.HINDI = termVocabulary.findTermByUuid(Language.uuidHindi);
+ Language.ITALIAN = termVocabulary.findTermByUuid(Language.uuidItalian);
+ Language.JAPANESE = termVocabulary.findTermByUuid(Language.uuidJapanese);
+ Language.LATIN = termVocabulary.findTermByUuid(Language.uuidLatin);
+ Language.POLISH = termVocabulary.findTermByUuid(Language.uuidPolish);
+ Language.PORTUGUESE = termVocabulary.findTermByUuid(Language.uuidPortuguese);
+ Language.RUSSIAN = termVocabulary.findTermByUuid(Language.uuidRussian);
+ Language.SPANISH = termVocabulary.findTermByUuid(Language.uuidSpanish);
+ addLanguageForVocabularyRepresentation(termVocabulary);
+ }
+
+ private void addLanguageForVocabularyRepresentation(TermVocabulary<Language> termVocabulary){
+ for (Representation repr : termVocabulary.getRepresentations()){
+ Language lang = repr.getLanguage();
+ if (lang == null){
+ repr.setLanguage(Language.DEFAULT());
+ }
+ }
+ }
+
+
}
\ No newline at end of file