Project

General

Profile

Download (11.9 KB) Statistics
| Branch: | Revision:
1
package eu.etaxonomy.cdm.io.pesi.faunaEuropaea;
2

    
3
import java.sql.ResultSet;
4
import java.sql.SQLException;
5
import java.util.Collection;
6
import java.util.HashMap;
7
import java.util.HashSet;
8
import java.util.Iterator;
9
import java.util.List;
10
import java.util.Map;
11
import java.util.Map.Entry;
12
import java.util.Set;
13
import java.util.UUID;
14

    
15
import org.apache.log4j.Logger;
16
import org.springframework.stereotype.Component;
17
import org.springframework.transaction.TransactionStatus;
18

    
19
import eu.etaxonomy.cdm.io.common.Source;
20
import eu.etaxonomy.cdm.model.common.CdmBase;
21
import eu.etaxonomy.cdm.model.common.Language;
22
import eu.etaxonomy.cdm.model.common.TermType;
23
import eu.etaxonomy.cdm.model.common.TermVocabulary;
24
import eu.etaxonomy.cdm.model.description.CommonTaxonName;
25
import eu.etaxonomy.cdm.model.description.TaxonDescription;
26
import eu.etaxonomy.cdm.model.location.NamedArea;
27
import eu.etaxonomy.cdm.model.reference.Reference;
28
import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
29
import eu.etaxonomy.cdm.model.taxon.Synonym;
30
import eu.etaxonomy.cdm.model.taxon.Taxon;
31
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
32

    
33
@Component
34
public class FaunaEuropaeaVernacularNamesImport extends FaunaEuropaeaImportBase {
35
	private static final Logger logger = Logger.getLogger(FaunaEuropaeaVernacularNamesImport.class);
36

    
37
	private HashMap<String, Reference> sourceMap = new HashMap<String, Reference>();
38

    
39
	@Override
40
	protected void doInvoke(FaunaEuropaeaImportState state) {
41
		int limit = state.getConfig().getLimitSave();
42

    
43
		if (state.getConfig().isDoVernacularNames()){
44
			/* Taxon store for retrieving taxa from and saving taxa to CDM */
45
			List<TaxonBase> taxonList = null;
46
			/* UUID store as input for retrieving taxa from CDM */
47
			Set<UUID> taxonUuids = null;
48
			/* Store to hold helper objects */
49
			Map<UUID, FaunaEuropaeaVernacularNamesTaxon> fauEuVernacularNamesMap = null;
50

    
51

    
52
			TransactionStatus txStatus = null;
53

    
54
			createSourceMap(state);
55

    
56
			FaunaEuropaeaImportConfigurator fauEuConfig = state.getConfig();
57
			Source source = fauEuConfig.getSource();
58

    
59
	        int i = 0;
60

    
61
			String selectCount =
62
				" SELECT count(*) ";
63

    
64
			String selectColumns =
65
				" SELECT vernacularNames.*, Taxon.UUID ";
66

    
67
			String fromClause =
68
				" FROM vernacularNames INNER JOIN " +
69
	            " Taxon ON vernacularnames.UUID = Taxon.UUID ";
70
			String orderBy = " ORDER BY vernacularNames.UUID";
71

    
72
			String countQuery =
73
				selectCount + fromClause;
74

    
75
			String selectQuery =
76
				selectColumns + fromClause + orderBy;
77

    
78

    
79

    
80
			if(logger.isInfoEnabled()) { logger.info("Start making vernacular names..."); }
81

    
82
			try {
83
				ResultSet rs = source.getResultSet(countQuery);
84
				rs.next();
85
				int count = rs.getInt(1);
86

    
87
				rs = source.getResultSet(selectQuery);
88

    
89
				if (logger.isInfoEnabled()) {
90
					logger.info("Number of rows: " + count);
91
					logger.info("Count Query: " + countQuery);
92
					logger.info("Select Query: " + selectQuery);
93
				}
94

    
95
				//int taxonId;
96

    
97
				while (rs.next()) {
98
					if ((i++ % limit) == 0) {
99

    
100
						txStatus = startTransaction();
101
						taxonUuids = new HashSet<UUID>(limit);
102
						fauEuVernacularNamesMap = new HashMap<UUID, FaunaEuropaeaVernacularNamesTaxon>(limit);
103

    
104
						if(logger.isInfoEnabled()) {
105
							logger.info("i = " + i + " - vernacular names import transaction started");
106
						}
107
					}
108

    
109
					//taxonId = rs.getInt("dis_tax_id");
110
					String vernameGUID = rs.getString("GUID");
111
					String vernacularNameString = rs.getString("verName");
112
					//int taxonFk = rs.getInt("taxonFK");
113
					int languageFK= rs.getInt("languageFK");
114
					String languageCache = rs.getString("languageCache");
115
					String taxonUUID= rs.getString("UUID");
116
					String verSource = rs.getString("VerSource");
117
					UUID currentTaxonUuid = null;
118

    
119

    
120
					FaunaEuropaeaVernacularName fauEuVernacularName = new FaunaEuropaeaVernacularName();
121
					fauEuVernacularName.setGuid(vernameGUID);
122
					fauEuVernacularName.setLanguageCache(languageCache);
123
					fauEuVernacularName.setLanguageFk(languageFK);
124
					fauEuVernacularName.setVernacularName(vernacularNameString);
125
					fauEuVernacularName.setSource(verSource);
126
					fauEuVernacularName.setTaxonUuid(UUID.fromString(taxonUUID));
127
					currentTaxonUuid =UUID.fromString(taxonUUID);
128
					if (!taxonUuids.contains(currentTaxonUuid)) {
129
						taxonUuids.add(currentTaxonUuid);
130
						FaunaEuropaeaVernacularNamesTaxon fauEuVernacularNameTaxon =
131
							new FaunaEuropaeaVernacularNamesTaxon(currentTaxonUuid);
132
						fauEuVernacularNamesMap.put(currentTaxonUuid, fauEuVernacularNameTaxon);
133
						fauEuVernacularNameTaxon = null;
134
					} else {
135
						if (logger.isTraceEnabled()) {
136
							logger.trace("Taxon (" + currentTaxonUuid + ") already stored.");
137
							continue;
138
						}
139
					}
140

    
141
					fauEuVernacularNamesMap.get(currentTaxonUuid).addVernacularName(fauEuVernacularName);
142

    
143
					if (((i % limit) == 0 && i != 1 ) || i == count ) {
144

    
145
						try {
146
							commitTaxaAndVernacularNames(state,  taxonUuids, fauEuVernacularNamesMap, txStatus);
147
							taxonUuids = null;
148
							taxonList = null;
149
							fauEuVernacularNamesMap = null;
150

    
151
						} catch (Exception e) {
152
							logger.error("Commit of taxa and distributions failed" + e.getMessage());
153
							e.printStackTrace();
154
						}
155

    
156
						if(logger.isInfoEnabled()) { logger.info("i = " + i + " - Transaction committed");}
157
					}
158

    
159

    
160
				}
161
				if (taxonUuids != null){
162
					try {
163
						commitTaxaAndVernacularNames(state, taxonUuids, fauEuVernacularNamesMap, txStatus);
164
						taxonUuids = null;
165
						taxonList = null;
166
						fauEuVernacularNamesMap = null;
167
					} catch (Exception e) {
168
						logger.error("Commit of taxa and vernacular names failed");
169
						logger.error(e.getMessage());
170
						e.printStackTrace();
171
					}
172
				}
173
				rs = null;
174
			} catch (SQLException e) {
175
				logger.error("SQLException:" +  e);
176
				state.setUnsuccessfull();
177
			}
178

    
179
			if(logger.isInfoEnabled()) { logger.info("End making vernacular names..."); }
180

    
181
			return;
182
		}
183

    
184
	}
185

    
186
	@Override
187
	protected boolean doCheck(FaunaEuropaeaImportState state) {
188
		// TODO Auto-generated method stub
189
		return false;
190
	}
191

    
192
	@Override
193
	protected boolean isIgnore(FaunaEuropaeaImportState state) {
194
		// TODO Auto-generated method stub
195
		return false;
196
	}
197
	private void commitTaxaAndVernacularNames(
198
			FaunaEuropaeaImportState state,
199
			Set<UUID> taxonUuids,
200
			Map<UUID, FaunaEuropaeaVernacularNamesTaxon> fauEuTaxonMap,
201
			TransactionStatus txStatus) throws Exception {
202
		List<TaxonBase> taxonList = prepareTaxaAndVernacularNames(getTaxonService().find(taxonUuids), fauEuTaxonMap, state);
203

    
204
		getTaxonService().saveOrUpdate(taxonList);
205
		taxonList = null;
206
		taxonUuids = null;
207
		fauEuTaxonMap = null;
208
		commitTransaction(txStatus);
209

    
210
	}
211

    
212
	private List<TaxonBase> prepareTaxaAndVernacularNames(List<TaxonBase> taxonList, Map<UUID, FaunaEuropaeaVernacularNamesTaxon> fauEuTaxonMap,  FaunaEuropaeaImportState state) throws Exception{
213

    
214
		CommonTaxonName verName = null;
215

    
216

    
217
		FaunaEuropaeaVernacularNamesTaxon fauEuHelperTaxon;
218
		UUID taxonUuid;
219
		TaxonDescription taxonDescription;
220
		Taxon taxon;
221
		for (TaxonBase<?> taxonBase : taxonList) {
222

    
223
			if (taxonBase != null) {
224

    
225
				if (taxonBase instanceof Taxon) {
226
					taxon = CdmBase.deproxy(taxonBase, Taxon.class);
227
				} else {
228
					Synonym syn = CdmBase.deproxy(taxonBase, Synonym.class);
229
					taxon = syn.getAcceptedTaxon();
230
					logger.warn("TaxonBase (" + taxonBase.getId() + " is not of type Taxon but: "
231
							+ taxonBase.getClass().getSimpleName() + " using accepted Taxon for vernacular name");
232
					continue;
233
				}
234

    
235
				taxonDescription = TaxonDescription.NewInstance();
236
				taxon.addDescription(taxonDescription);
237

    
238
				taxonUuid = taxonBase.getUuid();
239
				fauEuHelperTaxon= fauEuTaxonMap.get(taxonUuid);
240

    
241
				for (FaunaEuropaeaVernacularName fauEuHelperVernacularName: fauEuHelperTaxon.getVernacularNames()) {
242

    
243
					verName = null;
244

    
245
					/*
246
					 * UUID uuid = state.getTransformer().getLanguageUuid(languageKey);
247
					result = (Language)getTermService().find(uuid);
248
				}
249
				if (result == null){
250
					result = state.getTransformer().getLanguageByKey(languageKey);
251
					if (result == null){
252
						UUID uuidLanguage;
253
						uuidLanguage = state.getTransformer().getLanguageUuid(languageKey);
254
						if (uuidLanguage == null){
255
							logger.warn("Language not defined: " + languageKey)  ;
256
						}
257
						result = getLanguage(state, uuidLanguage, languageKey, languageKey, null);
258
						if (result == null){
259
							logger.warn("Language not defined: " + languageKey)  ;
260
						}
261
					}else if (result.getId() == 0){
262
//						UUID uuidLanguageVoc = UUID.fromString("45ac7043-7f5e-4f37-92f2-3874aaaef2de");
263
						UUID uuidLanguageVoc = UUID.fromString("434cea89-9052-4567-b2db-ff77f42e9084");
264
						TermVocabulary<Language> voc = getVocabulary(TermType.Language, uuidLanguageVoc, "User Defined Languages", "User Defined Languages", null, null, false, result);
265
//						TermVocabulary<Language> voc = getVocabularyService().find(uuidLanguageVoc);
266
						voc.addTerm(result);
267
						getTermService().saveOrUpdate(result);
268
						state.putLanguage(result);
269
					}
270
					 *
271
					 */
272
					Language lang = FaunaEuropaeaTransformer.langFK2Language(fauEuHelperVernacularName.getLanguageFk());
273
					if (lang == null && fauEuHelperVernacularName.getLanguageFk() == 83){
274
						lang = Language.ENGLISH();
275
						fauEuHelperVernacularName.setArea("USA");
276
					}
277

    
278
					if (lang == null){
279
						UUID uuidLanguageVoc = UUID.fromString("434cea89-9052-4567-b2db-ff77f42e9084");
280
						logger.info("languageFk = " + fauEuHelperVernacularName.getLanguageFk());
281
						TermVocabulary<Language> voc = getVocabulary(TermType.Language, uuidLanguageVoc, "User Defined Languages", "User Defined Languages", null, null, false, lang);
282
						lang = Language.NewInstance("Dummy", "", "");
283
						voc.addTerm(lang);
284
						lang =(Language)getTermService().save(lang);
285
						FaunaEuropaeaTransformer.languageFK2Language.put(fauEuHelperVernacularName.getLanguageFk(), lang);
286
					}
287
//					if (lang.getId() == 0){
288
//						UUID uuidLanguageVoc = UUID.fromString("434cea89-9052-4567-b2db-ff77f42e9084");
289
//						TermVocabulary<Language> voc = getVocabulary(TermType.Language, uuidLanguageVoc, "User Defined Languages", "User Defined Languages", null, null, false, lang);
290
//						voc.addTerm(lang);
291
//						lang =(Language)getTermService().save(lang);
292
//						//FaunaEuropaeaTransformer.languageFK2Language.put(fauEuHelperVernacularName.getLanguageFk(), lang);
293
//					}
294

    
295
					verName = CommonTaxonName.NewInstance(fauEuHelperVernacularName.getVernacularName(), lang);
296
					if (fauEuHelperVernacularName.getArea()!= null && fauEuHelperVernacularName.getArea().equals("USA")){
297
						verName.setArea(NamedArea.NORTH_AMERICA());
298
					}
299
					verName.setCreated(null);
300
					addOriginalSource(verName, null, null, sourceMap.get(fauEuHelperVernacularName.getSource()));
301
					taxonDescription.addElement(verName);
302

    
303
				}
304
			}
305
		}
306
		return taxonList;
307
	}
308

    
309
	private void createSourceMap(FaunaEuropaeaImportState state){
310
		FaunaEuropaeaImportConfigurator fauEuConfig = state.getConfig();
311
		Source source = fauEuConfig.getSource();
312
		TransactionStatus txStatus = null;
313
		String sourceSelect = "SELECT DISTINCT vernacularNames.VerSource FROM vernacularNames group by vernacularNames.VerSource";
314
		try {
315
			txStatus =startTransaction();
316
			ResultSet rs = source.getResultSet(sourceSelect);
317
			Reference sourceRef;
318
			String title ;
319
			Set<Reference> referncesToSave = new HashSet<Reference>();
320
			while (rs.next()) {
321
				sourceRef = ReferenceFactory.newGeneric();
322
				title = rs.getString("VerSource");
323
				sourceRef.setTitle(title);
324
				referncesToSave.add(sourceRef);
325

    
326
			}
327
			commitReferences(referncesToSave, txStatus);
328

    
329
		}catch (SQLException e) {
330
			logger.error("SQLException:" +  e);
331
			state.setUnsuccessfull();
332
		}
333

    
334

    
335
	}
336
	private void commitReferences(Collection<Reference> references,  TransactionStatus txStatus) {
337
		Map <UUID, Reference> referenceMap =getReferenceService().save(references);
338
		Iterator<Entry<UUID, Reference>> it = referenceMap.entrySet().iterator();
339
		while (it.hasNext()){
340
			Reference ref = it.next().getValue();
341
			String refID = ref.getTitle();
342
			sourceMap.put(refID, ref);
343
		}
344

    
345
		commitTransaction(txStatus);
346
	}
347
}
(19-19/20)