Project

General

Profile

Download (24.5 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.eflora.centralAfrica.ferns;
11

    
12
import java.sql.ResultSet;
13
import java.sql.SQLException;
14
import java.util.Arrays;
15
import java.util.HashMap;
16
import java.util.HashSet;
17
import java.util.List;
18
import java.util.Map;
19
import java.util.Set;
20
import java.util.UUID;
21

    
22
import org.apache.commons.lang.StringUtils;
23
import org.apache.log4j.Logger;
24
import org.springframework.stereotype.Component;
25

    
26
import eu.etaxonomy.cdm.api.service.IClassificationService;
27
import eu.etaxonomy.cdm.io.common.IOValidator;
28
import eu.etaxonomy.cdm.io.common.mapping.DbImportMapping;
29
import eu.etaxonomy.cdm.io.common.mapping.DbImportMethodMapper;
30
import eu.etaxonomy.cdm.io.common.mapping.DbImportObjectCreationMapper;
31
import eu.etaxonomy.cdm.io.common.mapping.DbImportTaxIncludedInMapper;
32
import eu.etaxonomy.cdm.io.common.mapping.IMappingImport;
33
import eu.etaxonomy.cdm.io.eflora.centralAfrica.checklist.CentralAfricaChecklistImportState;
34
import eu.etaxonomy.cdm.io.eflora.centralAfrica.ferns.validation.CentralAfricaFernsTaxonImportValidator;
35
import eu.etaxonomy.cdm.model.agent.Team;
36
import eu.etaxonomy.cdm.model.common.CdmBase;
37
import eu.etaxonomy.cdm.model.name.BotanicalName;
38
import eu.etaxonomy.cdm.model.name.NonViralName;
39
import eu.etaxonomy.cdm.model.name.Rank;
40
import eu.etaxonomy.cdm.model.reference.Reference;
41
import eu.etaxonomy.cdm.model.taxon.Synonym;
42
import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;
43
import eu.etaxonomy.cdm.model.taxon.Taxon;
44
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
45
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
46
import eu.etaxonomy.cdm.model.taxon.Classification;
47

    
48

    
49
/**
50
 * @author a.mueller
51
 * @created 20.02.2010
52
 * @version 1.0
53
 */
54
@Component
55
public class CentralAfricaFernsTaxonRelationImport  extends CentralAfricaFernsImportBase<TaxonBase> implements IMappingImport<TaxonBase, CentralAfricaFernsImportState>{
56
	private static final Logger logger = Logger.getLogger(CentralAfricaFernsTaxonRelationImport.class);
57
	
58
	private DbImportMapping mapping;
59
	
60
	
61
	private int modCount = 10000;
62
	private static final String pluralString = "taxa";
63
	private static final String dbTableName = "[African pteridophytes]";
64
	private static final Class cdmTargetClass = TaxonBase.class;
65

    
66
	private Map<String, UUID> taxonMap = new HashMap<String, UUID>();
67

    
68
	
69
	public CentralAfricaFernsTaxonRelationImport(){
70
		super(pluralString, dbTableName, cdmTargetClass);
71
	}
72
	
73
	
74

    
75
	/* (non-Javadoc)
76
	 * @see eu.etaxonomy.cdm.io.erms.ErmsImportBase#getIdQuery()
77
	 */
78
	@Override
79
	protected String getIdQuery() {
80
		String strQuery = " SELECT [Taxon number] FROM " + dbTableName;;
81
		return strQuery;
82
	}
83

    
84

    
85
	/* (non-Javadoc)
86
	 * @see eu.etaxonomy.cdm.io.erms.ErmsImportBase#getMapping()
87
	 */
88
	protected DbImportMapping getMapping() {
89
		if (mapping == null){
90
			mapping = new DbImportMapping();
91
			
92
			mapping.addMapper(DbImportMethodMapper.NewInstance(this, "createObject", ResultSet.class, CentralAfricaFernsImportState.class));
93
//					NewInstance(this, "Taxon number", TAXON_NAMESPACE)); //id + tu_status
94

    
95
//funktioniert nicht wegen doppeltem Abfragen von Attributen
96
//			mapping.addMapper(DbImportSynonymMapper.NewInstance("Taxon number", "Current", TAXON_NAMESPACE, null)); 			
97
//			mapping.addMapper(DbImportNameTypeDesignationMapper.NewInstance("id", "tu_typetaxon", NAME_NAMESPACE, "tu_typedesignationstatus"));
98

    
99
		}
100
		return mapping;
101
	}
102

    
103
	/* (non-Javadoc)
104
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getRecordQuery(eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator)
105
	 */
106
	@Override
107
	protected String getRecordQuery(CentralAfricaFernsImportConfigurator config) {
108
		String strSelect = " SELECT * ";
109
		String strFrom = " FROM [African pteridophytes] as ap";
110
		String strWhere = " WHERE ( ap.[taxon number] IN (" + ID_LIST_TOKEN + ") )";
111
		String strRecordQuery = strSelect + strFrom + strWhere;
112
		return strRecordQuery;
113
	}
114
	
115

    
116
	/* (non-Javadoc)
117
	 * @see eu.etaxonomy.cdm.io.erms.ErmsImportBase#doInvoke(eu.etaxonomy.cdm.io.erms.ErmsImportState)
118
	 */
119
	@Override
120
	protected boolean doInvoke(CentralAfricaFernsImportState state) {
121
		//first path
122
		fillTaxonMap();
123
		boolean success = super.doInvoke(state);
124
		
125
		return success;
126

    
127
	}
128

    
129

    
130

    
131
	private void fillTaxonMap() {
132
		List<String> propPath = Arrays.asList(new String []{"name"});
133
		
134
		List<Taxon> taxonList = (List)getTaxonService().list(Taxon.class, null, null, null, propPath );
135
		for (Taxon taxon : taxonList){
136
			NonViralName nvn = CdmBase.deproxy(taxon.getName(), NonViralName.class);
137
			UUID uuid = taxon.getName().getUuid();
138
			String name = nvn.getNameCache();
139
			taxonMap.put(name, uuid);
140
			
141
		}
142
	}
143

    
144

    
145

    
146
	/* (non-Javadoc)
147
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#getRelatedObjectsForPartition(java.sql.ResultSet)
148
	 */
149
	public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs) {
150
		String nameSpace;
151
		Class cdmClass;
152
		Set<String> idSet;
153
		Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();
154
		
155
		try{
156
			Set<String> taxonIdSet = new HashSet<String>();
157
//				Set<String> referenceIdSet = new HashSet<String>();
158
			while (rs.next()){
159
				handleForeignKey(rs, taxonIdSet, "Current");
160
				handleForeignKey(rs, taxonIdSet, "Taxon number");
161

    
162
//				handleForeignKey(rs, referenceIdSet, "PTRefFk");
163
			}
164

    
165
			//reference map
166
			nameSpace = TAXON_NAMESPACE;
167
			cdmClass = TaxonBase.class;
168
			Map<String, TaxonBase> taxonMap = (Map<String, TaxonBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, taxonIdSet, nameSpace);
169
			result.put(nameSpace, taxonMap);
170
				
171
				
172
			//reference map
173
//			nameSpace = "Reference";
174
//			cdmClass = Reference.class;
175
//			Map<String, Person> referenceMap = (Map<String, Person>)getCommonService().getSourcedObjectsByIdInSource(Person.class, teamIdSet, nameSpace);
176
//			result.put(Reference.class, referenceMap);
177

    
178
		} catch (SQLException e) {
179
			throw new RuntimeException(e);
180
		}
181
		return result;
182
	}
183
	
184

    
185
	/* (non-Javadoc)
186
	 * @see eu.etaxonomy.cdm.io.common.mapping.IMappingImport#createObject(java.sql.ResultSet)
187
	 */
188
	public TaxonBase createObject(ResultSet rs, CentralAfricaFernsImportState state) throws SQLException {
189
		TaxonBase result = null;
190
		try {
191
			String status = rs.getString("Current/Synonym");
192
			
193
			if ("s".equalsIgnoreCase(status)){
194
				//synonym
195
				result = handleSynonym(rs, state);
196
			}else{
197
				//accepted Taxon
198
				result = handleTaxon(rs, state);
199
			}
200
			
201
			return result;
202
		} catch (Exception e) {
203
			e.printStackTrace();
204
			return result;
205
		}
206

    
207
	}
208

    
209

    
210
	private Synonym handleSynonym(ResultSet rs, CentralAfricaFernsImportState state) throws SQLException {
211
		String accTaxonId = rs.getString("Current");
212
		String synonymId = rs.getString("Taxon number");
213
		Synonym synonym = (Synonym)state.getRelatedObject(TAXON_NAMESPACE, synonymId);
214
		if (synonym == null){
215
			logger.warn ("Synonym ("+synonymId+")not found.");
216
			return null;
217
		}
218
		TaxonBase taxonBase = CdmBase.deproxy(state.getRelatedObject(TAXON_NAMESPACE, accTaxonId), TaxonBase.class);
219
			
220
		if (taxonBase != null){
221
			if (taxonBase.isInstanceOf(Taxon.class)){
222
				Taxon taxon = CdmBase.deproxy(taxonBase, Taxon.class);
223
				taxon.addSynonym(synonym, SynonymRelationshipType.SYNONYM_OF());
224
			}else{
225
				logger.warn("Accepted taxon (" + accTaxonId + ") for synonym (" + synonymId +") is not of type 'Current'");
226
			}		
227
		}else{
228
			logger.warn("Taxon (" + accTaxonId + ") not found for synonym (" + synonymId +")");
229
		}
230
		
231
		return synonym;
232
	}
233

    
234
	private Taxon handleTaxon(ResultSet rs, CentralAfricaFernsImportState state) throws SQLException {
235
		String taxonNumber = rs.getString("Taxon number");
236
		Taxon child = (Taxon)state.getRelatedObject(TAXON_NAMESPACE, taxonNumber);
237
		if (child == null){
238
			logger.warn("Taxon does not exist: " + taxonNumber);
239
			return null;
240
		}
241
		
242
		String orderName = rs.getString("Order name");
243
		String subOrderName = rs.getString("Suborder name");
244
		String familyName = rs.getString("Family name");
245
		String subFamilyName = rs.getString("Subfamily name");
246
		String tribusName = rs.getString("Tribus name");
247
		String subTribusName = rs.getString("Subtribus name");
248
		String sectionName = rs.getString("Section name");
249
		String subsectionName = rs.getString("Subsection name");
250
		String genusName = rs.getString("Genus name");
251
		String subGenusName = rs.getString("Subgenus name");
252
		String seriesName = rs.getString("Series name");
253
		String specificEpihet = rs.getString("Specific epihet");
254
		String subspeciesName = rs.getString("Subspecies name");
255
		String varietyName = rs.getString("Variety name");
256
		String subVariety = rs.getString("Subvariery");
257
		String formaName = rs.getString("Forma name");
258
		String subFormaName = rs.getString("Subforma");
259
		
260
		makeNextHigherTaxon(state, child, orderName, subOrderName, familyName, subFamilyName, tribusName, subTribusName, sectionName,
261
				subsectionName, genusName, subGenusName, seriesName, specificEpihet, subspeciesName, varietyName, subVariety, formaName, subFormaName);
262
		return child;
263
	}
264

    
265

    
266

    
267
	/**
268
	 * @param state
269
	 * @param child
270
	 * @param orderName
271
	 * @param subOrderName
272
	 * @param familyName
273
	 * @param subFamilyName
274
	 * @param tribusName
275
	 * @param subTribusName
276
	 * @param sectionName
277
	 * @param subsectionName
278
	 * @param genusName
279
	 * @param subGenusName
280
	 * @param seriesName
281
	 * @param specificEpihet
282
	 * @param subspeciesName
283
	 * @param varietyName
284
	 * @param subVariety
285
	 * @param formaName
286
	 * @param subFormaName
287
	 */
288
	private void makeNextHigherTaxon(CentralAfricaFernsImportState state, Taxon child, String orderName, String subOrderName,
289
			String familyName, String subFamilyName, String tribusName, String subTribusName, String sectionName, String subsectionName,
290
			String genusName, String subGenusName, String seriesName, String specificEpihet, String subspeciesName, String varietyName,
291
			String subVariety, String formaName, String subFormaName) {
292

    
293
		Taxon higherTaxon = getNextHigherTaxon(state, child, orderName, subOrderName, familyName, subFamilyName, tribusName, subTribusName, sectionName, subsectionName, genusName, subGenusName, seriesName, specificEpihet, subspeciesName, varietyName, subVariety, formaName, subFormaName);
294
		
295
		Reference citation = null;
296
		if (higherTaxon != null){
297
			if (! includedRelationshipExists(child, higherTaxon)){
298
				makeTaxonomicallyIncluded(state, null, child, higherTaxon, citation, null);
299
			}else{
300
				logger.info("Included exists");
301
			}
302
			makeNextHigherTaxon(state, higherTaxon, orderName, subOrderName, familyName, subFamilyName, tribusName, subTribusName, sectionName, subsectionName, genusName, subGenusName, seriesName, specificEpihet, subspeciesName, varietyName, subVariety, formaName, subFormaName);
303
		}
304
	}
305

    
306
	/**
307
	 * Tests if this the child taxon already is a child of the higher taxon.
308
	 * @param child
309
	 * @param higherTaxon
310
	 * @return
311
	 */
312
	private boolean includedRelationshipExists(Taxon child, Taxon higherTaxon) {
313
		int countNodes = higherTaxon.getTaxonNodes().size();
314
		if (countNodes < 1){
315
			return false;
316
		}else if (countNodes > 1){
317
			throw new IllegalStateException("Multiple nodes exist for higher taxon. This is an invalid state.");
318
		}else{
319
			TaxonNode higherNode = higherTaxon.getTaxonNodes().iterator().next();
320
			return childExists(child, higherNode);
321
		}
322
	}
323

    
324

    
325

    
326
	private boolean childExists(Taxon child, TaxonNode higherNode) {
327
		for (TaxonNode childNode : higherNode.getChildNodes()){
328
			String existingChildTitle = childNode.getTaxon().getName().getTitleCache();
329
			String newChildTitle = child.getName().getTitleCache();
330
			if (existingChildTitle.equals(newChildTitle)){
331
				return true;
332
			}
333
		}
334
		return false;
335
	}
336

    
337

    
338

    
339
//	private boolean makeTaxonomicallyIncluded(CentralAfricaFernsImportState state, Taxon parent, Taxon child, Reference citation, String microCitation){
340
//		Reference sec = child.getSec();
341
//		Classification tree = state.getTree(sec);
342
//		if (tree == null){
343
//			tree = makeTreeMemSave(state, sec);
344
//		}
345
//		TaxonNode childNode;
346
//		if (parent != null){
347
//			childNode = tree.addParentChild(parent, child, citation, microCitation);
348
//		}else{
349
//			childNode = tree.addChildTaxon(child, citation, microCitation, null);
350
//		}
351
//		return (childNode != null);
352
//	}
353
	
354
	//TODO use Mapper
355
	private boolean makeTaxonomicallyIncluded(CentralAfricaFernsImportState state, Integer treeRefFk, Taxon child, Taxon parent, Reference citation, String microCitation){
356
		String treeKey;
357
		UUID treeUuid;
358
		if (treeRefFk == null){
359
			treeKey = "1";  // there is only one tree and it gets the map key '1'
360
			treeUuid = state.getConfig().getClassificationUuid();
361
		}else{
362
			treeKey =String.valueOf(treeRefFk);
363
			treeUuid = state.getTreeUuidByTreeKey(treeKey);
364
		}
365
		Classification tree = (Classification)state.getRelatedObject(DbImportTaxIncludedInMapper.TAXONOMIC_TREE_NAMESPACE, treeKey);
366
		if (tree == null){
367
			IClassificationService service = state.getCurrentIO().getClassificationService();
368
			tree = service.getClassificationByUuid(treeUuid);
369
			if (tree == null){
370
				String treeName = state.getConfig().getClassificationName();
371
				tree = Classification.NewInstance(treeName);
372
				tree.setUuid(treeUuid);
373
				//FIXME tree reference
374
				tree.setReference(citation);
375
				service.save(tree);
376
			}
377
			state.addRelatedObject(DbImportTaxIncludedInMapper.TAXONOMIC_TREE_NAMESPACE, treeKey, tree);
378
		}
379
		
380
		TaxonNode childNode = tree.addParentChild(parent, child, citation, microCitation);
381
		return (childNode != null);
382
	}
383

    
384

    
385

    
386
	private Taxon getNextHigherTaxon(CentralAfricaFernsImportState state, Taxon childTaxon, String orderName, String subOrderName, String familyName, String subFamilyName,
387
			String tribusName, String subTribusName, String sectionName, String subsectionName, String genusName, String subGenusName, String seriesName, String speciesName, String subspeciesName, String varietyName, String subVariety, String formaName, String subFormaName) {
388
		
389
		Taxon result = null;
390
		BotanicalName childName = CdmBase.deproxy(childTaxon.getName(), BotanicalName.class);
391
		Rank childRank = childName.getRank();
392
		BotanicalName higherName; 
393
		higherName = handleInfraSpecific(childRank, genusName, speciesName, subspeciesName, varietyName, subVariety, formaName, subFormaName);
394
		if (higherName.getRank() == null){
395
			handleSpecies(childRank, higherName, genusName, speciesName);
396
		}
397
		if (higherName.getRank() == null){
398
			handleInfraGeneric(childRank, higherName, genusName, subGenusName, seriesName);
399
		}
400
		if (higherName.getRank() == null){
401
			handleUninomial(childRank, higherName, orderName, subOrderName, familyName, subFamilyName, tribusName, subTribusName, sectionName, subsectionName, genusName);
402
		}
403
		//if higher taxon must exist, create it if it was not yet created
404
		if (higherName.getRank() != null && getExistingTaxon(higherName, state) == null ){
405
			result = Taxon.NewInstance(higherName, childTaxon.getSec());
406
			UUID uuid = higherName.getUuid();
407
			String name = higherName.getNameCache();
408
			taxonMap.put(name, uuid);
409
			state.addRelatedObject(HIGHER_TAXON_NAMESPACE, higherName.getNameCache(), result);
410
		}
411
		return result;
412
	}
413

    
414

    
415

    
416
	private Taxon getExistingTaxon(BotanicalName higherName, CentralAfricaFernsImportState state) {
417
		String nameCache = higherName.getNameCache();
418
		UUID uuid = taxonMap.get(nameCache);
419
		
420
		Taxon taxon = null;
421
		if (uuid != null){
422
			taxon = CdmBase.deproxy(getTaxonService().find(uuid), Taxon.class);
423
			Taxon taxon2 = state.getRelatedObject(HIGHER_TAXON_NAMESPACE, nameCache, Taxon.class);
424
			if (taxon != taxon2){
425
				logger.warn("Difference in related taxa: " + nameCache);
426
			}
427
			
428
		}
429
		return taxon;
430
	}
431

    
432

    
433

    
434
	private BotanicalName handleInfraSpecific(Rank lowerTaxonRank, String genusName, String specificEpithet, String subspeciesName, String varietyName, String subVariety, String formaName, String subFormaName) {
435

    
436
		BotanicalName taxonName = BotanicalName.NewInstance(null);
437
		Rank newRank = null;
438
		
439
		if (StringUtils.isNotBlank(subFormaName)   && lowerTaxonRank.isLower(Rank.SUBFORM())){
440
			taxonName.setInfraSpecificEpithet(subFormaName);
441
			newRank =  Rank.SUBFORM();
442
		}else if (StringUtils.isNotBlank(formaName)  && lowerTaxonRank.isLower(Rank.FORM())){
443
			taxonName.setInfraSpecificEpithet(formaName);
444
			newRank =  Rank.FORM();
445
		}else if (StringUtils.isNotBlank(subVariety)  && lowerTaxonRank.isLower(Rank.SUBVARIETY())){
446
			taxonName.setInfraSpecificEpithet(subVariety);
447
			newRank =  Rank.SUBVARIETY();
448
		}else if (StringUtils.isNotBlank(varietyName)  && lowerTaxonRank.isLower(Rank.VARIETY())){
449
			taxonName.setInfraSpecificEpithet(varietyName);
450
			newRank =  Rank.VARIETY();
451
		}else if (StringUtils.isNotBlank(subspeciesName)  && lowerTaxonRank.isLower(Rank.SUBSPECIES())){
452
			taxonName.setInfraSpecificEpithet(subspeciesName);
453
			newRank = Rank.SUBSPECIES();
454
		}
455
		
456
		if (newRank != null){
457
			taxonName.setSpecificEpithet(specificEpithet);
458
			taxonName.setGenusOrUninomial(genusName);
459
			taxonName.setRank(newRank);
460
		}
461
		
462
		return taxonName;
463
	}
464

    
465
	private BotanicalName handleSpecies(Rank lowerTaxonRank, BotanicalName taxonName, String genusName, String speciesEpithet) {
466
		Rank newRank = null;
467
		
468
		if (StringUtils.isNotBlank(speciesEpithet)  && lowerTaxonRank.isLower(Rank.SPECIES())){
469
			taxonName.setSpecificEpithet(speciesEpithet);
470
			newRank = Rank.SPECIES();
471
		}
472
		if (newRank != null){
473
			taxonName.setGenusOrUninomial(genusName);
474
			taxonName.setRank(newRank);
475
		}
476
		return taxonName;
477
	}
478

    
479
	private BotanicalName handleInfraGeneric(Rank lowerTaxonRank, BotanicalName taxonName, String genusName, String subGenusName, String seriesName) {
480
		Rank newRank = null;
481
		
482
		if (StringUtils.isNotBlank(seriesName)  && lowerTaxonRank.isLower(Rank.SERIES())){
483
			taxonName.setInfraGenericEpithet(seriesName);
484
			newRank = Rank.SERIES();
485
		}else if (StringUtils.isNotBlank(subGenusName) && lowerTaxonRank.isLower(Rank.SUBGENUS())){
486
			taxonName.setInfraGenericEpithet(subGenusName);
487
			newRank = Rank.SUBGENUS();
488
		}
489
		if (newRank != null){
490
			taxonName.setGenusOrUninomial(genusName);
491
			taxonName.setRank(newRank);
492
		}
493
		return taxonName;
494
	}
495

    
496

    
497

    
498
	private BotanicalName handleUninomial(Rank lowerTaxonRank, BotanicalName taxonName,  String orderName, String subOrderName, String familyName, String subFamilyName,
499
				String tribusName, String subTribusName, String sectionName, String subsectionName, String genusName) {
500
		
501
		Rank newRank = null;
502
		if (StringUtils.isNotBlank(genusName) && lowerTaxonRank.isLower(Rank.GENUS())){
503
			taxonName.setGenusOrUninomial(genusName);
504
			newRank =  Rank.GENUS();
505
		}else if (StringUtils.isNotBlank(subsectionName)  && lowerTaxonRank.isLower(Rank.SUBSECTION_BOTANY())){
506
			taxonName.setGenusOrUninomial(subsectionName);
507
			newRank =  Rank.SUBSECTION_BOTANY();
508
		}else if (StringUtils.isNotBlank(sectionName)  && lowerTaxonRank.isLower(Rank.SECTION_BOTANY())){
509
			taxonName.setGenusOrUninomial(sectionName);
510
			newRank =  Rank.SECTION_BOTANY();
511
		}else if (StringUtils.isNotBlank(subTribusName) && lowerTaxonRank.isLower(Rank.SUBTRIBE())){
512
			taxonName.setGenusOrUninomial(subTribusName);
513
			newRank =  Rank.SUBTRIBE();
514
		}else if (StringUtils.isNotBlank(tribusName) && lowerTaxonRank.isLower(Rank.TRIBE())){
515
			taxonName.setGenusOrUninomial(tribusName);
516
			newRank =  Rank.TRIBE();
517
		}else if (StringUtils.isNotBlank(subFamilyName) && lowerTaxonRank.isLower(Rank.SUBFAMILY())){
518
			taxonName.setGenusOrUninomial(subFamilyName);
519
			newRank =  Rank.SUBFAMILY();
520
		}else if (StringUtils.isNotBlank(familyName) && lowerTaxonRank.isLower(Rank.FAMILY())){
521
			taxonName.setGenusOrUninomial(familyName);
522
			newRank =  Rank.FAMILY();
523
		}else if (StringUtils.isNotBlank(subOrderName) && lowerTaxonRank.isLower(Rank.SUBORDER())){
524
			taxonName.setGenusOrUninomial(subOrderName);
525
			newRank =  Rank.SUBORDER();
526
		}else if (StringUtils.isNotBlank(orderName) && lowerTaxonRank.isLower(Rank.ORDER())){
527
			taxonName.setGenusOrUninomial(orderName);
528
			newRank =  Rank.ORDER();
529
		}
530
		taxonName.setRank(newRank);
531
		return taxonName;
532
	}
533

    
534

    
535

    
536

    
537
	private void setAuthor(BotanicalName taxonName, ResultSet rs) throws SQLException {
538
		String orderAuthor = rs.getString("Order name author");
539
		String subOrderAuthor = rs.getString("Suborder name author");
540
		String familyAuthor = rs.getString("Family name author");
541
		String subFamilyAuthor = rs.getString("Subfamily name author");
542
		String tribusAuthor = rs.getString("Tribus author");
543
		String subTribusAuthor = rs.getString("Subtribus author");
544
		String sectionAuthor = rs.getString("Section name author");
545
		String subsectionAuthor = rs.getString("Subsection author");
546
		String genusAuthor = rs.getString("Genus name author");
547
		String subGenusAuthor = rs.getString("Subgenus name author");
548
		String seriesAuthor = rs.getString("Series name author");
549
		String specificEpihetAuthor = rs.getString("Specific epithet author");
550
		String subspeciesAuthor = rs.getString("Subspecies author");
551
		String varietyAuthor = rs.getString("Variety name author");
552
		String subVarietyAuthor = rs.getString("Subvariety author");
553
		String formaAuthor = rs.getString("Forma name author");
554
		String subFormaAuthor = rs.getString("Subforma author");
555
		
556
		String authorsFull = rs.getString("Author/s - full");
557
		String authorsAbbrev = rs.getString("Author/s - abbreviated");
558
		
559

    
560
		Rank rank = taxonName.getRank();
561
		String authorString;
562
		if (rank != null){
563
			if (rank.equals(Rank.ORDER())){
564
				authorString = orderAuthor;
565
			}else if (rank.equals(Rank.SUBORDER())){
566
				authorString = subOrderAuthor;
567
			}else if (rank.equals(Rank.FAMILY())){
568
				authorString = familyAuthor;
569
			}else if (rank.equals(Rank.SUBFAMILY())){
570
				authorString = subFamilyAuthor;
571
			}else if (rank.equals(Rank.TRIBE())){
572
				authorString = tribusAuthor;
573
			}else if (rank.equals(Rank.SUBTRIBE())){
574
				authorString = subTribusAuthor;
575
			}else if (rank.equals(Rank.SECTION_BOTANY())){
576
				authorString = sectionAuthor;
577
			}else if (rank.equals(Rank.SUBSECTION_BOTANY())){
578
				authorString = subsectionAuthor;
579
			}else if (rank.equals(Rank.GENUS())){
580
				authorString = genusAuthor;
581
			}else if (rank.equals(Rank.SUBGENUS())){
582
				authorString = subGenusAuthor;
583
			}else if (rank.equals(Rank.SERIES())){
584
				authorString = seriesAuthor;
585
			}else if (rank.equals(Rank.SPECIES())){
586
				authorString = specificEpihetAuthor;
587
			}else if (rank.equals(Rank.SUBSPECIES())){
588
				authorString = subspeciesAuthor;
589
			}else if (rank.equals(Rank.VARIETY())){
590
				authorString = varietyAuthor;
591
			}else if (rank.equals(Rank.SUBVARIETY())){
592
				authorString = subVarietyAuthor;
593
			}else if (rank.equals(Rank.FORM())){
594
				authorString = formaAuthor;
595
			}else if (rank.equals(Rank.SUBFORM())){
596
				authorString = subFormaAuthor;
597
			}else{
598
				logger.warn("Author string could not be defined");
599
				authorString = authorsAbbrev;
600
				if (StringUtils.isBlank(authorString)){
601
					logger.warn("Authors abbrev string could not be defined");
602
					authorString = authorsFull;	
603
				}
604
			}
605
		}else{
606
			logger.warn("Rank is null");
607
			authorString = authorsAbbrev;
608
			if (StringUtils.isBlank(authorString)){
609
				logger.warn("Authors abbrev string could not be defined");
610
				authorString = authorsFull;	
611
			}
612
		}
613
		if (StringUtils.isNotBlank(authorsAbbrev) && ! authorsAbbrev.equalsIgnoreCase(authorString)){
614
			logger.warn("Rank author and abbrev author are not equal");
615
		}
616
		if (StringUtils.isNotBlank(authorsFull) && ! authorsFull.equalsIgnoreCase(authorString)){
617
			logger.warn("Rank author and full author are not equal");
618
		}
619
	
620
		Team team = Team.NewTitledInstance(authorString, authorString);
621
		taxonName.setCombinationAuthorTeam(team);
622
	
623
	}	
624

    
625
	
626
	/* (non-Javadoc)
627
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IImportConfigurator)
628
	 */
629
	@Override
630
	protected boolean doCheck(CentralAfricaFernsImportState state){
631
		IOValidator<CentralAfricaFernsImportState> validator = new CentralAfricaFernsTaxonImportValidator();
632
		return validator.validate(state);
633
	}
634
	
635
	
636
	/* (non-Javadoc)
637
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
638
	 */
639
	protected boolean isIgnore(CentralAfricaFernsImportState state){
640
		return ! state.getConfig().isDoTaxa();
641
	}
642

    
643

    
644

    
645

    
646

    
647
}
(6-6/7)