Project

General

Profile

Download (10.2 KB) Statistics
| Branch: | Revision:
1 9a971015 Andreas Müller
/**
2
* Copyright (C) 2007 EDIT
3 8422c0cd Andreas Müller
* European Distributed Institute of Taxonomy
4 9a971015 Andreas Müller
* http://www.e-taxonomy.eu
5 8422c0cd Andreas Müller
*
6 9a971015 Andreas Müller
* 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.indexFungorum;
11
12
import java.sql.ResultSet;
13
import java.sql.SQLException;
14
import java.util.HashMap;
15 1e41fbca Andreas Müller
import java.util.List;
16 9a971015 Andreas Müller
import java.util.Map;
17
18
import org.apache.log4j.Logger;
19
import org.springframework.stereotype.Component;
20 1e41fbca Andreas Müller
import org.springframework.transaction.TransactionStatus;
21 9a971015 Andreas Müller
22 1e41fbca Andreas Müller
import eu.etaxonomy.cdm.io.pesi.out.PesiTransformer;
23 9a971015 Andreas Müller
import eu.etaxonomy.cdm.model.common.CdmBase;
24 e6a3d605 Andreas Müller
import eu.etaxonomy.cdm.model.common.Marker;
25 9a971015 Andreas Müller
import eu.etaxonomy.cdm.model.name.Rank;
26 51688d00 Andreas Müller
import eu.etaxonomy.cdm.model.name.TaxonName;
27 bbeda5af Katja Luther
import eu.etaxonomy.cdm.model.name.TaxonNameFactory;
28 9a971015 Andreas Müller
import eu.etaxonomy.cdm.model.reference.Reference;
29
import eu.etaxonomy.cdm.model.taxon.Classification;
30
import eu.etaxonomy.cdm.model.taxon.Taxon;
31
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
32
33
/**
34
 * @author a.mueller
35 a13538c8 Andreas Müller
 * @since 27.02.2012
36 9a971015 Andreas Müller
 */
37
@Component
38 1e41fbca Andreas Müller
public class IndexFungorumHigherClassificationImport  extends IndexFungorumImportBase {
39 ffd6058e Andreas Müller
40
    private static final long serialVersionUID = -6841466146506309309L;
41
    private static final Logger logger = Logger.getLogger(IndexFungorumHigherClassificationImport.class);
42 8422c0cd Andreas Müller
43 9a971015 Andreas Müller
	private static final String pluralString = "higher classifications";
44
	private static final String dbTableName = "tblPESIfungi-Classification";
45
46
	public IndexFungorumHigherClassificationImport(){
47 deed567d Andreas Müller
		super(pluralString, dbTableName);
48 9a971015 Andreas Müller
	}
49
50
	@Override
51
	protected String getRecordQuery(IndexFungorumImportConfigurator config) {
52 8422c0cd Andreas Müller
		String strRecordQuery =
53
			" SELECT DISTINCT [Kingdom name], [Phylum name], [Subphylum name], [Class name], [Subclass name], [Order name], [Family name], g.[NAME OF FUNGUS] as GenusName, c.PreferredName as SpeciesName " +
54 1e41fbca Andreas Müller
			" FROM [tblPESIfungi-Classification] c  LEFT OUTER JOIN " +
55 2d481abb Katja Luther
                      " tblGenera g ON c.PreferredNameFDCnumber = g.[RECORD NUMBER]" +
56
			" ORDER BY [Kingdom name], [Phylum name], [Subphylum name], [Class name], [Subclass name], [Order name],  [Family name], GenusName, SpeciesName ";
57 9a971015 Andreas Müller
		return strRecordQuery;
58
	}
59
60
	@Override
61
	protected void doInvoke(IndexFungorumImportState state) {
62 ffd6058e Andreas Müller
63
	    logger.info("Start higher classification ...");
64
65 9a971015 Andreas Müller
		String sql = getRecordQuery(state.getConfig());
66
		ResultSet rs = state.getConfig().getSource().getResultSet(sql);
67 8422c0cd Andreas Müller
68 1e41fbca Andreas Müller
		//only 1 partition here
69 8422c0cd Andreas Müller
70 9a971015 Andreas Müller
		String lastKingdom = "";
71
		String lastPhylum = "";
72
		String lastSubphylum = "";
73
		String lastClassname = "";
74
		String lastSubclass = "";
75
		String lastOrder = "";
76
		String lastFamily = "";
77 8422c0cd Andreas Müller
78 9a971015 Andreas Müller
		Taxon taxonKingdom = null;
79
		Taxon taxonPhylum = null;
80
		Taxon taxonSubphylum = null;
81
		Taxon taxonClass = null;
82
		Taxon taxonSubclass = null;
83
		Taxon taxonOrder = null;
84
		Taxon taxonFamily = null;
85 8422c0cd Andreas Müller
86 1e41fbca Andreas Müller
		Taxon higherTaxon = null;
87 8422c0cd Andreas Müller
88 1e41fbca Andreas Müller
		TransactionStatus tx = startTransaction();
89
		ResultSet rsRelatedObjects = state.getConfig().getSource().getResultSet(sql);
90 8422c0cd Andreas Müller
		state.setRelatedObjects(getRelatedObjectsForPartition(rsRelatedObjects, state));
91
92 1e41fbca Andreas Müller
		Classification classification = getClassification(state);
93 8422c0cd Andreas Müller
94 9a971015 Andreas Müller
		try {
95
			while (rs.next()){
96 2d481abb Katja Luther
				String kingdom = rs.getString("Kingdom name");
97
				String phylum = rs.getString("Phylum name");
98
				String subphylum = rs.getString("Subphylum name");
99
				String classname = rs.getString("Class name");
100
				String subclass = rs.getString("Subclass name");
101
				String order = rs.getString("Order name");
102
				String family = rs.getString("Family name");
103 8422c0cd Andreas Müller
104 1e41fbca Andreas Müller
				if (isNewTaxon(family, lastFamily)){
105
					if (isNewTaxon(order,lastOrder)){
106
						if (isNewTaxon(subclass,lastSubclass)){
107
							if (isNewTaxon(classname,lastClassname)){
108
								if (isNewTaxon(subphylum, lastSubphylum)){
109
									if (isNewTaxon(phylum,lastPhylum)){
110
										if (isNewTaxon(kingdom,lastKingdom)){
111 9a971015 Andreas Müller
											taxonKingdom = makeTaxon(state, kingdom, Rank.KINGDOM());
112 1e41fbca Andreas Müller
											lastKingdom = kingdom;
113
											logger.info("Import kingdom " +  kingdom);
114
											getTaxonService().saveOrUpdate(taxonKingdom);
115
										}else{
116
											higherTaxon = taxonKingdom;
117 9a971015 Andreas Müller
										}
118 1e41fbca Andreas Müller
										higherTaxon = isIncertisSedis(kingdom) ? higherTaxon : taxonKingdom;
119 e6a3d605 Andreas Müller
										Rank newRank = (lastKingdom.equals("Fungi") ? null : Rank.PHYLUM());
120
										taxonPhylum = makeTaxon(state, phylum, newRank);
121 1e41fbca Andreas Müller
										if (taxonPhylum != null){
122 41d91065 Andreas Müller
											classification.addParentChild(higherTaxon, taxonPhylum, null, null);
123 1e41fbca Andreas Müller
										}
124
										higherTaxon = isIncertisSedis(phylum) ? higherTaxon : taxonPhylum;
125
										lastPhylum = phylum;
126
										logger.info("Import Phylum " +  phylum);
127
									}else{
128
										higherTaxon = taxonPhylum;
129 9a971015 Andreas Müller
									}
130 e6a3d605 Andreas Müller
									Rank newRank = (lastKingdom.equals("Fungi") ? null : Rank.SUBPHYLUM());
131
									taxonSubphylum = makeTaxon(state, subphylum, newRank);
132 1e41fbca Andreas Müller
									if (taxonSubphylum != null){
133 41d91065 Andreas Müller
										getClassification(state).addParentChild(higherTaxon,taxonSubphylum, null, null);
134 1e41fbca Andreas Müller
									}
135
									higherTaxon = isIncertisSedis(subphylum) ? higherTaxon : taxonSubphylum;
136
									lastSubphylum = subphylum;
137
								}else{
138
									higherTaxon = taxonSubphylum;
139 9a971015 Andreas Müller
								}
140
								taxonClass = makeTaxon(state, classname, Rank.CLASS());
141 1e41fbca Andreas Müller
								if (taxonClass != null){
142 41d91065 Andreas Müller
									getClassification(state).addParentChild(higherTaxon, taxonClass, null, null);
143 1e41fbca Andreas Müller
								}
144
								higherTaxon = isIncertisSedis(classname) ? higherTaxon : taxonClass;
145
								lastClassname = classname;
146
							}else{
147
								higherTaxon = taxonClass;
148 9a971015 Andreas Müller
							}
149
							taxonSubclass = makeTaxon(state, subclass, Rank.SUBCLASS());
150 1e41fbca Andreas Müller
							if (taxonSubclass != null){
151 41d91065 Andreas Müller
								getClassification(state).addParentChild(higherTaxon, taxonSubclass,null, null);
152 1e41fbca Andreas Müller
							}
153
							higherTaxon = isIncertisSedis(subclass) ? higherTaxon : taxonSubclass;
154
							lastSubclass = subclass;
155
						}else{
156
							higherTaxon = taxonSubclass;
157 9a971015 Andreas Müller
						}
158
						taxonOrder = makeTaxon(state, order, Rank.ORDER());
159 1e41fbca Andreas Müller
						if (taxonOrder != null){
160 41d91065 Andreas Müller
							getClassification(state).addParentChild(higherTaxon, taxonOrder, null, null);
161 1e41fbca Andreas Müller
						}
162
						higherTaxon = isIncertisSedis(order) ? higherTaxon : taxonOrder;
163
						lastOrder = order;
164
					}else{
165
						higherTaxon = taxonOrder;
166 9a971015 Andreas Müller
					}
167
					taxonFamily = makeTaxon(state, family, Rank.FAMILY());
168 1e41fbca Andreas Müller
					if (taxonFamily != null){
169 8fb964f0 Andreas Müller
					    try{
170 bb5bac58 Andreas Müller
							//if this shows a warning see single issue in #2826 about Glomerellaceae (which has 2 different parents)
171 925afb79 Andreas Müller
						    getClassification(state).addParentChild(higherTaxon, taxonFamily, null, null);
172 2d481abb Katja Luther
						}catch(IllegalStateException e){
173
							if (e.getMessage().startsWith("The child taxon is already part of the tree")){
174
								logger.warn(e.getMessage() + taxonFamily.getTitleCache() + " " + higherTaxon.getTitleCache());
175 bb5bac58 Andreas Müller
							}
176 2d481abb Katja Luther
						}
177 1e41fbca Andreas Müller
					}
178
					higherTaxon = isIncertisSedis(family) ? higherTaxon : taxonFamily;
179
					lastFamily = family;
180
					getTaxonService().saveOrUpdate(higherTaxon);
181 9a971015 Andreas Müller
				}
182 1e41fbca Andreas Müller
				getTaxonService().saveOrUpdate(higherTaxon);
183 9a971015 Andreas Müller
			}
184
		} catch (SQLException e) {
185
			e.printStackTrace();
186
			logger.error(e.getMessage());
187 1e41fbca Andreas Müller
			tx.setRollbackOnly();
188
			state.setSuccess(false);
189 9a971015 Andreas Müller
		}
190 1e41fbca Andreas Müller
		commitTransaction(tx);
191 ffd6058e Andreas Müller
		logger.info("End higher classification ...");
192
193 9a971015 Andreas Müller
		return;
194
	}
195
196 1e41fbca Andreas Müller
	private boolean isIncertisSedis(String uninomial) {
197 b015905a Andreas Müller
		return  uninomial.equalsIgnoreCase(INCERTAE_SEDIS) || uninomial.equalsIgnoreCase(FOSSIL_FUNGI);
198 9a971015 Andreas Müller
	}
199
200 1e41fbca Andreas Müller
	private boolean isNewTaxon(String uninomial, String lastUninomial) {
201
		boolean result =  !uninomial.equalsIgnoreCase(lastUninomial);
202
		result |= lastUninomial.equalsIgnoreCase(INCERTAE_SEDIS);
203 b015905a Andreas Müller
		result |= lastUninomial.equalsIgnoreCase(FOSSIL_FUNGI);
204 1e41fbca Andreas Müller
		return result;
205
	}
206
207 e6a3d605 Andreas Müller
	private Taxon makeTaxon(IndexFungorumImportState state, String uninomial, Rank newRank) {
208 b015905a Andreas Müller
		if (uninomial.equalsIgnoreCase(INCERTAE_SEDIS) || uninomial.equalsIgnoreCase(FOSSIL_FUNGI)){
209 1e41fbca Andreas Müller
			return null;
210
		}
211 bb5bac58 Andreas Müller
		Taxon taxon = state.getRelatedObject(IndexFungorumImportBase.NAMESPACE_SUPRAGENERIC_NAMES, uninomial, Taxon.class);
212 1e41fbca Andreas Müller
		if (taxon == null){
213 e6a3d605 Andreas Müller
			if (! newRank.equals(Rank.KINGDOM())){
214 2d481abb Katja Luther
				logger.warn("Taxon not found for uninomial " + uninomial);
215 1e41fbca Andreas Müller
			}
216 51688d00 Andreas Müller
			TaxonName name = TaxonNameFactory.NewBotanicalInstance(newRank);
217 1e41fbca Andreas Müller
			name.setGenusOrUninomial(uninomial);
218 8422c0cd Andreas Müller
			Reference sourceReference = state.getRelatedObject(NAMESPACE_REFERENCE, SOURCE_REFERENCE, Reference.class);
219 1e41fbca Andreas Müller
			taxon = Taxon.NewInstance(name, sourceReference);
220 e6a3d605 Andreas Müller
			taxon.addMarker(Marker.NewInstance(getMissingGUIDMarkerType(state), true));
221
		}else if (newRank != null){
222
			taxon.getName().setRank(newRank);
223 1e41fbca Andreas Müller
		}
224
		return taxon;
225 9a971015 Andreas Müller
	}
226
227 9900f429 Andreas Müller
	@Override
228
	public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs, IndexFungorumImportState state) {
229 9a971015 Andreas Müller
		String nameSpace;
230 bb5bac58 Andreas Müller
		Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<>();
231 8422c0cd Andreas Müller
232 9a971015 Andreas Müller
		try{
233
			//taxon map
234 bb5bac58 Andreas Müller
			nameSpace = IndexFungorumImportBase.NAMESPACE_SUPRAGENERIC_NAMES ;
235
			Map<String, TaxonBase<?>> taxonMap = new HashMap<>();
236 40bb5f10 Andreas Müller
			@SuppressWarnings("unchecked")
237
            List<Taxon> list = getCommonService().getHqlResult("SELECT t FROM Taxon t JOIN t.sources s WHERE s.citation.uuid = ?0", new Object[]{ PesiTransformer.uuidSourceRefIndexFungorum});
238 ba8ecd5d Andreas Müller
			for (Taxon taxon : list){
239 40bb5f10 Andreas Müller
			    String uninomial = CdmBase.deproxy(taxon.getName()).getGenusOrUninomial();
240
				TaxonBase<?> existing = taxonMap.put(uninomial, taxon);
241
				if (existing != null){
242
				    logger.warn("There seem to be duplicate taxa for uninomial: " + uninomial);
243
				}
244 1e41fbca Andreas Müller
			}
245 9a971015 Andreas Müller
			result.put(nameSpace, taxonMap);
246 8422c0cd Andreas Müller
247 1e41fbca Andreas Müller
			//source reference
248 8422c0cd Andreas Müller
			Reference sourceReference = getReferenceService().find(PesiTransformer.uuidSourceRefIndexFungorum);
249 bb5bac58 Andreas Müller
			Map<String, Reference> referenceMap = new HashMap<>();
250 1e41fbca Andreas Müller
			referenceMap.put(SOURCE_REFERENCE, sourceReference);
251
			result.put(NAMESPACE_REFERENCE, referenceMap);
252 8422c0cd Andreas Müller
253 1e41fbca Andreas Müller
		} catch (Exception e) {
254 9a971015 Andreas Müller
			throw new RuntimeException(e);
255
		}
256
		return result;
257
	}
258 8422c0cd Andreas Müller
259 9a971015 Andreas Müller
	@Override
260
	protected boolean doCheck(IndexFungorumImportState state){
261
		return true;
262
	}
263 8422c0cd Andreas Müller
264 9900f429 Andreas Müller
	@Override
265 9a971015 Andreas Müller
	protected boolean isIgnore(IndexFungorumImportState state){
266 1e41fbca Andreas Müller
		return ! state.getConfig().isDoRelTaxa();
267 9a971015 Andreas Müller
	}
268
}