Fauna Europaea Import - Initial version
authora.babadshanjan <a.babadshanjan@localhost>
Mon, 18 May 2009 15:11:52 +0000 (15:11 +0000)
committera.babadshanjan <a.babadshanjan@localhost>
Mon, 18 May 2009 15:11:52 +0000 (15:11 +0000)
.gitattributes
cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/faunaEuropaea/FaunaEuropaeaAuthorImport.java [new file with mode: 0644]
cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/faunaEuropaea/FaunaEuropaeaDistributionImport.java [new file with mode: 0644]
cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/faunaEuropaea/FaunaEuropaeaImportBase.java [new file with mode: 0644]
cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/faunaEuropaea/FaunaEuropaeaImportConfigurator.java [new file with mode: 0644]
cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/faunaEuropaea/FaunaEuropaeaImporter.java [new file with mode: 0644]
cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/faunaEuropaea/FaunaEuropaeaTaxonImport.java [new file with mode: 0644]
cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/faunaEuropaea/FaunaEuropaeaTransformer.java [new file with mode: 0644]

index 738f342f8c8fde1855a63bc9ac841e2819952a9a..59e07520454e241d7b67e7b835b88787dd99c2af 100644 (file)
@@ -726,6 +726,13 @@ cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/excel/taxa/NormalExplicitImport.java
 cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/excel/taxa/NormalExplicitImportConfigurator.java -text
 cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/excel/taxa/NormalExplicitRow.java -text
 cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/excel/taxa/TaxonExcelImporterBase.java -text
+cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/faunaEuropaea/FaunaEuropaeaAuthorImport.java -text
+cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/faunaEuropaea/FaunaEuropaeaDistributionImport.java -text
+cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/faunaEuropaea/FaunaEuropaeaImportBase.java -text
+cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/faunaEuropaea/FaunaEuropaeaImportConfigurator.java -text
+cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/faunaEuropaea/FaunaEuropaeaImporter.java -text
+cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/faunaEuropaea/FaunaEuropaeaTaxonImport.java -text
+cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/faunaEuropaea/FaunaEuropaeaTransformer.java -text
 cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/jaxb/CdmDocumentBuilder.java -text
 cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/jaxb/CdmMarshallerListener.java -text
 cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/jaxb/CdmResourceResolver.java -text
diff --git a/cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/faunaEuropaea/FaunaEuropaeaAuthorImport.java b/cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/faunaEuropaea/FaunaEuropaeaAuthorImport.java
new file mode 100644 (file)
index 0000000..94e6265
--- /dev/null
@@ -0,0 +1,121 @@
+/**\r
+* Copyright (C) 2007 EDIT\r
+* European Distributed Institute of Taxonomy \r
+* http://www.e-taxonomy.eu\r
+* \r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/\r
+package eu.etaxonomy.cdm.io.faunaEuropaea;\r
+\r
+import java.sql.ResultSet;\r
+import java.sql.SQLException;\r
+import java.util.Map;\r
+\r
+import org.apache.log4j.Logger;\r
+import org.springframework.stereotype.Component;\r
+\r
+import eu.etaxonomy.cdm.io.common.ICdmIO;\r
+import eu.etaxonomy.cdm.io.common.IImportConfigurator;\r
+import eu.etaxonomy.cdm.io.common.ImportHelper;\r
+import eu.etaxonomy.cdm.io.common.MapWrapper;\r
+import eu.etaxonomy.cdm.io.common.Source;\r
+import eu.etaxonomy.cdm.model.agent.AgentBase;\r
+import eu.etaxonomy.cdm.model.agent.Team;\r
+import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;\r
+import eu.etaxonomy.cdm.model.common.CdmBase;\r
+\r
+\r
+/**\r
+ * @author a.babadshanjan\r
+ * @created 12.05.2009\r
+ * @version 1.0\r
+ */\r
+@Component\r
+public class FaunaEuropaeaAuthorImport extends FaunaEuropaeaImportBase {\r
+       private static final Logger logger = Logger.getLogger(FaunaEuropaeaAuthorImport.class);\r
+\r
+       private static int modCount = 1000;\r
+\r
+       public FaunaEuropaeaAuthorImport(){\r
+       }\r
+       \r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IImportConfigurator)\r
+        */\r
+       @Override\r
+       protected boolean doCheck(IImportConfigurator config){\r
+               boolean result = true;\r
+               logger.warn("No checking for Authors not implemented");\r
+               \r
+               return result;\r
+       }\r
+       \r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doInvoke(eu.etaxonomy.cdm.io.common.IImportConfigurator, eu.etaxonomy.cdm.api.application.CdmApplicationController, java.util.Map)\r
+        */\r
+       @Override\r
+       protected boolean doInvoke(IImportConfigurator config, \r
+                       Map<String, MapWrapper<? extends CdmBase>> stores){ \r
+\r
+               MapWrapper<AgentBase> teamMap = (MapWrapper<AgentBase>)stores.get(ICdmIO.AUTHOR_STORE);\r
+               \r
+               FaunaEuropaeaImportConfigurator fauEuConfig = (FaunaEuropaeaImportConfigurator)config;\r
+               Source source = fauEuConfig.getSource();\r
+               String dbAttrName;\r
+               String cdmAttrName;\r
+\r
+               logger.info("Start making authors ...");\r
+               boolean success = true ;\r
+               \r
+               //get data from database\r
+               String strQuery = \r
+                               " SELECT *  " +\r
+                " FROM author " ;\r
+               ResultSet rs = source.getResultSet(strQuery) ;\r
+               String namespace = "AuthorTeam";\r
+               \r
+               int i = 0;\r
+               try{\r
+                       while (rs.next()){\r
+                               \r
+                               if ((i++ % modCount ) == 0 && i!= 1 ){ logger.info("Authors handled: " + (i-1));}\r
+                               \r
+                               //create Agent element\r
+                               int teamId = rs.getInt("aut_id");\r
+                               \r
+                               TeamOrPersonBase<Team> team = new Team();\r
+                               \r
+                               dbAttrName = "aut_name";\r
+                               cdmAttrName = "nomenclaturalTitle";\r
+                               success &= ImportHelper.addStringValue(rs, team, dbAttrName, cdmAttrName);\r
+\r
+                               dbAttrName = "aut_name";\r
+                               cdmAttrName = "titleCache";\r
+                               success &= ImportHelper.addStringValue(rs, team, dbAttrName, cdmAttrName);\r
+\r
+                               //TODO\r
+                               //title cache or nomenclaturalTitle?\r
+\r
+                               teamMap.put(teamId, team);\r
+                       }\r
+               } catch (SQLException e) {\r
+                       logger.error("SQLException:" +  e);\r
+                       return false;\r
+               }\r
+\r
+               logger.info(i + " authors handled");\r
+               getAgentService().saveAgentAll(teamMap.objects());\r
+\r
+               logger.info("End making authors ...");\r
+               return success;\r
+       }\r
+       \r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)\r
+        */\r
+       protected boolean isIgnore(IImportConfigurator config){\r
+               return !config.isDoAuthors();\r
+       }\r
+\r
+}\r
diff --git a/cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/faunaEuropaea/FaunaEuropaeaDistributionImport.java b/cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/faunaEuropaea/FaunaEuropaeaDistributionImport.java
new file mode 100644 (file)
index 0000000..22c3bd8
--- /dev/null
@@ -0,0 +1,287 @@
+/**\r
+* Copyright (C) 2007 EDIT\r
+* European Distributed Institute of Taxonomy \r
+* http://www.e-taxonomy.eu\r
+* \r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/\r
+\r
+package eu.etaxonomy.cdm.io.faunaEuropaea;\r
+\r
+import java.sql.ResultSet;\r
+import java.sql.SQLException;\r
+import java.util.ArrayList;\r
+import java.util.HashSet;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.Set;\r
+\r
+import org.apache.log4j.Logger;\r
+import org.springframework.stereotype.Component;\r
+\r
+import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;\r
+import eu.etaxonomy.cdm.io.common.ICdmIO;\r
+import eu.etaxonomy.cdm.io.common.IImportConfigurator;\r
+import eu.etaxonomy.cdm.io.common.MapWrapper;\r
+import eu.etaxonomy.cdm.io.common.Source;\r
+import eu.etaxonomy.cdm.model.common.CdmBase;\r
+import eu.etaxonomy.cdm.model.description.DescriptionElementBase;\r
+import eu.etaxonomy.cdm.model.description.Distribution;\r
+import eu.etaxonomy.cdm.model.description.PresenceAbsenceTermBase;\r
+import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
+import eu.etaxonomy.cdm.model.location.NamedArea;\r
+import eu.etaxonomy.cdm.model.location.TdwgArea;\r
+import eu.etaxonomy.cdm.model.reference.ReferenceBase;\r
+import eu.etaxonomy.cdm.model.taxon.Taxon;\r
+import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
+import eu.etaxonomy.cdm.strategy.exceptions.UnknownCdmTypeException;\r
+\r
+\r
+/**\r
+ * @author a.babadshanjan\r
+ * @created 12.05.2009\r
+ * @version 1.0\r
+ */\r
+@Component\r
+public class FaunaEuropaeaDistributionImport  extends FaunaEuropaeaImportBase {\r
+       private static final Logger logger = Logger.getLogger(FaunaEuropaeaDistributionImport.class);\r
+\r
+       private static int modCount = 10000;\r
+\r
+       public FaunaEuropaeaDistributionImport(){\r
+               super();\r
+       }\r
+       \r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IImportConfigurator)\r
+        */\r
+       @Override\r
+       protected boolean doCheck(IImportConfigurator config){\r
+               boolean result = true;\r
+               FaunaEuropaeaImportConfigurator bmiConfig = (FaunaEuropaeaImportConfigurator)config;\r
+               result &= checkTaxonIsAccepted(bmiConfig);\r
+               //result &= checkPartOfJournal(bmiConfig);\r
+               logger.warn("Checking for Occurrence not yet fully implemented");\r
+               return result;\r
+       }\r
+       \r
+//******************************** CHECK *************************************************\r
+       \r
+       private static boolean checkTaxonIsAccepted(FaunaEuropaeaImportConfigurator bmiConfig){\r
+               try {\r
+                       boolean result = true;\r
+                       Source source = bmiConfig.getSource();\r
+                       String strQuery = "SELECT emOccurrence.OccurrenceId, PTaxon.StatusFk, Name.FullNameCache, Status.Status " + \r
+                                               " FROM emOccurrence INNER JOIN " +\r
+                                                       " PTaxon ON emOccurrence.PTNameFk = PTaxon.PTNameFk AND emOccurrence.PTRefFk = PTaxon.PTRefFk INNER JOIN " + \r
+                                       " Name ON PTaxon.PTNameFk = Name.NameId INNER JOIN " +\r
+                                       " Status ON PTaxon.StatusFk = Status.StatusId " + \r
+                                               " WHERE (PTaxon.StatusFk <> 1)  ";\r
+                       \r
+                       ResultSet resulSet = source.getResultSet(strQuery);\r
+                       boolean firstRow = true;\r
+                       while (resulSet.next()){\r
+                               if (firstRow){\r
+                                       System.out.println("========================================================");\r
+                                       logger.warn("There are Occurrences for a taxon that is not accepted!");\r
+                                       System.out.println("========================================================");\r
+                               }\r
+                               int occurrenceId = resulSet.getInt("OccurrenceId");\r
+                               int statusFk = resulSet.getInt("StatusFk");\r
+                               String status = resulSet.getString("Status");\r
+                               String fullNameCache = resulSet.getString("FullNameCache");\r
+                               \r
+                               System.out.println("OccurrenceId:" + occurrenceId + "\n  Status: " + status + \r
+                                               "\n  FullNameCache: " + fullNameCache );\r
+                               result = firstRow = false;\r
+                       }\r
+                       \r
+                       return result;\r
+               } catch (SQLException e) {\r
+                       e.printStackTrace();\r
+                       return false;\r
+               }\r
+       }\r
+       \r
+       \r
+\r
+       \r
+\r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doInvoke(eu.etaxonomy.cdm.io.common.IImportConfigurator, eu.etaxonomy.cdm.api.application.CdmApplicationController, java.util.Map)\r
+        */\r
+       @Override\r
+       protected boolean doInvoke(IImportConfigurator config, \r
+                       Map<String, MapWrapper<? extends CdmBase>> stores){\r
+               \r
+               MapWrapper<TaxonBase> taxonMap = (MapWrapper<TaxonBase>)stores.get(ICdmIO.TAXON_STORE);\r
+               MapWrapper<ReferenceBase> referenceMap = (MapWrapper<ReferenceBase>)stores.get(ICdmIO.REFERENCE_STORE);\r
+               FaunaEuropaeaImportConfigurator bmiConfig = (FaunaEuropaeaImportConfigurator)config;\r
+               \r
+               Set<TaxonBase> taxonStore = new HashSet<TaxonBase>();\r
+               Source source = bmiConfig.getSource();\r
+               \r
+               logger.info("start make occurrences ...");\r
+               \r
+               try {\r
+                       //get data from database\r
+                       String strQuery =   //DISTINCT because otherwise emOccurrenceSource creates multiple records for a single distribution \r
+                " SELECT DISTINCT PTaxon.RIdentifier, emOccurrence.OccurrenceId, emOccurSumCat.emOccurSumCatId, emOccurSumCat.Short, emOccurSumCat.Description, " +  \r
+                       " emOccurSumCat.OutputCode, emArea.AreaId, emArea.EMCode, emArea.ISOCode, emArea.TDWGCode, emArea.Unit, " +  \r
+                       " emArea.Status, emArea.OutputOrder, emArea.eur, emArea.EuroMedArea " + \r
+                " FROM emOccurrence INNER JOIN " +  \r
+                       " emArea ON emOccurrence.AreaFk = emArea.AreaId INNER JOIN " + \r
+                       " PTaxon ON emOccurrence.PTNameFk = PTaxon.PTNameFk AND emOccurrence.PTRefFk = PTaxon.PTRefFk LEFT OUTER JOIN " + \r
+                       " emOccurSumCat ON emOccurrence.SummaryStatus = emOccurSumCat.emOccurSumCatId LEFT OUTER JOIN " +  \r
+                       " emOccurrenceSource ON emOccurrence.OccurrenceId = emOccurrenceSource.OccurrenceFk " +  \r
+                " WHERE (1=1)" +  \r
+                " ORDER BY PTaxon.RIdentifier";\r
+                       ResultSet rs = source.getResultSet(strQuery) ;\r
+                       \r
+                       int oldTaxonId = -1;\r
+                       TaxonDescription oldDescription = null;\r
+                       int i = 0;\r
+                       int countDescriptions = 0;\r
+                       int countDistributions = 0;\r
+                       //for each reference\r
+            while (rs.next()){\r
+                \r
+                if ((i++ % modCount) == 0 && i!= 1 ){ logger.info("Facts handled: " + (i-1));}\r
+                \r
+                int occurrenceId = rs.getInt("OccurrenceId");\r
+                int newTaxonId = rs.getInt("RIdentifier");\r
+                String tdwgCodeString = rs.getString("TDWGCode");\r
+                Integer emStatusId = (Integer)rs.getObject("emOccurSumCatId");\r
+                \r
+                try {\r
+                    //status\r
+                     PresenceAbsenceTermBase<?> status = null;\r
+                     if (emStatusId != null){\r
+                                 status = FaunaEuropaeaTransformer.occStatus2PresenceAbsence(emStatusId);\r
+                     }\r
+                     \r
+                     //Create area list\r
+                     List<NamedArea> tdwgAreas = new ArrayList<NamedArea>();\r
+                     if (tdwgCodeString != null){\r
+                           String[] tdwgCodes = tdwgCodeString.split(";");\r
+                           for (String tdwgCode : tdwgCodes){\r
+                                 NamedArea tdwgArea = TdwgArea.getAreaByTdwgAbbreviation(tdwgCode.trim());\r
+                                 if (tdwgArea != null){\r
+                                       tdwgAreas.add(tdwgArea);\r
+                                 }\r
+                           }\r
+                     }\r
+                     \r
+                     //create description(elements)\r
+                     TaxonDescription taxonDescription = getTaxonDescription(newTaxonId, oldTaxonId, oldDescription, taxonMap, occurrenceId);\r
+                     for (NamedArea tdwgArea : tdwgAreas){\r
+                           Distribution distribution = Distribution.NewInstance(tdwgArea, status);\r
+                           if (taxonDescription != null) { \r
+                               if (checkIsNoDuplicate(taxonDescription , distribution)){\r
+                                          taxonDescription.addElement(distribution); \r
+                                      countDistributions++; \r
+                                      if (taxonDescription != oldDescription){ \r
+                                          taxonStore.add(taxonDescription.getTaxon()); \r
+                                          oldDescription = taxonDescription; \r
+                                          countDescriptions++; \r
+                                       } \r
+                               }else{\r
+                                  logger.debug("Distribution is duplicate");\r
+                               }\r
+                               } else { \r
+                                       logger.warn("Distribution " + tdwgArea.toString() + " ignored"); \r
+                               }\r
+                     }\r
+                     \r
+                } catch (UnknownCdmTypeException e) {\r
+                     // TODO Auto-generated catch block\r
+                     e.printStackTrace();\r
+                }\r
+\r
+//              TODO\r
+//              sources\r
+//              references\r
+            }\r
+\r
+                       logger.info("Distributions: " + countDistributions + ", Descriptions: " + countDescriptions );\r
+                       logger.warn("Unmatched occurrences: "  + (i - countDescriptions));\r
+                       logger.info("Taxa to save: " + taxonStore.size());\r
+                       getTaxonService().saveTaxonAll(taxonStore);     \r
+                       \r
+                       logger.info("end make occurrences ...");\r
+                       return true;\r
+               } catch (SQLException e) {\r
+                       logger.error("SQLException:" +  e);\r
+                       return false;\r
+               }\r
+\r
+       }\r
+\r
+       \r
+    /**\r
+     * Tests if a distribution with the same tdwgArea and the same status already exists in the description\r
+     * Returns false, if a duplicate exists. True otherwise\r
+     * @param description\r
+     * @param tdwgArea\r
+     * @return\r
+     */\r
+    private boolean checkIsNoDuplicate(TaxonDescription description, Distribution distribution){\r
+       for (DescriptionElementBase descElBase : description.getElements()){\r
+               if (descElBase.isInstanceOf(Distribution.class)){\r
+                       Distribution oldDistr = HibernateProxyHelper.deproxy(descElBase, Distribution.class);\r
+                       NamedArea oldArea = oldDistr.getArea();\r
+                       if (oldArea != null && oldArea.equals(distribution.getArea())){\r
+                               PresenceAbsenceTermBase<?> oldStatus = oldDistr.getStatus();\r
+                               if (oldStatus != null && oldStatus.equals(distribution.getStatus())){\r
+                                       return false;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+       return true;\r
+    }\r
+       \r
+       /**\r
+        * Use same TaxonDescription if two records belong to the same taxon \r
+        * @param newTaxonId\r
+        * @param oldTaxonId\r
+        * @param oldDescription\r
+        * @param taxonMap\r
+        * @return\r
+        */\r
+       private TaxonDescription getTaxonDescription(int newTaxonId, int oldTaxonId, TaxonDescription oldDescription, MapWrapper<TaxonBase> taxonMap, int occurrenceId){\r
+               TaxonDescription result = null;\r
+               if (oldDescription == null || newTaxonId != oldTaxonId){\r
+                       TaxonBase taxonBase = taxonMap.get(newTaxonId);\r
+                       //TODO for testing\r
+                       //TaxonBase taxonBase = Taxon.NewInstance(BotanicalName.NewInstance(Rank.SPECIES()), null);\r
+                       Taxon taxon;\r
+                       if ( taxonBase instanceof Taxon ) {\r
+                               taxon = (Taxon) taxonBase;\r
+                       } else if (taxonBase != null) {\r
+                               logger.warn("TaxonBase for Occurrence " + occurrenceId + " was not of type Taxon but: " + taxonBase.getClass().getSimpleName());\r
+                               return null;\r
+                       } else {\r
+                               logger.warn("TaxonBase for Occurrence " + occurrenceId + " is null.");\r
+                               return null;\r
+                       }\r
+                       \r
+                       result = TaxonDescription.NewInstance();\r
+                       taxon.addDescription(result);\r
+                       //TODO add source title as title (or reference at least)\r
+                       //result.setTitleCache("");\r
+               }else{\r
+                       result = oldDescription;\r
+               }\r
+               return result;\r
+       }\r
+\r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)\r
+        */\r
+       protected boolean isIgnore(IImportConfigurator config){\r
+               return ! config.isDoOccurrence();\r
+       }\r
+       \r
+}\r
diff --git a/cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/faunaEuropaea/FaunaEuropaeaImportBase.java b/cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/faunaEuropaea/FaunaEuropaeaImportBase.java
new file mode 100644 (file)
index 0000000..8ad55e4
--- /dev/null
@@ -0,0 +1,100 @@
+/**\r
+* Copyright (C) 2007 EDIT\r
+* European Distributed Institute of Taxonomy \r
+* http://www.e-taxonomy.eu\r
+* \r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/\r
+\r
+package eu.etaxonomy.cdm.io.faunaEuropaea;\r
+\r
+import java.sql.ResultSet;\r
+import java.sql.ResultSetMetaData;\r
+import java.sql.SQLException;\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+\r
+import org.apache.log4j.Logger;\r
+\r
+import eu.etaxonomy.cdm.common.CdmUtils;\r
+import eu.etaxonomy.cdm.io.common.CdmIoBase;\r
+import eu.etaxonomy.cdm.io.common.ICdmIO;\r
+import eu.etaxonomy.cdm.io.common.IImportConfigurator;\r
+import eu.etaxonomy.cdm.io.common.ImportHelper;\r
+import eu.etaxonomy.cdm.io.common.Source;\r
+import eu.etaxonomy.cdm.model.common.Annotation;\r
+import eu.etaxonomy.cdm.model.common.IdentifiableEntity;\r
+import eu.etaxonomy.cdm.model.common.Language;\r
+\r
+/**\r
+ * @author a.babadshanjan\r
+ * @created 11.05.2009\r
+ * @version 1.0\r
+ */\r
+public abstract class FaunaEuropaeaImportBase extends CdmIoBase<IImportConfigurator> implements ICdmIO<IImportConfigurator> {\r
+       private static final Logger logger = Logger.getLogger(FaunaEuropaeaImportBase.class);\r
+       \r
+       public FaunaEuropaeaImportBase() {\r
+       }\r
+       \r
+       protected boolean resultSetHasColumn(ResultSet rs, String columnName){\r
+               try {\r
+                       ResultSetMetaData metaData = rs.getMetaData();\r
+                       for (int i = 0; i < metaData.getColumnCount(); i++){\r
+                               if (metaData.getColumnName(i + 1).equalsIgnoreCase(columnName)){\r
+                                       return true;\r
+                               }\r
+                       }\r
+                       return false;\r
+               } catch (SQLException e) {\r
+            logger.warn("Exception in resultSetHasColumn");\r
+            return false;\r
+               }\r
+       }\r
+       \r
+       protected boolean checkSqlServerColumnExists(Source source, String tableName, String columnName){\r
+               String strQuery = "SELECT  Count(t.id) as n " +\r
+                               " FROM sysobjects AS t " +\r
+                               " INNER JOIN syscolumns AS c ON t.id = c.id " +\r
+                               " WHERE (t.xtype = 'U') AND " + \r
+                               " (t.name = '" + tableName + "') AND " + \r
+                               " (c.name = '" + columnName + "')";\r
+               ResultSet rs = source.getResultSet(strQuery) ;          \r
+               int n;\r
+               try {\r
+                       rs.next();\r
+                       n = rs.getInt("n");\r
+                       return n>0;\r
+               } catch (SQLException e) {\r
+                       e.printStackTrace();\r
+                       return false;\r
+               }\r
+               \r
+       }\r
+       \r
+       /**\r
+        * Returns a map that holds all values of a ResultSet. This is needed if a value needs to\r
+        * be accessed twice\r
+        * @param rs\r
+        * @return\r
+        * @throws SQLException\r
+        */\r
+       protected Map<String, Object> getValueMap(ResultSet rs) throws SQLException{\r
+               try{\r
+                       Map<String, Object> valueMap = new HashMap<String, Object>();\r
+                       int colCount = rs.getMetaData().getColumnCount();\r
+                       for (int c = 0; c < colCount ; c++){\r
+                               Object value = rs.getObject(c+1);\r
+                               String label = rs.getMetaData().getColumnLabel(c+1).toLowerCase();\r
+                               if (value != null && ! CdmUtils.Nz(value.toString()).trim().equals("")){\r
+                                       valueMap.put(label, value);\r
+                               }\r
+                       }\r
+                       return valueMap;\r
+               }catch(SQLException e){\r
+                       throw e;\r
+               }\r
+       }\r
+       \r
+}\r
diff --git a/cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/faunaEuropaea/FaunaEuropaeaImportConfigurator.java b/cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/faunaEuropaea/FaunaEuropaeaImportConfigurator.java
new file mode 100644 (file)
index 0000000..7f5ab22
--- /dev/null
@@ -0,0 +1,90 @@
+/**\r
+* Copyright (C) 2008 EDIT\r
+* European Distributed Institute of Taxonomy \r
+* http://www.e-taxonomy.eu\r
+* \r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/\r
+package eu.etaxonomy.cdm.io.faunaEuropaea;\r
+\r
+import org.apache.log4j.Logger;\r
+import eu.etaxonomy.cdm.database.ICdmDataSource;\r
+import eu.etaxonomy.cdm.io.berlinModel.BerlinModelImportConfigurator;\r
+import eu.etaxonomy.cdm.io.common.IImportConfigurator;\r
+import eu.etaxonomy.cdm.io.common.ImportConfiguratorBase;\r
+import eu.etaxonomy.cdm.io.common.Source;\r
+import eu.etaxonomy.cdm.model.name.NomenclaturalCode;\r
+import eu.etaxonomy.cdm.model.reference.Database;\r
+import eu.etaxonomy.cdm.model.reference.ReferenceBase;\r
+\r
+/**\r
+ * @author a.babadshanjan\r
+ * @created 08.05.2009\r
+ * @version 1.0\r
+ */\r
+public class FaunaEuropaeaImportConfigurator extends ImportConfiguratorBase implements IImportConfigurator {\r
+\r
+       private static final Logger logger = Logger.getLogger(FaunaEuropaeaImportConfigurator.class);\r
+       \r
+       @SuppressWarnings("unchecked")\r
+       protected void makeIoClassList() {\r
+               ioClassList = new Class[] {\r
+//                             FaunaEuropaeaAuthorImport.class,\r
+                               FaunaEuropaeaTaxonImport.class,\r
+                               FaunaEuropaeaDistributionImport.class\r
+               };\r
+       };\r
+       \r
+       public static FaunaEuropaeaImportConfigurator NewInstance(Source source, ICdmDataSource destination){\r
+               return new FaunaEuropaeaImportConfigurator(source, destination);\r
+}\r
+       \r
+       private FaunaEuropaeaImportConfigurator(Source source, ICdmDataSource destination) {\r
+               setSource(source);\r
+               setDestination(destination);\r
+               setNomenclaturalCode(NomenclaturalCode.ICBN);\r
+       }\r
+       \r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.cdm.io.common.ImportConfiguratorBase#getSource()\r
+        */\r
+       public Source getSource() {\r
+               return (Source)super.getSource();\r
+       }\r
+       \r
+       /**\r
+        * @param dbSource\r
+        */\r
+       public void setSource(Source dbSource) {\r
+               super.setSource(dbSource);\r
+       }\r
+\r
+       \r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.cdm.io.common.ImportConfiguratorBase#getSourceReference()\r
+        */\r
+       @Override\r
+       public ReferenceBase getSourceReference() {\r
+               //TODO\r
+               if (this.sourceReference == null){\r
+                       logger.warn("getSource Reference not yet fully implemented");\r
+                       sourceReference = Database.NewInstance();\r
+                       sourceReference.setTitleCache("Fauna Europaea data import");\r
+               }\r
+               return sourceReference;\r
+       }\r
+\r
+\r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.cdm.io.common.IImportConfigurator#getSourceNameString()\r
+        */\r
+       public String getSourceNameString() {\r
+               if (this.getSource() == null){\r
+                       return null;\r
+               }else{\r
+                       return this.getSource().toString();\r
+               }\r
+       }\r
+       \r
+}\r
diff --git a/cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/faunaEuropaea/FaunaEuropaeaImporter.java b/cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/faunaEuropaea/FaunaEuropaeaImporter.java
new file mode 100644 (file)
index 0000000..4dc7d86
--- /dev/null
@@ -0,0 +1,75 @@
+/**\r
+* Copyright (C) 2008 EDIT\r
+* European Distributed Institute of Taxonomy \r
+* http://www.e-taxonomy.eu\r
+* \r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/\r
+package eu.etaxonomy.cdm.io.faunaEuropaea;\r
+\r
+import java.io.FileNotFoundException;\r
+import java.util.ArrayList;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.Set;\r
+\r
+import org.apache.log4j.Logger;\r
+import org.springframework.stereotype.Component;\r
+import org.springframework.transaction.TransactionStatus;\r
+\r
+import eu.etaxonomy.cdm.api.service.config.IIdentifiableEntityServiceConfigurator;\r
+import eu.etaxonomy.cdm.api.service.config.impl.IdentifiableServiceConfiguratorImpl;\r
+import eu.etaxonomy.cdm.common.CdmUtils;\r
+import eu.etaxonomy.cdm.common.ExcelUtils;\r
+import eu.etaxonomy.cdm.io.common.CdmIoBase;\r
+import eu.etaxonomy.cdm.io.common.ICdmIO;\r
+import eu.etaxonomy.cdm.io.common.IImportConfigurator;\r
+import eu.etaxonomy.cdm.io.common.MapWrapper;\r
+import eu.etaxonomy.cdm.model.common.CdmBase;\r
+import eu.etaxonomy.cdm.model.description.DescriptionElementBase;\r
+import eu.etaxonomy.cdm.model.description.Distribution;\r
+import eu.etaxonomy.cdm.model.description.PresenceAbsenceTermBase;\r
+import eu.etaxonomy.cdm.model.description.PresenceTerm;\r
+import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
+import eu.etaxonomy.cdm.model.location.NamedArea;\r
+import eu.etaxonomy.cdm.model.location.TdwgArea;\r
+import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
+import eu.etaxonomy.cdm.model.taxon.Taxon;\r
+import eu.etaxonomy.cdm.persistence.query.MatchMode;\r
+\r
+/**\r
+ * @author a.babadshanjan\r
+ * @created 08.05.2009\r
+ * @version 1.0\r
+ */\r
+@Component\r
+public class FaunaEuropaeaImporter extends CdmIoBase<IImportConfigurator> implements ICdmIO<IImportConfigurator> {\r
+\r
+       private static final Logger logger = Logger.getLogger(FaunaEuropaeaImporter.class);\r
+       \r
+       @Override\r
+       protected boolean doInvoke(IImportConfigurator config,\r
+                       Map<String, MapWrapper<? extends CdmBase>> stores) {\r
+               \r
+               if (logger.isDebugEnabled()) { logger.debug("Importing Fauna Europaea data"); }\r
+       \r
+               return true;\r
+       }\r
+                       \r
+\r
+       @Override\r
+       protected boolean doCheck(IImportConfigurator config) {\r
+               boolean result = true;\r
+               logger.warn("No check implemented for Fauna Europaea data import");\r
+               return result;\r
+       }\r
+       \r
+\r
+       @Override\r
+       protected boolean isIgnore(IImportConfigurator config) {\r
+               return false;\r
+       }\r
+\r
+}\r
diff --git a/cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/faunaEuropaea/FaunaEuropaeaTaxonImport.java b/cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/faunaEuropaea/FaunaEuropaeaTaxonImport.java
new file mode 100644 (file)
index 0000000..de7c37e
--- /dev/null
@@ -0,0 +1,207 @@
+/**\r
+* Copyright (C) 2007 EDIT\r
+* European Distributed Institute of Taxonomy \r
+* http://www.e-taxonomy.eu\r
+* \r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/\r
+\r
+package eu.etaxonomy.cdm.io.faunaEuropaea;\r
+\r
+import static eu.etaxonomy.cdm.io.faunaEuropaea.FaunaEuropaeaTransformer.T_STATUS_ACCEPTED;\r
+import static eu.etaxonomy.cdm.io.faunaEuropaea.FaunaEuropaeaTransformer.T_STATUS_NOT_ACCEPTED;\r
+\r
+import java.sql.ResultSet;\r
+import java.sql.SQLException;\r
+import java.util.Map;\r
+import java.util.UUID;\r
+\r
+import org.apache.log4j.Logger;\r
+import org.springframework.stereotype.Component;\r
+\r
+import eu.etaxonomy.cdm.io.berlinModel.CdmOneToManyMapper;\r
+import eu.etaxonomy.cdm.io.berlinModel.CdmStringMapper;\r
+import eu.etaxonomy.cdm.io.common.CdmAttributeMapperBase;\r
+import eu.etaxonomy.cdm.io.common.CdmSingleAttributeMapperBase;\r
+import eu.etaxonomy.cdm.io.common.ICdmIO;\r
+import eu.etaxonomy.cdm.io.common.IImportConfigurator;\r
+import eu.etaxonomy.cdm.io.common.ImportHelper;\r
+import eu.etaxonomy.cdm.io.common.MapWrapper;\r
+import eu.etaxonomy.cdm.io.common.Source;\r
+import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;\r
+import eu.etaxonomy.cdm.model.common.CdmBase;\r
+import eu.etaxonomy.cdm.model.name.Rank;\r
+import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
+import eu.etaxonomy.cdm.model.name.ZoologicalName;\r
+import eu.etaxonomy.cdm.model.reference.PublicationBase;\r
+import eu.etaxonomy.cdm.model.reference.Publisher;\r
+import eu.etaxonomy.cdm.model.reference.ReferenceBase;\r
+import eu.etaxonomy.cdm.model.taxon.Synonym;\r
+import eu.etaxonomy.cdm.model.taxon.Taxon;\r
+import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
+import eu.etaxonomy.cdm.strategy.exceptions.UnknownCdmTypeException;\r
+\r
+\r
+/**\r
+ * @author a.babadshanjan\r
+ * @created 12.05.2009\r
+ * @version 1.0\r
+ */\r
+@Component\r
+public class FaunaEuropaeaTaxonImport extends FaunaEuropaeaImportBase  {\r
+       private static final Logger logger = Logger.getLogger(FaunaEuropaeaTaxonImport.class);\r
+\r
+       private int modCount = 10000;\r
+       \r
+       public FaunaEuropaeaTaxonImport(){\r
+       }\r
+               \r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IImportConfigurator)\r
+        */\r
+       @Override\r
+       protected boolean doCheck(IImportConfigurator config){\r
+               boolean result = true;\r
+               FaunaEuropaeaImportConfigurator fauEuConfig = (FaunaEuropaeaImportConfigurator)config;\r
+               logger.warn("Checking for Taxa not yet fully implemented");\r
+               result &= checkTaxonStatus(fauEuConfig);\r
+               \r
+               return result;\r
+       }\r
+       \r
+       private boolean checkTaxonStatus(FaunaEuropaeaImportConfigurator fauEuConfig){\r
+               boolean result = true;\r
+//             try {\r
+                       Source source = fauEuConfig.getSource();\r
+                       String sqlStr = "";\r
+                       ResultSet rs = source.getResultSet(sqlStr);\r
+                       return result;\r
+//             } catch (SQLException e) {\r
+//                     e.printStackTrace();\r
+//                     return false;\r
+//             }\r
+       }\r
+       \r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doInvoke(eu.etaxonomy.cdm.io.common.IImportConfigurator, eu.etaxonomy.cdm.api.application.CdmApplicationController, java.util.Map)\r
+        */\r
+       @Override\r
+       protected boolean doInvoke(IImportConfigurator config, \r
+                       Map<String, MapWrapper<? extends CdmBase>> stores){                             \r
+               \r
+               boolean success = true;\r
+               //make not needed maps empty\r
+               MapWrapper<TeamOrPersonBase<?>> authorMap = (MapWrapper<TeamOrPersonBase<?>>)stores.get(ICdmIO.AUTHOR_STORE);\r
+               authorMap.makeEmpty();\r
+\r
+               \r
+               MapWrapper<TaxonNameBase<?,?>> taxonNameMap = (MapWrapper<TaxonNameBase<?,?>>)stores.get(ICdmIO.TAXONNAME_STORE);\r
+               MapWrapper<ReferenceBase> referenceMap = (MapWrapper<ReferenceBase>)stores.get(ICdmIO.REFERENCE_STORE);\r
+               MapWrapper<ReferenceBase> nomRefMap = (MapWrapper<ReferenceBase>)stores.get(ICdmIO.NOMREF_STORE);\r
+               MapWrapper<TaxonBase> taxonMap = (MapWrapper<TaxonBase>)stores.get(ICdmIO.TAXON_STORE);\r
+               \r
+               FaunaEuropaeaImportConfigurator fauEuConfig = (FaunaEuropaeaImportConfigurator)config;\r
+               Source source = fauEuConfig.getSource();\r
+               \r
+               logger.info("start make Taxa ...");\r
+               \r
+               String namespace = "Taxon";\r
+               \r
+               try {\r
+                       //get data from database\r
+                       String strQuery = \r
+                               " SELECT Taxon.*, rank.* " + \r
+                " FROM dbo.Taxon INNER JOIN dbo.rank ON dbo.Taxon.TAX_RNK_ID = dbo.rank.rnk_id " +\r
+                " WHERE (1=1)";\r
+                       \r
+//                     " SELECT Taxon.*, dbo.rank.rnk_id " + \r
+//            " FROM dbo.Taxon INNER JOIN dbo.rank ON dbo.Taxon.TAX_RNK_ID = dbo.rank.rnk_id " +\r
+//            " WHERE (1=1)";\r
+                       \r
+                       ResultSet rs = source.getResultSet(strQuery) ;\r
+                       \r
+                       int i = 0;\r
+                       while (rs.next()){\r
+                               \r
+                               if ((i++ % modCount) == 0 && i!= 1 ){ logger.info("Taxa handled: " + (i-1)); }\r
+                               \r
+                               //create TaxonName element\r
+                               int taxonId = rs.getInt("TAX_ID");\r
+                               //int statusFk = rs.getInt("statusFk");\r
+                               \r
+                               String taxonName = rs.getString("TAX_NAME");\r
+                               int statusFk = rs.getInt("TAX_VALID");\r
+                               int rankId = rs.getInt("rnk_id");\r
+                               Rank rank = null;\r
+                               \r
+                               try {\r
+                                       rank = FaunaEuropaeaTransformer.rankId2Rank(rs, false);\r
+                               } catch (UnknownCdmTypeException e) {\r
+                                       logger.warn("Taxon (" + taxonId + ") has unknown rank (" + rankId + ") and could not be saved.");\r
+                                       success = false; \r
+                               }\r
+                               \r
+                               ReferenceBase<?> reference = null;\r
+//                             if (referenceMap != null){\r
+//                                     //int refFk = rs.getInt("PTRefFk");\r
+//                                     if ()\r
+//                                     reference = referenceMap.get(refFk);\r
+//                                     if (reference == null){\r
+//                                             reference = nomRefMap.get(refFk);\r
+//                                     }\r
+//                             }\r
+                               \r
+                               ZoologicalName zooName = ZoologicalName.NewInstance(rank);\r
+                               zooName.setNameCache(taxonName);\r
+                               \r
+                               TaxonBase<?> taxonBase;\r
+                               Synonym synonym;\r
+                               Taxon taxon;\r
+                               try {\r
+                                       logger.debug(statusFk);\r
+                                       if (statusFk == T_STATUS_ACCEPTED) {\r
+                                               taxon = Taxon.NewInstance(zooName, reference);\r
+                                               taxonBase = taxon;\r
+                                       } else if (statusFk == T_STATUS_NOT_ACCEPTED) {\r
+                                               synonym = Synonym.NewInstance(zooName, reference);\r
+                                               taxonBase = synonym;\r
+                                       } else {\r
+                                               logger.warn("Taxon status " + statusFk + " not yet implemented. Taxon (" + taxonId + ") ignored.");\r
+                                               continue;\r
+                                       }\r
+                                       \r
+                                                                               \r
+                                       //nameId\r
+                                       ImportHelper.setOriginalSource(taxonBase, fauEuConfig.getSourceReference(), taxonId, namespace);\r
+\r
+                                       taxonMap.put(taxonId, taxonBase);\r
+                                       \r
+                               } catch (Exception e) {\r
+                                       logger.warn("An exception occurred when creating taxon with id " + taxonId + ". Taxon could not be saved.");\r
+                               }\r
+                       }\r
+                       //invokeRelations(source, cdmApp, deleteAll, taxonMap, referenceMap);\r
+                       logger.info("saving taxa ...");\r
+                       getTaxonService().saveTaxonAll(taxonMap.objects());\r
+                       \r
+                       logger.info("end making taxa ...");\r
+                       \r
+                       return true;\r
+               } catch (SQLException e) {\r
+                       logger.error("SQLException:" +  e);\r
+                       return false;\r
+               }\r
+\r
+       }\r
+\r
+       \r
+       \r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)\r
+        */\r
+       protected boolean isIgnore(IImportConfigurator config){\r
+               return ! config.isDoTaxa();\r
+       }\r
+\r
+}\r
diff --git a/cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/faunaEuropaea/FaunaEuropaeaTransformer.java b/cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/faunaEuropaea/FaunaEuropaeaTransformer.java
new file mode 100644 (file)
index 0000000..fff0a15
--- /dev/null
@@ -0,0 +1,243 @@
+/**\r
+* Copyright (C) 2007 EDIT\r
+* European Distributed Institute of Taxonomy \r
+* http://www.e-taxonomy.eu\r
+* \r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/\r
+\r
+package eu.etaxonomy.cdm.io.faunaEuropaea;\r
+\r
+import java.sql.ResultSet;\r
+import java.sql.SQLException;\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+\r
+import org.apache.log4j.Logger;\r
+import org.springframework.stereotype.Component;\r
+\r
+import eu.etaxonomy.cdm.common.ResultWrapper;\r
+import eu.etaxonomy.cdm.model.description.Feature;\r
+import eu.etaxonomy.cdm.model.description.PresenceAbsenceTermBase;\r
+import eu.etaxonomy.cdm.model.description.PresenceTerm;\r
+import eu.etaxonomy.cdm.model.location.NamedArea;\r
+import eu.etaxonomy.cdm.model.location.TdwgArea;\r
+import eu.etaxonomy.cdm.model.name.HybridRelationshipType;\r
+import eu.etaxonomy.cdm.model.name.Rank;\r
+import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignationStatus;\r
+import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;\r
+import eu.etaxonomy.cdm.strategy.exceptions.UnknownCdmTypeException;\r
+\r
+/**\r
+ * @author a.babadshanjan\r
+ * @created 12.05.2009\r
+ * @version 1.0\r
+ */\r
+\r
+public final class FaunaEuropaeaTransformer {\r
+       private static final Logger logger = Logger.getLogger(FaunaEuropaeaTransformer.class);\r
+       \r
+       //TaxonStatus\r
+       public static int T_STATUS_ACCEPTED = 1;\r
+       public static int T_STATUS_NOT_ACCEPTED = 0;\r
+       \r
+       private static Map<String, String> tdwgAreas = null;\r
+\r
+       public static PresenceAbsenceTermBase<?> occStatus2PresenceAbsence (int occStatusId)  throws UnknownCdmTypeException{\r
+               switch (occStatusId){\r
+                       case 0: return null;\r
+                       case 110: return PresenceTerm.CULTIVATED_REPORTED_IN_ERROR();\r
+                       case 120: return PresenceTerm.CULTIVATED();\r
+                       case 210: return PresenceTerm.INTRODUCED_REPORTED_IN_ERROR();\r
+                       case 220: return PresenceTerm.INTRODUCED_PRESENCE_QUESTIONABLE();\r
+                       case 230: return PresenceTerm.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
+                       case 270: return PresenceTerm.INTRODUCED_ADVENTITIOUS();\r
+                       case 280: return PresenceTerm.INTRODUCED_NATURALIZED();\r
+                       case 310: return PresenceTerm.NATIVE_REPORTED_IN_ERROR();\r
+                       case 320: return PresenceTerm.NATIVE_PRESENCE_QUESTIONABLE();\r
+                       case 330: return PresenceTerm.NATIVE_FORMERLY_NATIVE();\r
+                       case 340: return PresenceTerm.NATIVE_DOUBTFULLY_NATIVE();\r
+                       case 350: return PresenceTerm.NATIVE();\r
+                       case 999: {\r
+                                       logger.warn("endemic for EM can not be transformed in legal status");\r
+                                       //TODO preliminary\r
+                                       return PresenceTerm.PRESENT();\r
+                               }\r
+                       default: {\r
+                               throw new UnknownCdmTypeException("Unknown occurrence status  (id=" + Integer.valueOf(occStatusId).toString() + ")");\r
+                       }\r
+               }\r
+       }\r
+               \r
+       \r
+       public static Rank rankId2Rank (ResultSet rs, boolean useUnknown) throws UnknownCdmTypeException {\r
+               Rank result;\r
+               try {\r
+                       int rankId = rs.getInt("rnk_id");\r
+                       int parentRankId = rs.getInt("rnk_rnk_id");\r
+                       String rankName = rs.getString("rnk_name");\r
+                       String rankLatinName = rs.getString("rnk_latinname");\r
+                       int rankCategory = rs.getInt("rnk_category");\r
+\r
+                       if (logger.isDebugEnabled()) {\r
+                               logger.debug(rankId + ", " + parentRankId + ", " + rankName + ", " + rankLatinName + ", " + rankCategory);\r
+                       }\r
+\r
+                       try {\r
+                               result = Rank.getRankByNameOrAbbreviation(rankName);\r
+                       } catch (UnknownCdmTypeException e1) {\r
+\r
+                               switch (rankId) {\r
+                               case 0: return null;\r
+                               case 1: return Rank.KINGDOM();\r
+                               case 2: return Rank.SUBKINGDOM();\r
+                               case 3: return Rank.SUPERPHYLUM();\r
+                               case 4: return Rank.PHYLUM();\r
+                               case 5: return Rank.SUBPHYLUM();\r
+                               case 6: return Rank.INFRAPHYLUM();\r
+                               case 7: return Rank.CLASS();\r
+                               case 8: return Rank.SUBCLASS();\r
+                               case 9: return Rank.INFRACLASS();\r
+                               case 10: return Rank.SUPERORDER();\r
+                               case 11: return Rank.ORDER();\r
+                               case 12: return Rank.SUBORDER();\r
+                               case 13: return Rank.INFRAORDER();\r
+                               case 14: return Rank.SUPERFAMILY();\r
+                               case 15: return Rank.FAMILY();\r
+                               case 16: return Rank.SUBFAMILY();\r
+                               case 17: return Rank.TRIBE();\r
+                               case 18: return Rank.SUBTRIBE();\r
+                               case 19: return Rank.GENUS();\r
+                               case 20: return Rank.SUBGENUS();\r
+                               case 21: return Rank.SPECIES();\r
+                               case 22: return Rank.SUBSPECIES();\r
+\r
+                               default: {\r
+                                       if (useUnknown){\r
+                                               logger.error("Rank unknown. Created UNKNOWN_RANK");\r
+                                               return Rank.UNKNOWN_RANK();\r
+                                       }\r
+                                       throw new UnknownCdmTypeException("Unknown Rank id" + Integer.valueOf(rankId).toString());\r
+                               }\r
+                               }\r
+                       }\r
+                       return result;\r
+               } catch (SQLException e) {\r
+                       e.printStackTrace();\r
+                       logger.warn("Exception occurred. Created UNKNOWN_RANK instead");\r
+                       return Rank.UNKNOWN_RANK();\r
+               }               \r
+       }\r
+       \r
+       \r
+       public static NamedArea areaId2TdwgArea (ResultSet rs, boolean useUnknown) throws UnknownCdmTypeException {\r
+               \r
+               NamedArea tdwgArea = null;\r
+               \r
+               try {\r
+                       int areaId = rs.getInt("ara_id");\r
+                       String areaName = rs.getString("ara_name");\r
+                       String areaCode = rs.getString("ara_code");\r
+                       int extraLimital = rs.getInt("ara_extralimital");\r
+                       \r
+                       //TODO: Verify mappings with comments. Are those the best matches?\r
+                       \r
+                       if (areaCode.equals("AD")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("SPA-AN");\r
+                       else if (areaCode.equals("AFR")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("24"); // Afro-tropical region - Northeast Tropical Africa\r
+                       else if (areaCode.equals("AL")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("ALB-OO");\r
+                       else if (areaCode.equals("AT")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("AUT-AU");\r
+                       else if (areaCode.equals("AUS")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("50"); // Australian region - Australia\r
+                       else if (areaCode.equals("BA")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("YUG-BH"); \r
+                       else if (areaCode.equals("BE")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("BGM-BE");\r
+                       else if (areaCode.equals("BG")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("BUL-OO");\r
+                       else if (areaCode.equals("BY")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("BLR-OO");\r
+                       else if (areaCode.equals("CH")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("SWI-OO");\r
+                       else if (areaCode.equals("CY")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("CYP-OO");\r
+                       else if (areaCode.equals("CZ")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("CZE-CZ");\r
+                       else if (areaCode.equals("DE")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("GER-OO");\r
+                       else if (areaCode.equals("DK-DEN")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("DEN-OO");\r
+                       else if (areaCode.equals("DK-FOR")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("FOR-OO");\r
+                       else if (areaCode.equals("EE")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("BLT-ES");\r
+                       else if (areaCode.equals("EPA")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("Palaearctic");\r
+                       else if (areaCode.equals("ES-BAL")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("BLT-ES");\r
+                       else if (areaCode.equals("ES-CNY")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("CNY-OO");\r
+                       else if (areaCode.equals("ES-SPA")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("SPA-SP");\r
+                       else if (areaCode.equals("FI")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("FIN-OO");\r
+                       else if (areaCode.equals("FR-COR")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("COR-OO");\r
+                       else if (areaCode.equals("FR-FRA")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("FRA-FR");\r
+                       else if (areaCode.equals("GB-CI")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("FRA-CI");\r
+                       else if (areaCode.equals("GB-GI")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("SPA-GI");\r
+                       else if (areaCode.equals("GB-GRB")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("GRB-OO");\r
+                       else if (areaCode.equals("GB-NI")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("IRE-NI");\r
+                       else if (areaCode.equals("GR-AEG")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("EAI-OO"); // North Aegean Is. - East Aegean Is.\r
+                       else if (areaCode.equals("GR-CYC")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("GRC-OO"); // Cyclades Is. - Greece\r
+                       else if (areaCode.equals("GR-DOD")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("EAI-OO"); // Dodecanese Is. - East Aegean Is.\r
+                       else if (areaCode.equals("GR-GRC")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("GRC-OO");\r
+                       else if (areaCode.equals("GR-KRI")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("KRI-OO");\r
+                       else if (areaCode.equals("HR")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("YUG-CR");\r
+                       else if (areaCode.equals("HU")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("HUN-OO");\r
+                       else if (areaCode.equals("IE")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("IRE-IR");\r
+                       else if (areaCode.equals("IS")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("ICE-OO");\r
+                       else if (areaCode.equals("IT-ITA")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("ITA-IT");\r
+                       else if (areaCode.equals("IT-SAR")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("SAR-OO");\r
+                       else if (areaCode.equals("IT-SI")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("SIC-SI");\r
+                       else if (areaCode.equals("LI")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("AUT-LI");\r
+                       else if (areaCode.equals("LT")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("BLT-LI");\r
+                       else if (areaCode.equals("LU")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("BGM-LU");\r
+                       else if (areaCode.equals("LV")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("BLT-LA");\r
+                       else if (areaCode.equals("MC")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("FRA-MO");\r
+                       else if (areaCode.equals("MD")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("UKR-MO");\r
+                       else if (areaCode.equals("MK")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("YUG-MA");\r
+                       else if (areaCode.equals("MT")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("SIC-MA");\r
+                       else if (areaCode.equals("NAF")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("20"); // North Africa - Northern Africa\r
+                       else if (areaCode.equals("NEA")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("7");    // Nearctic region - Northern America\r
+                       else if (areaCode.equals("NEO")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("8"); // Neotropical region - Southern America\r
+else if (areaCode.equals("NL")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("NET-OO");\r
+                       else if (areaCode.equals("NO-NOR")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("NOR-OO");\r
+                       else if (areaCode.equals("NO-SVA")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("SVA-OO");\r
+                       else if (areaCode.equals("NRE")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("34"); // Near East - Western Asia\r
+                       else if (areaCode.equals("ORR")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("35");   // Oriental region - Arabian Peninsula\r
+                       else if (areaCode.equals("PL")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("POL-OO");\r
+                       else if (areaCode.equals("PT-AZO")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("AZO-OO");\r
+                       else if (areaCode.equals("PT-MDR")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("MDR-OO");\r
+                       else if (areaCode.equals("PT-POR")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("POR-OO");\r
+                       else if (areaCode.equals("PT-SEL")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("SEL-OO");\r
+                       else if (areaCode.equals("RO")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("ROM-OO");\r
+                       else if (areaCode.equals("RU-FJL")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("WSB-OO");\r
+                       else if (areaCode.equals("RU-KGD")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("BLT-KA");\r
+                       else if (areaCode.equals("RU-NOZ")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("WSB-OO");\r
+                       else if (areaCode.equals("RU-RUC")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("RUC-OO");\r
+                       else if (areaCode.equals("RU-RUE")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("RUE-OO");\r
+                       else if (areaCode.equals("RU-RUN")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("RUN-OO");\r
+                       else if (areaCode.equals("RU-RUS")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("RUS-OO");\r
+                       else if (areaCode.equals("RU-RUW")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("RUW-OO");\r
+                       else if (areaCode.equals("SE")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("SWE-OO");\r
+                       else if (areaCode.equals("SI")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("YUG-SL");\r
+                       else if (areaCode.equals("SK")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("CZE-SL");\r
+                       else if (areaCode.equals("SM")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("ITA-SM");\r
+                       else if (areaCode.equals("TR-TUE")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("TUE-OO");\r
+                       else if (areaCode.equals("UA")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("UKR-UK");\r
+                       else if (areaCode.equals("VA")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("ITA-VC");\r
+                       else if (areaCode.equals("YU")) tdwgArea = TdwgArea.getAreaByTdwgAbbreviation("YUG");\r
+                       else                                    \r
+                               throw new UnknownCdmTypeException("Unknown Area " + areaCode);\r
+\r
+                               \r
+                       if (logger.isDebugEnabled()) {\r
+                               logger.debug(areaId + ", " + areaName + ", " + areaCode + ", " + extraLimital);\r
+                       }\r
+                       \r
+               } catch (SQLException e) {\r
+                       e.printStackTrace();\r
+                       logger.warn("Exception occurred. Area could not be mapped.");\r
+                       return null;\r
+               }       \r
+               \r
+               return tdwgArea;\r
+       }\r
+       \r
+}\r