Project

General

Profile

« Previous | Next » 

Revision 1542dee5

Added by Andreas Müller over 8 years ago

Import references as taxon descriptions in FauEu

  • Until now they were imported as name descriptions

View differences:

cdm-pesi/src/main/java/eu/etaxonomy/cdm/io/pesi/faunaEuropaea/FaunaEuropaeaRefImport.java
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.OriginalSourceBase;
35
import eu.etaxonomy.cdm.model.common.OriginalSourceType;
36
import eu.etaxonomy.cdm.model.description.DescriptionElementSource;
37
import eu.etaxonomy.cdm.model.description.Feature;
38
import eu.etaxonomy.cdm.model.description.TaxonNameDescription;
39
import eu.etaxonomy.cdm.model.description.TextData;
40
import eu.etaxonomy.cdm.model.reference.Reference;
41
import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
42
import eu.etaxonomy.cdm.model.taxon.Synonym;
43
import eu.etaxonomy.cdm.model.taxon.Taxon;
44
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
45

  
46

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

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

  
59
	@Override
60
	protected boolean doCheck(FaunaEuropaeaImportState state) {
61
		boolean result = true;
62
		FaunaEuropaeaImportConfigurator fauEuConfig = state.getConfig();
63
		logger.warn("Checking for References not yet fully implemented");
64
		result &= checkReferenceStatus(fauEuConfig);
65

  
66
		return result;
67
	}
68

  
69
	private boolean checkReferenceStatus(FaunaEuropaeaImportConfigurator fauEuConfig) {
70
		boolean result = true;
71
//		try {
72
		Source source = fauEuConfig.getSource();
73
		String sqlStr = "";
74
//		ResultSet rs = source.getResultSet(sqlStr);
75
		return result;
76
//		} catch (SQLException e) {
77
//		e.printStackTrace();
78
//		return false;
79
//		}
80
	}
81
	
82
	@Override
83
	protected void doInvoke(FaunaEuropaeaImportState state) {				
84
		/*
85
		logger.warn("Start RefImport doInvoke");
86
		ProfilerController.memorySnapshot();
87
		*/
88
		List<TaxonBase> taxonList = null;
89
		List<Reference> referenceList = null;
90
		Set<UUID> taxonUuids = null;
91
		Map<Integer, Reference> references = null;
92
		Map<String,TeamOrPersonBase> authors = null;
93
		Map<UUID, FaunaEuropaeaReferenceTaxon> fauEuTaxonMap = null;
94
		Map<Integer, UUID> referenceUuids = new HashMap<Integer, UUID>();
95
		Set<Integer> referenceIDs = null;
96
		int limit = state.getConfig().getLimitSave();
97

  
98
		FaunaEuropaeaImportConfigurator fauEuConfig = state.getConfig();
99
		Source source = fauEuConfig.getSource();
100

  
101
		String namespace = "Reference";
102
		int i = 0;
103

  
104
		String selectCountTaxRefs = 
105
			" SELECT count(*) ";
106

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

  
121
		String selectColumnsRefs = 
122
			" SELECT * FROM Reference order by ref_author";
123
		
124
			
125
		String countQueryTaxRefs = 
126
			selectCountTaxRefs + fromClauseTaxRefs;
127

  
128
		String selectQueryTaxRefs = 
129
			selectColumnsTaxRefs + fromClauseTaxRefs + orderClauseTaxRefs;
130
		
131
		String countQueryRefs = 
132
			selectCountRefs;
133

  
134
		String selectQueryRefs = 
135
			selectColumnsRefs;
136
		
137
		
138
		if(logger.isInfoEnabled()) { logger.info("Start making References..."); }
139
//first add all References to CDM
140
		processReferences(state, references, authors,
141
				referenceUuids, limit, fauEuConfig, source, namespace, i,
142
				countQueryRefs, selectQueryRefs);
143
	        
144
	    /*    
145
		logger.warn("Start ref taxon relationships");
146
		ProfilerController.memorySnapshot();
147
	 	*/
148
	 //create the relationships between references and taxa       
149
	        
150
        createTaxonReferenceRel(state, taxonUuids, fauEuTaxonMap,
151
				referenceUuids, referenceIDs, limit, source,
152
				countQueryTaxRefs, selectQueryTaxRefs);
153
        
154
        /*
155
		logger.warn("End RefImport doInvoke");
156
		ProfilerController.memorySnapshot();
157
		*/
158
		if(logger.isInfoEnabled()) { logger.info("End making references ..."); }
159
		
160
		return;
161
	}
162

  
163
	private void processReferences(FaunaEuropaeaImportState state,
164
			Map<Integer, Reference> references,
165
			Map<String, TeamOrPersonBase> authors,
166
			Map<Integer, UUID> referenceUuids, int limit,
167
			FaunaEuropaeaImportConfigurator fauEuConfig, Source source,
168
			String namespace, int i, String countQueryRefs,
169
			String selectQueryRefs) {
170
		TransactionStatus txStatus = null;
171
		int count;
172
		try {
173
			ResultSet rsRefs = source.getResultSet(countQueryRefs);
174
			rsRefs.next();
175
			count = rsRefs.getInt(1);
176
			
177
			rsRefs = source.getResultSet(selectQueryRefs);
178
            								
179
	        if (logger.isInfoEnabled()) {
180
	        	logger.info("Get all References..."); 
181
				logger.info("Number of rows: " + count);
182
				logger.info("Count Query: " + countQueryRefs);
183
				logger.info("Select Query: " + selectQueryRefs);
184
			}
185
	        
186
	        while (rsRefs.next()){
187
	        	int refId = rsRefs.getInt("ref_id");
188
				String refAuthor = rsRefs.getString("ref_author");
189
				String year = rsRefs.getString("ref_year");
190
				String title = rsRefs.getString("ref_title");
191
				
192
				if (year == null){
193
					try{		
194
						year = String.valueOf((Integer.parseInt(title)));
195
					}
196
					catch(Exception ex)   
197
					{
198
						logger.info("year is empty and " +title + " contains no integer");
199
				    }
200
				}
201
				String refSource = rsRefs.getString("ref_source");
202
	        	
203
				if ((i++ % limit) == 0) {
204

  
205
					txStatus = startTransaction();
206
					references = new HashMap<Integer,Reference>(limit);
207
					authors = new HashMap<String,TeamOrPersonBase>(limit);
208
					
209
					if(logger.isInfoEnabled()) {
210
						logger.info("i = " + i + " - Reference import transaction started"); 
211
					}
212
				}
213
				
214
				Reference<?> reference = null;
215
				TeamOrPersonBase<Team> author = null;
216
				//ReferenceFactory refFactory = ReferenceFactory.newInstance();
217
				reference = ReferenceFactory.newGeneric();
218

  
219
//				reference.setTitleCache(title);
220
				reference.setTitle(title);
221
				reference.setDatePublished(ImportHelper.getDatePublished(year));
222
				
223
				if (!authors.containsKey(refAuthor)) {
224
					if (refAuthor == null) {
225
						logger.warn("Reference author is null");
226
					}
227
					author = Team.NewInstance();
228
					author.setTitleCache(refAuthor, true);
229
					authors.put(refAuthor,author); 
230
					if (logger.isTraceEnabled()) { 
231
						logger.trace("Stored author (" + refAuthor + ")");
232
					}
233
				//}
234

  
235
				} else {
236
					author = authors.get(refAuthor);
237
					if (logger.isDebugEnabled()) { 
238
						logger.debug("Not imported author with duplicated aut_id (" + refId + 
239
							") " + refAuthor);
240
					}
241
				}
242
				
243
				reference.setAuthorship(author);
244
				
245
				ImportHelper.setOriginalSource(reference, fauEuConfig.getSourceReference(), refId, namespace);
246
				ImportHelper.setOriginalSource(author, fauEuConfig.getSourceReference(), refId, namespace);
247

  
248
				// Store reference
249

  
250

  
251
				if (!references.containsKey(refId)) {
252

  
253
					if (reference == null) {
254
						logger.warn("Reference is null");
255
					}
256
					references.put(refId, reference);
257
					if (logger.isTraceEnabled()) { 
258
						logger.trace("Stored reference (" + refAuthor + ")"); 
259
					}
260
				} else {
261
					if (logger.isDebugEnabled()) { 
262
						logger.debug("Duplicated reference (" + refId + ", " + refAuthor + ")");
263
					}
264
					//continue;
265
				}
266
				
267
				if (((i % limit) == 0 && i > 1 ) || i == count ) { 
268
					
269
					commitReferences(references, authors, referenceUuids, i,
270
							txStatus);
271
					references= null;
272
					authors = null;
273
				}
274
				
275
	        	
276
	        	
277
	        }
278
	        if (references != null){
279
	        	commitReferences(references, authors, referenceUuids, i, txStatus);
280
	        	references= null;
281
				authors = null;
282
	        }
283
		}catch(SQLException e) {
284
			logger.error("SQLException:" +  e);
285
			state.setUnsuccessfull();
286
		}
287
		
288
	}
289

  
290
	private void commitReferences(Map<Integer, Reference> references,
291
			Map<String, TeamOrPersonBase> authors,
292
			Map<Integer, UUID> referenceUuids, int i, TransactionStatus txStatus) {
293
		Map <UUID, Reference> referenceMap =getReferenceService().save(references.values());
294
		logger.info("i = " + i + " - references saved"); 
295

  
296
		Iterator<Entry<UUID, Reference>> it = referenceMap.entrySet().iterator();
297
		while (it.hasNext()){
298
			Reference ref = it.next().getValue();
299
			int refID = Integer.valueOf(((OriginalSourceBase)ref.getSources().iterator().next()).getIdInSource());
300
			UUID uuid = ref.getUuid();
301
			referenceUuids.put(refID, uuid);
302
		}
303
		
304
		getAgentService().save((Collection)authors.values());
305
		commitTransaction(txStatus);
306
	}
307

  
308
	private void createTaxonReferenceRel(FaunaEuropaeaImportState state,
309
			Set<UUID> taxonUuids,
310
			Map<UUID, FaunaEuropaeaReferenceTaxon> fauEuTaxonMap,
311
			Map<Integer, UUID> referenceUuids, Set<Integer> referenceIDs,
312
			int limit, Source source, String countQueryTaxRefs,
313
			String selectQueryTaxRefs) {
314
		
315
		TransactionStatus txStatus = null;
316
		List<TaxonBase> taxonList;
317
		List<Reference> referenceList;
318
		Map<Integer, Reference> references;
319
		Map<String, TeamOrPersonBase> authors;
320
		int i;
321
		int count;
322
		Taxon taxon = null;
323
		i = 0;
324
		try{
325
			ResultSet rsTaxRefs = source.getResultSet(countQueryTaxRefs);
326
			rsTaxRefs.next();
327
			count = rsTaxRefs.getInt(1);
328
			
329
			rsTaxRefs = source.getResultSet(selectQueryTaxRefs);
330
		
331
			logger.info("Start taxon reference-relationships");
332
			FaunaEuropaeaReference fauEuReference;
333
			FaunaEuropaeaReferenceTaxon fauEuReferenceTaxon;
334
			while (rsTaxRefs.next()) {
335
				
336
				
337
				if ((i++ % limit) == 0) {
338

  
339
					txStatus = startTransaction();
340
					taxonUuids = new HashSet<UUID>(limit);
341
					referenceIDs = new HashSet<Integer>(limit);
342
					authors = new HashMap<String,TeamOrPersonBase>(limit);
343
					fauEuTaxonMap = new HashMap<UUID, FaunaEuropaeaReferenceTaxon>(limit);
344

  
345
					if(logger.isInfoEnabled()) {
346
						logger.info("i = " + i + " - Reference import transaction started"); 
347
					}
348
				}
349
				
350

  
351
				int taxonId = rsTaxRefs.getInt("trf_tax_id");
352
				int refId = rsTaxRefs.getInt("ref_id");
353
				String refAuthor = rsTaxRefs.getString("ref_author");
354
				String year = rsTaxRefs.getString("ref_year");
355
				String title = rsTaxRefs.getString("ref_title");
356
				
357
				if (year == null){
358
					try{		
359
						year = String.valueOf((Integer.parseInt(title)));
360
					}
361
					catch(Exception ex)   
362
					{
363
						logger.info("year is empty and " +title + " contains no integer");
364
				    }
365
				}
366
				String refSource = rsTaxRefs.getString("ref_source");
367
				String page = rsTaxRefs.getString("trf_page");
368
				UUID currentTaxonUuid = null;
369
				if (resultSetHasColumn(rsTaxRefs, "UUID")){
370
					currentTaxonUuid = UUID.fromString(rsTaxRefs.getString("UUID"));
371
				} else {
372
					logger.error("Taxon (" + taxonId + ") without UUID ignored");
373
					continue;
374
				}
375

  
376
				fauEuReference = new FaunaEuropaeaReference();
377
				fauEuReference.setTaxonUuid(currentTaxonUuid);
378
				fauEuReference.setReferenceId(refId);
379
				fauEuReference.setReferenceAuthor(refAuthor);
380
				fauEuReference.setReferenceYear(year);
381
				fauEuReference.setReferenceTitle(title);
382
				fauEuReference.setReferenceSource(refSource);
383
				fauEuReference.setPage(page);
384

  
385
				if (!taxonUuids.contains(currentTaxonUuid)) {
386
					taxonUuids.add(currentTaxonUuid);
387
					fauEuReferenceTaxon = 
388
						new FaunaEuropaeaReferenceTaxon(currentTaxonUuid);
389
					fauEuTaxonMap.put(currentTaxonUuid, fauEuReferenceTaxon);
390
				} else {
391
					if (logger.isTraceEnabled()) { 
392
						logger.trace("Taxon (" + currentTaxonUuid + ") already stored.");
393
						//continue; ein Taxon kann mehr als eine Referenz haben
394
					}
395
				}
396

  
397
				if (!referenceIDs.contains(refId)) {
398

  
399
					
400
					referenceIDs.add(refId);
401
					if (logger.isTraceEnabled()) { 
402
						logger.trace("Stored reference (" + refAuthor + ")"); 
403
					}
404
				} else {
405
					if (logger.isDebugEnabled()) { 
406
						logger.debug("Duplicated reference (" + refId + ", " + refAuthor + ")");
407
					}
408
					//continue;
409
				}
410

  
411
				
412
				fauEuTaxonMap.get(currentTaxonUuid).addReference(fauEuReference);
413

  
414
				
415
			
416
		
417
				if (((i % limit) == 0 && i > 1 ) || i == count) { 
418
	
419
					try {
420
	
421
						Set<UUID> uuidSet;
422
						commitTaxaReferenceRel(taxonUuids, fauEuTaxonMap,
423
								referenceUuids, referenceIDs, limit, txStatus, i,
424
								taxon);
425
	
426
						taxonUuids = null;
427
						references = null;
428
						taxonList = null;
429
						fauEuTaxonMap = null;
430
						referenceIDs = null;
431
						referenceList = null;
432
						uuidSet = null;
433
						
434
	
435
					} catch (Exception e) {
436
						logger.warn("An exception occurred when creating reference, reference could not be saved.");
437
					}
438
				}
439
			}
440
			if (taxonUuids != null){
441
				commitTaxaReferenceRel(taxonUuids, fauEuTaxonMap,
442
						referenceUuids, referenceIDs, limit, txStatus, i,
443
						taxon);
444
			}
445
			rsTaxRefs.close();
446
		} catch (SQLException e) {
447
				logger.error("SQLException:" +  e);
448
				state.setUnsuccessfull();
449
		}
450
		taxonUuids = null;
451
		references = null;
452
		taxonList = null;
453
		fauEuTaxonMap = null;
454
		referenceIDs = null;
455
		referenceList = null;
456
		
457
		
458
	}
459

  
460
	private void commitTaxaReferenceRel(Set<UUID> taxonUuids,
461
			Map<UUID, FaunaEuropaeaReferenceTaxon> fauEuTaxonMap,
462
			Map<Integer, UUID> referenceUuids, Set<Integer> referenceIDs,
463
			int limit, TransactionStatus txStatus, int i, Taxon taxon) {
464
		List<TaxonBase> taxonList;
465
		List<Reference> referenceList;
466
		Map<Integer, Reference> references;
467
		taxonList = getTaxonService().find(taxonUuids);
468
		//get UUIDs of used references
469
		Iterator itRefs = referenceIDs.iterator();
470
		Set<UUID> uuidSet = new HashSet<UUID>(referenceIDs.size());
471
		UUID uuid;
472
		while (itRefs.hasNext()){
473
			uuid = referenceUuids.get(itRefs.next());
474
			uuidSet.add(uuid);
475
		}
476
		referenceList = getReferenceService().find(uuidSet);
477
		references = new HashMap<Integer, Reference>(limit);
478
		for (Reference ref : referenceList){
479
			references.put(Integer.valueOf(((OriginalSourceBase)ref.getSources().iterator().next()).getIdInSource()), ref);
480
		}
481
		for (TaxonBase taxonBase : taxonList) {
482

  
483
			// Create descriptions
484

  
485
			if (taxonBase == null) { 
486
				if (logger.isDebugEnabled()) { 
487
					logger.debug("TaxonBase is null ");
488
				}
489
				continue; 
490
			}
491
			boolean isSynonym = taxonBase.isInstanceOf(Synonym.class);
492
			if (isSynonym) {
493
				Synonym syn = CdmBase.deproxy(taxonBase, Synonym.class);
494
				Set<Taxon> acceptedTaxa = syn.getAcceptedTaxa();
495
				if (acceptedTaxa.size() > 0) {
496
					taxon = syn.getAcceptedTaxa().iterator().next();
497
					//logger.warn("Synonym (" + taxonBase.getUuid() + ") has accepted taxon" + taxon.getUuid());
498
				} else {
499
//								if (logger.isDebugEnabled()) { 
500
					logger.warn("Synonym (" + taxonBase.getUuid() + ") does not have accepted taxa");
501
//								}
502
				}
503
			} else {
504
				taxon = CdmBase.deproxy(taxonBase, Taxon.class);
505
			}
506
//TODO: statt TaxonDescription TaxonNameDescription und an den Namen anstatt ans Taxon hängen!!!
507
			if (taxon != null) {
508
				TaxonNameDescription taxonNameDescription = null;
509
				Set<TaxonNameDescription> descriptions = taxon.getName().getDescriptions();
510
				if (descriptions.size() > 0) {
511
					taxonNameDescription = descriptions.iterator().next(); 
512
				} else {
513
					taxonNameDescription = TaxonNameDescription.NewInstance();
514
					taxon.getName().addDescription(taxonNameDescription);
515
				}
516

  
517

  
518
				UUID taxonUuid = taxonBase.getUuid();
519
				FaunaEuropaeaReferenceTaxon fauEuHelperTaxon = fauEuTaxonMap.get(taxonUuid);
520
				Reference<?> citation;
521
				String microCitation;
522
				DescriptionElementSource originalSource;
523
				Synonym syn;
524
				for (FaunaEuropaeaReference storedReference : fauEuHelperTaxon.getReferences()) {
525

  
526
					TextData textData = TextData.NewInstance(Feature.CITATION());
527
					
528
					citation = references.get(storedReference.getReferenceId());
529
					microCitation = storedReference.getPage();
530
					originalSource = DescriptionElementSource.NewInstance(OriginalSourceType.PrimaryTaxonomicSource, null, null, citation, microCitation, null, null);
531
					if (isSynonym){
532
						syn = CdmBase.deproxy(taxonBase, Synonym.class);
533
						originalSource.setNameUsedInSource(syn.getName());
534
					}
535
					textData.addSource(originalSource);
536
					taxonNameDescription.addElement(textData);
537
				}
538
			}
539
		}
540
		if(logger.isInfoEnabled()) { 
541
			logger.info("i = " + i + " - Transaction committed"); 
542
		}
543

  
544
		// save taxa
545
		getTaxonService().save(taxonList);
546
		commitTransaction(txStatus);
547
		
548
	}
549

  
550
	@Override
551
	protected boolean isIgnore(FaunaEuropaeaImportState state){
552
		return (state.getConfig().getDoReferences() == IImportConfigurator.DO_REFERENCES.NONE);
553
	}
554

  
555
}
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.OriginalSourceBase;
35
import eu.etaxonomy.cdm.model.common.OriginalSourceType;
36
import eu.etaxonomy.cdm.model.description.DescriptionElementSource;
37
import eu.etaxonomy.cdm.model.description.Feature;
38
import eu.etaxonomy.cdm.model.description.TaxonDescription;
39
import eu.etaxonomy.cdm.model.description.TextData;
40
import eu.etaxonomy.cdm.model.reference.Reference;
41
import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
42
import eu.etaxonomy.cdm.model.taxon.Synonym;
43
import eu.etaxonomy.cdm.model.taxon.Taxon;
44
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
45

  
46

  
47
/**
48
 * @author a.babadshanjan
49
 * @created 12.05.2009
50
 * @version 1.0
51
 */
52
@Component
53
public class FaunaEuropaeaRefImport extends FaunaEuropaeaImportBase {
54
    private static final long serialVersionUID = -586555645981648177L;
55

  
56
    private static final Logger logger = Logger.getLogger(FaunaEuropaeaRefImport.class);
57

  
58
	@Override
59
	protected boolean doCheck(FaunaEuropaeaImportState state) {
60
		boolean result = true;
61
		FaunaEuropaeaImportConfigurator fauEuConfig = state.getConfig();
62
		logger.warn("Checking for References not yet fully implemented");
63
//		result &= checkReferenceStatus(fauEuConfig);
64

  
65
		return result;
66
	}
67

  
68
	@Override
69
	protected void doInvoke(FaunaEuropaeaImportState state) {
70
		/*
71
		logger.warn("Start RefImport doInvoke");
72
		ProfilerController.memorySnapshot();
73
		*/
74

  
75
		Set<UUID> taxonUuids = null;
76
		Map<Integer, Reference<?>> references = null;
77
		Map<String,TeamOrPersonBase<?>> authors = null;
78
		Map<UUID, FaunaEuropaeaReferenceTaxon> fauEuTaxonMap = null;
79
		Map<Integer, UUID> referenceUuids = new HashMap<Integer, UUID>();
80
		Set<Integer> referenceIDs = null;
81
		int limit = state.getConfig().getLimitSave();
82

  
83
		FaunaEuropaeaImportConfigurator fauEuConfig = state.getConfig();
84
		Source source = fauEuConfig.getSource();
85

  
86
		String namespace = "Reference";
87
		int i = 0;
88

  
89
		String selectCountTaxRefs =
90
			" SELECT count(*) ";
91

  
92
		String selectColumnsTaxRefs =
93
			" SELECT Reference.*, TaxRefs.*, Taxon.UUID  ";
94

  
95
		String fromClauseTaxRefs =
96
			" FROM TaxRefs " +
97
			" INNER JOIN Reference ON Reference.ref_id = TaxRefs.trf_ref_id " +
98
			" INNER JOIN Taxon ON TaxRefs.trf_tax_id = Taxon.TAX_ID ";
99

  
100
		String orderClauseTaxRefs =
101
			" ORDER BY TaxRefs.trf_tax_id";
102

  
103
		String selectCountRefs =
104
			" SELECT count(*) FROM Reference";
105

  
106
		String selectColumnsRefs =
107
			" SELECT * FROM Reference order by ref_author";
108

  
109

  
110
		String countQueryTaxRefs =
111
			selectCountTaxRefs + fromClauseTaxRefs;
112

  
113
		String selectQueryTaxRefs =
114
			selectColumnsTaxRefs + fromClauseTaxRefs + orderClauseTaxRefs;
115

  
116
		String countQueryRefs =
117
			selectCountRefs;
118

  
119
		String selectQueryRefs =
120
			selectColumnsRefs;
121

  
122

  
123
		if(logger.isInfoEnabled()) { logger.info("Start making References..."); }
124
		//first add all References to CDM
125
		processReferences(state, references, authors,
126
				referenceUuids, limit, fauEuConfig, source, namespace, i,
127
				countQueryRefs, selectQueryRefs);
128

  
129
	    /*
130
		logger.warn("Start ref taxon relationships");
131
		ProfilerController.memorySnapshot();
132
	 	*/
133
	 //create the relationships between references and taxa
134

  
135
        createTaxonReferenceRel(state, taxonUuids, fauEuTaxonMap,
136
				referenceUuids, referenceIDs, limit, source,
137
				countQueryTaxRefs, selectQueryTaxRefs);
138

  
139
        /*
140
		logger.warn("End RefImport doInvoke");
141
		ProfilerController.memorySnapshot();
142
		*/
143
		if(logger.isInfoEnabled()) { logger.info("End making references ..."); }
144

  
145
		return;
146
	}
147

  
148
	private void processReferences(FaunaEuropaeaImportState state,
149
			Map<Integer, Reference<?>> references,
150
			Map<String, TeamOrPersonBase<?>> authors,
151
			Map<Integer, UUID> referenceUuids, int limit,
152
			FaunaEuropaeaImportConfigurator fauEuConfig, Source source,
153
			String namespace, int i, String countQueryRefs,
154
			String selectQueryRefs) {
155
		TransactionStatus txStatus = null;
156
		int count;
157
		try {
158
			ResultSet rsRefs = source.getResultSet(countQueryRefs);
159
			rsRefs.next();
160
			count = rsRefs.getInt(1);
161

  
162
			rsRefs = source.getResultSet(selectQueryRefs);
163

  
164
	        if (logger.isInfoEnabled()) {
165
	        	logger.info("Get all References...");
166
				logger.info("Number of rows: " + count);
167
				logger.info("Count Query: " + countQueryRefs);
168
				logger.info("Select Query: " + selectQueryRefs);
169
			}
170

  
171
	        while (rsRefs.next()){
172
	        	int refId = rsRefs.getInt("ref_id");
173
				String refAuthor = rsRefs.getString("ref_author");
174
				String year = rsRefs.getString("ref_year");
175
				String title = rsRefs.getString("ref_title");
176

  
177
				if (year == null){
178
					try{
179
						year = String.valueOf((Integer.parseInt(title)));
180
					}
181
					catch(Exception ex)
182
					{
183
						logger.info("year is empty and " +title + " contains no integer");
184
				    }
185
				}
186
				String refSource = rsRefs.getString("ref_source");
187

  
188
				if ((i++ % limit) == 0) {
189

  
190
					txStatus = startTransaction();
191
					references = new HashMap<Integer,Reference<?>>(limit);
192
					authors = new HashMap<String,TeamOrPersonBase<?>>(limit);
193

  
194
					if(logger.isInfoEnabled()) {
195
						logger.info("i = " + i + " - Reference import transaction started");
196
					}
197
				}
198

  
199
				Reference<?> reference = null;
200
				TeamOrPersonBase<?> author = null;
201
				//ReferenceFactory refFactory = ReferenceFactory.newInstance();
202
				reference = ReferenceFactory.newGeneric();
203

  
204
//				reference.setTitleCache(title);
205
				reference.setTitle(title);
206
				reference.setDatePublished(ImportHelper.getDatePublished(year));
207

  
208
				if (!authors.containsKey(refAuthor)) {
209
					if (refAuthor == null) {
210
						logger.warn("Reference author is null");
211
					}
212
					author = Team.NewInstance();
213
					author.setTitleCache(refAuthor, true);
214
					authors.put(refAuthor,author);
215
					if (logger.isTraceEnabled()) {
216
						logger.trace("Stored author (" + refAuthor + ")");
217
					}
218
				//}
219

  
220
				} else {
221
					author = authors.get(refAuthor);
222
					if (logger.isDebugEnabled()) {
223
						logger.debug("Not imported author with duplicated aut_id (" + refId +
224
							") " + refAuthor);
225
					}
226
				}
227

  
228
				reference.setAuthorship(author);
229

  
230
				ImportHelper.setOriginalSource(reference, fauEuConfig.getSourceReference(), refId, namespace);
231
				ImportHelper.setOriginalSource(author, fauEuConfig.getSourceReference(), refId, namespace);
232

  
233
				// Store reference
234

  
235

  
236
				if (!references.containsKey(refId)) {
237

  
238
					if (reference == null) {
239
						logger.warn("Reference is null");
240
					}
241
					references.put(refId, reference);
242
					if (logger.isTraceEnabled()) {
243
						logger.trace("Stored reference (" + refAuthor + ")");
244
					}
245
				} else {
246
					if (logger.isDebugEnabled()) {
247
						logger.debug("Duplicated reference (" + refId + ", " + refAuthor + ")");
248
					}
249
					//continue;
250
				}
251

  
252
				if (((i % limit) == 0 && i > 1 ) || i == count ) {
253

  
254
					commitReferences(references, authors, referenceUuids, i,
255
							txStatus);
256
					references= null;
257
					authors = null;
258
				}
259

  
260

  
261

  
262
	        }
263
	        if (references != null){
264
	        	commitReferences(references, authors, referenceUuids, i, txStatus);
265
	        	references= null;
266
				authors = null;
267
	        }
268
		}catch(SQLException e) {
269
			logger.error("SQLException:" +  e);
270
			state.setUnsuccessfull();
271
		}
272

  
273
	}
274

  
275
	private void commitReferences(Map<Integer, Reference<?>> references,
276
			Map<String, TeamOrPersonBase<?>> authors,
277
			Map<Integer, UUID> referenceUuids, int i, TransactionStatus txStatus) {
278
		Map <UUID, Reference> referenceMap =getReferenceService().save((Collection)references.values());
279
		logger.info("i = " + i + " - references saved");
280

  
281
		Iterator<Entry<UUID, Reference>> it = referenceMap.entrySet().iterator();
282
		while (it.hasNext()){
283
			Reference<?> ref = it.next().getValue();
284
			int refID = Integer.valueOf((ref.getSources().iterator().next()).getIdInSource());
285
			UUID uuid = ref.getUuid();
286
			referenceUuids.put(refID, uuid);
287
		}
288

  
289
		getAgentService().save((Collection)authors.values());
290
		commitTransaction(txStatus);
291
	}
292

  
293
	private void createTaxonReferenceRel(FaunaEuropaeaImportState state,
294
			Set<UUID> taxonUuids,
295
			Map<UUID, FaunaEuropaeaReferenceTaxon> fauEuTaxonMap,
296
			Map<Integer, UUID> referenceUuids, Set<Integer> referenceIDs,
297
			int limit, Source source, String countQueryTaxRefs,
298
			String selectQueryTaxRefs) {
299

  
300
		TransactionStatus txStatus = null;
301
		int i;
302
		int count;
303
		Taxon taxon = null;
304
		i = 0;
305
		try{
306
			ResultSet rsTaxRefs = source.getResultSet(countQueryTaxRefs);
307
			rsTaxRefs.next();
308
			count = rsTaxRefs.getInt(1);
309

  
310
			rsTaxRefs = source.getResultSet(selectQueryTaxRefs);
311

  
312
			logger.info("Start taxon reference-relationships");
313
			FaunaEuropaeaReference fauEuReference;
314
			FaunaEuropaeaReferenceTaxon fauEuReferenceTaxon;
315
			while (rsTaxRefs.next()) {
316

  
317

  
318
				if ((i++ % limit) == 0) {
319

  
320
					txStatus = startTransaction();
321
					taxonUuids = new HashSet<UUID>(limit);
322
					referenceIDs = new HashSet<Integer>(limit);
323
					fauEuTaxonMap = new HashMap<UUID, FaunaEuropaeaReferenceTaxon>(limit);
324

  
325
					if(logger.isInfoEnabled()) {
326
						logger.info("i = " + i + " - Reference import transaction started");
327
					}
328
				}
329

  
330

  
331
				int taxonId = rsTaxRefs.getInt("trf_tax_id");
332
				int refId = rsTaxRefs.getInt("ref_id");
333
				String refAuthor = rsTaxRefs.getString("ref_author");
334
				String year = rsTaxRefs.getString("ref_year");
335
				String title = rsTaxRefs.getString("ref_title");
336

  
337
				if (year == null){
338
					try{
339
						year = String.valueOf((Integer.parseInt(title)));
340
					}
341
					catch(Exception ex)
342
					{
343
						logger.info("year is empty and " +title + " contains no integer");
344
				    }
345
				}
346
				String refSource = rsTaxRefs.getString("ref_source");
347
				String page = rsTaxRefs.getString("trf_page");
348
				UUID currentTaxonUuid = null;
349
				if (resultSetHasColumn(rsTaxRefs, "UUID")){
350
					currentTaxonUuid = UUID.fromString(rsTaxRefs.getString("UUID"));
351
				} else {
352
					logger.error("Taxon (" + taxonId + ") without UUID ignored");
353
					continue;
354
				}
355

  
356
				fauEuReference = new FaunaEuropaeaReference();
357
				fauEuReference.setTaxonUuid(currentTaxonUuid);
358
				fauEuReference.setReferenceId(refId);
359
				fauEuReference.setReferenceAuthor(refAuthor);
360
				fauEuReference.setReferenceYear(year);
361
				fauEuReference.setReferenceTitle(title);
362
				fauEuReference.setReferenceSource(refSource);
363
				fauEuReference.setPage(page);
364

  
365
				if (!taxonUuids.contains(currentTaxonUuid)) {
366
					taxonUuids.add(currentTaxonUuid);
367
					fauEuReferenceTaxon =
368
						new FaunaEuropaeaReferenceTaxon(currentTaxonUuid);
369
					fauEuTaxonMap.put(currentTaxonUuid, fauEuReferenceTaxon);
370
				} else {
371
					if (logger.isTraceEnabled()) {
372
						logger.trace("Taxon (" + currentTaxonUuid + ") already stored.");
373
						//continue; ein Taxon kann mehr als eine Referenz haben
374
					}
375
				}
376

  
377
				if (!referenceIDs.contains(refId)) {
378

  
379

  
380
					referenceIDs.add(refId);
381
					if (logger.isTraceEnabled()) {
382
						logger.trace("Stored reference (" + refAuthor + ")");
383
					}
384
				} else {
385
					if (logger.isDebugEnabled()) {
386
						logger.debug("Duplicated reference (" + refId + ", " + refAuthor + ")");
387
					}
388
					//continue;
389
				}
390

  
391
				fauEuTaxonMap.get(currentTaxonUuid).addReference(fauEuReference);
392

  
393
				if (((i % limit) == 0 && i > 1 ) || i == count) {
394

  
395
					try {
396
						commitTaxaReferenceRel(taxonUuids, fauEuTaxonMap,
397
								referenceUuids, referenceIDs, limit, txStatus, i,
398
								taxon);
399

  
400
						taxonUuids = null;
401

  
402
						fauEuTaxonMap = null;
403
						referenceIDs = null;
404

  
405
					} catch (Exception e) {
406
						logger.warn("An exception occurred when creating reference, reference could not be saved.");
407
					}
408
				}
409
			}
410
			if (taxonUuids != null){
411
				commitTaxaReferenceRel(taxonUuids, fauEuTaxonMap,
412
						referenceUuids, referenceIDs, limit, txStatus, i,
413
						taxon);
414
			}
415
			rsTaxRefs.close();
416
		} catch (SQLException e) {
417
				logger.error("SQLException:" +  e);
418
				state.setUnsuccessfull();
419
		}
420
		taxonUuids = null;
421

  
422
		fauEuTaxonMap = null;
423
		referenceIDs = null;
424

  
425
	}
426

  
427
	private void commitTaxaReferenceRel(Set<UUID> taxonUuids,
428
			Map<UUID, FaunaEuropaeaReferenceTaxon> fauEuTaxonMap,
429
			Map<Integer, UUID> referenceUuids, Set<Integer> referenceIDs,
430
			int limit, TransactionStatus txStatus, int i, Taxon taxon) {
431
		List<TaxonBase> taxonList;
432
		List<Reference> referenceList;
433
		Map<Integer, Reference> references;
434
		taxonList = getTaxonService().find(taxonUuids);
435
		//get UUIDs of used references
436
		Iterator<?> itRefs = referenceIDs.iterator();
437
		Set<UUID> uuidSet = new HashSet<UUID>(referenceIDs.size());
438
		UUID uuid;
439
		while (itRefs.hasNext()){
440
			uuid = referenceUuids.get(itRefs.next());
441
			uuidSet.add(uuid);
442
		}
443
		referenceList = getReferenceService().find(uuidSet);
444
		references = new HashMap<Integer, Reference>(limit);
445
		for (Reference<?> ref : referenceList){
446
			references.put(Integer.valueOf(((OriginalSourceBase)ref.getSources().iterator().next()).getIdInSource()), ref);
447
		}
448
		for (TaxonBase<?> taxonBase : taxonList) {
449

  
450
			// Create descriptions
451

  
452
			if (taxonBase == null) {
453
				if (logger.isDebugEnabled()) {
454
					logger.debug("TaxonBase is null ");
455
				}
456
				continue;
457
			}
458
			boolean isSynonym = taxonBase.isInstanceOf(Synonym.class);
459
			if (isSynonym) {
460
				Synonym syn = CdmBase.deproxy(taxonBase, Synonym.class);
461
				Set<Taxon> acceptedTaxa = syn.getAcceptedTaxa();
462
				if (acceptedTaxa.size() > 0) {
463
					taxon = syn.getAcceptedTaxa().iterator().next();
464
					//logger.warn("Synonym (" + taxonBase.getUuid() + ") has accepted taxon" + taxon.getUuid());
465
				} else {
466
//								if (logger.isDebugEnabled()) {
467
					logger.warn("Synonym (" + taxonBase.getUuid() + ") does not have accepted taxa");
468
//								}
469
				}
470
			} else {
471
				taxon = CdmBase.deproxy(taxonBase, Taxon.class);
472
			}
473

  
474
			if (taxon != null) {
475
				TaxonDescription taxonDescription;
476
				Set<TaxonDescription> descriptions = taxon.getDescriptions();
477
				if (descriptions.size() > 0) {
478
					taxonDescription = descriptions.iterator().next();
479
				} else {
480
					taxonDescription = TaxonDescription.NewInstance();
481
					taxon.addDescription(taxonDescription);
482
				}
483

  
484

  
485
				UUID taxonUuid = taxonBase.getUuid();
486
				FaunaEuropaeaReferenceTaxon fauEuHelperTaxon = fauEuTaxonMap.get(taxonUuid);
487
				Reference<?> citation;
488
				String microCitation;
489
				DescriptionElementSource originalSource;
490
				Synonym syn;
491
				for (FaunaEuropaeaReference storedReference : fauEuHelperTaxon.getReferences()) {
492

  
493
					TextData textData = TextData.NewInstance(Feature.CITATION());
494

  
495
					citation = references.get(storedReference.getReferenceId());
496
					microCitation = storedReference.getPage();
497
					originalSource = DescriptionElementSource.NewInstance(OriginalSourceType.PrimaryTaxonomicSource, null, null, citation, microCitation, null, null);
498
					if (isSynonym){
499
						syn = CdmBase.deproxy(taxonBase, Synonym.class);
500
						originalSource.setNameUsedInSource(syn.getName());
501
					}
502
					textData.addSource(originalSource);
503
					taxonDescription.addElement(textData);
504
				}
505
			}
506
		}
507
		if(logger.isInfoEnabled()) {
508
			logger.info("i = " + i + " - Transaction committed");
509
		}
510

  
511
		// save taxa
512
		getTaxonService().save(taxonList);
513
		commitTransaction(txStatus);
514

  
515
	}
516

  
517
	@Override
518
	protected boolean isIgnore(FaunaEuropaeaImportState state){
519
		return (state.getConfig().getDoReferences() == IImportConfigurator.DO_REFERENCES.NONE);
520
	}
521

  
522
}

Also available in: Unified diff