merge trunk to cdm-3.3 branch
[cdmlib.git] / cdmlib-io / src / main / java / eu / etaxonomy / cdm / io / berlinModel / BerlinModelTransformer.java
index 1a13dd28e84fc97aa1ed8369a27ff061c4a53908..d82a6205dfab29f0e395c00fb6b021a709b0fd68 100644 (file)
@@ -16,6 +16,7 @@ import java.util.UUID;
 import org.apache.log4j.Logger;\r
 \r
 import eu.etaxonomy.cdm.common.ResultWrapper;\r
+import eu.etaxonomy.cdm.io.common.mapping.UndefinedTransformerMethodException;\r
 import eu.etaxonomy.cdm.model.common.Language;\r
 import eu.etaxonomy.cdm.model.common.OrderedTermVocabulary;\r
 import eu.etaxonomy.cdm.model.common.RelationshipBase;\r
@@ -30,6 +31,7 @@ import eu.etaxonomy.cdm.model.name.NameRelationshipType;
 import eu.etaxonomy.cdm.model.name.NomenclaturalStatus;\r
 import eu.etaxonomy.cdm.model.name.NomenclaturalStatusType;\r
 import eu.etaxonomy.cdm.model.name.Rank;\r
+import eu.etaxonomy.cdm.model.name.RankClass;\r
 import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignationStatus;\r
 import eu.etaxonomy.cdm.model.reference.ISectionBase;\r
 import eu.etaxonomy.cdm.model.reference.Reference;\r
@@ -46,13 +48,80 @@ import eu.etaxonomy.cdm.strategy.exceptions.UnknownCdmTypeException;
  * @created 20.03.2008\r
  * @version 1.0\r
  */\r
-public final class BerlinModelTransformer {\r
+public class BerlinModelTransformer {\r
        private static final Logger logger = Logger.getLogger(BerlinModelTransformer.class);\r
        \r
+       //ranks\r
+       public static UUID uuidRankCollSpecies = UUID.fromString("e14630ee-9446-4bb4-a7b7-4c3881bc5d94");\r
+       public static UUID uuidRankProles = UUID.fromString("8810d1ba-6a34-4ae3-a355-919ccd1cd1a5");\r
+       public static UUID uuidRankRace = UUID.fromString("196dee39-cfd8-4460-8bf0-88b83da27f62");\r
+       public static UUID uuidRankSublusus = UUID.fromString("1fafa596-a8e7-4e62-a378-3cc8cb3627ca");\r
+       \r
        //named areas\r
        public static UUID euroMedUuid = UUID.fromString("9fe09988-58c0-4c06-8474-f660a0c50014");\r
-\r
        \r
+       public static UUID uuidEasternEuropeanRussia = UUID.fromString("3f013375-0e0a-40c3-8a14-84c0535fab40");\r
+       public static UUID uuidSerbiaMontenegro = UUID.fromString("8926dbe6-863e-47a9-98a0-7dc9ed2c57f7");\r
+       public static UUID uuidSerbia = UUID.fromString("4ffed197-3d7e-4cd9-8984-e64b8dee9512");\r
+       public static UUID uuidLebanonSyria = UUID.fromString("0c45f250-99da-4b19-aa89-c3e56cfdf103");\r
+       public static UUID uuidUssr = UUID.fromString("a512e00a-45f3-4be5-82fa-bba8d675696f");\r
+       public static UUID uuidSicilyMalta = UUID.fromString("424d81ee-d272-4ae8-9600-0a334049cd72");\r
+       \r
+       public static UUID uuidDesertas = UUID.fromString("36f5e93e-34e8-45b5-a401-f0e0faad21cf");\r
+       public static UUID uuidMadeira = UUID.fromString("086e27ee-78ff-4236-aca9-9850850cd355");\r
+       public static UUID uuidPortoSanto = UUID.fromString("1f9ab6a0-a402-4dfe-8c5b-b1844eb4d8e5");\r
+       //azores\r
+       public static UUID uuidFlores = UUID.fromString("ef0067c2-8bbb-4e37-8462-97b03f51ba43");\r
+       public static UUID uuidCorvo = UUID.fromString("b1e6117c-2be1-43a3-9233-227dd90bdee9");\r
+       public static UUID uuidFaial = UUID.fromString("14f6dcdb-6524-4700-b80c-66424952ef2b");\r
+       public static UUID uuidGraciosa = UUID.fromString("05f93a7b-d813-4833-864f-eedbba747133");\r
+       public static UUID uuidSaoJorge = UUID.fromString("578e0ecd-b5e3-4c87-8ecc-0fc4c7e217d9");\r
+       public static UUID uuidSaoMiguel = UUID.fromString("0e2f6ad8-7afb-4f01-b134-4f71991e877a");\r
+       public static UUID uuidPico = UUID.fromString("98cc566f-4110-43d5-830f-68436a009f49");\r
+       public static UUID uuidSantaMaria = UUID.fromString("bd5e5d4a-22b7-41aa-8e58-1d1d73a9954d");\r
+       public static UUID uuidTerceira = UUID.fromString("6fc257c0-a131-41f0-b6c3-51ef9c4fa962");\r
+       //Canyry islands\r
+       public static UUID uuidGranCanaria = UUID.fromString("a0240c35-0e05-4157-8321-67ba8e31fdb9");\r
+       public static UUID uuidFuerteventura = UUID.fromString("549ce2c1-6d49-4bf3-b75d-cf3f4b5a1398");\r
+       public static UUID uuidGomera = UUID.fromString("895fab09-7478-4210-b42a-423d23c6f85e");\r
+       public static UUID uuidHierro = UUID.fromString("d137b6a5-31bc-418c-9403-f042017dc04b");\r
+       public static UUID uuidLanzaroteWithGraciosa = UUID.fromString("c9b08dc1-f301-4d9d-b447-b8744602c776");\r
+       public static UUID uuidLaPalma = UUID.fromString("fdb3f2b2-f154-4f04-9f31-240a47a0e780");\r
+       public static UUID uuidTenerife = UUID.fromString("73658c7e-a568-465e-bd84-4554fc93ca56");\r
+       //Baleares\r
+       public static UUID uuidIbizaWithFormentera = UUID.fromString("1cda2a33-3469-49d5-8e77-cb5451110519");\r
+       public static UUID uuidMallorca = UUID.fromString("a10cba04-b4b5-4a4b-b69a-fcd4b3916fec");\r
+       public static UUID uuidMenorca = UUID.fromString("9f6ede48-27f8-4270-bf4e-c97eaa86aab7");\r
+       \r
+       //russia\r
+       public static UUID uuidRussiaNorthern = UUID.fromString("c23bc1c9-a775-4426-b883-07d4d7d47eed");\r
+       public static UUID uuidRussiaBaltic = UUID.fromString("579dad44-9439-4b19-8716-ab90d8f27944");\r
+       public static UUID uuidRussiaCentral = UUID.fromString("8bbc8c6a-2ef2-4024-ad51-66fe34c70092");\r
+       public static UUID uuidRussiaSouthWest = UUID.fromString("daa5c207-5567-4690-8742-5e4d153b6a64");\r
+       public static UUID uuidRussiaSouthEast = UUID.fromString("e8516598-b529-489e-9ee8-63bbbd295c1b");\r
+       public static UUID uuidEastAegeanIslands = UUID.fromString("1c429593-c493-46e6-971a-0d70be690da8");\r
+       public static UUID uuidTurkishEastAegeanIslands = UUID.fromString("ba35dba3-ac70-41ae-81c2-2070943f44f2");\r
+       public static UUID uuidBalticStates = UUID.fromString("bf9d64f6-3183-4fa5-8e90-73090e7a2282");\r
+       public static final UUID uuidTurkey = UUID.fromString("d344ee2c-14c8-438d-b03d-11538edb1268");\r
+       public static final UUID uuidCaucasia = UUID.fromString("ebfd3fd1-3859-4e5e-95c7-f66010599d7e");\r
+       \r
+       //language areas\r
+       public static final UUID uuidUkraineAndCrimea = UUID.fromString("99d4d1c2-09f6-416e-86a3-bdde5cae52af");\r
+       public static final UUID uuidAzerbaijanNakhichevan = UUID.fromString("232fbef0-9f4a-4cab-8ac1-e14c717e9de6");\r
+       \r
+       //Marker Types\r
+       public static final UUID uuidMisappliedCommonName = UUID.fromString("25f5cfc3-16ab-4aba-a008-0db0f2cf7f9d");\r
+       \r
+       //Extension Types\r
+       public static final UUID uuidSpeciesExpertName = UUID.fromString("2e8153d2-7412-49e4-87e1-5c38f4c5153a");\r
+       public static final UUID uuidExpertName = UUID.fromString("24becb79-a90c-47d3-be35-efc87bb48fd3");\r
+       \r
+       public static final UUID DETAIL_EXT_UUID = UUID.fromString("c3959b4f-d876-4b7a-a739-9260f4cafd1c");\r
+       public static final UUID ID_IN_SOURCE_EXT_UUID = UUID.fromString("23dac094-e793-40a4-bad9-649fc4fcfd44");\r
+       \r
+       //languages\r
+       public static final UUID uuidLangMajorcan = UUID.fromString("82d696d7-cb4e-49de-ac89-63a0e12ca766");\r
+\r
        //REFERENCES\r
        public static int REF_ARTICLE = 1;\r
        public static int REF_PART_OF_OTHER_TITLE = 2;\r
@@ -109,6 +178,7 @@ public final class BerlinModelTransformer {
        public static int NAME_REL_IS_REJECTED_IN_FAVOUR_OF = 14;\r
        public static int NAME_REL_IS_TREATED_AS_LATER_HOMONYM_OF = 15;\r
        public static int NAME_REL_IS_ORTHOGRAPHIC_VARIANT_OF = 16;\r
+       public static int NAME_REL_IS_ALTERNATIVE_NAME_FOR = 17;\r
        public static int NAME_REL_HAS_SAME_TYPE_AS = 18;\r
        public static int NAME_REL_IS_LECTOTYPE_OF = 61;\r
        public static int NAME_REL_TYPE_NOT_DESIGNATED = 62;\r
@@ -154,10 +224,28 @@ public final class BerlinModelTransformer {
        public static int FACT_OBSERVATION = 9;\r
        public static int FACT_DISTRIBUTION_EM = 10;\r
        public static int FACT_DISTRIBUTION_WORLD = 11;\r
+       //E+M\r
+       public static final UUID uuidFeatureMaps = UUID.fromString("8367730e-f3c3-4361-8360-a2057e4295ed");\r
+       public static final UUID uuidFeatureConservationStatus = UUID.fromString("a32f33cd-1966-4a22-986c-94c5e688bbd1");\r
+       public static final UUID uuidFeatureUse = UUID.fromString("199bbbd8-2db6-4335-b454-2e92ae02b699");\r
+       public static final UUID uuidFeatureComments = UUID.fromString("31cc2b92-5cad-44e9-b50f-b8af591a527c");\r
+       public static final UUID uuidFeatureDistrEM = UUID.fromString("a5ba7e7f-ca7f-4f50-afc7-73e76b3231d4");\r
+       public static final UUID uuidFeatureDistrWorld = UUID.fromString("e4e24080-7017-47e6-924e-d2560fa68fb8");\r
+       public static final UUID uuidFeatureEditorBrackets = UUID.fromString("b3b5bc1a-7ba8-4a39-9c0d-63ba599eb5d8");\r
+       public static final UUID uuidFeatureEditorParenthesis = UUID.fromString("6ee10a2e-ff02-4cf4-a520-89630edc5b44");\r
+       public static final UUID uuidFeatureInedited = UUID.fromString("c93e2968-bc52-4165-9755-ce37611faf01");\r
+       public static final UUID uuidFeatureCommentsEditing = UUID.fromString("7a155021-158a-48bb-81d0-9a72b718e2de");\r
        \r
-       public static UUID uuidRelNameCombIned = UUID.fromString("dde8a2e7-bf9e-42ec-b186-d5bde9c9c128");\r
+       \r
+       \r
+       public static UUID uuidNomStatusCombIned = UUID.fromString("dde8a2e7-bf9e-42ec-b186-d5bde9c9c128");\r
+       public static UUID uuidNomStatusSpNovIned = UUID.fromString("1a359ca1-9364-43bc-93e4-834bdcd52b72");\r
+       public static UUID uuidNomStatusNomOrthCons = UUID.fromString("0f838183-ffa0-4014-928e-0e3a27eb3918");\r
        \r
        static NomenclaturalStatusType nomStatusCombIned;\r
+       static NomenclaturalStatusType nomStatusSpNovIned;\r
+       static NomenclaturalStatusType nomStatusNomOrthCons;\r
+       \r
        public static NomenclaturalStatusType nomStatusTypeAbbrev2NewNomStatusType(String nomStatus){\r
                NomenclaturalStatusType result = null;\r
                if (nomStatus == null){\r
@@ -167,10 +255,28 @@ public final class BerlinModelTransformer {
                                nomStatusCombIned = new NomenclaturalStatusType();\r
                                Representation representation = Representation.NewInstance("comb. ined.", "comb. ined.", "comb. ined.", Language.LATIN());\r
                                nomStatusCombIned.addRepresentation(representation);\r
-                               nomStatusCombIned.setUuid(uuidRelNameCombIned);\r
+                               nomStatusCombIned.setUuid(uuidNomStatusCombIned);\r
                                NomenclaturalStatusType.ALTERNATIVE().getVocabulary().addTerm(nomStatusCombIned);\r
                        }\r
                        result = nomStatusCombIned;\r
+               }else if (nomStatus.equalsIgnoreCase("sp. nov. ined.")){\r
+                       if (nomStatusSpNovIned == null){\r
+                               nomStatusSpNovIned = new NomenclaturalStatusType();\r
+                               Representation representation = Representation.NewInstance("sp. nov. ined.", "sp. nov. ined.", "sp. nov. ined.", Language.LATIN());\r
+                               nomStatusSpNovIned.addRepresentation(representation);\r
+                               nomStatusSpNovIned.setUuid(uuidNomStatusSpNovIned);\r
+                               NomenclaturalStatusType.ALTERNATIVE().getVocabulary().addTerm(nomStatusSpNovIned);\r
+                       }\r
+                       result = nomStatusSpNovIned;\r
+               }else if (nomStatus.equalsIgnoreCase("nom. & orth. cons.")){\r
+                       if (nomStatusNomOrthCons == null){\r
+                               nomStatusNomOrthCons = new NomenclaturalStatusType();\r
+                               Representation representation = Representation.NewInstance("nom. & orth. cons.", "nom. & orth. cons.", "nom. & orth. cons.", Language.LATIN());\r
+                               nomStatusNomOrthCons.addRepresentation(representation);\r
+                               nomStatusNomOrthCons.setUuid(uuidNomStatusNomOrthCons);\r
+                               NomenclaturalStatusType.ALTERNATIVE().getVocabulary().addTerm(nomStatusNomOrthCons);\r
+                       }\r
+                       result = nomStatusNomOrthCons;\r
                }\r
                return result;\r
        }\r
@@ -270,9 +376,12 @@ public final class BerlinModelTransformer {
                        case 23: return TaxonRelationshipType.CONGRUENT_OR_INCLUDES_OR_OVERLAPS();\r
                        case 24: return TaxonRelationshipType.INCLUDED_OR_INCLUDES_OR_OVERLAPS();\r
                        \r
-                       case 26: return TaxonRelationshipType.OVERLAPS();\r
+                       case 26: return TaxonRelationshipType.EXCLUDES();\r
+                       \r
                        //TODO other relationshipTypes\r
                        \r
+                       case 40: return TaxonRelationshipType.NOT_CONGRUENT_TO();\r
+                       \r
                        //FIXME doubtful\r
                        case 43: return TaxonRelationshipType.CONGRUENT_TO();\r
                        default: {\r
@@ -303,7 +412,7 @@ public final class BerlinModelTransformer {
                        case 120: return PresenceTerm.CULTIVATED();\r
                        case 210: return AbsenceTerm.INTRODUCED_REPORTED_IN_ERROR();\r
                        case 220: return PresenceTerm.INTRODUCED_PRESENCE_QUESTIONABLE();\r
-                       case 230: return PresenceTerm.INTRODUCED_FORMERLY_INTRODUCED();\r
+                       case 230: return AbsenceTerm.INTRODUCED_FORMERLY_INTRODUCED();\r
                        case 240: return PresenceTerm.INTRODUCED_DOUBTFULLY_INTRODUCED();\r
                        case 250: return PresenceTerm.INTRODUCED();\r
                        case 260: return PresenceTerm.INTRODUCED_UNCERTAIN_DEGREE_OF_NATURALISATION();\r
@@ -311,7 +420,7 @@ public final class BerlinModelTransformer {
                        case 280: return PresenceTerm.INTRODUCED_NATURALIZED();\r
                        case 310: return AbsenceTerm.NATIVE_REPORTED_IN_ERROR();\r
                        case 320: return PresenceTerm.NATIVE_PRESENCE_QUESTIONABLE();\r
-                       case 330: return PresenceTerm.NATIVE_FORMERLY_NATIVE();\r
+                       case 330: return AbsenceTerm.NATIVE_FORMERLY_NATIVE();\r
                        case 340: return PresenceTerm.NATIVE_DOUBTFULLY_NATIVE();\r
                        case 350: return PresenceTerm.NATIVE();\r
                        case 999: {\r
@@ -342,22 +451,40 @@ public final class BerlinModelTransformer {
                }\r
        }\r
        \r
+       public static UUID getFeatureUuid(String key) throws UndefinedTransformerMethodException {\r
+               if (key == null){\r
+                       return null;\r
+               }else if (key.equalsIgnoreCase("14-Maps")){ return uuidFeatureMaps;\r
+               }else if (key.equalsIgnoreCase("301-Conservation Status")){ return uuidFeatureConservationStatus;\r
+               }else if (key.equalsIgnoreCase("302-Use")){ return uuidFeatureUse;\r
+               }else if (key.equalsIgnoreCase("303-Comments")){ return uuidFeatureComments;\r
+               \r
+               }else if (key.equalsIgnoreCase("10-general distribution (Euro+Med)")){ return uuidFeatureDistrEM;\r
+               }else if (key.equalsIgnoreCase("11-general distribution (world)")){ return uuidFeatureDistrWorld;\r
+               }else if (key.equalsIgnoreCase("250-Editor_Brackets")){ return uuidFeatureEditorBrackets;\r
+               }else if (key.equalsIgnoreCase("251-Editor_Parenthesis")){ return uuidFeatureEditorParenthesis;\r
+               }else if (key.equalsIgnoreCase("252-Inedited")){ return uuidFeatureInedited;\r
+               }else if (key.equalsIgnoreCase("253-Comments on editing process")){ return uuidFeatureCommentsEditing;\r
+               \r
+               }else{\r
+                       return null;\r
+               }\r
+       }\r
+       \r
        \r
-       public static UUID uuidRankCollSpecies = UUID.fromString("e14630ee-9446-4bb4-a7b7-4c3881bc5d94");\r
        static Rank collSpeciesRank;\r
        /**\r
         * @param i\r
         * @return\r
         */\r
-       private static Rank rankId2NewRank(Integer rankId) {\r
+       private static Rank rankId2NewRank(Integer rankId, boolean switchRank) {\r
                Rank result = null;\r
                if (rankId == null){\r
                        return null;\r
                }else if (rankId == 57){\r
+                       \r
                        if (collSpeciesRank == null){\r
-                               collSpeciesRank = new Rank();\r
-                               Representation representation = Representation.NewInstance("Collective species", "Coll. species", "coll.", Language.ENGLISH());\r
-                               collSpeciesRank.addRepresentation(representation);\r
+                               collSpeciesRank = Rank.NewInstance(RankClass.SpeciesGroup, "Collective species", "Coll. species", "coll.");\r
                                collSpeciesRank.setUuid(uuidRankCollSpecies);\r
                                OrderedTermVocabulary<Rank> voc = (OrderedTermVocabulary<Rank>)Rank.SPECIES().getVocabulary();\r
                                voc.addTermBelow(collSpeciesRank, Rank.SPECIESGROUP());\r
@@ -366,8 +493,9 @@ public final class BerlinModelTransformer {
                }\r
                return result;\r
        }\r
+\r
        \r
-       public static Rank rankId2Rank (ResultSet rs, boolean useUnknown) throws UnknownCdmTypeException{\r
+       public static Rank rankId2Rank (ResultSet rs, boolean useUnknown, boolean switchSpeciesGroup) throws UnknownCdmTypeException{\r
                Rank result;\r
                try {\r
                        int rankId = rs.getInt("rankFk");\r
@@ -378,6 +506,13 @@ public final class BerlinModelTransformer {
                        if (logger.isDebugEnabled()){logger.debug(abbrev);}\r
                        if (logger.isDebugEnabled()){logger.debug(rankName);}\r
                        \r
+                       if (switchSpeciesGroup){\r
+                               if (rankId == 59){\r
+                                       rankId = 57;\r
+                               }else if (rankId == 57){\r
+                                       rankId = 59;\r
+                               }\r
+                       }\r
                        try {\r
                                result = Rank.getRankByNameOrAbbreviation(abbrev);\r
                        } catch (UnknownCdmTypeException e) {\r
@@ -412,6 +547,8 @@ public final class BerlinModelTransformer {
                                                case 60: return Rank.SPECIES();\r
                                                case 61: return Rank.GREX();\r
                                                case 65: return Rank.SUBSPECIES();\r
+                                               case 66: {System.out.println("Rank 66 not yet implemented"); throw new UnknownCdmTypeException("Unknown Rank id" + Integer.valueOf(rankId).toString());}\r
+                                               case 67: {System.out.println("Rank 67 not yet implemented"); throw new UnknownCdmTypeException("Unknown Rank id" + Integer.valueOf(rankId).toString());}\r
                                                case 68: return Rank.CONVAR();\r
                                                case 70: return Rank.VARIETY();\r
                                                case 73: return Rank.SUBVARIETY();\r
@@ -428,7 +565,7 @@ public final class BerlinModelTransformer {
                                                case 830: return Rank.SUPERFAMILY();\r
                                                \r
                                                default: {\r
-                                                       Rank rank = rankId2NewRank(57);\r
+                                                       Rank rank = rankId2NewRank(57, switchSpeciesGroup);\r
                                                        if (rank != null){\r
                                                                return rank;\r
                                                        }\r
@@ -448,7 +585,8 @@ public final class BerlinModelTransformer {
                        return Rank.UNKNOWN_RANK();\r
                }               \r
        }\r
-       \r
+\r
+\r
        public static Integer rank2RankId (Rank rank){\r
                if (rank == null){\r
                        return null;\r
@@ -682,5 +820,22 @@ public final class BerlinModelTransformer {
                        \r
        }\r
        \r
+       public static UUID getWebMarkerUuid (int markerCategoryId){\r
+               if (markerCategoryId == 1){\r
+                       return UUID.fromString("d8554418-d1ae-471d-a1bd-a0cbc7ab860c");  //any as not to find in cichorieae\r
+               }else if (markerCategoryId == 2){\r
+                       return UUID.fromString("7f189c48-8632-4870-9ec8-e4d2489f324e");\r
+               }else if (markerCategoryId == 3){\r
+                       return UUID.fromString("9a115e6b-8210-4dd3-825a-6fed11016c63");\r
+               }else if (markerCategoryId == 4){\r
+                       return UUID.fromString("1d287011-2054-41c5-a919-17ac1d0a9270");\r
+               }else if (markerCategoryId == 9){\r
+                       return UUID.fromString("cc5eca5c-1ae5-4feb-9a95-507fc167b0c9");\r
+               }else{\r
+                       logger.warn("Unknown webMarker category: " + markerCategoryId);\r
+                       return null;\r
+               }\r
+               \r
+       }\r
        \r
 }\r