Project

General

Profile

Download (9.78 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.model.description.Distribution;
27
import eu.etaxonomy.cdm.model.description.PresenceAbsenceTermBase;
28
import eu.etaxonomy.cdm.model.description.PresenceTerm;
29
import eu.etaxonomy.cdm.model.description.TaxonDescription;
30
import eu.etaxonomy.cdm.model.location.NamedArea;
31
import eu.etaxonomy.cdm.model.taxon.Taxon;
32
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
33

    
34

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

    
44
	
45
	/* (non-Javadoc)
46
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IImportConfigurator)
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
	/* (non-Javadoc)
72
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doInvoke(eu.etaxonomy.cdm.io.common.IImportConfigurator, eu.etaxonomy.cdm.api.application.CdmApplicationController, java.util.Map)
73
	 */
74
	@Override
75
	protected void doInvoke(FaunaEuropaeaImportState state) {	
76
		
77
		int limit = state.getConfig().getLimitSave();
78
		UUID noData;
79
		UUID doubtfullPresent;
80
		/* Taxon store for retrieving taxa from and saving taxa to CDM */
81
		List<TaxonBase> taxonList = null;
82
		/* UUID store as input for retrieving taxa from CDM */
83
		Set<UUID> taxonUuids = null;
84
		/* Store to hold helper objects */
85
		Map<UUID, FaunaEuropaeaDistributionTaxon> fauEuTaxonMap = null;
86
		
87
//		Map<UUID, TaxonBase<?>> taxonMap = null;
88
//		Set<TaxonBase<?>> taxonSet = null;
89
		
90
		TransactionStatus txStatus = null;
91
		
92
		txStatus = startTransaction();
93
			noData = getTermService().save(PresenceTerm.NewInstance("no data", "no data", "nod"));
94
			//doubtfullPresent = getTermService().save(PresenceTerm.NewInstance("doubtfull present", "doubtfull present", "dp"));
95
			HashMap<String, UUID> uuids = new HashMap<String, UUID>();
96
			uuids.put("noData", noData);
97
			logger.debug("uuid no Data: " + noData.toString() );
98
			//uuids.put("doubtfullPresent", doubtfullPresent);
99
			FaunaEuropaeaTransformer.setUUIDs(uuids);
100
		commitTransaction(txStatus);
101
		txStatus = null;
102
		FaunaEuropaeaImportConfigurator fauEuConfig = state.getConfig();
103
		Source source = fauEuConfig.getSource();
104
		
105
		String namespace = "Distribution";
106
		boolean success = true;
107
        int i = 0;
108
		
109
		String selectCount = 
110
			" SELECT count(*) ";
111

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

    
123
		String selectQuery = 
124
			selectColumns + fromClause;
125
		
126
//		String strQuery = 
127
//		" SELECT distribution.*, Area.*, Taxon.UUID " + 
128
//		" FROM distribution INNER JOIN " +
129
//        " Area ON distribution.dis_ara_id = Area.ara_id INNER JOIN " +
130
//        " Taxon ON distribution.dis_tax_id = Taxon.TAX_ID ";
131

    
132
		if(logger.isInfoEnabled()) { logger.info("Start making distributions..."); }
133
		
134
		try {
135
			ResultSet rs = source.getResultSet(countQuery);
136
			rs.next();
137
			int count = rs.getInt(1);
138

    
139
			rs = source.getResultSet(selectQuery);
140

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

    
147
			while (rs.next()) {
148

    
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
				int 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.setTaxonUuid(currentTaxonUuid);
176
//				fauEuDistribution.setTaxonId(taxonId);
177
				fauEuDistribution.setDistributionId(disId);
178
				fauEuDistribution.setOccurrenceStatusId(occStatusId);
179
				fauEuDistribution.setAreaId(areaId);
180
				fauEuDistribution.setAreaName(areaName);
181
				fauEuDistribution.setAreaCode(areaCode);
182
				fauEuDistribution.setExtraLimital(extraLimital);
183

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

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

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

    
200
					try {
201

    
202
						taxonList = getTaxonService().find(taxonUuids);
203

    
204
						for (TaxonBase taxonBase : taxonList) {
205

    
206
							if (taxonBase != null) {
207
								Taxon taxon;
208
								if (taxonBase instanceof Taxon) {
209
									taxon = taxonBase.deproxy(taxonBase, Taxon.class);
210
								} else {
211
									logger.warn("TaxonBase (" + taxonId + " is not of type Taxon but: " 
212
											+ taxonBase.getClass().getSimpleName());
213
									continue;
214
								}
215

    
216
								TaxonDescription taxonDescription;
217
								Set<TaxonDescription> descriptionSet = taxon.getDescriptions();
218
								if (descriptionSet.size() > 0) {
219
									taxonDescription = descriptionSet.iterator().next(); 
220
								} else {
221
									taxonDescription = TaxonDescription.NewInstance();
222
									taxon.addDescription(taxonDescription);
223
								}
224

    
225
								UUID taxonUuid = taxonBase.getUuid();
226
								FaunaEuropaeaDistributionTaxon fauEuHelperTaxon = fauEuTaxonMap.get(taxonUuid);
227

    
228
								for (FaunaEuropaeaDistribution fauEuHelperDistribution : fauEuHelperTaxon.getDistributions()) {
229
									PresenceAbsenceTermBase<?> presenceAbsenceStatus;
230
									
231
									if (fauEuHelperDistribution.getOccurrenceStatusId() != 0 && fauEuHelperDistribution.getOccurrenceStatusId() != 2 && fauEuHelperDistribution.getOccurrenceStatusId() != 1){
232
										presenceAbsenceStatus = (PresenceAbsenceTermBase)getTermService().find(noData);
233
									}else{
234
										presenceAbsenceStatus 
235
										= FaunaEuropaeaTransformer.occStatus2PresenceAbsence(fauEuHelperDistribution.getOccurrenceStatusId());
236
									}
237
									
238
									
239
									NamedArea namedArea = 
240
										FaunaEuropaeaTransformer.areaId2TdwgArea(fauEuHelperDistribution);
241
									
242
									if (namedArea == null){
243
										UUID areaUuid= FaunaEuropaeaTransformer.getUUIDByAreaAbbr(fauEuHelperDistribution.getAreaCode());
244
										namedArea = getNamedArea(state, areaUuid, fauEuHelperDistribution.getAreaName(), fauEuHelperDistribution.getAreaName(), fauEuHelperDistribution.getAreaCode(), null, null);
245
										
246
									}
247
									
248
									Distribution newDistribution = Distribution.NewInstance(namedArea, presenceAbsenceStatus);
249
									taxonDescription.addElement(newDistribution);
250
								}
251
							}
252
						}
253
						getTaxonService().save(taxonList);
254

    
255
						taxonUuids = null;
256
						taxonList = null;
257
						fauEuTaxonMap = null;
258
						commitTransaction(txStatus);
259
						if(logger.isInfoEnabled()) { 
260
							logger.info("i = " + i + " - Transaction committed"); 
261
						}
262

    
263
					} catch (Exception e) {
264
						logger.warn("An exception occurred when creating distribution with id " + disId);
265
						e.printStackTrace();
266
					}
267
				}
268
			}		
269
		} catch (SQLException e) {
270
			logger.error("SQLException:" +  e);
271
			state.setUnsuccessfull();
272
		}
273
		if(logger.isInfoEnabled()) { logger.info("End making distributions..."); }
274
		
275
		return;
276
	}
277

    
278
	
279
	/* (non-Javadoc)
280
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
281
	 */
282
	protected boolean isIgnore(FaunaEuropaeaImportState state){
283
		return !state.getConfig().isDoOccurrence();
284
	}
285
}
(4-4/17)