View Javadoc

1   // $Id$
2   /**
3   * Copyright (C) 2007 EDIT
4   * European Distributed Institute of Taxonomy 
5   * http://www.e-taxonomy.eu
6   * 
7   * The contents of this file are subject to the Mozilla Public License Version 1.1
8   * See LICENSE.TXT at the top of this package for the full license terms.
9   */
10  
11  package eu.etaxonomy.cdm.io.faunaEuropaea;
12  
13  import java.util.Collection;
14  import java.util.HashSet;
15  import java.util.List;
16  import java.util.Set;
17  
18  import org.apache.log4j.Logger;
19  import org.springframework.stereotype.Component;
20  import org.springframework.transaction.TransactionStatus;
21  
22  import eu.etaxonomy.cdm.io.common.CdmImportBase;
23  import eu.etaxonomy.cdm.io.common.ICdmImport;
24  import eu.etaxonomy.cdm.model.name.HomotypicalGroup;
25  import eu.etaxonomy.cdm.model.name.NameRelationship;
26  import eu.etaxonomy.cdm.model.name.TaxonNameBase;
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  
31  /**
32   * This class creates heterotypic synonymy relationships to the accepted taxon for 
33   * basionym synonyms. 
34   * 
35   * @author a.babadshanjan
36   * @created 22.09.2009
37   * @version 1.0
38   */
39  @Component
40  public class FaunaEuropaeaHeterotypicSynonymImport extends CdmImportBase<FaunaEuropaeaImportConfigurator, FaunaEuropaeaImportState>
41  implements ICdmImport<FaunaEuropaeaImportConfigurator, FaunaEuropaeaImportState> {
42  	private static final Logger logger = Logger
43  			.getLogger(FaunaEuropaeaHeterotypicSynonymImport.class);
44  
45  	/* (non-Javadoc)
46  	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IoStateBase)
47  	 */
48  	@Override
49  	protected boolean doCheck(FaunaEuropaeaImportState state) {
50  		logger.warn("Checking for heterotypic synonyms for basionyms not yet implemented");
51  		return false;
52  	}
53  
54  	/* (non-Javadoc)
55  	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doInvoke(eu.etaxonomy.cdm.io.common.IoStateBase)
56  	 */
57  	@Override
58  	protected boolean doInvoke(FaunaEuropaeaImportState state) {
59  		
60  		TransactionStatus txStatus = null;
61  		List<Synonym> synonymList = null;
62  		Set<Taxon> taxonSet = null;
63  		int i = 0;
64  		int start = 0;
65  
66  		int limit = state.getConfig().getLimitSave();
67  		int nbrOfSynonyms = getTaxonService().count(Synonym.class);
68  		if (logger.isInfoEnabled()) {
69  			logger.info("Number of synonyms = " + nbrOfSynonyms);
70  		}
71  		
72  		while (i < nbrOfSynonyms) {
73  
74  			try {
75  				if ((i++ % limit) == 0) {
76  
77  					start = (i == 1) ? 0 : i;
78  					if (logger.isInfoEnabled()) {
79  						logger.info("Retrieving synonyms starting from: " + start);
80  					}
81  					txStatus = startTransaction();
82  					synonymList = getTaxonService().getAllSynonyms(limit, start);
83  					taxonSet = new HashSet<Taxon>(limit);
84  				}
85  
86  				if (((i % limit) == 0 && i != 1 ) || i == nbrOfSynonyms) { 
87  
88  					HomotypicalGroup homotypicalGroup = null;
89  					Set<TaxonNameBase> basionyms = null;
90  					Set<NameRelationship> nameRelations = null;
91  					TaxonNameBase basionym = null;
92  					Set<TaxonBase> taxonBases = null;
93  					TaxonBase taxonBase = null;
94  					Taxon acceptedTaxon = null;
95  					TaxonNameBase synonymName = null;
96  					NameRelationship nameRelation = null;
97  					TaxonNameBase acceptedName = null;
98  					
99  					for (Synonym synonym : synonymList) {
100 						synonymName = synonym.getName();
101 						if (synonymName.isGroupsBasionym()) {
102 							nameRelations = synonymName.getNameRelations();
103 							if (nameRelations != null && nameRelations.iterator().hasNext()) {
104 								nameRelation = nameRelations.iterator().next();
105 								acceptedName = nameRelation.getToName();
106 								logger.info("SynonymName: " + synonymName + " titleCache of synonym: "+synonym.getTitleCache() + " name of acceptedTaxon: " + acceptedName.getTitleCache());
107 								if (logger.isTraceEnabled()) {
108 									logger.trace("toName: " + acceptedName);
109 									logger.trace("fromName: " + nameRelation.getFromName());
110 								}
111 								taxonBases = acceptedName.getTaxa();
112 								if (taxonBases != null && taxonBases.iterator().hasNext()) {
113 									taxonBase = taxonBases.iterator().next();
114 									acceptedTaxon = taxonBase.deproxy(taxonBase, Taxon.class);
115 									Set <Synonym> synonyms = acceptedTaxon.getSynonyms();
116 									if (!synonyms.contains(synonym)){
117 									//TODO: Achtung!!!!! dies wird auch bei homotypischen Synonymen aufgerufen! Dadurch wird ein weiteres Synonym erzeugt
118 										acceptedTaxon.addHeterotypicSynonymName(synonymName);
119 										taxonSet.add(acceptedTaxon);
120 									}
121 								}
122 							}
123 						}
124 					}
125 						
126 					getTaxonService().save((Collection)taxonSet);
127 					taxonSet = null;
128 					synonymList = null;
129 					commitTransaction(txStatus);
130 					if(logger.isInfoEnabled()) { 
131 						logger.info("i = " + i + " - Transaction committed"); 
132 					}
133 				}
134 
135 			} catch (Exception e) {
136 				logger.warn("An exception occurred when creating heterotypic synonym relationship # " + i );
137 				e.printStackTrace();
138 			}
139 		}
140 		return true;
141 	}
142 
143 	/* (non-Javadoc)
144 	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IoStateBase)
145 	 */
146 	@Override
147 	protected boolean isIgnore(FaunaEuropaeaImportState state) {
148 		return !(state.getConfig().isDoHeterotypicSynonymsForBasionyms());
149 	}
150 }