updates for Fauna Europea import
[cdmlib-apps.git] / cdm-pesi / src / main / java / eu / etaxonomy / cdm / io / pesi / faunaEuropaea / FaunaEuropaeaDistributionImport.java
1 /**
2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
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.
8 */
9
10 package eu.etaxonomy.cdm.io.pesi.faunaEuropaea;
11
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;
17 import java.util.Map;
18 import java.util.Set;
19 import java.util.UUID;
20
21 import org.apache.log4j.Logger;
22 import org.springframework.stereotype.Component;
23 import org.springframework.transaction.TransactionStatus;
24
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;
35
36
37 /**
38 * @author a.babadshanjan
39 * @created 12.05.2009
40 * @version 1.0
41 */
42 @Component
43 public class FaunaEuropaeaDistributionImport extends FaunaEuropaeaImportBase {
44 private static final Logger logger = Logger.getLogger(FaunaEuropaeaDistributionImport.class);
45
46
47 /* (non-Javadoc)
48 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IImportConfigurator)
49 */
50 @Override
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);
56
57 return result;
58 }
59
60 private boolean checkReferenceStatus(FaunaEuropaeaImportConfigurator fauEuConfig) {
61 boolean result = true;
62 // try {
63 Source source = fauEuConfig.getSource();
64 String sqlStr = "";
65 // ResultSet rs = source.getResultSet(sqlStr);
66 return result;
67 // } catch (SQLException e) {
68 // e.printStackTrace();
69 // return false;
70 // }
71 }
72
73 /* (non-Javadoc)
74 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doInvoke(eu.etaxonomy.cdm.io.common.IImportConfigurator, eu.etaxonomy.cdm.api.application.CdmApplicationController, java.util.Map)
75 */
76 /* (non-Javadoc)
77 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doInvoke(eu.etaxonomy.cdm.io.common.IoStateBase)
78 */
79 @Override
80 protected void doInvoke(FaunaEuropaeaImportState state) {
81 /*
82 logger.warn("Start distribution doInvoke");
83 ProfilerController.memorySnapshot();
84 */
85 int limit = state.getConfig().getLimitSave();
86 UUID noDataUuid;
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;
93
94
95 TransactionStatus txStatus = null;
96
97 //txStatus = startTransaction();
98 noDataUuid = getTermService().save(PresenceTerm.NewInstance("no data", "no data", "nod"));
99 //commitTransaction(txStatus);
100
101 FaunaEuropaeaTransformer.setUUIDs(noDataUuid);
102
103 txStatus = null;
104
105 FaunaEuropaeaImportConfigurator fauEuConfig = state.getConfig();
106 Source source = fauEuConfig.getSource();
107
108 int i = 0;
109
110 String selectCount =
111 " SELECT count(*) ";
112
113 String selectColumns =
114 " SELECT distribution.*, Area.*, Taxon.UUID ";
115
116 String fromClause =
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";
121
122 String countQuery =
123 selectCount + fromClause;
124
125 String selectQuery =
126 selectColumns + fromClause + orderBy;
127
128
129
130 if(logger.isInfoEnabled()) { logger.info("Start making distributions..."); }
131
132 try {
133 ResultSet rs = source.getResultSet(countQuery);
134 rs.next();
135 int count = rs.getInt(1);
136
137 rs = source.getResultSet(selectQuery);
138
139 if (logger.isInfoEnabled()) {
140 logger.info("Number of rows: " + count);
141 logger.info("Count Query: " + countQuery);
142 logger.info("Select Query: " + selectQuery);
143 }
144
145 //int taxonId;
146
147 while (rs.next()) {
148 if ((i++ % limit) == 0) {
149
150 txStatus = startTransaction();
151 taxonUuids = new HashSet<UUID>(limit);
152 fauEuTaxonMap = new HashMap<UUID, FaunaEuropaeaDistributionTaxon>(limit);
153
154 if(logger.isInfoEnabled()) {
155 logger.info("i = " + i + " - Distribution import transaction started");
156 }
157 }
158
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"));
169 } else {
170 currentTaxonUuid = UUID.randomUUID();
171 }
172
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);
180
181 if (!taxonUuids.contains(currentTaxonUuid)) {
182 taxonUuids.add(currentTaxonUuid);
183 FaunaEuropaeaDistributionTaxon fauEuDistributionTaxon =
184 new FaunaEuropaeaDistributionTaxon(currentTaxonUuid);
185 fauEuTaxonMap.put(currentTaxonUuid, fauEuDistributionTaxon);
186 fauEuDistributionTaxon = null;
187 } else {
188 if (logger.isTraceEnabled()) {
189 logger.trace("Taxon (" + currentTaxonUuid + ") already stored.");
190 continue;
191 }
192 }
193
194 fauEuTaxonMap.get(currentTaxonUuid).addDistribution(fauEuDistribution);
195
196 if (((i % limit) == 0 && i != 1 ) || i == count ) {
197
198
199
200 try {
201 commitTaxaAndDistribution(state,
202 noDataUuid, taxonUuids, fauEuTaxonMap, txStatus);
203
204 taxonUuids = null;
205 taxonList = null;
206 fauEuTaxonMap = null;
207
208
209 } catch (Exception e) {
210 logger.error("Commit of taxa and distributions failed");
211 e.printStackTrace();
212 }
213
214 if(logger.isInfoEnabled()) {
215 logger.info("i = " + i + " - Transaction committed");
216 }
217 }
218
219
220 }
221 if (taxonUuids != null){
222 try {
223 commitTaxaAndDistribution(state, noDataUuid, taxonUuids, fauEuTaxonMap, txStatus);
224 taxonUuids = null;
225 taxonList = null;
226 fauEuTaxonMap = null;
227 } catch (Exception e) {
228 logger.error("Commit of taxa and distributions failed");
229 logger.error(e.getMessage());
230 e.printStackTrace();
231 }
232 }
233 } catch (SQLException e) {
234 logger.error("SQLException:" + e);
235 state.setUnsuccessfull();
236 }
237 if(logger.isInfoEnabled()) { logger.info("End making distributions..."); }
238
239 return;
240 }
241
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);
249
250 getTaxonService().save(taxonList);
251 commitTransaction(txStatus);
252
253 }
254
255 private List<TaxonBase> prepareTaxaAndDistribution(List<TaxonBase> taxonList, Map<UUID, FaunaEuropaeaDistributionTaxon> fauEuTaxonMap, UUID noData, FaunaEuropaeaImportState state) throws Exception{
256
257 Distribution newDistribution = null;
258 NamedArea namedArea;
259 PresenceAbsenceTermBase<?> presenceAbsenceStatus;
260 FaunaEuropaeaDistributionTaxon fauEuHelperTaxon;
261 UUID taxonUuid;
262 TaxonDescription taxonDescription;
263 Taxon taxon;
264 for (TaxonBase taxonBase : taxonList) {
265
266 if (taxonBase != null) {
267
268 if (taxonBase instanceof Taxon) {
269 taxon = taxonBase.deproxy(taxonBase, Taxon.class);
270 } else {
271 logger.warn("TaxonBase (" + taxonBase.getId() + " is not of type Taxon but: "
272 + taxonBase.getClass().getSimpleName());
273 continue;
274 }
275
276
277 Set<TaxonDescription> descriptionSet = taxon.getDescriptions();
278 if (descriptionSet.size() > 0) {
279 taxonDescription = descriptionSet.iterator().next();
280 } else {
281 taxonDescription = TaxonDescription.NewInstance();
282 taxon.addDescription(taxonDescription);
283 }
284
285 taxonUuid = taxonBase.getUuid();
286 fauEuHelperTaxon= fauEuTaxonMap.get(taxonUuid);
287
288 for (FaunaEuropaeaDistribution fauEuHelperDistribution : fauEuHelperTaxon.getDistributions()) {
289 namedArea = null;
290 newDistribution = null;
291 presenceAbsenceStatus = null;
292
293 if (fauEuHelperDistribution.getOccurrenceStatusId() != 0 && fauEuHelperDistribution.getOccurrenceStatusId() != 2 && fauEuHelperDistribution.getOccurrenceStatusId() != 1){
294 presenceAbsenceStatus = (PresenceAbsenceTermBase)getTermService().find(noData);
295 }else{
296 presenceAbsenceStatus
297 = FaunaEuropaeaTransformer.occStatus2PresenceAbsence(fauEuHelperDistribution.getOccurrenceStatusId());
298 }
299
300
301
302 namedArea = FaunaEuropaeaTransformer.areaId2TdwgArea(fauEuHelperDistribution);
303
304 if (namedArea == null){
305 UUID areaUuid= FaunaEuropaeaTransformer.getUUIDByAreaAbbr(fauEuHelperDistribution.getAreaCode());
306 namedArea = getNamedArea(state, areaUuid, fauEuHelperDistribution.getAreaName(), fauEuHelperDistribution.getAreaName(), fauEuHelperDistribution.getAreaCode(), null, null);
307
308 }
309
310 newDistribution = Distribution.NewInstance(namedArea, presenceAbsenceStatus);
311 taxonDescription.addElement(newDistribution);
312 }
313 }
314 }
315 return taxonList;
316 }
317
318
319 /* (non-Javadoc)
320 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
321 */
322 protected boolean isIgnore(FaunaEuropaeaImportState state){
323 return !state.getConfig().isDoOccurrence();
324 }
325 }