Project

General

Profile

Download (12.1 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
	private Reference pesiProject = ReferenceFactory.newDatabase();
39

    
40
	@Override
41
	protected void doInvoke(FaunaEuropaeaImportState state) {
42
		int limit = state.getConfig().getLimitSave();
43
		pesiProject.setTitle("PESI");
44

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

    
53

    
54
			TransactionStatus txStatus = null;
55

    
56
			createSourceMap(state);
57

    
58
			FaunaEuropaeaImportConfigurator fauEuConfig = state.getConfig();
59
			Source source = fauEuConfig.getSource();
60

    
61
	        int i = 0;
62

    
63
			String selectCount =
64
				" SELECT count(*) ";
65

    
66
			String selectColumns =
67
				" SELECT vernacularNames.*, Taxon.UUID ";
68

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

    
74
			String countQuery =
75
				selectCount + fromClause;
76

    
77
			String selectQuery =
78
				selectColumns + fromClause + orderBy;
79

    
80

    
81

    
82
			if(logger.isInfoEnabled()) { logger.info("Start making vernacular names..."); }
83

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

    
89
				rs = source.getResultSet(selectQuery);
90

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

    
97
				//int taxonId;
98

    
99
				while (rs.next()) {
100
					if ((i++ % limit) == 0) {
101

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

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

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

    
121

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

    
143
					fauEuVernacularNamesMap.get(currentTaxonUuid).addVernacularName(fauEuVernacularName);
144

    
145
					if (((i % limit) == 0 && i != 1 ) || i == count ) {
146

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

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

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

    
161

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

    
181
			if(logger.isInfoEnabled()) { logger.info("End making vernacular names..."); }
182

    
183
			return;
184
		}
185

    
186
	}
187

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

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

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

    
212
	}
213

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

    
216
		CommonTaxonName verName = null;
217

    
218

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

    
225
			if (taxonBase != null) {
226

    
227
				if (taxonBase instanceof Taxon) {
228
					taxon = CdmBase.deproxy(taxonBase, Taxon.class);
229
				} else {
230
					Synonym syn = CdmBase.deproxy(taxonBase, Synonym.class);
231
					taxon = syn.getAcceptedTaxon();
232
					logger.warn("TaxonBase (" + taxonBase.getId() + " is not of type Taxon but: "
233
							+ taxonBase.getClass().getSimpleName() + " using accepted Taxon for vernacular name");
234
					continue;
235
				}
236
				taxonDescription = TaxonDescription.NewInstance();
237
				addOriginalSource(taxonDescription, null, "CommonNameDefaultImport", pesiProject);
238

    
239
				taxon.addDescription(taxonDescription);
240

    
241
				taxonUuid = taxonBase.getUuid();
242
				fauEuHelperTaxon= fauEuTaxonMap.get(taxonUuid);
243

    
244
				for (FaunaEuropaeaVernacularName fauEuHelperVernacularName: fauEuHelperTaxon.getVernacularNames()) {
245

    
246
					verName = null;
247

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

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

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

    
308
				}
309
			}
310
		}
311
		return taxonList;
312
	}
313

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

    
331
			}
332
			commitReferences(referncesToSave, txStatus);
333

    
334
		}catch (SQLException e) {
335
			logger.error("SQLException:" +  e);
336
			state.setUnsuccessfull();
337
		}
338

    
339

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

    
350
		commitTransaction(txStatus);
351
	}
352
}
(19-19/20)