Fauna Europaea Import
[cdmlib.git] / cdmlib-io / src / main / java / eu / etaxonomy / cdm / io / faunaEuropaea / FaunaEuropaeaImportBase.java
index 01aff22ae3a7350c52c483f2e04b1fadb6543fae..57ed27050556c4331bdf42e6d6142aa8af5949e6 100644 (file)
@@ -12,31 +12,45 @@ package eu.etaxonomy.cdm.io.faunaEuropaea;
 import java.sql.ResultSet;\r
 import java.sql.ResultSetMetaData;\r
 import java.sql.SQLException;\r
+import java.util.Collection;\r
 import java.util.HashMap;\r
 import java.util.Map;\r
 \r
 import org.apache.log4j.Logger;\r
+import org.springframework.transaction.TransactionStatus;\r
 \r
 import eu.etaxonomy.cdm.common.CdmUtils;\r
+import eu.etaxonomy.cdm.io.common.CdmImportBase;\r
 import eu.etaxonomy.cdm.io.common.CdmIoBase;\r
 import eu.etaxonomy.cdm.io.common.ICdmIO;\r
+import eu.etaxonomy.cdm.io.common.ICdmImport;\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.common.Annotation;\r
+import eu.etaxonomy.cdm.model.common.CdmBase;\r
 import eu.etaxonomy.cdm.model.common.IdentifiableEntity;\r
 import eu.etaxonomy.cdm.model.common.Language;\r
+import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
 \r
 /**\r
  * @author a.babadshanjan\r
  * @created 11.05.2009\r
  * @version 1.0\r
  */\r
-public abstract class FaunaEuropaeaImportBase extends CdmIoBase<FaunaEuropeaImportState> implements ICdmIO<FaunaEuropeaImportState> {\r
+public abstract class FaunaEuropaeaImportBase extends CdmImportBase<FaunaEuropaeaImportConfigurator, FaunaEuropaeaImportState> \r
+implements ICdmImport<FaunaEuropaeaImportConfigurator,FaunaEuropaeaImportState> {\r
        private static final Logger logger = Logger.getLogger(FaunaEuropaeaImportBase.class);\r
        \r
-       public FaunaEuropaeaImportBase() {\r
-       }\r
+//     /* Max number of taxa to retrieve (for test purposes) */\r
+//     protected static final int maxTaxa = 1000;\r
+//     /* Max number of taxa to be saved with one service call */\r
+//     protected int limit = 20000; // TODO: Make configurable\r
+//     /* Interval for progress info message when retrieving taxa */\r
+//     protected static final int modCount = 10000;\r
+//     /* Highest taxon index in the FauEu database */\r
+//     protected int highestTaxonIndex = 0;\r
        \r
        protected boolean resultSetHasColumn(ResultSet rs, String columnName){\r
                try {\r
@@ -97,4 +111,67 @@ public abstract class FaunaEuropaeaImportBase extends CdmIoBase<FaunaEuropeaImpo
                }\r
        }\r
        \r
+\r
+       protected boolean saveTaxa(Map<String, MapWrapper<? extends CdmBase>> stores,\r
+                       int highestTaxonIndex, int limit) {\r
+\r
+               MapWrapper<TaxonBase> taxonStore = (MapWrapper<TaxonBase>)stores.get(ICdmIO.TAXON_STORE);\r
+\r
+               int n = 0;\r
+               int nbrOfTaxa = highestTaxonIndex;\r
+//             int nbrOfTaxa = taxonStore.size();\r
+               boolean success = true;\r
+\r
+               if(logger.isInfoEnabled()) { logger.info("Saving taxa ..."); }\r
+\r
+               if (nbrOfTaxa < limit) {             // TODO: test with critical values\r
+                       limit = nbrOfTaxa;\r
+               } else {\r
+                       n = nbrOfTaxa / limit;\r
+               }\r
+\r
+               if(logger.isInfoEnabled()) { \r
+                       logger.info("number of taxa = " + taxonStore.size() \r
+                                       + ", highest taxon index = " + highestTaxonIndex \r
+                                       + ", limit = " + limit\r
+                                       + ", n = " + n); \r
+               }\r
+\r
+               // save taxa in blocks of <=limit\r
+               \r
+               for (int j = 1; j <= n + 1; j++)\r
+               {\r
+                       int offset = j - 1;\r
+                       int start = offset * limit;\r
+\r
+                       if(logger.isInfoEnabled()) { \r
+                               logger.info("Saving taxa: " + start + " - " + (start + limit - 1)); \r
+                       }\r
+\r
+                       if(logger.isInfoEnabled()) { \r
+                               logger.info("index = " + j \r
+                                               + ", offset = " + offset\r
+                                               + ", start = " + start); \r
+                       }\r
+                       \r
+                       if (j == n + 1) {\r
+                               limit = nbrOfTaxa - n * limit;\r
+                               if(logger.isInfoEnabled()) { \r
+                                       logger.info("n = " + n + ", limit = " + limit); \r
+                               }\r
+                       }\r
+\r
+               TransactionStatus txStatus = startTransaction();\r
+               \r
+                       Collection<TaxonBase> taxonMapPart = taxonStore.objects(start, limit);\r
+                       getTaxonService().saveTaxonAll(taxonMapPart);\r
+                       taxonMapPart = null;\r
+                       taxonStore.removeObjects(start, limit);\r
+                       \r
+                       commitTransaction(txStatus);\r
+\r
+               }\r
+               \r
+               return success;\r
+       }\r
 }\r