Project

General

Profile

Download (20.2 KB) Statistics
| Branch: | Revision:
1
package eu.etaxonomy.cdm.app.pesi.merging;
2

    
3
import java.io.FileWriter;
4
import java.io.IOException;
5
import java.util.ArrayList;
6
import java.util.Iterator;
7
import java.util.List;
8
import java.util.Map;
9
import java.util.Set;
10
import java.util.UUID;
11

    
12
import org.apache.log4j.Logger;
13

    
14
import eu.etaxonomy.cdm.api.application.CdmApplicationController;
15
import eu.etaxonomy.cdm.app.common.CdmDestinations;
16
import eu.etaxonomy.cdm.app.pesi.ErmsImportActivator;
17
import eu.etaxonomy.cdm.database.DbSchemaValidation;
18
import eu.etaxonomy.cdm.database.ICdmDataSource;
19
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
20
import eu.etaxonomy.cdm.io.api.application.CdmIoApplicationController;
21
import eu.etaxonomy.cdm.io.pesi.merging.FaunaEuErmsMerging;
22
import eu.etaxonomy.cdm.model.common.CdmBase;
23
import eu.etaxonomy.cdm.model.common.IdentifiableSource;
24
import eu.etaxonomy.cdm.model.name.IZoologicalName;
25
import eu.etaxonomy.cdm.model.name.Rank;
26
import eu.etaxonomy.cdm.model.name.TaxonName;
27
import eu.etaxonomy.cdm.model.reference.Reference;
28
import eu.etaxonomy.cdm.model.taxon.Classification;
29
import eu.etaxonomy.cdm.model.taxon.Synonym;
30
import eu.etaxonomy.cdm.model.taxon.Taxon;
31
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
32
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
33
import eu.etaxonomy.cdm.persistence.dto.TaxonNodeDto;
34

    
35
public class FaunaEuErmsFindIdenticalNamesActivator {
36
	private static final Logger logger = Logger.getLogger(FaunaEuErmsFindIdenticalNamesActivator.class);
37
	//static final ICdmDataSource faunaEuropaeaSource = CdmDestinations.localH2();
38
	static final ICdmDataSource faunaEuropaeaSource = CdmDestinations.cdm_test_local_faunaEu_mysql();
39
	static Reference faunaSec;
40
	static Reference ermsSec;
41

    
42
	//TODO hole aus beiden DB alle TaxonNameBases
43

    
44
	private CdmApplicationController initDb(ICdmDataSource db) {
45

    
46
		// Init source DB
47
		//CdmApplicationController appCtrInit = null;
48
		CdmApplicationController appCtrInit = CdmIoApplicationController.NewInstance(db, DbSchemaValidation.VALIDATE, false);
49

    
50
		
51
		//appCtrInit = TestDatabase.initDb(db, DbSchemaValidation.VALIDATE, false);
52

    
53
		return appCtrInit;
54
	}
55

    
56

    
57
	/**
58
	 * @param args
59
	 */
60
	public static void main(String[] args) {
61

    
62
		FaunaEuErmsFindIdenticalNamesActivator sc = new FaunaEuErmsFindIdenticalNamesActivator();
63

    
64
		CdmApplicationController appCtrFaunaEu = sc.initDb(faunaEuropaeaSource);
65
		String sFileName = "C:\\Users\\k.luther\\test";
66
		//CdmApplicationController appCtrErms = sc.initDb(ermsSource);
67
		List<String> propertyPaths = new ArrayList<>();
68
		propertyPaths.add("sources.*");
69
		propertyPaths.add("sources.idInSource");
70
		propertyPaths.add("sources.idNamespace");
71
		propertyPaths.add("taxonBases.*");
72
		propertyPaths.add("taxonBases.relationsFromThisTaxon");
73
		propertyPaths.add("taxonBases.taxonNodes.*");
74
		propertyPaths.add("taxonBases.taxonNodes.parent.*");
75
		propertyPaths.add("taxonBases.taxonNodes.childNodes.*");
76
		propertyPaths.add("taxonBases.taxonNodes.childNodes.classification.rootNode.childNodes.*");
77
		propertyPaths.add("taxonBases.taxonNodes.parent.taxon.name.*");
78
		propertyPaths.add("taxonBases.acceptedTaxon.taxonNodes.*");
79
		propertyPaths.add("taxonBases.acceptedTaxon.taxonNodes.childNodes.*");
80
		propertyPaths.add("taxonBases.acceptedTaxon.taxonNodes.childNodes.classification.rootNode.childNodes.*");
81
		System.err.println("Start getIdenticalNames...");
82
		
83
		faunaSec = appCtrFaunaEu.getReferenceService().load(UUID.fromString("6786d863-75d4-4796-b916-c1c3dff4cb70"));
84
		ermsSec = appCtrFaunaEu.getReferenceService().load(UUID.fromString("7744bc26-f914-42c4-b54a-dd2a030a8bb7"));
85
		Map<String, List<TaxonName>> namesOfIdenticalTaxa = appCtrFaunaEu.getTaxonService().findIdenticalTaxonNameIds(ermsSec, faunaSec, propertyPaths);
86
			
87
		List<FaunaEuErmsMerging> mergingObjects = new ArrayList<>();
88
		FaunaEuErmsMerging mergeObject;
89
		TaxonName faunaEuTaxName;
90
		TaxonName ermsTaxName;
91
		System.err.println("Start creating merging objects");
92
		mergingObjects= sc.createMergeObjects(namesOfIdenticalTaxa, appCtrFaunaEu);
93
		boolean resultOK = true;
94
		System.err.println("Start creating csv files");
95
		resultOK = resultOK && sc.writeSameNamesdifferentAuthorToCsv(mergingObjects, sFileName + "_authors.csv");
96
		resultOK = resultOK &&sc.writeSameNamesdifferentStatusToCsv(mergingObjects, sFileName + "_status.csv");
97
		resultOK = resultOK &&sc.writeSameNamesToCsVFile(mergingObjects, sFileName + "_names.csv");
98
		//do not create the phylum file, explanation inside the method writeSameNamesdifferentPhylumToCsv
99
		//resultOK = resultOK &&sc.writeSameNamesdifferentPhylumToCsv(mergingObjects, sFileName + "_phylum.csv");
100
		resultOK = resultOK &&sc.writeSameNamesDifferentParentToCsv(mergingObjects, sFileName + "parent.csv");
101

    
102
		System.err.println("End merging Fauna Europaea and Erms" + resultOK);
103
		System.exit(0);
104

    
105
	}
106

    
107
	private boolean writeSameNamesToCsVFile(
108
			List<FaunaEuErmsMerging> mergingObjects, String string) {
109
	    try{
110
    		FileWriter writer = new FileWriter(string);
111

    
112
    	    //create Header
113
    	    String firstLine = "same names";
114
    	    createHeader(writer, firstLine);
115
    		for (FaunaEuErmsMerging merging : mergingObjects){
116
    	    	writeCsvLine(writer, merging) ;
117
    		}
118
    		writer.flush();
119
    		writer.close();
120
    	}catch(IOException e){
121
    	    return false;
122
    	}
123
    	return true;
124
	}
125

    
126
	private boolean writeSameNamesdifferentPhylumToCsv(List<FaunaEuErmsMerging> mergingObjects, String sfileName){
127
		try
128
		{
129
			//do we really need this?? it is a taxon needed merged like all others? for erms only one taxon has different phylum. (Valencia, but these are not the same taxa -> fish and ribbon worms)
130
		    FileWriter writer = new FileWriter(sfileName);
131

    
132
		    //create Header
133
		   String firstLine = "same names but different phylum";
134
		   createHeader(writer, firstLine);
135

    
136
			//write data
137
			for (FaunaEuErmsMerging merging : mergingObjects){
138
		    	//TODO the phyllum is always different doing it this way, maybe we need to merge the phylum taxa first and then 
139
				if ((merging.getPhylumInErms()== null )^ (merging.getPhylumInFaunaEu()== null)){
140
					writeCsvLine(writer, merging) ;
141
				}else if(!((merging.getPhylumInErms()==null) && (merging.getPhylumInFaunaEu()==null))){
142
					if(!merging.getPhylumInErms().getNameTitleCache().equals(merging.getPhylumInFaunaEu().getNameTitleCache())){
143
						writeCsvLine(writer, merging) ;
144
					}
145
				}
146
			}
147
			writer.flush();
148
			writer.close();
149
		}
150
		catch(IOException e)
151
		{
152
		 return false;
153
		}
154
		return true;
155
	}
156
	
157
	private boolean writeSameNamesDifferentParentToCsv(List<FaunaEuErmsMerging> mergingObjects, String sfileName){
158
		try
159
		{
160
		    FileWriter writer = new FileWriter(sfileName);
161

    
162
		    //create Header
163
		   String firstLine = "same names but different parent";
164
		   createHeader(writer, firstLine);
165

    
166
			//write data
167
			for (FaunaEuErmsMerging merging : mergingObjects){
168
		    	//TODO
169
				if ((merging.getParentStringInErms()== null )^ (merging.getParentStringInFaunaEu()== null)){
170
					writeCsvLine(writer, merging) ;
171
				}else if(!((merging.getParentStringInErms()==null) && (merging.getParentStringInFaunaEu()==null))){
172
					if(!merging.getParentStringInErms().equals(merging.getParentStringInFaunaEu())){
173
						writeCsvLine(writer, merging) ;
174
					}
175
				}
176
			}
177
			writer.flush();
178
			writer.close();
179
		}
180
		catch(IOException e)
181
		{
182
		 return false;
183
		}
184
		return true;
185
	}
186

    
187
	private boolean writeSameNamesdifferentRankToCsv(List<FaunaEuErmsMerging> mergingObjects, String sfileName){
188
		try
189
		{
190
		    FileWriter writer = new FileWriter(sfileName);
191
		    String firstLine = "same names but different rank";
192
		    //create Header
193
		    createHeader(writer, firstLine);
194

    
195
			//write data
196
			for (FaunaEuErmsMerging merging : mergingObjects){
197

    
198
				if (!merging.getRankInErms().equals(merging.getRankInFaunaEu())){
199
					writeCsvLine(writer, merging);
200
				}
201
			}
202
			writer.flush();
203
			writer.close();
204
		}
205
		catch(IOException e)
206
		{
207
		 return false;
208
		}
209
		return true;
210
	}
211

    
212
	private void createHeader(FileWriter writer, String firstLine) throws IOException{
213
		 	writer.append(firstLine);
214
		    writer.append('\n');
215
		    writer.append("uuid in Fauna Europaea");
216
			writer.append(';');
217
			writer.append("id in Fauna Europaea");
218
			writer.append(';');
219
			writer.append("name in FE");
220
			writer.append(';');
221
			writer.append("author in FE");
222
			writer.append(';');
223
			writer.append("rank in FE");
224
			writer.append(';');
225
			writer.append("state in FE");
226
			writer.append(';');
227
			writer.append("phylum in FE");
228
			writer.append(';');
229
			writer.append("parent in FE");
230
			writer.append(';');
231
			writer.append("parent rank in FE");
232
			writer.append(';');
233

    
234
			writer.append("uuid in Erms");
235
			writer.append(';');
236
			writer.append("id in Erms");
237
			writer.append(';');
238
			writer.append("name in Erms");
239
			writer.append(';');
240
			writer.append("author in Erms");
241
			writer.append(';');
242
			writer.append("rank in Erms");
243
			writer.append(';');
244
			writer.append("state in Erms");
245
			writer.append(';');
246
			writer.append("phylum in Erms");
247
			writer.append(';');
248
			writer.append("parent in Erms");
249
			writer.append(';');
250
			writer.append("parent rank in Erms");
251
			writer.append('\n');
252
	}
253

    
254
	private boolean writeSameNamesdifferentStatusToCsv(List<FaunaEuErmsMerging> mergingObjects, String sfileName){
255
		try
256
		{
257
		    FileWriter writer = new FileWriter(sfileName);
258

    
259
		    //create Header
260
		    String firstLine = "same names but different status";
261
		    createHeader(writer, firstLine);
262

    
263
			//write data
264
			for (FaunaEuErmsMerging merging : mergingObjects){
265

    
266
				if (merging.isStatInErms()^merging.isStatInFaunaEu()){
267
					 writeCsvLine(writer, merging);
268
				}
269
			}
270

    
271
			writer.flush();
272
			writer.close();
273
		}
274
		catch(IOException e)
275
		{
276
		 return false;
277
		}
278
		return true;
279
	}
280

    
281
	private boolean writeSameNamesdifferentAuthorToCsv(List<FaunaEuErmsMerging> mergingObjects, String sfileName){
282
		try
283
		{
284
		    FileWriter writer = new FileWriter(sfileName);
285

    
286
		    //create Header
287
		   String firstLine = "same names but different authors";
288
		   createHeader(writer, firstLine);
289

    
290
			//write data
291
			for (FaunaEuErmsMerging merging : mergingObjects){
292

    
293
				if (merging.getAuthorInErms() != null && merging.getAuthorInFaunaEu() != null && !merging.getAuthorInErms().equals(merging.getAuthorInFaunaEu())){
294
					 writeCsvLine(writer, merging);
295
				}else if ((merging.getAuthorInErms() == null && merging.getAuthorInFaunaEu() != null) || (merging.getAuthorInErms() != null && merging.getAuthorInFaunaEu() == null)) {
296
					writeCsvLine(writer, merging);
297
				}
298
			}
299

    
300

    
301
			writer.flush();
302
			writer.close();
303
		}
304
		catch(IOException e)
305
		{
306
		 return false;
307
		}
308
		return true;
309
	}
310

    
311
	private void writeCsvLine(FileWriter writer, FaunaEuErmsMerging merging) throws IOException{
312

    
313
		writer.append(merging.getUuidFaunaEu());
314
		writer.append(';');
315
		writer.append(merging.getIdInFaunaEu());
316
		writer.append(';');
317
		writer.append(merging.getNameCacheInFaunaEu());
318
		writer.append(';');
319
		writer.append(merging.getAuthorInFaunaEu());
320
		writer.append(';');
321
		writer.append(merging.getRankInFaunaEu());
322
		writer.append(';');
323
		if (merging.isStatInFaunaEu()){
324
			writer.append("accepted");
325
		}else{
326
			writer.append("synonym");
327
		}
328
		writer.append(';');
329
		writer.append(merging.getPhylumInFaunaEu() != null? merging.getPhylumInFaunaEu().getTaxonTitleCache(): "");
330
		writer.append(';');
331
		writer.append(merging.getParentStringInFaunaEu());
332
		writer.append(';');
333
		writer.append(merging.getParentRankStringInFaunaEu());
334
		writer.append(';');
335

    
336
		writer.append(merging.getUuidErms());
337
		writer.append(';');
338
		writer.append(merging.getIdInErms());
339
		writer.append(';');
340
		writer.append(merging.getNameCacheInErms());
341
		writer.append(';');
342
		writer.append(merging.getAuthorInErms());
343
		writer.append(';');
344
		writer.append(merging.getRankInErms());
345
		writer.append(';');
346
		if (merging.isStatInErms()){
347
			writer.append("accepted");
348
		}else{
349
			writer.append("synonym");
350
		}
351

    
352
		writer.append(';');
353
		writer.append(merging.getPhylumInErms() != null? merging.getPhylumInErms().getTitleCache():"");
354
		writer.append(';');
355
		writer.append(merging.getParentStringInErms());
356
		writer.append(';');
357
		writer.append(merging.getParentRankStringInErms());
358
		writer.append('\n');
359
	}
360

    
361

    
362
	private List<FaunaEuErmsMerging> createMergeObjects(Map<String,List<TaxonName>> names, CdmApplicationController appCtr){
363
		Classification faunaEuClassification = appCtr.getClassificationService().load(UUID.fromString("44d8605e-a7ce-41e1-bee9-99edfec01e7c"));
364
		Classification ermsClassification = appCtr.getClassificationService().load(UUID.fromString("6fa988a9-10b7-48b0-a370-2586fbc066eb"));
365
		List<FaunaEuErmsMerging> merge = new ArrayList<>();
366
		
367
		FaunaEuErmsMerging mergeObject;
368
		String idInSource1;
369
		List<TaxonName> identicalNames;
370
		
371
		for (String nameCache: names.keySet()){
372
			identicalNames = names.get(nameCache);
373
			
374
			mergeObject = new FaunaEuErmsMerging();
375
			
376
			
377
			//getPhylum
378
			TaxonNodeDto phylum1 = null;
379
			TaxonName faunaEuName = null;
380
			TaxonName ermsName = null;
381
			TaxonBase tempName = null;
382
			if (identicalNames.size() == 2) {
383
				Set<TaxonBase> taxonBases = identicalNames.get(0).getTaxonBases();
384
				if (taxonBases.size()==1) {
385
					Iterator<TaxonBase> it = taxonBases.iterator();
386
					tempName = it.next();
387
					if (tempName.getSec().equals(faunaSec)) {
388
						faunaEuName = identicalNames.get(0);
389
						ermsName = identicalNames.get(1);
390
					}else {
391
						faunaEuName = identicalNames.get(1);
392
						ermsName = identicalNames.get(0);
393
					}
394
				}else {
395
					//TODO: find the two correct names
396
				}
397
			}else {
398
				logger.debug(nameCache + " has more than two identical namecaches");
399
				continue;
400
			}
401
			phylum1 = null;
402
			if (faunaEuName.getRank().equals(Rank.PHYLUM())) {
403
				Taxon taxon = null;
404
				taxon = getAcceptedTaxon(faunaEuName);
405
				if (taxon != null) {
406
					phylum1 = new TaxonNodeDto(taxon.getTaxonNode(faunaEuClassification));
407
				}
408
				
409
			}
410
			if (phylum1 == null && faunaEuName != null && !faunaEuName.getRank().isHigher(Rank.PHYLUM())){
411
					phylum1 =appCtr.getTaxonNodeService().taxonNodeDtoParentRank(faunaEuClassification, Rank.PHYLUM(), faunaEuName);
412
			}
413

    
414
			TaxonNodeDto phylum2 = null;
415
			if (ermsName.getRank().equals(Rank.PHYLUM())) {
416
				Taxon taxon = null;
417
				taxon = getAcceptedTaxon(ermsName);
418
				if (taxon != null) {
419
					phylum2 = new TaxonNodeDto(taxon.getTaxonNode(ermsClassification));
420
				}
421
				
422
			}
423
			if (phylum2 == null && ermsName != null && !ermsName.getRank().isHigher(Rank.PHYLUM())){
424
				phylum2 = appCtr.getTaxonNodeService().taxonNodeDtoParentRank(ermsClassification, Rank.PHYLUM(), ermsName);
425
			}
426
			mergeObject.setPhylumInErms(phylum1);
427
			mergeObject.setPhylumInFaunaEu(phylum2);
428

    
429
			//getUuids
430
			mergeObject.setUuidErms(ermsName.getUuid().toString());
431
			mergeObject.setUuidFaunaEu(faunaEuName.getUuid().toString());
432

    
433
			Iterator<IdentifiableSource> sources = ermsName.getSources().iterator();
434
			if (sources.hasNext()){
435
				IdentifiableSource source = sources.next();
436
				idInSource1 = source.getIdInSource();
437
				mergeObject.setIdInErms(idInSource1);
438
			}
439
			sources = faunaEuName.getSources().iterator();
440
			if (sources.hasNext()){
441
				IdentifiableSource source = sources.next();
442
				idInSource1 = source.getIdInSource();
443
				mergeObject.setIdInFaunaEu(idInSource1);
444
			}
445

    
446
			mergeObject.setNameCacheInErms(ermsName.getNameCache());
447
			mergeObject.setNameCacheInFaunaEu(faunaEuName.getNameCache());
448

    
449
			mergeObject.setAuthorInErms(ermsName.getAuthorshipCache());
450
			mergeObject.setAuthorInFaunaEu(faunaEuName.getAuthorshipCache());
451
			Set<Taxon> taxa = ermsName.getTaxa();
452
			if (!taxa.isEmpty()){
453
				mergeObject.setStatInErms(true);
454
				Iterator<Taxon> taxaIterator = taxa.iterator();
455
				Taxon taxon = null;
456
				while (taxaIterator.hasNext()){
457
					taxon = taxaIterator.next();
458
					if (!taxon.isMisapplication()){
459
						break;
460
					}
461
				}
462
				Set<TaxonNode> nodes = taxon.getTaxonNodes();
463
				Iterator<TaxonNode> taxonNodeIterator = nodes.iterator();
464
				TaxonNode node, parentNode = null;
465
				while (taxonNodeIterator.hasNext()){
466
					node = taxonNodeIterator.next();
467
					if (!node.isTopmostNode()){
468
						parentNode = node.getParent();
469
					}
470
				}
471
				//TODO: ändern mit erweitertem Initializer..
472
				if (parentNode != null){
473
				    TaxonName parentName = HibernateProxyHelper.deproxy(parentNode.getTaxon().getName());
474
					String parentNameCache = parentName.getNameCache();
475
					mergeObject.setParentStringInErms(parentNameCache);
476
					mergeObject.setParentRankStringInErms(parentName.getRank().getLabel());
477
					
478
				}
479
			}else{
480
				mergeObject.setStatInErms(false);
481
				TaxonNode parentNode = getAcceptedNode(ermsName);
482
				//TODO: ändern mit erweitertem Initializer..
483
				if (parentNode != null){
484
				    TaxonName parentName = HibernateProxyHelper.deproxy(parentNode.getTaxon().getName());
485
					String parentNameCache = parentName.getNameCache();
486
					mergeObject.setParentStringInErms(parentNameCache);
487
					mergeObject.setParentRankStringInErms(parentName.getRank().getLabel());
488
					
489
				}
490
			}
491
			taxa = faunaEuName.getTaxa();
492
			if (!taxa.isEmpty()){
493
				mergeObject.setStatInFaunaEu(true);
494
				Iterator<Taxon> taxaIterator = taxa.iterator();
495
				Taxon taxon = null;
496
				while (taxaIterator.hasNext()){
497
					taxon = taxaIterator.next();
498
					if (!taxon.isMisapplication()){
499
						break;
500
					}
501
				}
502
				Set<TaxonNode> nodes = taxon.getTaxonNodes();
503
				Iterator<TaxonNode> taxonNodeIterator = nodes.iterator();
504
				TaxonNode node, parentNode = null;
505
				while (taxonNodeIterator.hasNext()){
506
					node = taxonNodeIterator.next();
507
					if (!node.isTopmostNode()){
508
						parentNode = node.getParent();
509
					}
510
				}
511
				//TODO: ändern mit erweitertem Initializer..
512
				if (parentNode != null){
513
					if (parentNode.getTaxon().getName().isZoological()){
514

    
515
    					IZoologicalName parentName = CdmBase.deproxy(parentNode.getTaxon().getName());
516
    					String parentNameCache = parentName.getNameCache();
517
    					mergeObject.setParentStringInFaunaEu(parentNameCache);
518
    					mergeObject.setParentRankStringInFaunaEu(parentName.getRank().getLabel());
519
    					
520
					}else{
521
						logger.debug("no zoologicalName: " + parentNode.getTaxon().getName().getTitleCache() +" . "+parentNode.getTaxon().getName().getUuid());
522
					}
523

    
524
				}
525
			}else{
526
				mergeObject.setStatInFaunaEu(false);
527
				TaxonNode parentNode = getAcceptedNode(faunaEuName);
528
				//TODO: ändern mit erweitertem Initializer..
529
				if (parentNode != null){
530
				    TaxonName parentName = HibernateProxyHelper.deproxy(parentNode.getTaxon().getName());
531
					String parentNameCache = parentName.getNameCache();
532
					mergeObject.setParentStringInFaunaEu(parentNameCache);
533
					mergeObject.setParentRankStringInFaunaEu(parentName.getRank().getLabel());
534
					
535
				}
536
			}
537
			
538

    
539
			mergeObject.setRankInErms(ermsName.getRank().getLabel());
540
			mergeObject.setRankInFaunaEu(faunaEuName.getRank().getLabel());
541

    
542
		
543
			merge.add(mergeObject);
544
		}
545

    
546

    
547
		return merge;
548

    
549
	}
550

    
551

    
552
	/**
553
	 * @param ermsName
554
	 * @return
555
	 */
556
	private TaxonNode getAcceptedNode(TaxonName ermsName) {
557
		Set<TaxonBase> taxonBases = ermsName.getTaxonBases();
558
		Taxon taxon = null;
559
		if (taxonBases != null && !taxonBases.isEmpty()) {
560
			TaxonBase taxonBase = taxonBases.iterator().next();
561
			if (taxonBase instanceof Synonym) {
562
				taxon = ((Synonym)taxonBase).getAcceptedTaxon();
563
			}
564
		}
565
		
566
		
567
		Set<TaxonNode> nodes = taxon.getTaxonNodes();
568
		
569
		TaxonNode node, parentNode = null;
570
		if (nodes != null && !nodes.isEmpty()) {
571
			parentNode = nodes.iterator().next();
572
		}
573
		return parentNode;
574
	}
575

    
576

    
577
	/**
578
	 * @param ermsName
579
	 * @param taxon
580
	 * @return
581
	 */
582
	private Taxon getAcceptedTaxon(TaxonName ermsName) {
583
		Taxon taxon = null;
584
		if (ermsName.getTaxa() != null && !ermsName.getTaxa().isEmpty()){
585
			taxon = ermsName.getTaxa().iterator().next();
586
			
587
		}else if (ermsName.getTaxonBases() != null && !ermsName.getTaxonBases().isEmpty()){
588
			TaxonBase taxonBase = ermsName.getTaxonBases().iterator().next();
589
			if (taxonBase instanceof Synonym) {
590
				Synonym syn = (Synonym)taxonBase;
591
				taxon = syn.getAcceptedTaxon();
592
			}
593
		}
594
		return taxon;
595
	}
596
}
(1-1/2)