Project

General

Profile

Download (10.4 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.io.common.Source;
26
//import eu.etaxonomy.cdm.io.profiler.ProfilerController;
27
import eu.etaxonomy.cdm.model.common.CdmBase;
28
import eu.etaxonomy.cdm.model.description.Distribution;
29
import eu.etaxonomy.cdm.model.description.PresenceAbsenceTermBase;
30
import eu.etaxonomy.cdm.model.description.PresenceTerm;
31
import eu.etaxonomy.cdm.model.description.TaxonDescription;
32
import eu.etaxonomy.cdm.model.location.NamedArea;
33
import eu.etaxonomy.cdm.model.taxon.Taxon;
34
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
35
//import com.yourkit.api.Controller;
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
	/* (non-Javadoc)
49
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IImportConfigurator)
50
	 */
51
	@Override
52
	protected boolean doCheck(FaunaEuropaeaImportState state) {
53
		boolean result = true;
54
		FaunaEuropaeaImportConfigurator fauEuConfig = state.getConfig();
55
		logger.warn("Checking for Distributions not yet fully implemented");
56
		result &= checkReferenceStatus(fauEuConfig);
57
		
58
		return result;
59
	}
60
	
61
	private boolean checkReferenceStatus(FaunaEuropaeaImportConfigurator fauEuConfig) {
62
		boolean result = true;
63
//		try {
64
//			Source source = fauEuConfig.getSource();
65
//			String sqlStr = "";
66
	//		ResultSet rs = source.getResultSet(sqlStr);
67
			return result;
68
//		} catch (SQLException e) {
69
//			e.printStackTrace();
70
//			return false;
71
//		}
72
	}
73
	
74
	/* (non-Javadoc)
75
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doInvoke(eu.etaxonomy.cdm.io.common.IoStateBase)
76
	 */
77
	@Override
78
	protected void doInvoke(FaunaEuropaeaImportState state) {	
79
		/*
80
		logger.warn("Start distribution doInvoke");
81
		ProfilerController.memorySnapshot();
82
		*/
83
		int limit = state.getConfig().getLimitSave();
84
		UUID noDataUuid;
85
		/* Taxon store for retrieving taxa from and saving taxa to CDM */
86
		List<TaxonBase> taxonList = null;
87
		/* UUID store as input for retrieving taxa from CDM */
88
		Set<UUID> taxonUuids = null;
89
		/* Store to hold helper objects */
90
		Map<UUID, FaunaEuropaeaDistributionTaxon> fauEuTaxonMap = null;
91
		
92
		
93
		TransactionStatus txStatus = null;
94
		
95
		//txStatus = startTransaction();
96
		noDataUuid = getTermService().save(PresenceTerm.NewInstance("no data", "no data", "nod"));
97
		//commitTransaction(txStatus);	
98
		
99
		FaunaEuropaeaTransformer.setUUIDs(noDataUuid);
100
		
101
		txStatus = null;
102
		
103
		FaunaEuropaeaImportConfigurator fauEuConfig = state.getConfig();
104
		Source source = fauEuConfig.getSource();
105
		
106
        int i = 0;
107
		
108
		String selectCount = 
109
			" SELECT count(*) ";
110

    
111
		String selectColumns = 
112
			" SELECT distribution.*, Area.*, Taxon.UUID ";
113
			
114
		String fromClause = 
115
			" FROM distribution INNER JOIN " +
116
            " Area ON distribution.dis_ara_id = Area.ara_id INNER JOIN " +
117
            " Taxon ON distribution.dis_tax_id = Taxon.TAX_ID ";
118
		String orderBy = " ORDER BY distribution.dis_tax_id";
119
		
120
		String countQuery = 
121
			selectCount + fromClause;
122

    
123
		String selectQuery = 
124
			selectColumns + fromClause + orderBy;
125
		
126

    
127

    
128
		if(logger.isInfoEnabled()) { logger.info("Start making distributions..."); }
129
		
130
		try {
131
			ResultSet rs = source.getResultSet(countQuery);
132
			rs.next();
133
			int count = rs.getInt(1);
134

    
135
			rs = source.getResultSet(selectQuery);
136

    
137
			if (logger.isInfoEnabled()) {
138
				logger.info("Number of rows: " + count);
139
				logger.info("Count Query: " + countQuery);
140
				logger.info("Select Query: " + selectQuery);
141
			}
142
			
143
			//int taxonId;
144
			
145
			while (rs.next()) {
146
				if ((i++ % limit) == 0) {
147

    
148
					txStatus = startTransaction();
149
					taxonUuids = new HashSet<UUID>(limit);
150
					fauEuTaxonMap = new HashMap<UUID, FaunaEuropaeaDistributionTaxon>(limit);
151

    
152
					if(logger.isInfoEnabled()) {
153
						logger.info("i = " + i + " - Distribution import transaction started"); 
154
					}
155
				}
156

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

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

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

    
192
				fauEuTaxonMap.get(currentTaxonUuid).addDistribution(fauEuDistribution);
193

    
194
				if (((i % limit) == 0 && i != 1 ) || i == count ) { 
195

    
196
					try {
197
						commitTaxaAndDistribution(state, noDataUuid, taxonUuids, fauEuTaxonMap, txStatus);
198
						taxonUuids = null;
199
						taxonList = null;
200
						fauEuTaxonMap = null;
201
						
202
					} catch (Exception e) {
203
						logger.error("Commit of taxa and distributions failed" + e.getMessage());
204
						e.printStackTrace();
205
					}
206
					
207
					if(logger.isInfoEnabled()) { logger.info("i = " + i + " - Transaction committed");}
208
				}
209

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

    
233
	private void commitTaxaAndDistribution(
234
			FaunaEuropaeaImportState state, UUID noDataUuid,
235
			Set<UUID> taxonUuids,
236
			Map<UUID, FaunaEuropaeaDistributionTaxon> fauEuTaxonMap,
237
			TransactionStatus txStatus) throws Exception {
238
		 List<TaxonBase> taxonList = prepareTaxaAndDistribution(getTaxonService().find(taxonUuids), fauEuTaxonMap, noDataUuid, state);
239

    
240
		getTaxonService().save(taxonList);
241
		commitTransaction(txStatus);
242
		
243
	}
244
	
245
	private List<TaxonBase> prepareTaxaAndDistribution(List<TaxonBase> taxonList, Map<UUID, FaunaEuropaeaDistributionTaxon> fauEuTaxonMap, UUID noData, FaunaEuropaeaImportState state) throws Exception{
246
	
247
		Distribution newDistribution = null;
248
		NamedArea namedArea;
249
		PresenceAbsenceTermBase<?> presenceAbsenceStatus;
250
		FaunaEuropaeaDistributionTaxon fauEuHelperTaxon;
251
		UUID taxonUuid;
252
		TaxonDescription taxonDescription;
253
		Taxon taxon;
254
		for (TaxonBase<?> taxonBase : taxonList) {
255

    
256
			if (taxonBase != null) {
257
				
258
				if (taxonBase instanceof Taxon) {
259
					taxon = CdmBase.deproxy(taxonBase, Taxon.class);
260
				} else {
261
					logger.warn("TaxonBase (" + taxonBase.getId() + " is not of type Taxon but: " 
262
							+ taxonBase.getClass().getSimpleName());
263
					continue;
264
				}
265
	
266
				
267
				Set<TaxonDescription> descriptionSet = taxon.getDescriptions();
268
				if (descriptionSet.size() > 0) {
269
					taxonDescription = descriptionSet.iterator().next(); 
270
				} else {
271
					taxonDescription = TaxonDescription.NewInstance();
272
					taxon.addDescription(taxonDescription);
273
				}
274
	
275
				taxonUuid = taxonBase.getUuid();
276
				fauEuHelperTaxon= fauEuTaxonMap.get(taxonUuid);
277
	
278
				for (FaunaEuropaeaDistribution fauEuHelperDistribution : fauEuHelperTaxon.getDistributions()) {
279
					namedArea = null;
280
					newDistribution = null;
281
					presenceAbsenceStatus = null;
282
					
283
					if (fauEuHelperDistribution.getOccurrenceStatusId() != 0 && fauEuHelperDistribution.getOccurrenceStatusId() != 2 && fauEuHelperDistribution.getOccurrenceStatusId() != 1){
284
						presenceAbsenceStatus = (PresenceAbsenceTermBase<?>)getTermService().find(noData);
285
					}else{
286
						presenceAbsenceStatus = FaunaEuropaeaTransformer.occStatus2PresenceAbsence(fauEuHelperDistribution.getOccurrenceStatusId());
287
					}
288

    
289
					namedArea = FaunaEuropaeaTransformer.areaId2TdwgArea(fauEuHelperDistribution);
290
					
291
					if (namedArea == null){
292
						UUID areaUuid= FaunaEuropaeaTransformer.getUUIDByAreaAbbr(fauEuHelperDistribution.getAreaCode());
293
						if (areaUuid == null){
294
							logger.warn("Area " + fauEuHelperDistribution.getAreaCode() + "not found in FE transformer");
295
						}
296
						namedArea = getNamedArea(state, areaUuid, fauEuHelperDistribution.getAreaName(), fauEuHelperDistribution.getAreaName(), fauEuHelperDistribution.getAreaCode(), null, null);
297
						
298
					}
299
					
300
					newDistribution = Distribution.NewInstance(namedArea, presenceAbsenceStatus);
301
					newDistribution.setCreated(null);
302
					
303
					taxonDescription.addElement(newDistribution);
304
				}
305
			}
306
		}
307
		return taxonList;
308
	}
309

    
310
	
311
	/* (non-Javadoc)
312
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
313
	 */
314
	protected boolean isIgnore(FaunaEuropaeaImportState state){
315
		return !state.getConfig().isDoOccurrence();
316
	}
317
}
(4-4/17)