Project

General

Profile

Download (10.1 KB) Statistics
| Branch: | Revision:
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.hibernate.HibernateProxyHelper;
26
import eu.etaxonomy.cdm.io.common.Source;
27
import eu.etaxonomy.cdm.model.common.CdmBase;
28
import eu.etaxonomy.cdm.model.common.OrderedTermVocabulary;
29
import eu.etaxonomy.cdm.model.common.TermVocabulary;
30
import eu.etaxonomy.cdm.model.description.Distribution;
31
import eu.etaxonomy.cdm.model.description.PresenceAbsenceTerm;
32
import eu.etaxonomy.cdm.model.description.TaxonDescription;
33
import eu.etaxonomy.cdm.model.location.NamedArea;
34
import eu.etaxonomy.cdm.model.taxon.Taxon;
35
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
36

    
37

    
38
/**
39
 * @author a.babadshanjan
40
 * @created 12.05.2009
41
 * @version 1.0
42
 */
43
@Component
44
public class FaunaEuropaeaDistributionImport extends FaunaEuropaeaImportBase {
45
	private static final Logger logger = Logger.getLogger(FaunaEuropaeaDistributionImport.class);
46

    
47

    
48
	@Override
49
	protected boolean doCheck(FaunaEuropaeaImportState state) {
50
		boolean result = true;
51
		FaunaEuropaeaImportConfigurator fauEuConfig = state.getConfig();
52
		logger.warn("Checking for Distributions not yet fully implemented");
53
		result &= checkReferenceStatus(fauEuConfig);
54

    
55
		return result;
56
	}
57

    
58
	private boolean checkReferenceStatus(FaunaEuropaeaImportConfigurator fauEuConfig) {
59
		boolean result = true;
60
//		try {
61
//			Source source = fauEuConfig.getSource();
62
//			String sqlStr = "";
63
	//		ResultSet rs = source.getResultSet(sqlStr);
64
			return result;
65
//		} catch (SQLException e) {
66
//			e.printStackTrace();
67
//			return false;
68
//		}
69
	}
70

    
71
	@Override
72
	protected void doInvoke(FaunaEuropaeaImportState state) {
73
		/*
74
		logger.warn("Start distribution doInvoke");
75
		ProfilerController.memorySnapshot();
76
		*/
77
		
78
		if (!state.getConfig().isDoOccurrence()){
79
			return;
80
		}
81
			
82
		int limit = state.getConfig().getLimitSave();
83
		UUID noDataUuid;
84
		/* Taxon store for retrieving taxa from and saving taxa to CDM */
85
		List<TaxonBase> taxonList = null;
86
		/* UUID store as input for retrieving taxa from CDM */
87
		Set<UUID> taxonUuids = null;
88
		/* Store to hold helper objects */
89
		Map<UUID, FaunaEuropaeaDistributionTaxon> fauEuTaxonMap = null;
90

    
91

    
92
		TransactionStatus txStatus = null;
93

    
94
		//txStatus = startTransaction();
95
		PresenceAbsenceTerm noDataStatusTerm = PresenceAbsenceTerm.NewPresenceInstance("no data", "no data", "nod");
96
		noDataUuid = noDataStatusTerm.getUuid();
97
		TermVocabulary<PresenceAbsenceTerm> voc = getVocabularyService().find(30);
98
		HibernateProxyHelper.deproxy(voc, OrderedTermVocabulary.class);
99
		//voc.addTerm(noDataStatusTerm);
100
	//	getVocabularyService().saveOrUpdate(voc);
101
		getTermService().save(noDataStatusTerm);
102
		//commitTransaction(txStatus);
103

    
104
		FaunaEuropaeaTransformer.setUUIDs(noDataUuid);
105

    
106
		FaunaEuropaeaImportConfigurator fauEuConfig = state.getConfig();
107
		Source source = fauEuConfig.getSource();
108

    
109
        int i = 0;
110

    
111
		String selectCount =
112
			" SELECT count(*) ";
113

    
114
		String selectColumns =
115
			" SELECT distribution.*, Area.*, Taxon.UUID ";
116

    
117
		String fromClause =
118
			" FROM distribution INNER JOIN " +
119
            " Area ON distribution.dis_ara_id = Area.ara_id INNER JOIN " +
120
            " Taxon ON distribution.dis_tax_id = Taxon.TAX_ID ";
121
		String orderBy = " ORDER BY distribution.dis_tax_id";
122

    
123
		String countQuery =
124
			selectCount + fromClause;
125

    
126
		String selectQuery =
127
			selectColumns + fromClause + orderBy;
128

    
129

    
130

    
131
		if(logger.isInfoEnabled()) { logger.info("Start making distributions..."); }
132

    
133
		try {
134
			ResultSet rs = source.getResultSet(countQuery);
135
			rs.next();
136
			int count = rs.getInt(1);
137

    
138
			rs = source.getResultSet(selectQuery);
139

    
140
			if (logger.isInfoEnabled()) {
141
				logger.info("Number of rows: " + count);
142
				logger.info("Count Query: " + countQuery);
143
				logger.info("Select Query: " + selectQuery);
144
			}
145

    
146
			//int taxonId;
147

    
148
			while (rs.next()) {
149
				if ((i++ % limit) == 0) {
150

    
151
					txStatus = startTransaction();
152
					taxonUuids = new HashSet<UUID>(limit);
153
					fauEuTaxonMap = new HashMap<UUID, FaunaEuropaeaDistributionTaxon>(limit);
154

    
155
					if(logger.isInfoEnabled()) {
156
						logger.info("i = " + i + " - Distribution import transaction started");
157
					}
158
				}
159

    
160
				//taxonId = rs.getInt("dis_tax_id");
161
				int disId = rs.getInt("dis_id");
162
				int occStatusId = rs.getInt("dis_present");
163
				int areaId = rs.getInt("ara_id");
164
				String areaName = rs.getString("ara_name");
165
				String areaCode = rs.getString("ara_code");
166
				int extraLimital = rs.getInt("ara_extralimital");
167
				UUID currentTaxonUuid = null;
168
				if (resultSetHasColumn(rs,"UUID")){
169
					currentTaxonUuid = UUID.fromString(rs.getString("UUID"));
170
				} else {
171
					currentTaxonUuid = UUID.randomUUID();
172
				}
173

    
174
				FaunaEuropaeaDistribution fauEuDistribution = new FaunaEuropaeaDistribution();
175
				fauEuDistribution.setDistributionId(disId);
176
				fauEuDistribution.setOccurrenceStatusId(occStatusId);
177
				fauEuDistribution.setAreaId(areaId);
178
				fauEuDistribution.setAreaName(areaName);
179
				fauEuDistribution.setAreaCode(areaCode);
180
				fauEuDistribution.setExtraLimital(extraLimital);
181

    
182
				if (!taxonUuids.contains(currentTaxonUuid)) {
183
					taxonUuids.add(currentTaxonUuid);
184
					FaunaEuropaeaDistributionTaxon fauEuDistributionTaxon =
185
						new FaunaEuropaeaDistributionTaxon(currentTaxonUuid);
186
					fauEuTaxonMap.put(currentTaxonUuid, fauEuDistributionTaxon);
187
					fauEuDistributionTaxon = null;
188
				} else {
189
					if (logger.isTraceEnabled()) {
190
						logger.trace("Taxon (" + currentTaxonUuid + ") already stored.");
191
						continue;
192
					}
193
				}
194

    
195
				fauEuTaxonMap.get(currentTaxonUuid).addDistribution(fauEuDistribution);
196

    
197
				if (((i % limit) == 0 && i != 1 ) || i == count ) {
198

    
199
					try {
200
						commitTaxaAndDistribution(state, noDataUuid, taxonUuids, fauEuTaxonMap, txStatus);
201
						taxonUuids = null;
202
						taxonList = null;
203
						fauEuTaxonMap = null;
204

    
205
					} catch (Exception e) {
206
						logger.error("Commit of taxa and distributions failed" + e.getMessage());
207
						e.printStackTrace();
208
					}
209

    
210
					if(logger.isInfoEnabled()) { logger.info("i = " + i + " - Transaction committed");}
211
				}
212

    
213

    
214
			}
215
			if (taxonUuids != null){
216
				try {
217
					commitTaxaAndDistribution(state, noDataUuid, taxonUuids, fauEuTaxonMap, txStatus);
218
					taxonUuids = null;
219
					taxonList = null;
220
					fauEuTaxonMap = null;
221
				} catch (Exception e) {
222
					logger.error("Commit of taxa and distributions failed");
223
					logger.error(e.getMessage());
224
					e.printStackTrace();
225
				}
226
			}
227
			rs = null;
228
		} catch (SQLException e) {
229
			logger.error("SQLException:" +  e);
230
			state.setUnsuccessfull();
231
		}
232

    
233
		if(logger.isInfoEnabled()) { logger.info("End making distributions..."); }
234

    
235
		
236
		return;
237
	}
238

    
239
	private void commitTaxaAndDistribution(
240
			FaunaEuropaeaImportState state, UUID noDataUuid,
241
			Set<UUID> taxonUuids,
242
			Map<UUID, FaunaEuropaeaDistributionTaxon> fauEuTaxonMap,
243
			TransactionStatus txStatus) throws Exception {
244
		 List<TaxonBase> taxonList = prepareTaxaAndDistribution(getTaxonService().find(taxonUuids), fauEuTaxonMap, noDataUuid, state);
245

    
246
		getTaxonService().save(taxonList);
247
		taxonList = null;
248
		taxonUuids = null;
249
		fauEuTaxonMap = null;
250
		commitTransaction(txStatus);
251

    
252
	}
253

    
254
	private List<TaxonBase> prepareTaxaAndDistribution(List<TaxonBase> taxonList, Map<UUID, FaunaEuropaeaDistributionTaxon> fauEuTaxonMap, UUID noData, FaunaEuropaeaImportState state) throws Exception{
255

    
256
		Distribution newDistribution = null;
257
		NamedArea namedArea;
258
		PresenceAbsenceTerm presenceAbsenceStatus;
259
		FaunaEuropaeaDistributionTaxon fauEuHelperTaxon;
260
		UUID taxonUuid;
261
		TaxonDescription taxonDescription;
262
		Taxon taxon;
263
		for (TaxonBase<?> taxonBase : taxonList) {
264

    
265
			if (taxonBase != null) {
266

    
267
				if (taxonBase instanceof Taxon) {
268
					taxon = CdmBase.deproxy(taxonBase, Taxon.class);
269
				} else {
270
					logger.warn("TaxonBase (" + taxonBase.getId() + " is not of type Taxon but: "
271
							+ taxonBase.getClass().getSimpleName());
272
					continue;
273
				}
274

    
275

    
276
				Set<TaxonDescription> descriptionSet = taxon.getDescriptions();
277
				if (descriptionSet.size() > 0) {
278
					taxonDescription = descriptionSet.iterator().next();
279
				} else {
280
					taxonDescription = TaxonDescription.NewInstance();
281
					taxon.addDescription(taxonDescription);
282
				}
283

    
284
				taxonUuid = taxonBase.getUuid();
285
				fauEuHelperTaxon= fauEuTaxonMap.get(taxonUuid);
286

    
287
				for (FaunaEuropaeaDistribution fauEuHelperDistribution : fauEuHelperTaxon.getDistributions()) {
288
					namedArea = null;
289
					newDistribution = null;
290
					presenceAbsenceStatus = null;
291

    
292
					if (fauEuHelperDistribution.getOccurrenceStatusId() != 0 && fauEuHelperDistribution.getOccurrenceStatusId() != 2 && fauEuHelperDistribution.getOccurrenceStatusId() != 1){
293
						presenceAbsenceStatus = (PresenceAbsenceTerm)getTermService().find(noData);
294
					}else{
295
						presenceAbsenceStatus = FaunaEuropaeaTransformer.occStatus2PresenceAbsence(fauEuHelperDistribution.getOccurrenceStatusId());
296
					}
297

    
298
					namedArea = FaunaEuropaeaTransformer.areaId2TdwgArea(fauEuHelperDistribution);
299

    
300
					if (namedArea == null){
301
						UUID areaUuid= FaunaEuropaeaTransformer.getUUIDByAreaAbbr(fauEuHelperDistribution.getAreaCode());
302
						if (areaUuid == null){
303
							logger.warn("Area " + fauEuHelperDistribution.getAreaCode() + "not found in FE transformer");
304
						}
305
						namedArea = getNamedArea(state, areaUuid, fauEuHelperDistribution.getAreaName(), fauEuHelperDistribution.getAreaName(), fauEuHelperDistribution.getAreaCode(), null, null);
306

    
307
					}
308

    
309
					newDistribution = Distribution.NewInstance(namedArea, presenceAbsenceStatus);
310
					newDistribution.setCreated(null);
311

    
312
					taxonDescription.addElement(newDistribution);
313
				}
314
			}
315
		}
316
		return taxonList;
317
	}
318

    
319
    @Override
320
    protected boolean isIgnore(FaunaEuropaeaImportState state){
321
		return !state.getConfig().isDoOccurrence();
322
	}
323
}
(4-4/20)