minor
[cdmlib.git] / cdmlib-io / src / main / java / eu / etaxonomy / cdm / io / faunaEuropaea / FaunaEuropaeaHeterotypicSynonymImport.java
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 }