Project

General

Profile

Download (15.3 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.Collection;
15
import java.util.HashMap;
16
import java.util.HashSet;
17
import java.util.Iterator;
18
import java.util.List;
19
import java.util.Map;
20
import java.util.Map.Entry;
21
import java.util.Set;
22
import java.util.UUID;
23

    
24
import org.apache.log4j.Logger;
25
import org.springframework.stereotype.Component;
26
import org.springframework.transaction.TransactionStatus;
27

    
28
import eu.etaxonomy.cdm.io.common.IImportConfigurator;
29
import eu.etaxonomy.cdm.io.common.ImportHelper;
30
import eu.etaxonomy.cdm.io.common.Source;
31
import eu.etaxonomy.cdm.model.agent.Team;
32
import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
33
import eu.etaxonomy.cdm.model.common.CdmBase;
34
import eu.etaxonomy.cdm.model.common.DescriptionElementSource;
35
import eu.etaxonomy.cdm.model.common.OriginalSourceBase;
36
import eu.etaxonomy.cdm.model.description.Feature;
37
import eu.etaxonomy.cdm.model.description.TaxonDescription;
38
import eu.etaxonomy.cdm.model.description.TextData;
39
import eu.etaxonomy.cdm.model.reference.Reference;
40
import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
41
import eu.etaxonomy.cdm.model.taxon.Synonym;
42
import eu.etaxonomy.cdm.model.taxon.Taxon;
43
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
44

    
45

    
46
/**
47
 * @author a.babadshanjan
48
 * @created 12.05.2009
49
 * @version 1.0
50
 */
51
@Component
52
public class FaunaEuropaeaRefImport extends FaunaEuropaeaImportBase {
53
	private static final Logger logger = Logger.getLogger(FaunaEuropaeaRefImport.class);
54

    
55
	/* Interval for progress info message when retrieving taxa */
56
	private int modCount = 10000;
57

    
58
	/* (non-Javadoc)
59
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IImportConfigurator)
60
	 */
61
	@Override
62
	protected boolean doCheck(FaunaEuropaeaImportState state) {
63
		boolean result = true;
64
		FaunaEuropaeaImportConfigurator fauEuConfig = state.getConfig();
65
		logger.warn("Checking for References not yet fully implemented");
66
		result &= checkReferenceStatus(fauEuConfig);
67

    
68
		return result;
69
	}
70

    
71
	private boolean checkReferenceStatus(FaunaEuropaeaImportConfigurator fauEuConfig) {
72
		boolean result = true;
73
//		try {
74
		Source source = fauEuConfig.getSource();
75
		String sqlStr = "";
76
//		ResultSet rs = source.getResultSet(sqlStr);
77
		return result;
78
//		} catch (SQLException e) {
79
//		e.printStackTrace();
80
//		return false;
81
//		}
82
	}
83
	
84
	/* (non-Javadoc)
85
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doInvoke(eu.etaxonomy.cdm.io.common.IImportConfigurator, eu.etaxonomy.cdm.api.application.CdmApplicationController, java.util.Map)
86
	 */
87
	@Override
88
	protected void doInvoke(FaunaEuropaeaImportState state) {				
89

    
90
		TransactionStatus txStatus = null;
91
		List<TaxonBase> taxonList = null;
92
		List<Reference> referenceList = null;
93
		Set<UUID> taxonUuids = null;
94
		Map<Integer, Reference> references = null;
95
		Map<String,TeamOrPersonBase> authors = null;
96
		Map<UUID, FaunaEuropaeaReferenceTaxon> fauEuTaxonMap = null;
97
		Map<Integer, UUID> referenceUuids = new HashMap<Integer, UUID>();
98
		Set<Integer> referenceIDs = null;
99
		int limit = state.getConfig().getLimitSave();
100

    
101
		FaunaEuropaeaImportConfigurator fauEuConfig = state.getConfig();
102
		Source source = fauEuConfig.getSource();
103

    
104
		String namespace = "Reference";
105
		int i = 0;
106

    
107
		String selectCountTaxRefs = 
108
			" SELECT count(*) ";
109

    
110
		String selectColumnsTaxRefs = 
111
			" SELECT Reference.*, TaxRefs.*, Taxon.UUID  ";
112
			
113
		String fromClauseTaxRefs = 
114
			" FROM TaxRefs " +
115
			" INNER JOIN Reference ON Reference.ref_id = TaxRefs.trf_ref_id " +
116
			" INNER JOIN Taxon ON TaxRefs.trf_tax_id = Taxon.TAX_ID ";
117
		
118
		String orderClauseTaxRefs = 
119
			" ORDER BY TaxRefs.trf_tax_id";
120
		
121
		String selectCountRefs = 
122
			" SELECT count(*) FROM Reference";
123

    
124
		String selectColumnsRefs = 
125
			" SELECT * FROM Reference order by ref_author";
126
		
127
			
128
		String countQueryTaxRefs = 
129
			selectCountTaxRefs + fromClauseTaxRefs;
130

    
131
		String selectQueryTaxRefs = 
132
			selectColumnsTaxRefs + fromClauseTaxRefs + orderClauseTaxRefs;
133
		
134
		String countQueryRefs = 
135
			selectCountRefs;
136

    
137
		String selectQueryRefs = 
138
			selectColumnsRefs;
139
		
140
		int count;
141
		if(logger.isInfoEnabled()) { logger.info("Start making References..."); }
142
//first add all References to CDM
143
		try {
144
			ResultSet rsRefs = source.getResultSet(countQueryRefs);
145
			rsRefs.next();
146
			count = rsRefs.getInt(1);
147
			
148
			rsRefs = source.getResultSet(selectQueryRefs);
149
            								
150
	        if (logger.isInfoEnabled()) {
151
	        	logger.info("Get all References..."); 
152
				logger.info("Number of rows: " + count);
153
				logger.info("Count Query: " + countQueryRefs);
154
				logger.info("Select Query: " + selectQueryRefs);
155
			}
156
	        
157
	        while (rsRefs.next()){
158
	        	int refId = rsRefs.getInt("ref_id");
159
				String refAuthor = rsRefs.getString("ref_author");
160
				String year = rsRefs.getString("ref_year");
161
				String title = rsRefs.getString("ref_title");
162
				
163
				if (year == null){
164
					try{		
165
						year = String.valueOf((Integer.parseInt(title)));
166
					}
167
					catch(Exception ex)   
168
					{
169
						logger.info("year is empty and " +title + " contains no integer");
170
				    }
171
				}
172
				String refSource = rsRefs.getString("ref_source");
173
	        	
174
				if ((i++ % limit) == 0) {
175

    
176
					txStatus = startTransaction();
177
					references = new HashMap<Integer,Reference>(limit);
178
					authors = new HashMap<String,TeamOrPersonBase>(limit);
179
					
180
					if(logger.isInfoEnabled()) {
181
						logger.info("i = " + i + " - Reference import transaction started"); 
182
					}
183
				}
184
				
185
				Reference<?> reference = null;
186
				TeamOrPersonBase<Team> author = null;
187
				//ReferenceFactory refFactory = ReferenceFactory.newInstance();
188
				reference = ReferenceFactory.newGeneric();
189

    
190
//				reference.setTitleCache(title);
191
				reference.setTitle(title);
192
				reference.setDatePublished(ImportHelper.getDatePublished(year));
193
				
194
				if (!authors.containsKey(refAuthor)) {
195
					if (refAuthor == null) {
196
						logger.warn("Reference author is null");
197
					}
198
					author = Team.NewInstance();
199
					author.setTitleCache(refAuthor, true);
200
					authors.put(refAuthor,author); 
201
					if (logger.isTraceEnabled()) { 
202
						logger.trace("Stored author (" + refAuthor + ")");
203
					}
204
				//}
205

    
206
				} else {
207
					author = authors.get(refAuthor);
208
					if (logger.isDebugEnabled()) { 
209
						logger.debug("Not imported author with duplicated aut_id (" + refId + 
210
							") " + refAuthor);
211
					}
212
				}
213
				
214
				reference.setAuthorTeam(author);
215
				
216
				ImportHelper.setOriginalSource(reference, fauEuConfig.getSourceReference(), refId, namespace);
217
				ImportHelper.setOriginalSource(author, fauEuConfig.getSourceReference(), refId, namespace);
218

    
219
				// Store reference
220

    
221

    
222
				if (!references.containsKey(refId)) {
223

    
224
					if (reference == null) {
225
						logger.warn("Reference is null");
226
					}
227
					references.put(refId, reference);
228
					if (logger.isTraceEnabled()) { 
229
						logger.trace("Stored reference (" + refAuthor + ")"); 
230
					}
231
				} else {
232
					if (logger.isDebugEnabled()) { 
233
						logger.debug("Duplicated reference (" + refId + ", " + refAuthor + ")");
234
					}
235
					//continue;
236
				}
237
				
238
				if (((i % limit) == 0 && i > 1 ) || i == count) { 
239
					
240
					Map <UUID, Reference> referenceMap =getReferenceService().save(references.values());
241
					logger.info("i = " + i + " - references saved"); 
242

    
243
					Iterator<Entry<UUID, Reference>> it = referenceMap.entrySet().iterator();
244
					while (it.hasNext()){
245
						Reference ref = it.next().getValue();
246
						int refID = Integer.valueOf(((OriginalSourceBase)ref.getSources().iterator().next()).getIdInSource());
247
						UUID uuid = ref.getUuid();
248
						referenceUuids.put(refID, uuid);
249
					}
250
					references= null;
251
					getAgentService().save((Collection)authors.values());
252
					
253
					authors = null;
254
				}
255
				
256
	        	
257
	        	
258
	        }
259
		}catch(SQLException e) {
260
			logger.error("SQLException:" +  e);
261
			state.setUnsuccessfull();
262
		}
263
	        
264
	        
265
	 //create the relationships between references and taxa       
266
	        
267
	        Taxon taxon = null;
268
	        i = 0;
269
	        try{
270
	        	ResultSet rsTaxRefs = source.getResultSet(countQueryTaxRefs);
271
	        	rsTaxRefs.next();
272
				count = rsTaxRefs.getInt(1);
273
				
274
				rsTaxRefs = source.getResultSet(selectQueryTaxRefs);
275
	        
276
				logger.info("Start taxon reference-relationships");
277
				FaunaEuropaeaReference fauEuReference;
278
				FaunaEuropaeaReferenceTaxon fauEuReferenceTaxon;
279
				while (rsTaxRefs.next()) {
280
					
281
					
282
					if ((i++ % limit) == 0) {
283
	
284
						txStatus = startTransaction();
285
						taxonUuids = new HashSet<UUID>(limit);
286
						referenceIDs = new HashSet<Integer>(limit);
287
						authors = new HashMap<String,TeamOrPersonBase>(limit);
288
						fauEuTaxonMap = new HashMap<UUID, FaunaEuropaeaReferenceTaxon>(limit);
289
	
290
						if(logger.isInfoEnabled()) {
291
							logger.info("i = " + i + " - Reference import transaction started"); 
292
						}
293
					}
294
					
295
	
296
					int taxonId = rsTaxRefs.getInt("trf_tax_id");
297
					int refId = rsTaxRefs.getInt("ref_id");
298
					String refAuthor = rsTaxRefs.getString("ref_author");
299
					String year = rsTaxRefs.getString("ref_year");
300
					String title = rsTaxRefs.getString("ref_title");
301
					
302
					if (year == null){
303
						try{		
304
							year = String.valueOf((Integer.parseInt(title)));
305
						}
306
						catch(Exception ex)   
307
						{
308
							logger.info("year is empty and " +title + " contains no integer");
309
					    }
310
					}
311
					String refSource = rsTaxRefs.getString("ref_source");
312
					String page = rsTaxRefs.getString("trf_page");
313
					UUID currentTaxonUuid = null;
314
					if (resultSetHasColumn(rsTaxRefs, "UUID")){
315
						currentTaxonUuid = UUID.fromString(rsTaxRefs.getString("UUID"));
316
					} else {
317
						logger.error("Taxon (" + taxonId + ") without UUID ignored");
318
						continue;
319
					}
320
	
321
					fauEuReference = new FaunaEuropaeaReference();
322
					fauEuReference.setTaxonUuid(currentTaxonUuid);
323
					fauEuReference.setReferenceId(refId);
324
					fauEuReference.setReferenceAuthor(refAuthor);
325
					fauEuReference.setReferenceYear(year);
326
					fauEuReference.setReferenceTitle(title);
327
					fauEuReference.setReferenceSource(refSource);
328
					fauEuReference.setPage(page);
329
	
330
					if (!taxonUuids.contains(currentTaxonUuid)) {
331
						taxonUuids.add(currentTaxonUuid);
332
						fauEuReferenceTaxon = 
333
							new FaunaEuropaeaReferenceTaxon(currentTaxonUuid);
334
						fauEuTaxonMap.put(currentTaxonUuid, fauEuReferenceTaxon);
335
					} else {
336
						if (logger.isTraceEnabled()) { 
337
							logger.trace("Taxon (" + currentTaxonUuid + ") already stored.");
338
							//continue; ein Taxon kann mehr als eine Referenz haben
339
						}
340
					}
341
	
342
					if (!referenceIDs.contains(refId)) {
343
	
344
						
345
						referenceIDs.add(refId);
346
						if (logger.isTraceEnabled()) { 
347
							logger.trace("Stored reference (" + refAuthor + ")"); 
348
						}
349
					} else {
350
						if (logger.isDebugEnabled()) { 
351
							logger.debug("Duplicated reference (" + refId + ", " + refAuthor + ")");
352
						}
353
						//continue;
354
					}
355
	
356
					
357
					fauEuTaxonMap.get(currentTaxonUuid).addReference(fauEuReference);
358
	
359
					
360
				
361
			
362
				if (((i % limit) == 0 && i > 1 ) || i == count) { 
363
	
364
					try {
365
	
366
						taxonList = getTaxonService().find(taxonUuids);
367
						//get UUIDs of used references
368
						Iterator itRefs = referenceIDs.iterator();
369
						Set<UUID> uuidSet = new HashSet<UUID>(referenceIDs.size());
370
						UUID uuid;
371
						while (itRefs.hasNext()){
372
							uuid = referenceUuids.get(itRefs.next());
373
							uuidSet.add(uuid);
374
						}
375
						referenceList = getReferenceService().find(uuidSet);
376
						references = new HashMap<Integer, Reference>(limit);
377
						for (Reference ref : referenceList){
378
							references.put(Integer.valueOf(((OriginalSourceBase)ref.getSources().iterator().next()).getIdInSource()), ref);
379
						}
380
						for (TaxonBase taxonBase : taxonList) {
381
	
382
							// Create descriptions
383
	
384
							if (taxonBase == null) { 
385
								if (logger.isDebugEnabled()) { 
386
									logger.debug("TaxonBase is null ");
387
								}
388
								continue; 
389
							}
390
							boolean isSynonym = taxonBase.isInstanceOf(Synonym.class);
391
							if (isSynonym) {
392
								Synonym syn = CdmBase.deproxy(taxonBase, Synonym.class);
393
								Set<Taxon> acceptedTaxa = syn.getAcceptedTaxa();
394
								if (acceptedTaxa.size() > 0) {
395
									taxon = syn.getAcceptedTaxa().iterator().next();
396
								} else {
397
	//								if (logger.isDebugEnabled()) { 
398
										logger.warn("Synonym (" + taxonBase.getUuid() + ") does not have accepted taxa");
399
	//								}
400
								}
401
							} else {
402
								taxon = CdmBase.deproxy(taxonBase, Taxon.class);
403
							}
404
	
405
							if (taxon != null) {
406
								TaxonDescription taxonDescription = null;
407
								Set<TaxonDescription> descriptions = taxon.getDescriptions();
408
								if (descriptions.size() > 0) {
409
									taxonDescription = descriptions.iterator().next(); 
410
								} else {
411
									taxonDescription = TaxonDescription.NewInstance();
412
									taxon.addDescription(taxonDescription);
413
								}
414
	
415
	
416
								UUID taxonUuid = taxonBase.getUuid();
417
								FaunaEuropaeaReferenceTaxon fauEuHelperTaxon = fauEuTaxonMap.get(taxonUuid);
418
								Reference citation;
419
								String microCitation;
420
								DescriptionElementSource originalSource;
421
								Synonym syn;
422
								for (FaunaEuropaeaReference storedReference : fauEuHelperTaxon.getReferences()) {
423
	
424
									TextData textData = TextData.NewInstance(Feature.CITATION());
425
									
426
									citation = references.get(storedReference.getReferenceId());
427
									microCitation = storedReference.getPage();
428
									originalSource = DescriptionElementSource.NewInstance(null, null, citation, microCitation, null, null);
429
									if (isSynonym){
430
										syn = CdmBase.deproxy(taxonBase, Synonym.class);
431
										originalSource.setNameUsedInSource(syn.getName());
432
									}
433
									textData.addSource(originalSource);
434
									taxonDescription.addElement(textData);
435
								}
436
							}
437
						}
438
						if(logger.isInfoEnabled()) { 
439
							logger.info("i = " + i + " - Transaction committed"); 
440
						}
441
	
442
						// save taxa
443
						getTaxonService().save(taxonList);
444
						
445
	
446
						taxonUuids = null;
447
						references = null;
448
						taxonList = null;
449
						fauEuTaxonMap = null;
450
						referenceIDs = null;
451
						referenceList = null;
452
						uuidSet = null;
453
						commitTransaction(txStatus);
454
	
455
					} catch (Exception e) {
456
						logger.warn("An exception occurred when creating reference, reference could not be saved.");
457
					}
458
				}
459
				}
460
			rsTaxRefs.close();
461
		} catch (SQLException e) {
462
			logger.error("SQLException:" +  e);
463
			state.setUnsuccessfull();
464
		}
465
		
466
		if(logger.isInfoEnabled()) { logger.info("End making references ..."); }
467
		
468
		return;
469
	}
470

    
471
	
472
	
473

    
474
	
475

    
476
	/* (non-Javadoc)
477
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
478
	 */
479
	protected boolean isIgnore(FaunaEuropaeaImportState state){
480
		return (state.getConfig().getDoReferences() == IImportConfigurator.DO_REFERENCES.NONE);
481
	}
482

    
483
}
(10-10/17)