Project

General

Profile

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

    
3
import java.io.BufferedReader;
4
import java.io.File;
5
import java.io.FileNotFoundException;
6
import java.io.FileReader;
7
import java.io.IOException;
8
import java.util.ArrayList;
9
import java.util.HashSet;
10
import java.util.Iterator;
11
import java.util.List;
12
import java.util.Set;
13
import java.util.StringTokenizer;
14
import java.util.UUID;
15

    
16
import common.Logger;
17

    
18
import eu.etaxonomy.cdm.api.application.CdmApplicationController;
19
import eu.etaxonomy.cdm.api.service.pager.Pager;
20
import eu.etaxonomy.cdm.app.common.CdmDestinations;
21
import eu.etaxonomy.cdm.app.util.TestDatabase;
22
import eu.etaxonomy.cdm.database.DbSchemaValidation;
23
import eu.etaxonomy.cdm.database.ICdmDataSource;
24
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
25
import eu.etaxonomy.cdm.io.common.Source;
26
import eu.etaxonomy.cdm.model.common.Annotation;
27
import eu.etaxonomy.cdm.model.common.Credit;
28
import eu.etaxonomy.cdm.model.common.Extension;
29
import eu.etaxonomy.cdm.model.common.IdentifiableSource;
30
import eu.etaxonomy.cdm.model.common.Marker;
31
import eu.etaxonomy.cdm.model.common.RelationshipBase.Direction;
32
import eu.etaxonomy.cdm.model.description.DescriptionBase;
33
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
34
import eu.etaxonomy.cdm.model.description.Distribution;
35
import eu.etaxonomy.cdm.model.description.Feature;
36
import eu.etaxonomy.cdm.model.description.TaxonDescription;
37
import eu.etaxonomy.cdm.model.name.NameRelationship;
38
import eu.etaxonomy.cdm.model.name.Rank;
39
import eu.etaxonomy.cdm.model.name.TaxonNameBase;
40
import eu.etaxonomy.cdm.model.name.ZoologicalName;
41
import eu.etaxonomy.cdm.model.reference.Reference;
42
import eu.etaxonomy.cdm.model.taxon.Synonym;
43
import eu.etaxonomy.cdm.model.taxon.SynonymRelationship;
44
import eu.etaxonomy.cdm.model.taxon.Taxon;
45
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
46
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
47
import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;
48

    
49
public class FaunaEuErmsMergeActivator {
50
	
51
	static final ICdmDataSource faunaEuropaeaSource = CdmDestinations.cdm_test_patricia();
52
	
53
	static final int faunaEuUuid = 0;
54
	static final int ermsUuid = 9;
55
	static final int rankFaunaEu = 4;
56
	static final int rankErms = 13;
57
	
58
	CdmApplicationController appCtrInit;
59
	
60
	private static final Logger logger = Logger.getLogger(FaunaEuErmsMergeActivator.class);
61
	
62
	//csv files starting with...
63
	static String sFileName = "c:\\test";
64
	
65
	private void initDb(ICdmDataSource db) {
66

    
67
		// Init source DB
68
		appCtrInit = TestDatabase.initDb(db, DbSchemaValidation.VALIDATE, false);
69

    
70
		
71
	}
72
	
73
	public static void main(String[] args) {
74
		
75
		FaunaEuErmsMergeActivator sc = new FaunaEuErmsMergeActivator();
76
		
77
		sc.initDb(faunaEuropaeaSource);
78
			
79
		sc.mergeAuthors();
80
		
81
		//set the ranks of Agnatha and Gnathostomata to 50 instead of 45
82
		List<TaxonBase> taxaToChangeRank = new ArrayList<TaxonBase>();
83
		Pager<TaxonBase> agnatha = sc.appCtrInit.getTaxonService().findTaxaByName(TaxonBase.class, "Agnatha", null, null, null, Rank.INFRAPHYLUM(), 10, 0);
84
		List<TaxonBase> agnathaList = agnatha.getRecords();
85
		taxaToChangeRank.addAll(agnathaList);
86
		Pager<TaxonBase> gnathostomata = sc.appCtrInit.getTaxonService().findTaxaByName(TaxonBase.class, "Gnathostomata", null, null, null, Rank.INFRAPHYLUM(), 10, 0);
87
		List<TaxonBase> gnathostomataList = gnathostomata.getRecords();
88
		taxaToChangeRank.addAll(gnathostomataList);
89
		
90
		sc.setSpecificRank(taxaToChangeRank,Rank.SUPERCLASS());
91
		
92
		//ermsTaxon is accepted, fauna eu taxon is synonym
93
		//ermsTaxon is synonym, faunaEu is accepted
94
		
95
		sc.mergeDiffStatus();
96
		
97
		//erms is synonym, faunaEu as well
98
		
99
		// erms is accepted, faunaEu as well
100
		
101
		
102
		
103
		
104
		
105
		
106
		
107
	}
108
	
109
	private static List readCsvFile(String fileName){
110
		
111
		List<List<String>> result = new ArrayList<List<String>>();
112
		File file = new File(fileName);
113
		BufferedReader bufRdr;
114
		try {
115
			bufRdr = new BufferedReader(new FileReader(file));
116
			String line = null;
117
			//read each line of text file
118
			while((line = bufRdr.readLine()) != null){
119
				StringTokenizer st = new StringTokenizer(line,",");
120
				List<String> rowList = new ArrayList<String>();
121
				while (st.hasMoreTokens()){
122
					//get next token and store it in the array
123
					rowList.add(st.nextToken());
124
				}
125
			result.add(rowList);
126
			}
127
			//close the file
128
			bufRdr.close();
129
		} catch (FileNotFoundException e) {
130
			// TODO Auto-generated catch block
131
			e.printStackTrace();
132
		} catch (IOException e) {
133
			// TODO Auto-generated catch block
134
			e.printStackTrace();
135
		}
136
		return result;
137
	}
138
	
139
	
140
	private void mergeAuthors(){
141
		List<List<String>> authors = readCsvFile(sFileName + "_authors.csv");
142
		//authors: get firstAuthor if isFauEu = 1 otherwise get secondAuthor
143
		
144
		Iterator<List<String>> authorIterator = authors.iterator();
145
		List<String> row;
146
		TaxonBase taxonFaunaEu;
147
		TaxonBase taxonErms;
148
		List<TaxonBase> taxaToSave = new ArrayList<TaxonBase>();
149
		while (authorIterator.hasNext()){
150
			row = authorIterator.next();
151
			UUID uuidFaunaEu = UUID.fromString(row.get(faunaEuUuid));
152
			UUID uuidErms = UUID.fromString(row.get(ermsUuid));
153
			taxonFaunaEu = appCtrInit.getTaxonService().find(uuidFaunaEu);
154
			taxonErms = appCtrInit.getTaxonService().find(uuidFaunaEu);
155
			
156
			if (Integer.parseInt(row.get(18)) == 1){
157
				//isFaunaEu = 1 -> copy the author of Fauna Europaea to Erms
158
				if (((ZoologicalName)taxonFaunaEu.getName()).getBasionymAuthorTeam()!= null){
159
					((ZoologicalName)taxonErms.getName()).setBasionymAuthorTeam(((ZoologicalName)taxonFaunaEu.getName()).getBasionymAuthorTeam());
160
				} 
161
				if (((ZoologicalName)taxonFaunaEu.getName()).getCombinationAuthorTeam()!= null){
162
					((ZoologicalName)taxonErms.getName()).setCombinationAuthorTeam(((ZoologicalName)taxonFaunaEu.getName()).getCombinationAuthorTeam());
163
				}
164
				((ZoologicalName)taxonErms.getName()).generateAuthorship();
165
				taxaToSave.add(taxonErms);
166
			}else{
167
				if (((ZoologicalName)taxonErms.getName()).getBasionymAuthorTeam()!= null){
168
					((ZoologicalName)taxonFaunaEu.getName()).setBasionymAuthorTeam(((ZoologicalName)taxonErms.getName()).getBasionymAuthorTeam());
169
				} 
170
				if (((ZoologicalName)taxonErms.getName()).getCombinationAuthorTeam()!= null){
171
					((ZoologicalName)taxonFaunaEu.getName()).setCombinationAuthorTeam(((ZoologicalName)taxonErms.getName()).getCombinationAuthorTeam());
172
				}
173
				((ZoologicalName)taxonFaunaEu.getName()).generateAuthorship();
174
				taxaToSave.add(taxonFaunaEu);
175
			}
176
			
177
			
178
		}
179
	}
180
	
181
	public void setSpecificRank(List<TaxonBase> taxa, Rank rank){
182
		
183
		for (TaxonBase taxon: taxa){
184
			taxon.getName().setRank(rank);
185
		}
186
	}
187
	
188
	private void mergeDiffStatus(){
189
		List<List<String>> diffStatus = readCsvFile(sFileName + "_status.csv");
190
		
191
		//find all taxa accepted in erms, but synonyms in FauEu  and the same rank
192
		List<List<String>> accErmsSynFaunaEu = new ArrayList<List<String>>();
193
		for (List<String> rowList: diffStatus){
194
			if ((rowList.get(5).equals("synonym")) && (rowList.get(rankFaunaEu).equals(rowList.get(rankErms)))){
195
				//both conditions are true
196
				accErmsSynFaunaEu.add(rowList);
197
			}
198
		}
199
		mergeErmsAccFaunaEuSyn(accErmsSynFaunaEu);
200
		
201
		//find all taxa accepted in faunaEu, but synonyms in Erms and the same rank
202
		List<List<String>> synErmsAccFaunaEu = new ArrayList<List<String>>();
203
		for (List<String> rowList: diffStatus){
204
			if ((rowList.get(5).equals("accepted")) && (rowList.get(rankFaunaEu).equals(rowList.get(rankErms)))){
205
				//both conditions are true
206
				synErmsAccFaunaEu.add(rowList);
207
			}
208
		}
209
		mergeErmsSynFaunaEuAcc(synErmsAccFaunaEu);
210
		
211
	
212
	}
213
	
214
	private void mergeSameStatus(){
215
		List<List<String>> sameStatus = readCsvFile(sFileName + "_names.csv");
216
		
217
		TaxonBase taxonFaunaEu;
218
		TaxonBase taxonErms;
219
		
220
		for (List<String> row: sameStatus){
221
			taxonFaunaEu = appCtrInit.getTaxonService().find(UUID.fromString(row.get(faunaEuUuid)));
222
			taxonErms = appCtrInit.getTaxonService().find(UUID.fromString(row.get(ermsUuid)));
223
			moveAllInformationsFromFaunaEuToErms(taxonFaunaEu, taxonErms);
224
			if (taxonErms instanceof Taxon){
225
				moveFaunaEuSynonymsToErmsTaxon((Taxon)taxonFaunaEu, (Taxon)taxonErms);
226
			}
227
		}
228
	}
229
	
230
	
231

    
232
	private void mergeErmsAccFaunaEuSyn(List<List<String>> ermsAccFaEuSyn){
233
		
234
		// update nameRelationships -> if the nameRelationship does not exist, then create a new one with ermsAcc as relatedTo TaxonName
235
		updateNameRelationships(ermsAccFaEuSyn);
236
		
237
		//delete all synonymRelationships of FaunaEu Syn
238
		for (List<String> rowList: ermsAccFaEuSyn){
239
			UUID faunaUUID = UUID.fromString(rowList.get(faunaEuUuid));
240
			//UUID ermsUUID = UUID.fromString(rowList.get(ermsUuid));
241
			Synonym syn = (Synonym)appCtrInit.getTaxonService().find(faunaUUID);
242
			appCtrInit.getTaxonService().deleteSynonymRelationships(syn);
243
		}
244
		
245
		//merge the infos of 
246
		
247
		
248
	}
249
	
250
	private  void mergeErmsSynFaunaEuAcc (List<List<String>> ermsAccFaEuSyn){
251
		//occurence: verkn?pfe statt dem Fauna Europaea Taxon das akzeptierte Taxon, des Synonyms mit der Occurence (CDM -> distribution)
252
		//suche distribution (?ber das Taxon der TaxonDescription), dessen Taxon, das entsprechende Fauna Eu Taxon ist und verkn?pfe es mit dem akzeptieren Taxon des Erms Syn
253
		Taxon taxonFaunaEu = null;
254
		Taxon taxonErms = null;
255
		Synonym synErms = null;
256
		for (List<String> row: ermsAccFaEuSyn){
257
			taxonFaunaEu = (Taxon)appCtrInit.getTaxonService().find(UUID.fromString(row.get(faunaEuUuid)));
258
			synErms = (Synonym)appCtrInit.getTaxonService().find(UUID.fromString(row.get(ermsUuid)));
259
			synErms = HibernateProxyHelper.deproxy(synErms, Synonym.class);
260
			Set<SynonymRelationship> synRel=synErms.getSynonymRelations();
261
			
262
			if (synRel.size()>1){
263
				//TODO: which Relationship??
264
				Iterator<SynonymRelationship> iterator = synRel.iterator();
265
				taxonErms = iterator.next().getAcceptedTaxon();
266
			}else if (synRel.size() == 1){
267
				Iterator<SynonymRelationship> iterator = synRel.iterator();
268
				taxonErms = iterator.next().getAcceptedTaxon();
269
			} else {
270
				taxonErms = null;
271
				logger.debug("There is no SynonymRelationship for the synonym" + synErms.getTitleCache());
272
			}
273
			
274
			Set<Feature> features = new HashSet<Feature>();
275
			features.add(Feature.DISTRIBUTION());
276
			List<String> propertyPaths = new ArrayList<String>();
277
			propertyPaths.add("inDescription.Taxon.*");
278
			List<DescriptionElementBase> distributions = appCtrInit.getDescriptionService().getDescriptionElementsForTaxon(taxonFaunaEu, features, Distribution.class, 10, 0, null);
279
			
280
			
281
			for(DescriptionElementBase distribution: distributions){
282
				TaxonDescription description = (TaxonDescription)distribution.getInDescription();
283
				TaxonDescription newDescription = TaxonDescription.NewInstance(taxonErms);
284
				newDescription.addElement(distribution);
285
				appCtrInit.getDescriptionService().delete(description);
286
			}
287
			
288
			//Child-Parent Relationship aktualisieren -> dem Child des Fauna Europaea Taxons als parent das akzeptierte Taxon von synErms
289
			Set<TaxonNode> nodesErms = taxonErms.getTaxonNodes();
290
			Set<TaxonNode> nodesFaunaEu =taxonFaunaEu.getTaxonNodes();
291
			if (nodesFaunaEu.size()>1 || nodesFaunaEu.isEmpty()){
292
				
293
			}else{
294
				Iterator<TaxonNode> iteratorNodesErms = nodesErms.iterator();
295
				
296
				Iterator<TaxonNode> iteratorNodesFaunaEu = nodesFaunaEu.iterator();
297
				TaxonNode node = iteratorNodesFaunaEu.next();
298
				Set<TaxonNode> children = node.getChildNodes();
299
				Iterator<TaxonNode> childrenIterator = children.iterator();
300
				TaxonNode childNode;
301
				if (iteratorNodesErms.hasNext()){
302
					TaxonNode ermsNode = iteratorNodesErms.next();
303
					while (childrenIterator.hasNext()){
304
						childNode = childrenIterator.next();
305
						ermsNode.addChildNode(childNode, childNode.getReference(), childNode.getMicroReference(), null);
306
					}
307
				}
308
				
309
			}
310
			moveFaunaEuSynonymsToErmsTaxon(taxonFaunaEu, taxonErms);
311
			moveAllInformationsFromFaunaEuToErms(taxonFaunaEu, taxonErms);
312
			moveOriginalDbToErmsTaxon(taxonFaunaEu, taxonErms);
313
			//neue sec Referenz an das ErmsTaxon oder an das Synonym und Taxon oder nur Synonym??
314
			deleteFaunaEuTaxon(taxonFaunaEu);
315
			
316
		}
317
		
318
		
319
		
320
	
321
	}
322
	
323
	
324
	
325
	private void updateNameRelationships(List<List<String>> ermsAccFaEuSyn){
326
		//suche alle NameRelationships aus FaunaEu und Erms, wo (faunaEu)relatedFrom.name.titleCache = (erms)relatedFrom.name.titleCache und ersetze in der faunaEu Relationship den relatedTo.name durch den relatedTo.name der erms-relationship
327
		//wenn es diese relationship noch nicht gibt und der typ der gleiche ist!!
328
		//wenn der relatedTo Name zu einem Erms Taxon und einem FaunaEu Synonym geh?rt
329
		
330
		Synonym synFaunaEu;
331
		Taxon taxonErms;
332
		for (List<String> row: ermsAccFaEuSyn){
333
			synFaunaEu = (Synonym)appCtrInit.getTaxonService().find(UUID.fromString(row.get(faunaEuUuid)));
334
			taxonErms = (Taxon)appCtrInit.getTaxonService().find(UUID.fromString(row.get(ermsUuid)));
335
			List<NameRelationship> relSynFaunaEu = appCtrInit.getNameService().listToNameRelationships(synFaunaEu.getName(), null, 100, 0, null, null);
336
			List<NameRelationship> relTaxonErms = appCtrInit.getNameService().listToNameRelationships(taxonErms.getName(), null, 100, 0, null, null);
337
			
338
			List<NameRelationship> deleteRel = new ArrayList<NameRelationship>();
339
			for (NameRelationship relFauEu: relSynFaunaEu){
340
				boolean createNewRelationship = true;
341
				for (NameRelationship relErms: relTaxonErms){
342
					if ((relErms.getFromName().getTitleCache().equals(relFauEu.getFromName().getTitleCache())) && (relErms.getToName().getTitleCache().equals(relFauEu.getFromName().getTitleCache()))){
343
						//delete the faunaEu relationship because there exist an analogous relationship in erms
344
						deleteRel.add(relFauEu);
345
						createNewRelationship = false;
346
						break;
347
					}
348
				}
349
				if (createNewRelationship){
350
					//if relationship does not exist, create a new one with erms synonym
351
					taxonErms.getName().addRelationshipFromName(relFauEu.getFromName(), relFauEu.getType(), relFauEu.getRuleConsidered());
352
				}
353
			}
354
			
355
		}
356
	}
357
	
358
	private void updateSynonymRelationships(List<List<String>> ermsSynFaEuAcc){
359
//		-- Update queries for RelTaxon (synonym relationships - move relationships to ERMS accepted taxon if not already existent or delete if already existent)
360
//		UPDATE RelTaxon_1 SET RelTaxon_1.TaxonFk2 = RT.TaxonFk2
361
//		FROM         Taxon AS ERMSSyn INNER JOIN
362
//		                      Taxon AS FaEuAcc ON ERMSSyn.RankFk = FaEuAcc.RankFk AND ERMSSyn.FullName = FaEuAcc.FullName AND
363
//		                      ERMSSyn.TaxonStatusFk <> ISNULL(FaEuAcc.TaxonStatusFk, 0) INNER JOIN
364
//		                      RelTaxon AS RT ON ERMSSyn.TaxonId = RT.TaxonFk1 INNER JOIN
365
//		                      RelTaxon AS RelTaxon_1 ON FaEuAcc.TaxonId = RelTaxon_1.TaxonFk2 INNER JOIN
366
//		                      Taxon AS FaEuSyn ON RelTaxon_1.TaxonFk1 = FaEuSyn.TaxonId LEFT OUTER JOIN
367
//		                      Taxon AS ERMSAllSyn ON RT.TaxonFk1 = ERMSAllSyn.TaxonId AND FaEuSyn.FullName <> ERMSAllSyn.FullName --(!!)
368
//		WHERE     (ERMSSyn.OriginalDB = N'ERMS') AND (RT.RelTaxonQualifierFk > 100) AND (ERMSSyn.TaxonStatusFk <> 1) AND (ERMSSyn.KingdomFk = 2) AND
369
//		                      (FaEuAcc.OriginalDB = N'FaEu') AND (RelTaxon_1.RelTaxonQualifierFk > 100)
370
		Taxon taxonFaunaEu;
371
		Synonym synErms;
372
		Taxon taxonErms;
373
		Set<Taxon> acceptedTaxa = new HashSet<Taxon>();
374
		for (List<String> row: ermsSynFaEuAcc){
375
			taxonFaunaEu = (Taxon)appCtrInit.getTaxonService().find(UUID.fromString(row.get(faunaEuUuid)));
376
			synErms = (Synonym)appCtrInit.getTaxonService().find(UUID.fromString(row.get(ermsUuid)));
377
			acceptedTaxa.clear();
378
			acceptedTaxa.addAll( synErms.getAcceptedTaxa());
379
			if (!acceptedTaxa.isEmpty()){
380
				taxonErms = acceptedTaxa.iterator().next();
381
				if (acceptedTaxa.size() > 1){
382
					logger.debug("There are more than one accepted taxon for synonym " + synErms.getTitleCache());
383
				}
384
			}else{
385
				taxonErms = null;
386
				logger.debug("There is no accepted taxon for synonym "  + synErms.getTitleCache());
387
			}
388
			
389
			if (taxonErms != null){
390
				List<SynonymRelationship> relTaxonFaunaEu = appCtrInit.getTaxonService().listSynonymRelationships(taxonFaunaEu, null, 100, 0, null, null, Direction.relatedTo);
391
				List<SynonymRelationship> relTaxonErms = appCtrInit.getTaxonService().listSynonymRelationships(taxonErms, null, 100, 0, null, null, Direction.relatedTo);
392
				
393
				List<SynonymRelationship> deleteRel = new ArrayList<SynonymRelationship>();
394
				for (SynonymRelationship relFauEu: relTaxonFaunaEu){
395
					//TODO: wenn es noch keine SynonymRelationship gibt zu einem Synonym mit gleichem Namen, dann erzeuge die SynonymRelationship vom FaunaEuSyn (des FaunaEu Taxons, dass identischen Namen hat) zum akzeptierten Taxon des Erms Syn
396
					boolean createNewRelationship = true;
397
					for (SynonymRelationship relErms: relTaxonErms){
398
						if (relErms.getSynonym().getTitleCache().equals(relFauEu.getSynonym().getTitleCache())){
399
							//es gibt schon eine Relationship zu einem Synonym mit dem gleichen Namen wie das FaunaEu Synonym, also Relationship l?schen.
400
							createNewRelationship = false;
401
							break;
402
						}
403
					}
404
					if (createNewRelationship){
405
						taxonErms.addSynonym(relFauEu.getSynonym(), relFauEu.getType());
406
					}
407
					
408
					deleteRel.add(relFauEu);
409
				}
410
			}
411
		
412
		}
413
	}
414
	
415
	
416
	private void deleteFaunaEuTaxon(Taxon taxonFaunaEu) {
417
		appCtrInit.getTaxonService().delete(taxonFaunaEu);
418
		
419
	}
420

    
421
	//wenn Name und Rang identisch sind und auch der Status gleich, dann alle Informationen vom Fauna Europaea Taxon/Synonym zum Erms Taxon/Synonym
422
	
423
	private void moveAllInformationsFromFaunaEuToErms(TaxonBase faunaEu, TaxonBase erms){
424
		Set<Annotation> annotations = faunaEu.getAnnotations();
425
		Set<Extension> extensions = faunaEu.getExtensions();
426
		Set<Marker> markers = faunaEu.getMarkers();
427
		List<Credit> credits = faunaEu.getCredits();
428
		if (faunaEu instanceof Taxon){
429
			Set<TaxonDescription> descriptions = ((Taxon)faunaEu).getDescriptions();
430
			Set<Taxon> misappliedNames = ((Taxon)faunaEu).getMisappliedNames();
431
			
432
			if (erms instanceof Taxon){
433
				Iterator<TaxonDescription> descriptionsIterator = descriptions.iterator();
434
				TaxonDescription description;
435
				while (descriptionsIterator.hasNext()){
436
					description = descriptionsIterator.next();
437
					((Taxon) erms).addDescription(description);
438
				}
439
				
440
				Iterator<Taxon> misappliedNamesIterator = misappliedNames.iterator();
441
				Taxon misappliedName;
442
				while (misappliedNamesIterator.hasNext()){
443
					misappliedName = misappliedNamesIterator.next();
444
					((Taxon) erms).addMisappliedName(misappliedName, null, null);
445
				}
446
			}
447
		}
448
		
449
		//move all these informations to the erms taxon
450
		Iterator<Annotation> annotationsIterator = annotations.iterator();
451
		Annotation annotation;
452
		while (annotationsIterator.hasNext()){
453
			annotation = annotationsIterator.next();
454
			erms.addAnnotation(annotation);
455
		}
456
		
457
		Iterator<Extension> extensionIterator = extensions.iterator();
458
		Extension extension;
459
		while (extensionIterator.hasNext()){
460
			extension = extensionIterator.next();
461
			erms.addExtension(extension);
462
		}
463
		
464
		Iterator<Marker> markerIterator = markers.iterator();
465
		Marker marker;
466
		while (markerIterator.hasNext()){
467
			marker = markerIterator.next();
468
			erms.addMarker(marker);
469
		}
470
		
471
		for (Credit credit: credits){
472
			erms.addCredit(credit);
473
		}
474
		
475
		
476
	}
477
	
478
	//if name, rank, and status (accepted) are the same, then move the synonyms of faunaEu taxon to the erms taxon
479
	
480
	private void moveFaunaEuSynonymsToErmsTaxon(Taxon faunaEu, Taxon erms){
481
		Set<SynonymRelationship> synRel =faunaEu.getSynonymRelations();
482
		Iterator<SynonymRelationship> synRelIterator = synRel.iterator();
483
		SynonymRelationship rel;
484
		while (synRelIterator.hasNext()){
485
			rel = synRelIterator.next();
486
			faunaEu.removeSynonym(rel.getSynonym());
487
			erms.addSynonym(rel.getSynonym(), rel.getType());
488
		}
489
	}
490
	
491
	//after merging faunaEu taxon and erms taxon, the originalSource of the faunaEu taxon has to be moved to the erms taxon
492
	private void moveOriginalDbToErmsTaxon(TaxonBase faunaEu, TaxonBase erms){
493
		Set<IdentifiableSource> sourcesFaunaEu = faunaEu.getSources();
494
		IdentifiableSource sourceFaunaEu = sourcesFaunaEu.iterator().next();
495
		erms.addSource(sourceFaunaEu);
496
	}
497
	
498
	//merged taxon should have a new sec reference
499
	private void addNewSecForMergedTaxon(Taxon taxon, Reference sec){
500
		taxon.setSec(sec);
501
		taxon.setUuid(UUID.randomUUID());
502
	}
503
	
504
	// ----------- methods for merging Erms synonyms and Fauna Europaea Taxon
505
	
506
	
507
	
508
	
509
}
(2-2/2)