Project

General

Profile

Download (20.3 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 org.apache.log4j.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.common.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.model.common.Annotation;
26
import eu.etaxonomy.cdm.model.common.Credit;
27
import eu.etaxonomy.cdm.model.common.Extension;
28
import eu.etaxonomy.cdm.model.common.IdentifiableSource;
29
import eu.etaxonomy.cdm.model.common.Marker;
30
import eu.etaxonomy.cdm.model.common.RelationshipBase.Direction;
31
import eu.etaxonomy.cdm.model.description.Distribution;
32
import eu.etaxonomy.cdm.model.description.Feature;
33
import eu.etaxonomy.cdm.model.description.TaxonDescription;
34
import eu.etaxonomy.cdm.model.name.NameRelationship;
35
import eu.etaxonomy.cdm.model.name.Rank;
36
import eu.etaxonomy.cdm.model.name.ZoologicalName;
37
import eu.etaxonomy.cdm.model.reference.Reference;
38
import eu.etaxonomy.cdm.model.taxon.Synonym;
39
import eu.etaxonomy.cdm.model.taxon.SynonymRelationship;
40
import eu.etaxonomy.cdm.model.taxon.Taxon;
41
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
42
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
43

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

    
63
		// Init source DB
64
		appCtrInit = TestDatabase.initDb(db, DbSchemaValidation.VALIDATE, false);
65

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

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

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