2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
10 package eu
.etaxonomy
.cdm
.io
.pesi
.faunaEuropaea
;
12 import java
.sql
.ResultSet
;
13 import java
.sql
.SQLException
;
14 import java
.util
.HashMap
;
15 import java
.util
.HashSet
;
16 import java
.util
.List
;
19 import java
.util
.UUID
;
21 import org
.apache
.log4j
.Logger
;
22 import org
.springframework
.stereotype
.Component
;
23 import org
.springframework
.transaction
.TransactionStatus
;
25 import eu
.etaxonomy
.cdm
.io
.common
.Source
;
26 import eu
.etaxonomy
.cdm
.io
.profiler
.ProfilerController
;
27 import eu
.etaxonomy
.cdm
.model
.description
.Distribution
;
28 import eu
.etaxonomy
.cdm
.model
.description
.PresenceAbsenceTermBase
;
29 import eu
.etaxonomy
.cdm
.model
.description
.PresenceTerm
;
30 import eu
.etaxonomy
.cdm
.model
.description
.TaxonDescription
;
31 import eu
.etaxonomy
.cdm
.model
.location
.NamedArea
;
32 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
33 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonBase
;
34 import com
.yourkit
.api
.Controller
;
38 * @author a.babadshanjan
43 public class FaunaEuropaeaDistributionImport
extends FaunaEuropaeaImportBase
{
44 private static final Logger logger
= Logger
.getLogger(FaunaEuropaeaDistributionImport
.class);
48 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IImportConfigurator)
51 protected boolean doCheck(FaunaEuropaeaImportState state
) {
52 boolean result
= true;
53 FaunaEuropaeaImportConfigurator fauEuConfig
= state
.getConfig();
54 logger
.warn("Checking for Distributions not yet fully implemented");
55 result
&= checkReferenceStatus(fauEuConfig
);
60 private boolean checkReferenceStatus(FaunaEuropaeaImportConfigurator fauEuConfig
) {
61 boolean result
= true;
63 Source source
= fauEuConfig
.getSource();
65 // ResultSet rs = source.getResultSet(sqlStr);
67 // } catch (SQLException e) {
68 // e.printStackTrace();
74 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doInvoke(eu.etaxonomy.cdm.io.common.IImportConfigurator, eu.etaxonomy.cdm.api.application.CdmApplicationController, java.util.Map)
77 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doInvoke(eu.etaxonomy.cdm.io.common.IoStateBase)
80 protected void doInvoke(FaunaEuropaeaImportState state
) {
82 logger.warn("Start distribution doInvoke");
83 ProfilerController.memorySnapshot();
85 int limit
= state
.getConfig().getLimitSave();
87 /* Taxon store for retrieving taxa from and saving taxa to CDM */
88 List
<TaxonBase
> taxonList
= null;
89 /* UUID store as input for retrieving taxa from CDM */
90 Set
<UUID
> taxonUuids
= null;
91 /* Store to hold helper objects */
92 Map
<UUID
, FaunaEuropaeaDistributionTaxon
> fauEuTaxonMap
= null;
95 TransactionStatus txStatus
= null;
97 //txStatus = startTransaction();
98 noDataUuid
= getTermService().save(PresenceTerm
.NewInstance("no data", "no data", "nod"));
99 //commitTransaction(txStatus);
101 FaunaEuropaeaTransformer
.setUUIDs(noDataUuid
);
105 FaunaEuropaeaImportConfigurator fauEuConfig
= state
.getConfig();
106 Source source
= fauEuConfig
.getSource();
113 String selectColumns
=
114 " SELECT distribution.*, Area.*, Taxon.UUID ";
117 " FROM distribution INNER JOIN " +
118 " Area ON distribution.dis_ara_id = Area.ara_id INNER JOIN " +
119 " Taxon ON distribution.dis_tax_id = Taxon.TAX_ID ";
120 String orderBy
= " ORDER BY distribution.dis_tax_id";
123 selectCount
+ fromClause
;
126 selectColumns
+ fromClause
+ orderBy
;
130 if(logger
.isInfoEnabled()) { logger
.info("Start making distributions..."); }
133 ResultSet rs
= source
.getResultSet(countQuery
);
135 int count
= rs
.getInt(1);
137 rs
= source
.getResultSet(selectQuery
);
139 if (logger
.isInfoEnabled()) {
140 logger
.info("Number of rows: " + count
);
141 logger
.info("Count Query: " + countQuery
);
142 logger
.info("Select Query: " + selectQuery
);
148 if ((i
++ % limit
) == 0) {
150 txStatus
= startTransaction();
151 taxonUuids
= new HashSet
<UUID
>(limit
);
152 fauEuTaxonMap
= new HashMap
<UUID
, FaunaEuropaeaDistributionTaxon
>(limit
);
154 if(logger
.isInfoEnabled()) {
155 logger
.info("i = " + i
+ " - Distribution import transaction started");
159 //taxonId = rs.getInt("dis_tax_id");
160 int disId
= rs
.getInt("dis_id");
161 int occStatusId
= rs
.getInt("dis_present");
162 int areaId
= rs
.getInt("ara_id");
163 String areaName
= rs
.getString("ara_name");
164 String areaCode
= rs
.getString("ara_code");
165 int extraLimital
= rs
.getInt("ara_extralimital");
166 UUID currentTaxonUuid
= null;
167 if (resultSetHasColumn(rs
,"UUID")){
168 currentTaxonUuid
= UUID
.fromString(rs
.getString("UUID"));
170 currentTaxonUuid
= UUID
.randomUUID();
173 FaunaEuropaeaDistribution fauEuDistribution
= new FaunaEuropaeaDistribution();
174 fauEuDistribution
.setDistributionId(disId
);
175 fauEuDistribution
.setOccurrenceStatusId(occStatusId
);
176 fauEuDistribution
.setAreaId(areaId
);
177 fauEuDistribution
.setAreaName(areaName
);
178 fauEuDistribution
.setAreaCode(areaCode
);
179 fauEuDistribution
.setExtraLimital(extraLimital
);
181 if (!taxonUuids
.contains(currentTaxonUuid
)) {
182 taxonUuids
.add(currentTaxonUuid
);
183 FaunaEuropaeaDistributionTaxon fauEuDistributionTaxon
=
184 new FaunaEuropaeaDistributionTaxon(currentTaxonUuid
);
185 fauEuTaxonMap
.put(currentTaxonUuid
, fauEuDistributionTaxon
);
186 fauEuDistributionTaxon
= null;
188 if (logger
.isTraceEnabled()) {
189 logger
.trace("Taxon (" + currentTaxonUuid
+ ") already stored.");
194 fauEuTaxonMap
.get(currentTaxonUuid
).addDistribution(fauEuDistribution
);
196 if (((i
% limit
) == 0 && i
!= 1 ) || i
== count
) {
201 commitTaxaAndDistribution(state
,
202 noDataUuid
, taxonUuids
, fauEuTaxonMap
, txStatus
);
206 fauEuTaxonMap
= null;
209 } catch (Exception e
) {
210 logger
.error("Commit of taxa and distributions failed");
214 if(logger
.isInfoEnabled()) {
215 logger
.info("i = " + i
+ " - Transaction committed");
221 if (taxonUuids
!= null){
223 commitTaxaAndDistribution(state
, noDataUuid
, taxonUuids
, fauEuTaxonMap
, txStatus
);
226 fauEuTaxonMap
= null;
227 } catch (Exception e
) {
228 logger
.error("Commit of taxa and distributions failed");
229 logger
.error(e
.getMessage());
233 } catch (SQLException e
) {
234 logger
.error("SQLException:" + e
);
235 state
.setUnsuccessfull();
237 if(logger
.isInfoEnabled()) { logger
.info("End making distributions..."); }
242 private void commitTaxaAndDistribution(
243 FaunaEuropaeaImportState state
, UUID noDataUuid
,
244 Set
<UUID
> taxonUuids
,
245 Map
<UUID
, FaunaEuropaeaDistributionTaxon
> fauEuTaxonMap
,
246 TransactionStatus txStatus
) throws Exception
{
247 List
<TaxonBase
> taxonList
;
248 taxonList
= prepareTaxaAndDistribution(getTaxonService().find(taxonUuids
), fauEuTaxonMap
, noDataUuid
, state
);
250 getTaxonService().save(taxonList
);
251 commitTransaction(txStatus
);
255 private List
<TaxonBase
> prepareTaxaAndDistribution(List
<TaxonBase
> taxonList
, Map
<UUID
, FaunaEuropaeaDistributionTaxon
> fauEuTaxonMap
, UUID noData
, FaunaEuropaeaImportState state
) throws Exception
{
257 Distribution newDistribution
= null;
259 PresenceAbsenceTermBase
<?
> presenceAbsenceStatus
;
260 FaunaEuropaeaDistributionTaxon fauEuHelperTaxon
;
262 TaxonDescription taxonDescription
;
264 for (TaxonBase taxonBase
: taxonList
) {
266 if (taxonBase
!= null) {
268 if (taxonBase
instanceof Taxon
) {
269 taxon
= taxonBase
.deproxy(taxonBase
, Taxon
.class);
271 logger
.warn("TaxonBase (" + taxonBase
.getId() + " is not of type Taxon but: "
272 + taxonBase
.getClass().getSimpleName());
277 Set
<TaxonDescription
> descriptionSet
= taxon
.getDescriptions();
278 if (descriptionSet
.size() > 0) {
279 taxonDescription
= descriptionSet
.iterator().next();
281 taxonDescription
= TaxonDescription
.NewInstance();
282 taxon
.addDescription(taxonDescription
);
285 taxonUuid
= taxonBase
.getUuid();
286 fauEuHelperTaxon
= fauEuTaxonMap
.get(taxonUuid
);
288 for (FaunaEuropaeaDistribution fauEuHelperDistribution
: fauEuHelperTaxon
.getDistributions()) {
290 newDistribution
= null;
291 presenceAbsenceStatus
= null;
293 if (fauEuHelperDistribution
.getOccurrenceStatusId() != 0 && fauEuHelperDistribution
.getOccurrenceStatusId() != 2 && fauEuHelperDistribution
.getOccurrenceStatusId() != 1){
294 presenceAbsenceStatus
= (PresenceAbsenceTermBase
)getTermService().find(noData
);
296 presenceAbsenceStatus
297 = FaunaEuropaeaTransformer
.occStatus2PresenceAbsence(fauEuHelperDistribution
.getOccurrenceStatusId());
302 namedArea
= FaunaEuropaeaTransformer
.areaId2TdwgArea(fauEuHelperDistribution
);
304 if (namedArea
== null){
305 UUID areaUuid
= FaunaEuropaeaTransformer
.getUUIDByAreaAbbr(fauEuHelperDistribution
.getAreaCode());
306 namedArea
= getNamedArea(state
, areaUuid
, fauEuHelperDistribution
.getAreaName(), fauEuHelperDistribution
.getAreaName(), fauEuHelperDistribution
.getAreaCode(), null, null);
310 newDistribution
= Distribution
.NewInstance(namedArea
, presenceAbsenceStatus
);
311 taxonDescription
.addElement(newDistribution
);
320 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
322 protected boolean isIgnore(FaunaEuropaeaImportState state
){
323 return !state
.getConfig().isDoOccurrence();