Project

General

Profile

Download (19.8 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.cyprus;
11

    
12
import java.util.Arrays;
13
import java.util.HashSet;
14
import java.util.List;
15
import java.util.Map;
16
import java.util.Set;
17
import java.util.UUID;
18

    
19
import org.apache.commons.lang.StringUtils;
20
import org.apache.log4j.Logger;
21
import org.springframework.stereotype.Component;
22

    
23
import eu.etaxonomy.cdm.common.CdmUtils;
24
import eu.etaxonomy.cdm.io.common.TdwgAreaProvider;
25
import eu.etaxonomy.cdm.io.common.mapping.IInputTransformer;
26
import eu.etaxonomy.cdm.io.common.mapping.UndefinedTransformerMethodException;
27
import eu.etaxonomy.cdm.io.excel.common.ExcelImportBase;
28
import eu.etaxonomy.cdm.io.excel.common.ExcelRowBase;
29
import eu.etaxonomy.cdm.model.common.Language;
30
import eu.etaxonomy.cdm.model.description.Distribution;
31
import eu.etaxonomy.cdm.model.description.Feature;
32
import eu.etaxonomy.cdm.model.description.PresenceAbsenceTerm;
33
import eu.etaxonomy.cdm.model.description.TaxonDescription;
34
import eu.etaxonomy.cdm.model.description.TextData;
35
import eu.etaxonomy.cdm.model.location.NamedArea;
36
import eu.etaxonomy.cdm.model.name.INonViralName;
37
import eu.etaxonomy.cdm.model.name.NomenclaturalCode;
38
import eu.etaxonomy.cdm.model.name.Rank;
39
import eu.etaxonomy.cdm.model.reference.Reference;
40
import eu.etaxonomy.cdm.model.taxon.Classification;
41
import eu.etaxonomy.cdm.model.taxon.Synonym;
42
import eu.etaxonomy.cdm.model.taxon.SynonymType;
43
import eu.etaxonomy.cdm.model.taxon.Taxon;
44
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
45
import eu.etaxonomy.cdm.strategy.parser.INonViralNameParser;
46
import eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl;
47

    
48
/**
49
 * @author a.babadshanjan
50
 * @since 08.01.2009
51
 */
52

    
53
@Component
54
public class CyprusExcelImport
55
        extends ExcelImportBase<CyprusImportState, CyprusImportConfigurator, ExcelRowBase> {
56

    
57
    private static final long serialVersionUID = 4449832452730987788L;
58

    
59
    private static final Logger logger = Logger.getLogger(CyprusExcelImport.class);
60

    
61
	public static Set<String> validMarkers = new HashSet<String>(Arrays.asList(new String[]{"", "valid", "accepted", "a", "v", "t"}));
62
	public static Set<String> synonymMarkers = new HashSet<String>(Arrays.asList(new String[]{"", "invalid", "synonym", "s", "i"}));
63

    
64

    
65
	@Override
66
	protected boolean isIgnore(CyprusImportState state) {
67
		return ! state.getConfig().isDoTaxa();
68
	}
69

    
70

    
71
	/* (non-Javadoc)
72
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IoStateBase)
73
	 */
74
	@Override
75
	protected boolean doCheck(CyprusImportState state) {
76
		logger.warn("DoCheck not yet implemented for CyprusExcelImport");
77
		return true;
78
	}
79

    
80
//	protected static final String ID_COLUMN = "Id";
81
	protected static final String SPECIES_COLUMN = "species";
82
	protected static final String SUBSPECIES_COLUMN = "subspecies";
83
	protected static final String GENUS_COLUMN = "genus";
84
	protected static final String FAMILY_COLUMN = "family";
85
	protected static final String DIVISION_COLUMN = "division";
86
	protected static final String HOMOTYPIC_SYNONYM_COLUMN = "homotypic synonyms";
87
	protected static final String HETEROTYPIC_SYNONYMS_COLUMN = "heterotypic synonyms";
88
	protected static final String ENDEMISM_COLUMN = "endemism";
89

    
90
	protected static final String STATUS_COLUMN = "status";
91
	protected static final String RED_DATA_BOOK_CATEGORY_COLUMN = "red data book category";
92
	protected static final String SYSTEMATICS_COLUMN = "systematics";
93

    
94

    
95

    
96
	// TODO: This enum is for future use (perhaps).
97
	protected enum Columns {
98
//		Id("Id"),
99
		Species("species"),
100
		Subspecies("subspecies"),
101
		Genus("genus"),
102
		Family("family"),
103
		Division("division"),
104
		HomotypicSynonyms("homotypic synonyms"),
105
		HeterotypicSynonyms("heterotypic synonyms"),
106
		Status("status"),
107
		Endemism("endemism");
108

    
109
		private final String head;
110
		private String value;
111

    
112
		private Columns(String head) {
113
			this.head = head;
114
		}
115

    
116
		public String head() {
117
			return this.head;
118
		}
119

    
120
		public String value() {
121
			return this.value;
122
		}
123
	}
124

    
125

    
126
	@Override
127
    protected void analyzeRecord(Map<String, String> record, CyprusImportState state) {
128

    
129
		Set<String> keys = record.keySet();
130

    
131
    	CyprusRow cyprusRow = new CyprusRow();
132
    	state.setCyprusRow(cyprusRow);
133

    
134
    	for (String originalKey: keys) {
135
    		String indexedKey = CdmUtils.removeDuplicateWhitespace(originalKey.trim()).toString();
136
    		String[] split = indexedKey.split("_");
137
    		String key = split[0];
138
    		if (split.length > 1){
139
    			String indexString = split[1];
140
    			try {
141
					Integer.valueOf(indexString);
142
				} catch (NumberFormatException e) {
143
					String message = "Index must be integer";
144
					logger.error(message);
145
					continue;
146
				}
147
    		}
148

    
149
    		String value = record.get(indexedKey);
150
    		if (! StringUtils.isBlank(value)) {
151
    			if (logger.isDebugEnabled()) { logger.debug(key + ": " + value); }
152
        		value = CdmUtils.removeDuplicateWhitespace(value.trim()).toString();
153
    		}else{
154
    			continue;
155
    		}
156

    
157

    
158
    		if (key.equalsIgnoreCase(SPECIES_COLUMN)) {
159
//    			int ivalue = floatString2IntValue(value);
160
    			cyprusRow.setSpecies(value);
161

    
162
			} else if(key.equalsIgnoreCase(SUBSPECIES_COLUMN)) {
163
				cyprusRow.setSubspecies(value);
164

    
165
			} else if(key.equalsIgnoreCase(HOMOTYPIC_SYNONYM_COLUMN)) {
166
				cyprusRow.setHomotypicSynonyms(value);
167

    
168
			} else if(key.equalsIgnoreCase(HETEROTYPIC_SYNONYMS_COLUMN)) {
169
				cyprusRow.setHeterotypicSynonyms(value);
170

    
171
			} else if(key.equalsIgnoreCase(ENDEMISM_COLUMN)) {
172
				cyprusRow.setEndemism(value);
173

    
174
			} else if(key.equalsIgnoreCase(STATUS_COLUMN)) {
175
				cyprusRow.setStatus(value);
176

    
177
			} else if(key.equalsIgnoreCase(RED_DATA_BOOK_CATEGORY_COLUMN)) {
178
				cyprusRow.setRedDataBookCategory(value);
179

    
180
			} else if(key.equalsIgnoreCase(SYSTEMATICS_COLUMN)) {
181
				cyprusRow.setSystematics(value);
182

    
183
			} else if(key.equalsIgnoreCase(GENUS_COLUMN)) {
184
				cyprusRow.setGenus(value);
185

    
186
			} else if(key.equalsIgnoreCase(FAMILY_COLUMN)) {
187
				cyprusRow.setFamily(value);
188

    
189
			} else if(key.equalsIgnoreCase(DIVISION_COLUMN)) {
190
				cyprusRow.setDivision(value);
191

    
192
			} else {
193
				state.setUnsuccessfull();
194
				logger.error("Unexpected column header " + key);
195
			}
196
    	}
197
    	return;
198
    }
199

    
200
	private static INonViralNameParser<INonViralName> nameParser = NonViralNameParserImpl.NewInstance();
201
	private static NomenclaturalCode nc = NomenclaturalCode.ICNAFP;
202
	private Feature redBookCategory;
203
	private Feature endemism;
204
	private PresenceAbsenceTerm indigenous;
205
	private PresenceAbsenceTerm indigenousDoubtful;
206
	private PresenceAbsenceTerm cultivatedDoubtful;
207

    
208
	private PresenceAbsenceTerm casual;
209
	private PresenceAbsenceTerm casualDoubtful;
210
	private PresenceAbsenceTerm nonInvasive;
211
	private PresenceAbsenceTerm nonInvasiveDoubtful;
212
	private PresenceAbsenceTerm invasive;
213
	private PresenceAbsenceTerm invasiveDoubtful;
214
	private PresenceAbsenceTerm questionable;
215
	private PresenceAbsenceTerm questionableDoubtful;
216

    
217
	private boolean termsCreated = false;
218

    
219
	private boolean makeTerms(CyprusImportState state) {
220
		if (termsCreated == false){
221
			IInputTransformer transformer = state.getTransformer();
222

    
223
			try {
224
				//feature
225
				UUID redBookUuid = transformer.getFeatureUuid("Red book");
226
				redBookCategory = this.getFeature(state, redBookUuid, "Red book category", "Red data book category", "Red book", null);
227
				getTermService().save(redBookCategory);
228

    
229
				UUID endemismUuid = transformer.getFeatureUuid("Endemism");
230
				endemism = this.getFeature(state, endemismUuid, "Endemism", "Endemism", "Endemism", null);
231
				getTermService().save(endemism);
232

    
233
				//status
234

    
235
				UUID indigenousUuid = transformer.getPresenceTermUuid("IN");
236
				indigenous = this.getPresenceTerm(state, indigenousUuid, "indigenous", "Indigenous", "IN", false);
237
				getTermService().save(indigenous);
238
				UUID indigenousDoubtfulUuid = transformer.getPresenceTermUuid("IN?");
239
				indigenousDoubtful = this.getPresenceTerm(state, indigenousDoubtfulUuid, "indigenous?", "Indigenous?", "IN?", false);
240
				getTermService().save(indigenousDoubtful);
241

    
242
				UUID cultivatedDoubtfulUuid = transformer.getPresenceTermUuid("CU?");
243
				cultivatedDoubtful = this.getPresenceTerm(state, cultivatedDoubtfulUuid, "cultivated?", "Cultivated?", "CU?", false);
244
				getTermService().save(cultivatedDoubtful);
245

    
246

    
247
				UUID casualUuid = transformer.getPresenceTermUuid("CA");
248
				casual = this.getPresenceTerm(state, casualUuid, "casual", "Casual", "CA", false);
249
				getTermService().save(casual);
250
				UUID casualDoubtfulUuid = transformer.getPresenceTermUuid("CA?");
251
				casualDoubtful = this.getPresenceTerm(state, casualDoubtfulUuid, "casual?", "Casual?", "CA?", false);
252
				getTermService().save(casualDoubtful);
253

    
254

    
255
				UUID nonInvasiveUuid = transformer.getPresenceTermUuid("NN");
256
				nonInvasive = this.getPresenceTerm(state, nonInvasiveUuid, "naturalized  non-invasive", "Naturalized  non-invasive", "NN", false);
257
				getTermService().save(nonInvasive);
258
				UUID nonInvasiveDoubtfulUuid = transformer.getPresenceTermUuid("NN?");
259
				nonInvasiveDoubtful = this.getPresenceTerm(state, nonInvasiveDoubtfulUuid, "naturalized  non-invasive?", "Naturalized  non-invasive?", "NN?", false);
260
				getTermService().save(nonInvasiveDoubtful);
261

    
262
				UUID invasiveUuid = transformer.getPresenceTermUuid("NA");
263
				invasive = this.getPresenceTerm(state, invasiveUuid, "naturalized  invasive", "Naturalized  invasive", "NA", false);
264
				getTermService().save(invasive);
265
				UUID invasiveDoubtfulUuid = transformer.getPresenceTermUuid("NA?");
266
				invasiveDoubtful = this.getPresenceTerm(state, invasiveDoubtfulUuid, "naturalized  invasive?", "Naturalized  invasive?", "NA?", false);
267
				getTermService().save(invasiveDoubtful);
268

    
269
				UUID questionableUuid = transformer.getPresenceTermUuid("Q");
270
				questionable = this.getPresenceTerm(state, questionableUuid, "questionable", "Questionable", "Q", false);
271
				getTermService().save(questionable);
272
				UUID questionableDoubtfulUuid = transformer.getPresenceTermUuid("Q?");
273
				questionableDoubtful = this.getPresenceTerm(state, questionableDoubtfulUuid, "questionable?", "Questionable?", "Q?", false);
274
				getTermService().save(questionableDoubtful);
275

    
276
				termsCreated = true;
277

    
278
				return true;
279
			} catch (UndefinedTransformerMethodException e) {
280
				e.printStackTrace();
281
				return false;
282
			}
283
		}
284
		return true;
285

    
286
	}
287

    
288
	/**
289
	 *  Stores taxa records in DB
290
	 */
291
	@Override
292
    protected void firstPass(CyprusImportState state) {
293

    
294
		makeTerms(state);
295
		CyprusRow taxonLight = state.getCyprusRow();
296
		Reference citation = null;
297
		String microCitation = null;
298

    
299
		//species name
300
		String speciesStr = taxonLight.getSpecies();
301
		String subSpeciesStr = taxonLight.getSubspecies();
302
		String homotypicSynonymsString = taxonLight.getHomotypicSynonyms();
303
		List<String> homotypicSynonymList = Arrays.asList(homotypicSynonymsString.split(";"));
304
		String heterotypicSynonymsString = taxonLight.getHeterotypicSynonyms();
305
		List<String> heterotypicSynonymList = Arrays.asList(heterotypicSynonymsString.split(";"));
306

    
307
		String systematicsString = taxonLight.getSystematics();
308
		String endemismString = taxonLight.getEndemism();
309
		String statusString = taxonLight.getStatus();
310
		String redBookCategory = taxonLight.getRedDataBookCategory();
311

    
312
		if (StringUtils.isNotBlank(speciesStr)) {
313
			boolean speciesIsExisting = false;
314
			Taxon mainTaxon = null;
315
			//species
316
			Taxon speciesTaxon = (Taxon)createTaxon(state, Rank.SPECIES(), speciesStr, Taxon.class, nc);
317
			mainTaxon = speciesTaxon;
318

    
319
			//subspecies
320
			if (StringUtils.isNotBlank(subSpeciesStr)){
321
				Taxon existingSpecies = state.getHigherTaxon(speciesStr);
322
				if (existingSpecies != null){
323
					speciesIsExisting = true;
324
					speciesTaxon = existingSpecies;
325
				}
326

    
327
				Taxon subSpeciesTaxon = (Taxon)createTaxon(state, Rank.SUBSPECIES(), subSpeciesStr, Taxon.class, nc);
328

    
329
				if (subSpeciesTaxon != null){
330
					makeParent(state, speciesTaxon, subSpeciesTaxon, citation, microCitation);
331
				}
332
				mainTaxon = subSpeciesTaxon;
333
				state.putHigherTaxon(speciesStr, speciesTaxon);
334
			}
335

    
336
			if (! speciesIsExisting){
337
				makeHigherTaxa(state, taxonLight, speciesTaxon, citation, microCitation);
338
			}
339
			makeHomotypicSynonyms(state, homotypicSynonymList, mainTaxon);
340
			makeHeterotypicSynonyms(state, heterotypicSynonymList, mainTaxon);
341
			makeSystematics(systematicsString, mainTaxon);
342
			makeEndemism(endemismString, mainTaxon);
343
			makeStatus(statusString, mainTaxon);
344
			makeRedBookCategory(redBookCategory, mainTaxon);
345

    
346
//			state.putHigherTaxon(higherName, uuid);//(speciesStr, mainTaxon);
347
			getTaxonService().save(mainTaxon);
348
		}
349
		return;
350
    }
351

    
352

    
353
	private void makeHigherTaxa(CyprusImportState state, CyprusRow taxonLight, Taxon speciesTaxon, Reference citation, String microCitation) {
354
		String divisionStr = taxonLight.getDivision();
355
		String genusStr = taxonLight.getGenus();
356
		String familyStr = taxonLight.getFamily();
357

    
358
		Taxon division = getTaxon(state, divisionStr, Rank.DIVISION(), null, citation, microCitation);
359
		Taxon family = getTaxon(state, familyStr, Rank.FAMILY(), division, citation, microCitation);
360
		Taxon genus = getTaxon(state, genusStr, Rank.GENUS(), family, citation, microCitation);
361
		makeParent(state, genus, speciesTaxon, citation, microCitation)	;
362
	}
363

    
364

    
365
	private Taxon getTaxon(CyprusImportState state, String taxonNameStr, Rank rank, Taxon parent, Reference citation, String microCitation) {
366
		Taxon result;
367
		if (state.containsHigherTaxon(taxonNameStr)){
368
			result = state.getHigherTaxon(taxonNameStr);
369
		}else{
370
			result = (Taxon)createTaxon(state, rank, taxonNameStr, Taxon.class, nc);
371
			state.putHigherTaxon(taxonNameStr, result);
372
			if (parent == null){
373
				makeParent(state, null,result, citation, microCitation);
374
			}else{
375
				makeParent(state, parent, result, citation, microCitation);
376
			}
377

    
378
		}
379
		return result;
380
	}
381

    
382

    
383
	private void makeHomotypicSynonyms(CyprusImportState state,
384
			List<String> homotypicSynonymList, Taxon mainTaxon) {
385
		for (String homotypicSynonym: homotypicSynonymList){
386
			if (StringUtils.isNotBlank(homotypicSynonym)){
387
				Synonym synonym = (Synonym)createTaxon(state, null, homotypicSynonym, Synonym.class, nc);
388
				mainTaxon.addHomotypicSynonym(synonym);
389
			}
390
		}
391
	}
392

    
393

    
394
	private void makeHeterotypicSynonyms(CyprusImportState state, List<String> heterotypicSynonymList, Taxon mainTaxon) {
395
		for (String heterotypicSynonym: heterotypicSynonymList){
396
			if (StringUtils.isNotBlank(heterotypicSynonym)){
397
				Synonym synonym = (Synonym)createTaxon(state, null, heterotypicSynonym, Synonym.class, nc);
398
				mainTaxon.addSynonym(synonym, SynonymType.HETEROTYPIC_SYNONYM_OF());
399
			}
400
		}
401
	}
402

    
403

    
404
	private void makeSystematics(String systematicsString, Taxon mainTaxon) {
405
		//Systematics
406
		if (StringUtils.isNotBlank(systematicsString)){
407
			TaxonDescription td = this.getTaxonDescription(mainTaxon, false, true);
408
			TextData textData = TextData.NewInstance(Feature.SYSTEMATICS());
409
			textData.putText(Language.UNDETERMINED(), systematicsString);
410
			td.addElement(textData);
411
		}
412
	}
413

    
414

    
415
	private void makeEndemism(String endemismString, Taxon mainTaxon) {
416
		//endemism
417
		if (StringUtils.isNotBlank(endemismString)){
418
			//OLD - not wanted as marker
419
//			boolean flag;
420
//			if (endemismString.trim().equalsIgnoreCase("not endemic") || endemismString.trim().equalsIgnoreCase("ne?")){
421
//				flag = false;
422
//			}else if (endemismString.trim().equalsIgnoreCase("endemic")){
423
//				flag = true;
424
//			}else{
425
//				throw new RuntimeException(endemismString + " is not a valid value for endemism");
426
//			}
427
//			Marker marker = Marker.NewInstance(MarkerType.ENDEMIC(), flag);
428
//			mainTaxon.addMarker(marker);
429
			//text data
430
			TaxonDescription td = this.getTaxonDescription(mainTaxon, false, true);
431
			TextData textData = TextData.NewInstance(endemism);
432
			textData.putText(Language.ENGLISH(), endemismString);
433
			td.addElement(textData);
434
		}
435
	}
436

    
437

    
438
	private void makeStatus(String statusString, Taxon mainTaxon) {
439
		//status
440
		if (StringUtils.isNotBlank(statusString)){
441
			PresenceAbsenceTerm status = null;
442
			if (statusString.contains("Indigenous?")){
443
				status = indigenousDoubtful;
444
			}else if (statusString.contains("Indigenous")){
445
				status = indigenous;
446
			}else if (statusString.contains("Casual?") || statusString.contains("Causal?")){
447
				status = casualDoubtful;
448
			}else if (statusString.contains("Casual")){
449
				status = casual;
450
			}else if (statusString.contains("Cultivated?")){
451
				status = cultivatedDoubtful;
452
			}else if (statusString.contains("Cultivated")){
453
				status = PresenceAbsenceTerm.CULTIVATED();
454
			}else if (statusString.contains("non-invasive?")){
455
				status = nonInvasiveDoubtful;
456
			}else if (statusString.contains("non-invasive")){
457
				status = nonInvasive;
458
			}else if (statusString.contains("invasive?")){
459
				status = invasiveDoubtful;
460
			}else if (statusString.contains("invasive")){
461
				status = invasive;
462
			}else if (statusString.contains("Questionable?")){
463
				status = questionableDoubtful;
464
			}else if (statusString.contains("Questionable")){
465
				status = questionable;
466
			}else if (statusString.startsWith("F")){
467
				status = null;
468
			}else if (statusString.equals("##")){
469
				status = null;
470
			}else{
471
				logger.warn("Unknown status: " + statusString);
472
				status = null;
473
			}
474
			TaxonDescription td = this.getTaxonDescription(mainTaxon, false, true);
475
			NamedArea area = TdwgAreaProvider.getAreaByTdwgAbbreviation("CYP");
476
			Distribution distribution = Distribution.NewInstance(area, status);
477
			td.addElement(distribution);
478

    
479
			//text data
480
			TextData textData = TextData.NewInstance(Feature.STATUS());
481
			textData.putText(Language.ENGLISH(), statusString);
482
			td.addElement(textData);
483
		}
484
	}
485

    
486

    
487
	private void makeRedBookCategory(String redBookCategory, Taxon mainTaxon) {
488
		//red data book category
489
		if (StringUtils.isNotBlank(redBookCategory)){
490
			TaxonDescription td = this.getTaxonDescription(mainTaxon, false, true);
491
			TextData textData = TextData.NewInstance(this.redBookCategory);
492
			textData.putText(Language.ENGLISH(), redBookCategory);
493
			td.addElement(textData);
494
		}
495
	}
496

    
497

    
498

    
499

    
500
	/**
501
	 *  Stores parent-child, synonym and common name relationships
502
	 */
503
	@Override
504
    protected void secondPass(CyprusImportState state) {
505
//		CyprusRow cyprusRow = state.getCyprusRow();
506
		return;
507
	}
508

    
509

    
510

    
511
	/**
512
	 * @param state
513
	 * @param rank
514
	 * @param taxonNameStr
515
	 * @param authorStr
516
	 * @param nameStatus
517
	 * @param nc
518
	 * @return
519
	 */
520
	private TaxonBase<?> createTaxon(CyprusImportState state, Rank rank, String taxonNameStr,
521
			Class<?> statusClass, NomenclaturalCode nc) {
522
		TaxonBase<?> taxonBase;
523
		INonViralName taxonNameBase = null;
524
		if (nc == NomenclaturalCode.ICVCN){
525
			logger.warn("ICVCN not yet supported");
526

    
527
		}else{
528
			taxonNameBase = nc.getNewTaxonNameInstance(rank);
529
			INonViralNameParser<INonViralName> parser = nameParser;//NonViralNameParserImpl.NewInstance();
530
			taxonNameBase = parser.parseFullName(taxonNameStr, nc, rank);
531

    
532
			//taxonNameBase.setNameCache(taxonNameStr);
533

    
534
		}
535

    
536
		//Create the taxon
537
		Reference sec = state.getConfig().getSourceReference();
538
		// Create the status
539
		if (statusClass.equals(Taxon.class)){
540
			taxonBase = Taxon.NewInstance(taxonNameBase, sec);
541
		}else if (statusClass.equals(Synonym.class)){
542
			taxonBase = Synonym.NewInstance(taxonNameBase, sec);
543
		}else {
544
			Taxon taxon = Taxon.NewInstance(taxonNameBase, sec);
545
			taxon.setTaxonStatusUnknown(true);
546
			taxonBase = taxon;
547
		}
548
		return taxonBase;
549
	}
550

    
551
	private boolean makeParent(CyprusImportState state, Taxon parentTaxon, Taxon childTaxon, Reference citation, String microCitation){
552
		boolean success = true;
553
		Reference sec = state.getConfig().getSourceReference();
554

    
555
//		Reference sec = parentTaxon.getSec();
556
		Classification tree = state.getTree(sec);
557
		if (tree == null){
558
			tree = makeTree(state, sec);
559
			tree.setTitleCache(state.getConfig().getSourceReferenceTitle(), true);
560
		}
561
		if (sec.equals(childTaxon.getSec())){
562
			success &=  (null !=  tree.addParentChild(parentTaxon, childTaxon, citation, microCitation));
563
		}else{
564
			logger.warn("No relationship added for child " + childTaxon.getTitleCache());
565
		}
566
		return success;
567
	}
568

    
569

    
570

    
571
}
(3-3/8)