bug fix for add/remove TaxonNameDescription in TaxonNameBase
[cdmlib.git] / cdmlib-model / src / main / java / eu / etaxonomy / cdm / model / common / Language.java
index d73a0c543c636c3f4df7558dea42fb53cc48232e..fc6d8abe88cf513754f7a0fed6135a35658a3138 100644 (file)
 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.*;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
 
-import javax.persistence.*;
+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.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
 
+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
  * or ISO codes.  http://www.ietf.org/rfc/rfc4646.txt 
@@ -34,10 +38,12 @@ import javax.xml.bind.annotation.XmlType;
  */
 @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");
        public static final UUID uuidEnglish = UUID.fromString("e9f8cdb7-6819-44e8-95d3-e2d0690c3523");
@@ -52,6 +58,21 @@ public class Language extends DefinedTermBase {
        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();
@@ -62,9 +83,14 @@ public class Language extends DefinedTermBase {
        }
        
        @XmlAttribute(name = "iso639_1")
-       private char[] iso639_1 = new char[2];
+       //TODO create userDefinedType ?
+       @Column(length=2)
+       private String iso639_1;
+       
        @XmlAttribute(name = "iso639_2")
-       private char[] iso639_2 = new char[3];
+       //TODO create userDefinedType ?
+       @Column(length=3)
+       private String iso639_2;
        
        public Language() {
                super();
@@ -73,19 +99,19 @@ public class Language extends DefinedTermBase {
                super();
                this.setUuid(uuid);
        }
-       public Language(char[] iso639_1, char[] iso639_2, String englishLabel, String frenchLabel) throws Exception {
+       public Language(String iso639_1, String iso639_2, String englishLabel, String frenchLabel) throws Exception {
                super();
-               if(iso639_1.length > 2){
+               if(iso639_1 != null && iso639_1.length() > 2){
                        logger.warn("iso639_1 too long: "+iso639_1.toString());
                }
-               if(iso639_2.length > 3){
+               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;
                String textEnglish = englishLabel;
                String textFrench = englishLabel;
-               String label = String.valueOf(iso639_2);
+               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()));
@@ -97,67 +123,65 @@ public class Language extends DefinedTermBase {
        public Language(String label, String text, String labelAbbrev) {
                this(label,text,labelAbbrev, DEFAULT());
        }
-
-       public static final Language getByUuid(UUID uuid){
-               return (Language)findByUuid(uuid);
-       }
-
        
        public static final Language DEFAULT(){
-               return ENGLISH();
+               return ENGLISH;
        }
-       
 
        public static final Language CHINESE(){
-               return getByUuid(uuidChinese);
+               return CHINESE;
        }
 
        public static final Language ENGLISH(){
-               return getByUuid(uuidEnglish);
+               return ENGLISH;
        }
 
        public static final Language SPANISH(){
-               return getByUuid(uuidSpanish);
+               return SPANISH;
        }
 
        public static final Language HINDI(){
-               return getByUuid(uuidHindi);
+               return HINDI;
        }
 
        public static final Language ARABIC(){
-               return getByUuid(uuidArabic);
+               return ARABIC;
        }
 
        public static final Language RUSSIAN(){
-               return getByUuid(uuidRussian);
+               return RUSSIAN;
        }
 
        public static final Language PORTUGUESE(){
-               return getByUuid(uuidPortuguese);
+               return PORTUGUESE;
        }
 
        public static final Language JAPANESE(){
-               return getByUuid(uuidJapanese);
+               return JAPANESE;
        }
 
        public static final Language GERMAN(){
-               return getByUuid(uuidGerman);
+               return GERMAN;
        }
        
        public static final Language FRENCH(){
-               return getByUuid(uuidFrench);
+               return FRENCH;
        }
 
        public static final Language ITALIAN(){
-               return getByUuid(uuidItalian);
+               return ITALIAN;
        }
 
        public static final Language DUTCH(){
-               return getByUuid(uuidDutch);
+               return DUTCH;
        }
 
        public static final Language POLISH(){
-               return getByUuid(uuidPolish);
+               return POLISH;
+       }
+       
+       public static final Language LATIN(){
+               return LATIN;
        }
        
        /**
@@ -166,11 +190,8 @@ public class Language extends DefinedTermBase {
         * 
         * @return the iso639 alpha-2 language code or null if not available
         */
-       //TODO create userDefinedType ?
-       @Column(length=2)
        public String getIso639_1() {
-               
-               return String.valueOf(iso639_1);
+               return iso639_1;
        }
 
        public void setIso639_1(String iso639_1) {
@@ -178,7 +199,7 @@ public class Language extends DefinedTermBase {
                if(iso639_1.length() > 2){
                        logger.warn("Iso639-1: "+iso639_1+" too long");
                }
-               this.iso639_1 = iso639_1.toCharArray();
+               this.iso639_1 = iso639_1;
        }
 
        /**
@@ -187,10 +208,8 @@ public class Language extends DefinedTermBase {
         * 
         * @return the iso639 alpha-3 language code or null if not available
         */
-       //TODO create userDefinedType ?
-       @Column(length=3)
        public String getIso639_2() {
-               return String.valueOf(iso639_2);
+               return iso639_2;
        }
 
        public void setIso639_2(String iso639_2) {
@@ -198,41 +217,45 @@ public class Language extends DefinedTermBase {
                if(iso639_2.length() > 3 ){
                        logger.warn("Iso639-2: "+iso639_2+" too long");
                }
-               this.iso639_2 = iso639_2.toCharArray();
+               this.iso639_2 = iso639_2;
        }
  
        @Override 
-       public ILoadableTerm readCsvLine(List csvLine) {
-               ILoadableTerm result;
-               if ( UUID.fromString(csvLine.get(0).toString()).equals(DEFAULT().getUuid()) && this != DEFAULT() ){
-                       result = DEFAULT();
-                       result.readCsvLine(csvLine);
-               }else{
-                       // read UUID, URI, english label+description
-                       List<String> csvLineString = csvLine;
-                       result = this;
-                       super.readCsvLine(csvLine);
-                       // iso codes extra
-                       this.iso639_1=csvLineString.get(5).trim().toCharArray();
-                       this.iso639_2=csvLineString.get(4).trim().toCharArray();
-                       if(iso639_1.length > 2){
-                               logger.warn("Iso639-1: "+iso639_1.toString()+" from "+csvLine.get(3)+" ,"+csvLine.get(2)+" too long");
-                       }
-                       if(iso639_2.length > 3 ){
-                               logger.warn("Iso639-2: "+iso639_2.toString()+" from "+csvLine.get(3)+" ,"+csvLine.get(2)+" too long");
-                       }
-               }
-               return result;
+       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;
+               } 
        }
        
-       public void writeCsvLine(CSVWriter writer) {
+       @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);
        }
 
@@ -247,6 +270,34 @@ public class Language extends DefinedTermBase {
                        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());
+                       }
+               }
+       }