Project

General

Profile

Download (12.2 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.description.CommonTaxonName;
23
import eu.etaxonomy.cdm.model.description.TaxonDescription;
24
import eu.etaxonomy.cdm.model.location.NamedArea;
25
import eu.etaxonomy.cdm.model.reference.Reference;
26
import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
27
import eu.etaxonomy.cdm.model.taxon.Synonym;
28
import eu.etaxonomy.cdm.model.taxon.Taxon;
29
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
30
import eu.etaxonomy.cdm.model.term.TermType;
31
import eu.etaxonomy.cdm.model.term.TermVocabulary;
32

    
33
@Component
34
public class FaunaEuropaeaVernacularNamesImport extends FaunaEuropaeaImportBase {
35

    
36
    private static final long serialVersionUID = 168771351441040059L;
37

    
38
    private static final Logger logger = Logger.getLogger(FaunaEuropaeaVernacularNamesImport.class);
39

    
40
	private HashMap<String, Reference> sourceMap = new HashMap<String, Reference>();
41
	private Reference pesiProject = ReferenceFactory.newDatabase();
42

    
43
	@Override
44
	protected void doInvoke(FaunaEuropaeaImportState state) {
45
		int limit = state.getConfig().getLimitSave();
46
		pesiProject.setTitle("PESI");
47

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

    
56

    
57
			TransactionStatus txStatus = null;
58

    
59
			createSourceMap(state);
60

    
61
			FaunaEuropaeaImportConfigurator fauEuConfig = state.getConfig();
62
			Source source = fauEuConfig.getSource();
63

    
64
	        int i = 0;
65

    
66
			String selectCount =
67
				" SELECT count(*) ";
68

    
69
			String selectColumns =
70
				" SELECT vernacularNames.*, Taxon.UUID ";
71

    
72
			String fromClause =
73
				" FROM vernacularNames INNER JOIN " +
74
	            " Taxon ON vernacularnames.UUID = Taxon.UUID ";
75
			String orderBy = " ORDER BY vernacularNames.UUID";
76

    
77
			String countQuery =
78
				selectCount + fromClause;
79

    
80
			String selectQuery =
81
				selectColumns + fromClause + orderBy;
82

    
83

    
84

    
85
			if(logger.isInfoEnabled()) { logger.info("Start making vernacular names..."); }
86

    
87
			try {
88
				ResultSet rs = source.getResultSet(countQuery);
89
				rs.next();
90
				int count = rs.getInt(1);
91

    
92
				rs = source.getResultSet(selectQuery);
93

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

    
100
				//int taxonId;
101

    
102
				while (rs.next()) {
103
					if ((i++ % limit) == 0) {
104

    
105
						txStatus = startTransaction();
106
						taxonUuids = new HashSet<UUID>(limit);
107
						fauEuVernacularNamesMap = new HashMap<UUID, FaunaEuropaeaVernacularNamesTaxon>(limit);
108

    
109
						if(logger.isInfoEnabled()) {
110
							logger.info("i = " + i + " - vernacular names import transaction started");
111
						}
112
					}
113

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

    
124

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

    
146
					fauEuVernacularNamesMap.get(currentTaxonUuid).addVernacularName(fauEuVernacularName);
147

    
148
					if (((i % limit) == 0 && i != 1 ) || i == count ) {
149

    
150
						try {
151
							commitTaxaAndVernacularNames(state,  taxonUuids, fauEuVernacularNamesMap, txStatus);
152
							taxonUuids = null;
153
							taxonList = null;
154
							fauEuVernacularNamesMap = null;
155

    
156
						} catch (Exception e) {
157
							logger.error("Commit of taxa and distributions failed" + e.getMessage());
158
							e.printStackTrace();
159
						}
160

    
161
						if(logger.isInfoEnabled()) { logger.info("i = " + i + " - Transaction committed");}
162
					}
163

    
164

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

    
184
			if(logger.isInfoEnabled()) { logger.info("End making vernacular names..."); }
185

    
186
			return;
187
		}
188

    
189
	}
190

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

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

    
209
		getTaxonService().saveOrUpdate(taxonList);
210
		taxonList = null;
211
		taxonUuids = null;
212
		fauEuTaxonMap = null;
213
		commitTransaction(txStatus);
214

    
215
	}
216

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

    
219
		CommonTaxonName verName = null;
220

    
221

    
222
		FaunaEuropaeaVernacularNamesTaxon fauEuHelperTaxon;
223
		UUID taxonUuid;
224
		TaxonDescription taxonDescription;
225
		Taxon taxon;
226
		for (TaxonBase<?> taxonBase : taxonList) {
227

    
228
			if (taxonBase != null) {
229

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

    
242
				taxon.addDescription(taxonDescription);
243

    
244
				taxonUuid = taxonBase.getUuid();
245
				fauEuHelperTaxon= fauEuTaxonMap.get(taxonUuid);
246

    
247
				for (FaunaEuropaeaVernacularName fauEuHelperVernacularName: fauEuHelperTaxon.getVernacularNames()) {
248

    
249
					verName = null;
250

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

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

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

    
311
				}
312
			}
313
		}
314
		return taxonList;
315
	}
316

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

    
334
			}
335
			commitReferences(referncesToSave, txStatus);
336

    
337
		}catch (SQLException e) {
338
			logger.error("SQLException:" +  e);
339
			state.setUnsuccessfull();
340
		}
341

    
342

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

    
353
		commitTransaction(txStatus);
354
	}
355
}
(19-19/20)