Project

General

Profile

Download (68.3 KB) Statistics
| Branch: | Tag: | 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.api.service;
11

    
12
import static org.junit.Assert.assertEquals;
13
import static org.junit.Assert.assertFalse;
14
import static org.junit.Assert.assertNotNull;
15
import static org.junit.Assert.assertNull;
16
import static org.junit.Assert.assertTrue;
17

    
18
import java.io.FileNotFoundException;
19
import java.util.ArrayList;
20
import java.util.Collections;
21
import java.util.Iterator;
22
import java.util.List;
23
import java.util.Set;
24
import java.util.UUID;
25
import java.util.stream.Collectors;
26

    
27
import org.junit.Assert;
28
import org.junit.Before;
29
import org.junit.Ignore;
30
import org.junit.Test;
31
import org.unitils.dbunit.annotation.DataSet;
32
import org.unitils.spring.annotation.SpringBeanByType;
33

    
34
import eu.etaxonomy.cdm.api.service.config.PublishForSubtreeConfigurator;
35
import eu.etaxonomy.cdm.api.service.config.SecundumForSubtreeConfigurator;
36
import eu.etaxonomy.cdm.api.service.config.SubtreeCloneConfigurator;
37
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
38
import eu.etaxonomy.cdm.model.agent.Person;
39
import eu.etaxonomy.cdm.model.common.CdmBase;
40
import eu.etaxonomy.cdm.model.description.PolytomousKey;
41
import eu.etaxonomy.cdm.model.description.PolytomousKeyNode;
42
import eu.etaxonomy.cdm.model.name.IBotanicalName;
43
import eu.etaxonomy.cdm.model.name.NameRelationshipType;
44
import eu.etaxonomy.cdm.model.name.Rank;
45
import eu.etaxonomy.cdm.model.name.TaxonName;
46
import eu.etaxonomy.cdm.model.name.TaxonNameFactory;
47
import eu.etaxonomy.cdm.model.reference.Reference;
48
import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
49
import eu.etaxonomy.cdm.model.taxon.Classification;
50
import eu.etaxonomy.cdm.model.taxon.Synonym;
51
import eu.etaxonomy.cdm.model.taxon.SynonymType;
52
import eu.etaxonomy.cdm.model.taxon.Taxon;
53
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
54
import eu.etaxonomy.cdm.model.taxon.TaxonNaturalComparator;
55
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
56
import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;
57
import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
58
import eu.etaxonomy.cdm.persistence.dao.reference.IReferenceDao;
59
import eu.etaxonomy.cdm.persistence.dao.taxon.IClassificationDao;
60
import eu.etaxonomy.cdm.persistence.dto.TaxonNodeDto;
61
import eu.etaxonomy.cdm.test.integration.CdmTransactionalIntegrationTest;
62
import eu.etaxonomy.cdm.test.unitils.CleanSweepInsertLoadStrategy;
63

    
64
/**
65
 * @author n.hoffmann
66
 * @since Dec 16, 2010
67
 */
68
//@SpringApplicationContext("file:./target/test-classes/eu/etaxonomy/cdm/applicationContext-test.xml")
69
public class TaxonNodeServiceImplTest extends CdmTransactionalIntegrationTest{
70

    
71
	@SpringBeanByType
72
	private ITaxonNodeService taxonNodeService;
73

    
74
	@SpringBeanByType
75
	private IClassificationService classificationService;
76

    
77
	@SpringBeanByType
78
	private IReferenceService referenceService;
79

    
80
	@SpringBeanByType
81
	private IAgentService agentService;
82

    
83
	@SpringBeanByType
84
	private ITermService termService;
85

    
86
	@SpringBeanByType
87
    private INameService nameService;
88

    
89
	@SpringBeanByType
90
	private ITaxonService taxonService;
91

    
92
    @SpringBeanByType
93
    private IClassificationDao classificationDao;
94

    
95
    @SpringBeanByType
96
    private IReferenceDao referenceDao;
97

    
98
	@SpringBeanByType
99
	private IPolytomousKeyService polKeyService;
100

    
101
	@SpringBeanByType
102
	private IPolytomousKeyNodeService polKeyNodeService;
103

    
104

    
105
	private static final UUID t1Uuid = UUID.fromString("55c3e41a-c629-40e6-aa6a-ff274ac6ddb1");
106
	private static final UUID t2Uuid = UUID.fromString("2659a7e0-ff35-4ee4-8493-b453756ab955");
107
	private static final UUID classificationUuid = UUID.fromString("6c2bc8d9-ee62-4222-be89-4a8e31770878");
108
	private static final UUID classification2Uuid = UUID.fromString("43d67247-936f-42a3-a739-bbcde372e334");
109
	private static final UUID referenceUuid = UUID.fromString("de7d1205-291f-45d9-9059-ca83fc7ade14");
110
	private static final UUID node1Uuid= UUID.fromString("484a1a77-689c-44be-8e65-347d835f47e8");
111
	private static final UUID node2Uuid = UUID.fromString("2d41f0c2-b785-4f73-a436-cc2d5e93cc5b");
112

    
113
	private static final UUID node4Uuid = UUID.fromString("2fbf7bf5-22dd-4c1a-84e4-c8c93d1f0342");
114
	private static final UUID node5Uuid = UUID.fromString("c4d5170a-7967-4dac-ab76-ae2019eefde5");
115
	private static final UUID node6Uuid = UUID.fromString("b419ba5e-9c8b-449c-ad86-7abfca9a7340");
116
	private static final UUID rootNodeUuid = UUID.fromString("324a1a77-689c-44be-8e65-347d835f4111");
117
	private static final UUID person1uuid = UUID.fromString("fe660517-8d8e-4dac-8bbb-4fb8f4f4a72e");
118

    
119
	private Taxon t1;
120
	private Taxon t2;
121
	private Taxon t4;
122
//	private Synonym s1;
123
	private SynonymType synonymType;
124
	private Reference reference;
125
	private String referenceDetail;
126
	private Classification classification;
127
	private TaxonNode node1;
128
	private TaxonNode node2;
129

    
130
    private TaxonNode node4;
131

    
132
	@Before
133
	public void setUp() throws Exception {
134
	}
135

    
136
	/**
137
	 * Test method for {@link eu.etaxonomy.cdm.api.service.TaxonNodeServiceImpl#makeTaxonNodeASynonymOfAnotherTaxonNode(eu.etaxonomy.cdm.model.taxon.TaxonNode, eu.etaxonomy.cdm.model.taxon.TaxonNode, eu.etaxonomy.cdm.model.taxon.SynonymType, eu.etaxonomy.cdm.model.reference.Reference, java.lang.String)}.
138
	 */
139
	@Test
140
	@DataSet
141
	public final void testMakeTaxonNodeASynonymOfAnotherTaxonNode() {
142
		classification = classificationService.load(classificationUuid);
143
		node1 = taxonNodeService.load(node1Uuid);
144
		node2 = taxonNodeService.load(node2Uuid);
145
		node4 = taxonNodeService.load(node4Uuid);
146
		reference = referenceService.load(referenceUuid);
147
//		synonymType = SynonymType.HOMOTYPIC_SYNONYM_OF();
148
		synonymType = CdmBase.deproxy(termService.load(SynonymType.uuidHomotypicSynonymOf), SynonymType.class) ;
149
		referenceDetail = "test";
150

    
151
		//TODO
152

    
153
		// descriptions
154
		t1 = node1.getTaxon();
155
		PolytomousKey polKey = PolytomousKey.NewInstance();
156
		PolytomousKeyNode keyNode = PolytomousKeyNode.NewInstance("", "", t1, null);
157
		keyNode.setKey(polKey);
158
		polKeyNodeService.save(keyNode);
159
		polKeyService.save(polKey);
160

    
161
		//nameRelations
162

    
163
		TaxonName relatedName = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
164
		t1.getName().addRelationshipFromName(relatedName, NameRelationshipType.ALTERNATIVE_NAME(), null, null );
165

    
166
		//taxonRelations
167
		Taxon relatedTaxon = Taxon.NewInstance(TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES()), null);
168
		t1.addTaxonRelation(relatedTaxon, TaxonRelationshipType.CONGRUENT_OR_EXCLUDES(), null, null);
169
		Synonym synonym = Synonym.NewInstance(TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES()), null);
170
		taxonService.save(t1);
171
		taxonService.save(relatedTaxon);
172
		nameService.save(relatedName);
173

    
174
		t1.addHomotypicSynonym(synonym);
175
		taxonService.saveOrUpdate(t1);
176
		t1 =(Taxon) taxonService.load(t1.getUuid());
177
		t1 = HibernateProxyHelper.deproxy(t1);
178
		TaxonName nameT1 = t1.getName();
179
		t2 = node2.getTaxon();
180
		assertEquals(2, t1.getDescriptions().size());
181
		Assert.assertTrue(t2.getSynonyms().isEmpty());
182
		Assert.assertTrue(t2.getDescriptions().size() == 0);
183
		assertEquals(2,t1.getSynonyms().size());
184
		DeleteResult result;
185

    
186
		t4 = node4.getTaxon();
187
        UUID uuidT4 = t4.getUuid();
188
        t4 = (Taxon) taxonService.find(uuidT4);
189
        TaxonName name4 = nameService.find(t4.getName().getUuid());
190
        result = taxonNodeService.makeTaxonNodeASynonymOfAnotherTaxonNode(node4, node2, synonymType, reference, referenceDetail, true);
191
        if (result.isError() || result.isAbort()){
192
            Assert.fail();
193
        }
194
        t4 = (Taxon)taxonService.find(uuidT4);
195
        assertNull(t4);
196

    
197
		//Taxon can't be deleted because of the polytomous key node
198
		result = taxonNodeService.makeTaxonNodeASynonymOfAnotherTaxonNode(node1, node2, synonymType, reference, referenceDetail, true);
199
		if (result.isError() || result.isAbort()){
200
			Assert.fail();
201
		}
202
		commitAndStartNewTransaction(new String[]{/*"TaxonNode"*/});
203
		t1 = (Taxon)taxonService.find(t1Uuid);
204
		assertNotNull(t1);//because of the polytomous key node
205
		node1 = taxonNodeService.load(node1Uuid);
206
		assertNull(node1);
207

    
208
		Set<CdmBase> updatedObjects = result.getUpdatedObjects();
209
		Iterator<CdmBase> it = updatedObjects.iterator();
210
		Taxon taxon;
211
		while (it.hasNext()) {
212
			CdmBase updatedObject = it.next();
213
			if(updatedObject.isInstanceOf(Taxon.class)){
214
				taxon = HibernateProxyHelper.deproxy(updatedObject, Taxon.class);
215
				Set<Synonym> syns =  taxon.getSynonyms();
216
				assertNotNull(syns);
217
				if (taxon.equals(t2)){
218
				    assertEquals(4,syns.size());
219
				    Set<TaxonName> typifiedNames =taxon.getHomotypicGroup().getTypifiedNames();
220
	                assertEquals(typifiedNames.size(),4);
221
	                assertTrue(taxon.getHomotypicGroup().equals( nameT1.getHomotypicalGroup()));
222

    
223
	                assertEquals(taxon, t2);
224
				}
225

    
226
			}
227

    
228
		}
229
	}
230

    
231
	/**
232
	 * Test method for {@link eu.etaxonomy.cdm.api.service.TaxonNodeServiceImpl#makeTaxonNodeASynonymOfAnotherTaxonNode(eu.etaxonomy.cdm.model.taxon.TaxonNode, eu.etaxonomy.cdm.model.taxon.TaxonNode, eu.etaxonomy.cdm.model.taxon.SynonymType, eu.etaxonomy.cdm.model.reference.Reference, java.lang.String)}.
233
	 */
234
	@Test
235
	@DataSet(loadStrategy=CleanSweepInsertLoadStrategy.class)
236
	public final void testMakeTaxonNodeAHeterotypicSynonymOfAnotherTaxonNode() {
237

    
238
	    //create data
239
	    classification = classificationService.load(classificationUuid);
240
		node1 = taxonNodeService.load(node1Uuid);
241
		node2 = taxonNodeService.load(node2Uuid);
242
		reference = referenceService.load(referenceUuid);
243
		synonymType = CdmBase.deproxy(termService.load(SynonymType.uuidHeterotypicSynonymOf), SynonymType.class) ;
244
		referenceDetail = "test";
245

    
246
		// descriptions
247
		t1 = node1.getTaxon();
248
		PolytomousKey polKey = PolytomousKey.NewInstance();
249
		PolytomousKeyNode keyNode = PolytomousKeyNode.NewInstance("", "", t1, null);
250
		keyNode.setKey(polKey);
251
		polKeyNodeService.save(keyNode);
252
		polKeyService.save(polKey);
253

    
254
		//nameRelations
255
		TaxonName relatedName = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
256
		t1.getName().addRelationshipFromName(relatedName, NameRelationshipType.ALTERNATIVE_NAME(), null, null );
257
		TaxonName name1 = t1.getName();
258
		UUID name1UUID = name1.getUuid();
259
		//taxonRelations
260
		Taxon relatedTaxon = Taxon.NewInstance(TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES()), null);
261
		t1.addTaxonRelation(relatedTaxon, TaxonRelationshipType.CONGRUENT_OR_EXCLUDES(), null, null);
262
		Synonym t1HomotypSynonym = Synonym.NewInstance(TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES()), null);
263

    
264
		t1.addHomotypicSynonym(t1HomotypSynonym);
265
		TaxonName nameT1 = t1.getName();
266
		t2 = node2.getTaxon();
267
		assertEquals("taxon 1 must have 2 descriptions", 2, t1.getDescriptions().size());
268
		assertEquals("taxon 1 must have 2 synonyms", 2, t1.getSynonyms().size());
269
		Assert.assertTrue("taxon 2 must have no synonyms", t2.getSynonyms().isEmpty());
270
		Assert.assertTrue("taxon 2 must have no descriptions", t2.getDescriptions().size() == 0);
271

    
272
		//save
273
		taxonService.save(t1HomotypSynonym);
274
		taxonService.save(relatedTaxon);
275
		nameService.save(relatedName);
276

    
277
		//do it
278
		DeleteResult result = taxonNodeService.makeTaxonNodeASynonymOfAnotherTaxonNode
279
		        (node1, node2, synonymType, reference, referenceDetail, true);
280

    
281
		//post conditions
282
		if (!result.getUpdatedObjects().iterator().hasNext()){
283
			Assert.fail("Some updates must have taken place");
284
		}
285
		assertEquals(3,result.getUpdatedObjects().size());
286
		assertNotNull("Old taxon should not have been deleted as it is referenced by key node", taxonService.find(t1Uuid));
287
		assertNull("Old taxon node should not exist anymore", taxonNodeService.find(node1Uuid));
288

    
289
		t1HomotypSynonym = (Synonym)taxonService.find(t1HomotypSynonym.getUuid());
290
		assertNotNull(t1HomotypSynonym);
291

    
292
		keyNode.setTaxon(null);
293
		polKeyNodeService.saveOrUpdate(keyNode);
294
		t2 =HibernateProxyHelper.deproxy(t2);
295
		HibernateProxyHelper.deproxy(t2.getHomotypicGroup());
296
		t2.setName(HibernateProxyHelper.deproxy(t2.getName()));
297

    
298
		termService.saveOrUpdate(synonymType);
299
		assertFalse("taxon 2 must have a synonym now", t2.getSynonyms().isEmpty());
300
		assertEquals("taxon 2 must have 3 synonyms now, the old taxon 1 and it's 2 synonyms", 3, t2.getSynonyms().size());
301
		assertEquals("taxon 2 must have 2 descriptions now, taken form taxon 1", 2, t2.getDescriptions().size());
302

    
303
		result = taxonService.deleteTaxon(t1.getUuid(), null, null);
304
		if (result.isAbort() || result.isError()){
305
			Assert.fail();
306
		}
307
		assertNull(taxonService.find(t1Uuid));
308
		assertNull(taxonNodeService.find(node1Uuid));
309
		name1 = nameService.find(name1UUID);
310
		assertNotNull("taxon name 1 should still exist", name1);
311
		assertEquals("... but being used for the new synonym only as taxon 1 is deleted", 1, name1.getTaxonBases().size());
312
		t1HomotypSynonym = (Synonym)taxonService.find(t1HomotypSynonym.getUuid());
313
		assertNotNull(t1HomotypSynonym);
314

    
315
		Synonym newSynonym =(Synonym) name1.getTaxonBases().iterator().next();
316

    
317
		Taxon newAcceptedTaxon = CdmBase.deproxy(taxonService.find(t2.getUuid()), Taxon.class);
318
		assertEquals("The new synonym (old accepted taxon) and it's homotypic synonym should still be homotypic", newSynonym.getHomotypicGroup(), t1HomotypSynonym.getName().getHomotypicalGroup());
319
		assertFalse("The new accepted taxon must not be homotypic to ", newAcceptedTaxon.getHomotypicGroup().equals(newSynonym.getName().getHomotypicalGroup()));
320

    
321
		assertEquals("The new accepted taxon is taxon 2", newAcceptedTaxon, t2);
322
		assertEquals("The new synonyms name must be the same as the old accepted taxon's name", newSynonym.getName(), nameT1);
323
	}
324

    
325

    
326
	@Test
327
	@DataSet(loadStrategy=CleanSweepInsertLoadStrategy.class, value="TaxonNodeServiceImplTest-indexing.xml")
328
	public final void testIndexCreateNode() {
329
		Taxon taxon = Taxon.NewInstance(null, null);
330
		classification = classificationService.load(classificationUuid);
331
		node2 = taxonNodeService.load(node2Uuid);
332
		String oldTreeIndex = node2.treeIndex();
333

    
334
		TaxonNode newNode = node2.addChildTaxon(taxon, null, null);
335
		taxonNodeService.saveOrUpdate(newNode);
336
		commitAndStartNewTransaction(new String[]{"TaxonNode"});
337
		newNode = taxonNodeService.load(newNode.getUuid());
338
		Assert.assertEquals("", oldTreeIndex + newNode.getId() + "#", newNode.treeIndex());
339
	}
340

    
341

    
342
	@Test
343
	@DataSet(loadStrategy=CleanSweepInsertLoadStrategy.class, value="TaxonNodeServiceImplTest-indexing.xml")
344
	public final void testIndexMoveNode() {
345
		//in classification
346
		classification = classificationService.load(classificationUuid);
347
		node1 = taxonNodeService.load(node1Uuid);
348
		node2 = taxonNodeService.load(node2Uuid);
349
		node2.addChildNode(node1, null, null);
350
		taxonNodeService.saveOrUpdate(node1);
351
		commitAndStartNewTransaction(new String[]{"TaxonNode"});
352
		TaxonNode node6 = taxonNodeService.load(node6Uuid);
353
		Assert.assertEquals("Node6 treeindex is not correct", node2.treeIndex() + "2#4#6#", node6.treeIndex());
354

    
355
		//root of new classification
356
		Classification classification2 = classificationService.load(classification2Uuid);
357
		node1 = taxonNodeService.load(node1Uuid);
358
		classification2.setRootNode(HibernateProxyHelper.deproxy(classification2.getRootNode(),TaxonNode.class));
359
		classification2.addChildNode(node1, null, null);
360
		taxonNodeService.saveOrUpdate(node1);
361
		commitAndStartNewTransaction(new String[]{"TaxonNode"});
362
		node1 = taxonNodeService.load(node1Uuid);
363
		Assert.assertEquals("Node1 treeindex is not correct", "#t2#8#2#", node1.treeIndex());
364
		node6 = taxonNodeService.load(node6Uuid);
365
		Assert.assertEquals("Node6 treeindex is not correct", "#t2#8#2#4#6#", node6.treeIndex());
366

    
367
		//into new classification
368
		node2 = taxonNodeService.load(node2Uuid);
369
		TaxonNode node5 = taxonNodeService.load(node5Uuid);
370
		node2 =node5.addChildNode(node2, null, null);
371
		taxonNodeService.saveOrUpdate(node2);
372
		commitAndStartNewTransaction(new String[]{"TaxonNode"});
373
		node2 = taxonNodeService.load(node2Uuid);
374
		Assert.assertEquals("Node3 treeindex is not correct", "#t2#8#2#5#3#", node2.treeIndex());
375

    
376
}
377

    
378
	@Test
379
	@DataSet(loadStrategy=CleanSweepInsertLoadStrategy.class, value="TaxonNodeServiceImplTest-indexing.xml")
380
	public final void testIndexDeleteNode() {
381
		commitAndStartNewTransaction(new String[]{"TaxonNode"});
382
		node1 = taxonNodeService.load(node1Uuid);
383
		TaxonNode node4 = taxonNodeService.load(node4Uuid);
384
		String treeIndex = node1.treeIndex();
385
		TaxonNode node6 = taxonNodeService.load(node6Uuid);
386
		treeIndex= node6.treeIndex();
387

    
388
		HibernateProxyHelper.deproxy(node1, TaxonNode.class);
389
		node1.deleteChildNode(node4, false);
390
		TaxonNode node5 = taxonNodeService.load(node5Uuid);
391
		treeIndex = node5.treeIndex();
392

    
393
		node6 = taxonNodeService.load(node6Uuid);
394

    
395
		treeIndex = node6.treeIndex();
396
		Taxon newTaxon= Taxon.NewInstance(TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES()), null);
397
		UUID taxonNewUuid = taxonService.save(newTaxon).getUuid();
398

    
399
		node5.addChildTaxon(newTaxon, null, null);
400
		String node5TreeIndex =node5.treeIndex();
401
		taxonNodeService.saveOrUpdate(node5);
402

    
403
		commitAndStartNewTransaction(new String[]{"TaxonNode"});
404
		node5 = taxonNodeService.load(node5Uuid);
405
		List<TaxonNode> children =  node5.getChildNodes();
406
		TaxonNode node = children.get(0);
407
		int id = node.getId();
408
		Assert.assertEquals("Node6 treeindex is not correct", "#t1#1#2#6#", treeIndex);
409
		Assert.assertEquals("new node treeindex is not correct", node5TreeIndex + id +"#", node.treeIndex());
410
	}
411

    
412

    
413
	@Test
414
	@DataSet(loadStrategy=CleanSweepInsertLoadStrategy.class)
415
	public final void testDeleteNode(){
416
		classification = classificationService.load(classificationUuid);
417
		node1 = taxonNodeService.load(node1Uuid);
418
		node2 = taxonNodeService.load(rootNodeUuid);
419
		node1 = HibernateProxyHelper.deproxy(node1);
420

    
421
		TaxonNode newNode = node1.addChildTaxon(Taxon.NewInstance(TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES()), null), null, null);
422
		UUID uuidNewNode = taxonNodeService.save(newNode).getUuid();
423
		newNode = taxonNodeService.load(uuidNewNode);
424
		UUID taxUUID = newNode.getTaxon().getUuid();
425
		UUID nameUUID = newNode.getTaxon().getName().getUuid();
426

    
427
		DeleteResult result = taxonNodeService.deleteTaxonNode(node1, null);
428
		if (!result.isOk()){
429
			Assert.fail();
430
		}
431
		newNode = taxonNodeService.load(uuidNewNode);
432
		node1 = taxonNodeService.load(node1Uuid);
433
		assertNull(newNode);
434
		assertNull(node1);
435

    
436
		t1 = (Taxon) taxonService.load(t1Uuid);
437
		assertNull(t1);
438
		Taxon newTaxon = (Taxon)taxonService.load(taxUUID);
439
		assertNull(newTaxon);
440
		IBotanicalName name = nameService.load(nameUUID);
441
		assertNull(name);
442

    
443

    
444
	}
445

    
446
	@Test
447
    @DataSet(loadStrategy=CleanSweepInsertLoadStrategy.class)
448

    
449
    public final void testDeleteNodeWithReusedTaxon(){
450
        classification = classificationService.load(classificationUuid);
451
        node1 = taxonNodeService.load(node1Uuid);
452
        node2 = taxonNodeService.load(rootNodeUuid);
453
        node1 = HibernateProxyHelper.deproxy(node1);
454

    
455

    
456
        Classification classification2 = Classification.NewInstance("Classification2");
457
        TaxonNode nodeClassification2 =classification2.addChildTaxon(node1.getTaxon(), null, null);
458
        assertEquals(node1.getTaxon().getUuid(), t1Uuid);
459
        classificationService.save(classification2);
460
        List<TaxonNode> nodesOfClassification2 = taxonNodeService.listAllNodesForClassification(classification2, null, null);
461
        UUID nodeUUID = nodesOfClassification2.get(0).getUuid();
462
        assertEquals(nodeUUID, nodeClassification2.getUuid());
463
        Taxon newTaxon = Taxon.NewInstance(TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES()),  null);
464
        taxonService.save(newTaxon);
465
        TaxonNode newNode = node1.addChildTaxon(newTaxon,null, null);
466
        UUID uuidNewNode = taxonNodeService.save(newNode).getUuid();
467
        newNode = taxonNodeService.load(uuidNewNode);
468
        UUID taxUUID = newNode.getTaxon().getUuid();
469
        UUID nameUUID = newNode.getTaxon().getName().getUuid();
470

    
471
        DeleteResult result = taxonNodeService.deleteTaxonNode(node1, null);
472
        if (!result.isOk()){
473
            Assert.fail();
474
        }
475
        //taxonService.getSession().flush();
476
        newNode = taxonNodeService.load(uuidNewNode);
477
        node1 = taxonNodeService.load(node1Uuid);
478
        assertNull(newNode);
479
        assertNull(node1);
480
        List<String> propertyPath = new ArrayList<>();
481
        propertyPath.add("taxon.name.*");
482
        nodeClassification2 =taxonNodeService.load(nodeUUID, propertyPath);
483
        assertNotNull(nodeClassification2);
484
        assertNotNull(nodeClassification2.getTaxon());
485
        assertNotNull(nodeClassification2.getTaxon().getName());
486

    
487
        t1 = (Taxon) taxonService.load(t1Uuid);
488
        assertNotNull(t1);
489
        newTaxon = (Taxon)taxonService.load(taxUUID);
490
        assertNull(newTaxon);
491
        IBotanicalName name = nameService.load(nameUUID);
492
        assertNull(name);
493
    }
494

    
495
	@Test
496
    @DataSet(loadStrategy=CleanSweepInsertLoadStrategy.class)
497
	public final void testDeleteNodes(){
498
		classification = classificationService.load(classificationUuid);
499
		node1 = taxonNodeService.load(node1Uuid);
500
		node2 = taxonNodeService.load(rootNodeUuid);
501
		node1 = HibernateProxyHelper.deproxy(node1);
502
		node2 = HibernateProxyHelper.deproxy(node2);
503
		TaxonNode newNode = node1.addChildTaxon(Taxon.NewInstance(TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES()), null), null, null);
504
		UUID uuidNewNode = taxonNodeService.save(newNode).getUuid();
505
		List<TaxonNode> treeNodes = new ArrayList<>();
506
		treeNodes.add(node1);
507
		treeNodes.add(node2);
508

    
509
		taxonNodeService.deleteTaxonNodes(treeNodes, null);
510

    
511
		newNode = taxonNodeService.load(uuidNewNode);
512
		node1 = taxonNodeService.load(node1Uuid);
513
		assertNull(newNode);
514
		assertNull(node1);
515
		//taxonService.getSession().flush();
516
		t1 = (Taxon) taxonService.load(t1Uuid);
517
		assertNull(t1);
518
		t2 = (Taxon) taxonService.load(t2Uuid);
519
		assertNull(t2);
520
	}
521

    
522
	@Test
523
	@DataSet
524
	public void testMoveTaxonNode(){
525
	    classification = classificationService.load(classificationUuid);
526
	  //  Set<TaxonNode>  nodes = classification.getAllNodes();
527
	    List<TaxonNode>  nodes = classification.getChildNodes();
528
	    System.out.println(nodes.size());
529
	    classification.addChildTaxon(Taxon.NewInstance(TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES()), null), nodes.size(), null, null);
530
	    nodes =  classification.getChildNodes();
531
	    System.out.println(nodes.size());
532
	}
533

    
534
    @Test
535
    public void testCompareNaturalOrder() {
536
    	/*
537
    	 * Classification
538
    	 *  * Abies
539
    	 *  `- Abies alba
540
    	 *   - Abies balsamea
541
    	 *  * Pinus
542
    	 *  `- Pinus pampa
543
    	 */
544
    	Classification classification = Classification.NewInstance("Classification");
545
    	IBotanicalName abiesName = TaxonNameFactory.NewBotanicalInstance(Rank.GENUS());
546
    	abiesName.setGenusOrUninomial("Abies");
547
    	Taxon abies = Taxon.NewInstance(abiesName, null);
548
    	IBotanicalName abiesAlbaName = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
549
    	abiesAlbaName.setGenusOrUninomial("Abies");
550
    	abiesAlbaName.setSpecificEpithet("alba");
551
    	Taxon abiesAlba = Taxon.NewInstance(abiesAlbaName, null);
552
    	IBotanicalName pinusName = TaxonNameFactory.NewBotanicalInstance(Rank.GENUS());
553
    	pinusName.setGenusOrUninomial("Pinus");
554
    	Taxon pinus = Taxon.NewInstance(pinusName, null);
555
    	IBotanicalName pinusPampaName = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
556
    	pinusPampaName.setGenusOrUninomial("Pinus");
557
    	pinusPampaName.setSpecificEpithet("pampa");
558
    	Taxon pinusPampa = Taxon.NewInstance(pinusPampaName, null);
559

    
560
        IBotanicalName abiesBalsameaName = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
561
        abiesBalsameaName.setGenusOrUninomial("Abies");
562
        abiesBalsameaName.setSpecificEpithet("balsamea");
563
        Taxon abiesBalsamea = Taxon.NewInstance(abiesBalsameaName, null);
564

    
565
        List<TaxonNode> nodes = new ArrayList<TaxonNode>();
566
    	nodes.add(classification.addChildTaxon(abies, null, null));
567
    	TaxonNode abiesAlbaNode = classification.addParentChild(abies, abiesAlba, null, null);
568
    	TaxonNode balsameaNode = classification.addParentChild(abies, abiesBalsamea, null, null);
569
    	nodes.add(balsameaNode);
570
    	nodes.add(abiesAlbaNode);
571
    	nodes.add(classification.addChildTaxon(pinus, null, null));
572
    	nodes.add(classification.addParentChild(pinus, pinusPampa, null, null));
573
    	classificationService.saveClassification(classification);
574
    	//this.taxonNodeService.save(nodes);
575
    	TaxonNaturalComparator comparator = new TaxonNaturalComparator();
576
    	List<TaxonNode> allNodes = new ArrayList<>(classification.getAllNodes());
577
    	Collections.sort(allNodes, comparator);
578

    
579
    	Assert.assertEquals(allNodes.get(0).getTaxon(), abies );
580
    	Assert.assertEquals(allNodes.get(2).getTaxon(), abiesBalsamea );
581
    	Assert.assertEquals(allNodes.get(1).getTaxon(), abiesAlba );
582

    
583
    	taxonNodeService.moveTaxonNode(balsameaNode, abiesAlbaNode,1);
584
    	classification = classificationService.load(classification.getUuid());
585

    
586
    	allNodes = new ArrayList<>(classification.getAllNodes());
587
        Collections.sort(allNodes, comparator);
588

    
589
        Assert.assertEquals(allNodes.get(0).getTaxon(), abies );
590
        Assert.assertEquals(allNodes.get(1).getTaxon(), abiesBalsamea );
591
        Assert.assertEquals(allNodes.get(2).getTaxon(), abiesAlba );
592
    }
593

    
594
    @Test
595
    @DataSet(loadStrategy = CleanSweepInsertLoadStrategy.class, value = "TaxonNodeServiceImplTest.testGetUuidAndTitleCacheHierarchy.xml")
596
    public void testGetUuidAndTitleCacheHierarchy(){
597
        UUID classificationUuid = UUID.fromString("029b4c07-5903-4dcf-87e8-406ed0e0285f");
598
        UUID abiesUuid = UUID.fromString("f8306fd3-9825-41bf-94aa-a7b5790b553e");
599
        UUID abiesAlbaUuid = UUID.fromString("c70f76e5-2dcb-41c5-ae6f-d756e0a0fae0");
600
        UUID abiesAlbaSubBrotaUuid = UUID.fromString("06d58161-7707-44b5-b720-6c0eb916b37c");
601
        UUID abiesPalmaUuid = UUID.fromString("6dfd30dd-e589-493a-b66a-19c4cb374f92");
602
        UUID pinusUuid = UUID.fromString("5d8e8341-f5e9-4616-96cf-f0351dda42f4");
603
//        /*
604
//         * Checklist
605
//         *  - Abies
606
//         *   - Abies alba
607
//         *    - Abieas alba subs. brota
608
//         *   - Abies palma
609
//         *  -Pinus
610
//         */
611
//        Classification checklist = Classification.NewInstance("Checklist");
612
//        checklist.setUuid(classificationUuid);
613
//
614
//        BotanicalName abiesName = TaxonNameFactory.NewBotanicalInstance(Rank.GENUS());
615
//        abiesName.setGenusOrUninomial("Abies");
616
//        Taxon abies = Taxon.NewInstance(abiesName, null);
617
//
618
//        BotanicalName abiesAlbaName = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
619
//        abiesAlbaName.setGenusOrUninomial("Abies");
620
//        abiesAlbaName.setSpecificEpithet("alba");
621
//        Taxon abiesAlba = Taxon.NewInstance(abiesAlbaName, null);
622
//
623
//        BotanicalName abiesAlbaSubBrotaName = TaxonNameFactory.NewBotanicalInstance(Rank.SUBSPECIES());
624
//        abiesAlbaSubBrotaName.setGenusOrUninomial("Abies");
625
//        abiesAlbaSubBrotaName.setSpecificEpithet("alba");
626
//        abiesAlbaSubBrotaName.setInfraSpecificEpithet("brota");
627
//        Taxon abiesAlbaSubBrota = Taxon.NewInstance(abiesAlbaSubBrotaName, null);
628
//
629
//        BotanicalName abiesPalmaName = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
630
//        abiesPalmaName.setGenusOrUninomial("Abies");
631
//        abiesPalmaName.setSpecificEpithet("palma");
632
//        Taxon abiesPalma = Taxon.NewInstance(abiesPalmaName, null);
633
//
634
//        BotanicalName pinusName = TaxonNameFactory.NewBotanicalInstance(Rank.GENUS());
635
//        pinusName.setGenusOrUninomial("Pinus");
636
//        Taxon pinus = Taxon.NewInstance(pinusName, null);
637
//
638
//        checklist.addParentChild(null, abies, null, null);
639
//        checklist.addParentChild(abies, abiesAlba, null, null);
640
//        checklist.addParentChild(abiesAlba, abiesAlbaSubBrota, null, null);
641
//        checklist.addParentChild(abies, abiesPalma, null, null);
642
//        checklist.addParentChild(null, pinus, null, null);
643
//
644
//
645
//        setComplete();
646
//        endTransaction();
647
//
648
//        String fileNameAppendix = "testGetUuidAndTitleCacheHierarchy";
649
//
650
//        writeDbUnitDataSetFile(new String[] {
651
//            "TAXONBASE", "TAXONNAME",
652
//            "TAXONRELATIONSHIP",
653
//            "HOMOTYPICALGROUP",
654
//            "CLASSIFICATION", "TAXONNODE",
655
//            "HIBERNATE_SEQUENCES" // IMPORTANT!!!
656
//            },
657
//            fileNameAppendix );
658
        Classification classification = classificationService.load(classificationUuid);
659

    
660
        List<TaxonNode> expectedChildTaxonNodes = classification.getChildNodes();
661
        List<TaxonNodeDto> childNodesUuidAndTitleCache = taxonNodeService.listChildNodesAsTaxonNodeDto(classification.getRootNode());
662
        assertNotNull("child UuidAndTitleCache list is null", childNodesUuidAndTitleCache);
663

    
664
        compareChildren(expectedChildTaxonNodes, childNodesUuidAndTitleCache);
665

    
666
        //test taxon parent of sub species
667
        Taxon abiesAlbaSubBrota = HibernateProxyHelper.deproxy(taxonService.load(abiesAlbaSubBrotaUuid), Taxon.class);
668
        TaxonNode abiesAlbaSubBrotaNode = abiesAlbaSubBrota.getTaxonNodes().iterator().next();
669
        TaxonNode expectedTaxonParent = HibernateProxyHelper.deproxy(abiesAlbaSubBrotaNode.getParent(), TaxonNode.class);
670
        TaxonNodeDto taxonParent = taxonNodeService.getParentUuidAndTitleCache(abiesAlbaSubBrotaNode);
671
        assertEquals("Taxon Nodes do not match. ", expectedTaxonParent.getUuid(), taxonParent.getUuid());
672
        assertEquals("Taxon Nodes do not match. ", (Integer)expectedTaxonParent.getId(), taxonParent.getId());
673
        assertEquals("Taxon Nodes do not match. ", expectedTaxonParent.getTaxon().getTitleCache(), taxonParent.getTitleCache());
674
        assertEquals("Taxon Nodes do not match. ", expectedTaxonParent, taxonNodeService.load(taxonParent.getUuid()));
675

    
676
        //test classification parent
677
        Taxon abies = HibernateProxyHelper.deproxy(taxonService.load(abiesUuid), Taxon.class);
678
        TaxonNode abiesNode = abies.getTaxonNodes().iterator().next();
679
        TaxonNode expectedClassificationParent = HibernateProxyHelper.deproxy(abiesNode.getParent(), TaxonNode.class);
680
        TaxonNodeDto classificationParent= taxonNodeService.getParentUuidAndTitleCache(abiesNode);
681
        assertEquals("Taxon Nodes do not match. ", expectedClassificationParent.getUuid(), classificationParent.getUuid());
682
        assertEquals("Taxon Nodes do not match. ", (Integer)expectedClassificationParent.getId(), classificationParent.getId());
683
        assertEquals("Taxon Nodes do not match. ", expectedClassificationParent.getClassification().getTitleCache(), classificationParent.getTitleCache());
684
        assertEquals("Taxon Nodes do not match. ", expectedClassificationParent, taxonNodeService.load(classificationParent.getUuid()));
685
    }
686

    
687
    private void compareChildren(List<TaxonNode> expectedChildTaxonNodes, List<TaxonNodeDto> childNodesDto){
688
        assertEquals("Number of children does not match", expectedChildTaxonNodes.size(), childNodesDto.size());
689
        TaxonNodeDto foundMatch = null;
690
        for (TaxonNode taxonNode : expectedChildTaxonNodes) {
691
            foundMatch = null;
692
            for (TaxonNodeDto uuidAndTitleCache : childNodesDto) {
693
                if(uuidAndTitleCache.getUuid().equals(taxonNode.getUuid())){
694
                    Taxon taxon = HibernateProxyHelper.deproxy(taxonNode.getTaxon(), Taxon.class);
695
                    String titleCache = taxon.getTitleCache();
696
                    if(uuidAndTitleCache.getTaxonTitleCache().equals(titleCache)){
697
                        foundMatch = uuidAndTitleCache;
698
                        break;
699
                    }
700
                }
701
            }
702
            assertTrue(String.format("no matching UuidAndTitleCache found for child %s", taxonNode), foundMatch!=null);
703
            compareChildren(taxonNode.getChildNodes(), taxonNodeService.listChildNodesAsTaxonNodeDto(foundMatch));
704
        }
705
    }
706
//
707
//    private UuidAndTitleCache<TaxonNode> findMatchingUuidAndTitleCache(List<UuidAndTitleCache<TaxonNode>> childNodesUuidAndTitleCache,
708
//            UuidAndTitleCache<TaxonNode> foundMatch, TaxonNode taxonNode) {
709
//        for (UuidAndTitleCache<TaxonNode> uuidAndTitleCache : childNodesUuidAndTitleCache) {
710
//            if(uuidAndTitleCache.getUuid().equals(taxonNode.getUuid())){
711
//                String titleCache = taxonNode.getTaxon().getTitleCache();
712
//                if(uuidAndTitleCache.getTitleCache().equals(titleCache)){
713
//                    foundMatch = uuidAndTitleCache;
714
//                    break;
715
//                }
716
//            }
717
//        }
718
//        return foundMatch;
719
//    }
720

    
721
    @Test
722
    @DataSet("TaxonNodeServiceImplTest.testSetSecundumForSubtree.xml")
723
    public void testSetSecundumForSubtree(){
724
        UUID subTreeUuid = UUID.fromString("484a1a77-689c-44be-8e65-347d835f47e8");
725
//        UUID taxon1uuid = UUID.fromString("55c3e41a-c629-40e6-aa6a-ff274ac6ddb1");
726
//        UUID taxon5uuid = UUID.fromString("d0b99fee-a783-4dda-b8a2-8960703cfcc2");
727
        Reference newSec = referenceService.find(UUID.fromString("1d3fb074-d7ba-47e4-be94-b4cb1a99afa7"));
728

    
729
        //assert current state
730
        Assert.assertNotNull(newSec);
731
        Assert.assertNull(taxonService.find(1).getSec());
732
        Assert.assertNull(taxonService.find(2).getSec());
733
        Assert.assertNull(taxonService.find(3).getSec());
734
        Assert.assertNull(taxonService.find(4).getSec());
735
        TaxonBase<?> taxon5 = taxonService.find(5);
736
        Assert.assertNotNull(taxon5.getSec());
737
        Assert.assertNotEquals(newSec, taxon5.getSec());
738
        Assert.assertNotNull(taxon5.getSecMicroReference());
739

    
740
        //set secundum
741
        SecundumForSubtreeConfigurator config = new SecundumForSubtreeConfigurator(subTreeUuid);
742
        config.setNewSecundum(newSec);
743
        taxonNodeService.setSecundumForSubtree(config);
744

    
745
        commitAndStartNewTransaction(/*new String[]{"TaxonBase","TaxonBase_AUD"}*/);
746
        Assert.assertEquals(newSec, taxonService.find(1).getSec());
747
        Assert.assertNull(taxonService.find(2).getSec());
748
        Assert.assertEquals(newSec, taxonService.find(3).getSec());
749
        Assert.assertNull(taxonService.find(4).getSec());
750
        taxon5 = taxonService.find(5);
751
        Assert.assertEquals(newSec, taxon5.getSec());
752
        Assert.assertNull(taxon5.getSecMicroReference());
753
    }
754

    
755
    @Test
756
    @DataSet("TaxonNodeServiceImplTest.testSetSecundumForSubtree.xml")
757
    public void testSetSecundumForSubtreeNoOverwrite(){
758
        UUID subTreeUuid = UUID.fromString("484a1a77-689c-44be-8e65-347d835f47e8");
759
//        UUID taxon1uuid = UUID.fromString("55c3e41a-c629-40e6-aa6a-ff274ac6ddb1");
760
//        UUID taxon5uuid = UUID.fromString("d0b99fee-a783-4dda-b8a2-8960703cfcc2");
761
        Reference newSec = referenceService.find(UUID.fromString("1d3fb074-d7ba-47e4-be94-b4cb1a99afa7"));
762

    
763
        //assert current state
764
        Assert.assertNotNull(newSec);
765
        Assert.assertNull(taxonService.find(1).getSec());
766
        Assert.assertNull(taxonService.find(2).getSec());
767
        Assert.assertNull(taxonService.find(3).getSec());
768
        Assert.assertNull(taxonService.find(4).getSec());
769
        TaxonBase<?> taxon5 = taxonService.find(5);
770
        Assert.assertNotNull(taxon5.getSec());
771
        Assert.assertNotEquals(newSec, taxon5.getSec());
772
        Assert.assertNotNull(taxon5.getSecMicroReference());
773

    
774
        //set secundum
775
        SecundumForSubtreeConfigurator config = new SecundumForSubtreeConfigurator(subTreeUuid, newSec, null);
776
        config.setOverwriteExistingAccepted(false);
777
        config.setOverwriteExistingSynonyms(false);
778
        taxonNodeService.setSecundumForSubtree(config);
779

    
780
        commitAndStartNewTransaction(new String[]{"TaxonBase","TaxonBase_AUD"});
781
        Assert.assertEquals(newSec, taxonService.find(1).getSec());
782
        Assert.assertNull(taxonService.find(2).getSec());
783
        Assert.assertEquals(newSec, taxonService.find(3).getSec());
784
        Assert.assertNull(taxonService.find(4).getSec());
785
        Reference oldTaxon5Sec = taxon5.getSec();
786
        taxon5 = taxonService.find(5);
787
        Assert.assertEquals(oldTaxon5Sec, taxon5.getSec());
788
        Assert.assertNotEquals(newSec, taxon5.getSec());
789
        Assert.assertNotNull(taxon5.getSecMicroReference());
790
    }
791

    
792
    @Test
793
    @DataSet("TaxonNodeServiceImplTest.testSetSecundumForSubtree.xml")
794
    public void testSetSecundumForSubtreeOnlyAccepted(){
795
        UUID subTreeUuid = UUID.fromString("484a1a77-689c-44be-8e65-347d835f47e8");
796
        Reference newSec = referenceService.find(UUID.fromString("1d3fb074-d7ba-47e4-be94-b4cb1a99afa7"));
797

    
798
        //assert current state
799
        Assert.assertNotNull(newSec);
800
        Assert.assertNull(taxonService.find(1).getSec());
801
        Assert.assertNull(taxonService.find(2).getSec());
802
        Assert.assertNull(taxonService.find(3).getSec());
803
        Assert.assertNull(taxonService.find(4).getSec());
804
        TaxonBase<?> taxon5 = taxonService.find(5);
805
        Assert.assertNotNull(taxon5.getSec());
806
        Assert.assertNotEquals(newSec, taxon5.getSec());
807
        Assert.assertNotNull(taxon5.getSecMicroReference());
808

    
809
        //set secundum
810
        SecundumForSubtreeConfigurator config = new SecundumForSubtreeConfigurator(subTreeUuid, newSec, null);
811
        config.setIncludeSynonyms(false);
812
        taxonNodeService.setSecundumForSubtree(config);
813

    
814
//        commitAndStartNewTransaction(new String[]{"TaxonBase","TaxonBase_AUD"});
815
        Assert.assertEquals(newSec, taxonService.find(1).getSec());
816
        Assert.assertNull(taxonService.find(2).getSec());
817
        Assert.assertNull(taxonService.find(3).getSec());
818
        Assert.assertNull(taxonService.find(4).getSec());
819
        taxon5 = taxonService.find(5);
820
        Assert.assertEquals(newSec, taxon5.getSec());
821
        Assert.assertNull(taxon5.getSecMicroReference());
822
    }
823

    
824
    @Test
825
    @DataSet("TaxonNodeServiceImplTest.testSetSecundumForSubtree.xml")
826
    public void testSetSecundumForSubtreeOnlySynonyms(){
827
        UUID subTreeUuid = UUID.fromString("484a1a77-689c-44be-8e65-347d835f47e8");
828
        Reference newSec = referenceService.find(UUID.fromString("1d3fb074-d7ba-47e4-be94-b4cb1a99afa7"));
829

    
830
        //assert current state
831
        Assert.assertNotNull(newSec);
832
        Assert.assertNull(taxonService.find(1).getSec());
833
        Assert.assertNull(taxonService.find(2).getSec());
834
        Assert.assertNull(taxonService.find(3).getSec());
835
        Assert.assertNull(taxonService.find(4).getSec());
836
        TaxonBase<?> taxon5 = taxonService.find(5);
837
        Assert.assertNotNull(taxon5.getSec());
838
        Assert.assertNotEquals(newSec, taxon5.getSec());
839
        Assert.assertNotNull(taxon5.getSecMicroReference());
840

    
841
        //set secundum
842
        SecundumForSubtreeConfigurator config = new SecundumForSubtreeConfigurator(subTreeUuid, newSec, null);
843
        config.setIncludeAcceptedTaxa(false);
844
        taxonNodeService.setSecundumForSubtree(config);
845

    
846
        commitAndStartNewTransaction(new String[]{"TaxonBase","TaxonBase_AUD"});
847
        Assert.assertNull(taxonService.find(1).getSec());
848
        Assert.assertNull(taxonService.find(2).getSec());
849
        Assert.assertEquals("Synonym should be updated", newSec, taxonService.find(3).getSec());
850
        Assert.assertNull(taxonService.find(4).getSec());
851
        Reference oldTaxon5Sec = taxon5.getSec();
852
        taxon5 = taxonService.find(5);
853
        Assert.assertEquals(oldTaxon5Sec, taxon5.getSec());
854
        Assert.assertNotEquals(newSec, taxon5.getSec());
855
        Assert.assertNotNull(taxon5.getSecMicroReference());
856
    }
857

    
858
    @Test
859
    @DataSet("TaxonNodeServiceImplTest.testSetSecundumForSubtree.xml")
860
    public void testSetSecundumForSubtreeNoShared(){
861
        UUID subTreeUuid = UUID.fromString("484a1a77-689c-44be-8e65-347d835f47e8");
862
        Reference newSec = referenceService.find(UUID.fromString("1d3fb074-d7ba-47e4-be94-b4cb1a99afa7"));
863

    
864
        //assert current state
865
        Assert.assertNotNull(newSec);
866
        Assert.assertNull(taxonService.find(1).getSec());
867
        Assert.assertNull(taxonService.find(2).getSec());
868
        Assert.assertNull(taxonService.find(3).getSec());
869
        Assert.assertNull(taxonService.find(4).getSec());
870
        TaxonBase<?> taxon5 = taxonService.find(5);
871
        Assert.assertNotNull(taxon5.getSec());
872
        Assert.assertNotEquals(newSec, taxon5.getSec());
873
        Assert.assertNotNull(taxon5.getSecMicroReference());
874

    
875
        //set secundum
876
        SecundumForSubtreeConfigurator config = new SecundumForSubtreeConfigurator(subTreeUuid, newSec, null);
877
        config.setIncludeSharedTaxa(false);
878
        taxonNodeService.setSecundumForSubtree(config);
879

    
880
        commitAndStartNewTransaction(new String[]{"TaxonBase","TaxonBase_AUD"});
881
        Assert.assertNull("Shared taxon must not be set", taxonService.find(1).getSec());
882
        Assert.assertNull(taxonService.find(2).getSec());
883
        Assert.assertNull("Synonym of shared taxon must not be set", taxonService.find(3).getSec());
884
        Assert.assertNull(taxonService.find(4).getSec());
885
        taxon5 = taxonService.find(5);
886
        Assert.assertEquals(newSec, taxon5.getSec());
887
        Assert.assertNull(taxon5.getSecMicroReference());
888
    }
889

    
890
    @Test
891
    @DataSet("TaxonNodeServiceImplTest.testSetSecundumForSubtree.xml")
892
    public void testSetPublishForSubtree(){
893
        UUID subTreeUuid = UUID.fromString("484a1a77-689c-44be-8e65-347d835f47e8");
894

    
895
        assertStartingStateForSetPublish();
896

    
897
        boolean publish = false;
898

    
899
        PublishForSubtreeConfigurator config = PublishForSubtreeConfigurator.NewInstance(
900
                subTreeUuid,  publish, null);
901
        config.setIncludeAcceptedTaxa(true);
902
        config.setIncludeSynonyms(true);
903
        config.setIncludeSharedTaxa(true);
904
        config.setIncludeHybrids(false);
905
        taxonNodeService.setPublishForSubtree(config);
906

    
907
        commitAndStartNewTransaction();
908

    
909
        Assert.assertEquals(publish, taxonService.find(1).isPublish());
910
        Assert.assertEquals("Taxon2 is not in subtree", true, taxonService.find(2).isPublish());
911
        Assert.assertEquals("Synonym3 not yet updated because it is hybrid", true, taxonService.find(3).isPublish());
912
        Assert.assertEquals("Synonym4 is not in subtree", true, taxonService.find(4).isPublish());
913
        Assert.assertEquals(true, taxonService.find(5).isPublish());
914
        Assert.assertEquals(publish, taxonService.find(6).isPublish());
915
        Assert.assertEquals("Synonym7 is not in subtree", true, taxonService.find(7).isPublish());
916

    
917
        config.setIncludeHybrids(true);
918
        taxonNodeService.setPublishForSubtree(config);
919

    
920
        commitAndStartNewTransaction();
921
        Assert.assertEquals(publish, taxonService.find(3).isPublish());
922
        Assert.assertEquals(publish, taxonService.find(5).isPublish());
923
        Assert.assertEquals(publish, taxonService.find(7).isPublish());
924

    
925
    }
926

    
927
    @Test
928
    @DataSet("TaxonNodeServiceImplTest.testSetSecundumForSubtree.xml")
929
    public void testSetPublishForSubtreeOnlyAccepted(){
930
        UUID subTreeUuid = UUID.fromString("484a1a77-689c-44be-8e65-347d835f47e8");
931

    
932
        assertStartingStateForSetPublish();
933

    
934
        boolean publish = false;
935
        PublishForSubtreeConfigurator config = PublishForSubtreeConfigurator.NewInstance(subTreeUuid,  publish, null);
936
        config.setIncludeAcceptedTaxa(true);
937
        config.setIncludeSynonyms(false);
938
        config.setIncludeMisapplications(false);
939
        config.setIncludeProParteSynonyms(false);
940
        config.setIncludeSharedTaxa(true);
941
        taxonNodeService.setPublishForSubtree(config);
942

    
943

    
944
        commitAndStartNewTransaction();
945
        Assert.assertEquals(publish, taxonService.find(1).isPublish());
946
        Assert.assertEquals("Taxon2 not in subtree", true, taxonService.find(2).isPublish());
947
        Assert.assertEquals("Synonym3 should not be updated", true, taxonService.find(3).isPublish());
948
        Assert.assertEquals("Synonym3 should not be updated", true, taxonService.find(4).isPublish());
949
        Assert.assertEquals("Accepted in subtree should be udpated", publish, taxonService.find(5).isPublish());
950
        Assert.assertEquals("Misapplied should not be updated", true, taxonService.find(6).isPublish());
951
        Assert.assertEquals("Pro parte synonym should not be updated", true, taxonService.find(7).isPublish());
952

    
953
        config.setIncludeMisapplications(true);
954
        taxonNodeService.setPublishForSubtree(config);
955
        commitAndStartNewTransaction();
956
        Assert.assertEquals("Misapplied should be updated now", publish, taxonService.find(6).isPublish());
957
        Assert.assertEquals("Pro parte synonym should not yet be updated", true, taxonService.find(7).isPublish());
958

    
959
        config.setIncludeProParteSynonyms(true);
960
        config.setIncludeHybrids(false);
961
        taxonNodeService.setPublishForSubtree(config);
962
        commitAndStartNewTransaction();
963
        Assert.assertEquals("Pro parte synonym should not yet be updated because it is a hybrid", true, taxonService.find(7).isPublish());
964

    
965
        config.setIncludeHybrids(true);
966
        taxonNodeService.setPublishForSubtree(config);
967
        commitAndStartNewTransaction();
968
        Assert.assertEquals("Pro parte synonym should be updated now", publish, taxonService.find(7).isPublish());
969

    
970
    }
971

    
972
    @Test
973
    @DataSet("TaxonNodeServiceImplTest.testSetSecundumForSubtree.xml")
974
    public void testSetPublishForSubtreeOnlySynonyms(){
975
        UUID subTreeUuid = UUID.fromString("484a1a77-689c-44be-8e65-347d835f47e8");
976

    
977
        //assert current state
978
        assertStartingStateForSetPublish();
979

    
980
        boolean publish = false;
981

    
982
        PublishForSubtreeConfigurator config = PublishForSubtreeConfigurator.NewInstance(
983
                subTreeUuid, publish, null);
984
        config.setIncludeAcceptedTaxa(false);
985
        config.setIncludeSynonyms(true);
986
        config.setIncludeSharedTaxa(true);  //should have no effect
987
        config.setIncludeMisapplications(false);
988
        config.setIncludeProParteSynonyms(false);
989
        taxonNodeService.setPublishForSubtree(config);
990

    
991

    
992
        commitAndStartNewTransaction(new String[]{});
993
        Assert.assertEquals(true, taxonService.find(1).isPublish());
994
        Assert.assertEquals(true, taxonService.find(2).isPublish());
995
        //Synonym should be false
996
        Assert.assertEquals(publish, taxonService.find(3).isPublish());
997
        Assert.assertEquals(true, taxonService.find(4).isPublish());
998
        Assert.assertEquals(true, taxonService.find(5).isPublish());
999
        Assert.assertEquals(true, taxonService.find(6).isPublish());
1000
        Assert.assertEquals(true, taxonService.find(7).isPublish());
1001

    
1002
        config.setIncludeMisapplications(true);
1003
        taxonNodeService.setPublishForSubtree(config);
1004
        commitAndStartNewTransaction();
1005
        Assert.assertEquals("Misapplied should be updated now", publish, taxonService.find(6).isPublish());
1006
        Assert.assertEquals("Pro parte synonym should not yet be updated", true, taxonService.find(7).isPublish());
1007

    
1008
        config.setIncludeProParteSynonyms(true);
1009
        taxonNodeService.setPublishForSubtree(config);
1010
        commitAndStartNewTransaction();
1011
        Assert.assertEquals("Pro parte synonym should be updated now", publish, taxonService.find(7).isPublish());
1012

    
1013
    }
1014

    
1015
    private void assertStartingStateForSetPublish() {
1016
        Assert.assertTrue(taxonService.find(1).isPublish());
1017
        Assert.assertTrue(taxonService.find(2).isPublish());
1018
        Assert.assertTrue(taxonService.find(3).isPublish());
1019
        Assert.assertTrue(taxonService.find(4).isPublish());
1020
        Assert.assertTrue(taxonService.find(5).isPublish());
1021
        Assert.assertTrue(taxonService.find(6).isPublish());
1022
        Assert.assertTrue(taxonService.find(7).isPublish());
1023
    }
1024

    
1025

    
1026
    @Test
1027
    @DataSet("TaxonNodeServiceImplTest.testSetSecundumForSubtree.xml")
1028
    public void testSetPublishForSubtreeNoShared(){
1029
        UUID subTreeUuid = UUID.fromString("484a1a77-689c-44be-8e65-347d835f47e8");
1030

    
1031
        assertStartingStateForSetPublish();
1032

    
1033
        boolean publish = false;
1034
        PublishForSubtreeConfigurator config = PublishForSubtreeConfigurator.NewInstance(
1035
                subTreeUuid, publish, null);
1036
        config.setIncludeAcceptedTaxa(true);
1037
        config.setIncludeSynonyms(true);
1038
        config.setIncludeSharedTaxa(false);
1039
        taxonNodeService.setPublishForSubtree(config);
1040

    
1041
        commitAndStartNewTransaction();
1042
        Assert.assertEquals("Shared taxon must not be set", true, taxonService.find(1).isPublish());
1043
        Assert.assertEquals("Taxon2 is not in subtree", true, taxonService.find(2).isPublish());
1044
        Assert.assertEquals("Synonym of shared taxon must not be set", true, taxonService.find(3).isPublish());
1045
        Assert.assertEquals("Synonym4 belongs to Taxon2 which is not in subtree", true, taxonService.find(4).isPublish());
1046
        Assert.assertEquals("Taxon5 is in subtree and not shared => should be set to unpublished", publish, taxonService.find(5).isPublish());
1047
        Assert.assertEquals("Misapplied exists as taxon in classification 2 and should not be updated"
1048
                + " though related to taxon 5 which is updated", true, taxonService.find(6).isPublish());
1049
        Assert.assertEquals("Pro parte synonym7 should not be updated, as it is "
1050
                + "related to updated taxon5 but also to taxon2 which is not updated because not in subtree",
1051
                true, taxonService.find(7).isPublish());
1052

    
1053
        taxonService.find(2).setPublish(false);
1054
        taxonNodeService.setPublishForSubtree(config);
1055
        commitAndStartNewTransaction();
1056
        Assert.assertEquals("Pro parte synonym7 should be updated now, as taxon2 is now unpublished"
1057
                + " and therefore the noShared function is not relevant anymore",
1058
                publish, taxonService.find(7).isPublish());
1059
    }
1060

    
1061
    @Test
1062
    @DataSet("TaxonNodeServiceImplTest-testFindCommonParentNode.xml")
1063
    public void testFindCommonParentNode(){
1064
        UUID checklist2Uuid = UUID.fromString("c6e3a598-3b6c-4ef5-8b01-5bdb3de5a9fd");
1065
        UUID campanulaNodeUuid = UUID.fromString("62fa918d-a1d8-4284-ae4b-93478bde8656");
1066
        UUID campanulaPersicifoliaNodeUuid = UUID.fromString("dce3defa-5123-44a7-8008-0cc9b27461f6");
1067

    
1068
        UUID classificationUuid = UUID.fromString("029b4c07-5903-4dcf-87e8-406ed0e0285f");
1069
        UUID abiesNodeUuid = UUID.fromString("f8306fd3-9825-41bf-94aa-a7b5790b553e");
1070
        UUID abiesAlbaNodeUuid = UUID.fromString("c70f76e5-2dcb-41c5-ae6f-d756e0a0fae0");
1071
        UUID abiesAlbaSubBrotaNodeUuid = UUID.fromString("06d58161-7707-44b5-b720-6c0eb916b37c");
1072
        UUID abiesPalmaNodeUuid = UUID.fromString("6dfd30dd-e589-493a-b66a-19c4cb374f92");
1073

    
1074
        UUID pinusNodeUuid = UUID.fromString("5d8e8341-f5e9-4616-96cf-f0351dda42f4");
1075

    
1076
//        /*
1077
//         * Checklist2
1078
//         *  - Campanula
1079
//         *   - Campanula persicifolia
1080
//         * Checklist
1081
//         *  - Abies
1082
//         *   - Abies alba
1083
//         *    - Abieas alba subs. brota
1084
//         *   - Abies palma
1085
//         *  -Pinus
1086
//         */
1087
//        Classification checklist2 = Classification.NewInstance("Checklist2");
1088
//        checklist2.setUuid(checklist2Uuid);
1089
//
1090
//        IBotanicalName campanulaName = TaxonNameFactory.NewBotanicalInstance(Rank.GENUS());
1091
//        campanulaName.setGenusOrUninomial("Campanula");
1092
//        Taxon campanula = Taxon.NewInstance(campanulaName, null);
1093
//
1094
//        IBotanicalName campanulaPersicifoliaName = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
1095
//        campanulaPersicifoliaName.setGenusOrUninomial("Campanula");
1096
//        campanulaPersicifoliaName.setSpecificEpithet("persicifolia");
1097
//        Taxon campanulaPersicifolia = Taxon.NewInstance(campanulaPersicifoliaName, null);
1098
//
1099
//        TaxonNode campanulaNode = checklist2.addChildTaxon(campanula, null, null);
1100
//        campanulaNode.setUuid(campanulaNodeUuid);
1101
//        TaxonNode campanulaPersicifoliaNode = checklist2.addParentChild(campanula, campanulaPersicifolia, null, null);
1102
//        campanulaPersicifoliaNode.setUuid(campanulaPersicifoliaNodeUuid);
1103
//
1104
//        Classification checklist = Classification.NewInstance("Checklist");
1105
//        checklist.setUuid(classificationUuid);
1106
//
1107
//        IBotanicalName abiesName = TaxonNameFactory.NewBotanicalInstance(Rank.GENUS());
1108
//        abiesName.setGenusOrUninomial("Abies");
1109
//        Taxon abies = Taxon.NewInstance(abiesName, null);
1110
//
1111
//        IBotanicalName abiesAlbaName = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
1112
//        abiesAlbaName.setGenusOrUninomial("Abies");
1113
//        abiesAlbaName.setSpecificEpithet("alba");
1114
//        Taxon abiesAlba = Taxon.NewInstance(abiesAlbaName, null);
1115
//
1116
//        IBotanicalName abiesAlbaSubBrotaName = TaxonNameFactory.NewBotanicalInstance(Rank.SUBSPECIES());
1117
//        abiesAlbaSubBrotaName.setGenusOrUninomial("Abies");
1118
//        abiesAlbaSubBrotaName.setSpecificEpithet("alba");
1119
//        abiesAlbaSubBrotaName.setInfraSpecificEpithet("brota");
1120
//        Taxon abiesAlbaSubBrota = Taxon.NewInstance(abiesAlbaSubBrotaName, null);
1121
//
1122
//        IBotanicalName abiesPalmaName = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
1123
//        abiesPalmaName.setGenusOrUninomial("Abies");
1124
//        abiesPalmaName.setSpecificEpithet("palma");
1125
//        Taxon abiesPalma = Taxon.NewInstance(abiesPalmaName, null);
1126
//
1127
//        IBotanicalName pinusName = TaxonNameFactory.NewBotanicalInstance(Rank.GENUS());
1128
//        pinusName.setGenusOrUninomial("Pinus");
1129
//        Taxon pinus = Taxon.NewInstance(pinusName, null);
1130
//
1131
//        TaxonNode abiesNode = checklist.addChildTaxon(abies, null, null);
1132
//        abiesNode.setUuid(abiesNodeUuid);
1133
//        TaxonNode abiesAlbaNode = checklist.addParentChild(abies, abiesAlba, null, null);
1134
//        abiesAlbaNode.setUuid(abiesAlbaNodeUuid);
1135
//        TaxonNode abiesAlbaSubBrotaNode = checklist.addParentChild(abiesAlba, abiesAlbaSubBrota, null, null);
1136
//        abiesAlbaSubBrotaNode.setUuid(abiesAlbaSubBrotaNodeUuid);
1137
//        TaxonNode abiesPalmaNode = checklist.addParentChild(abies, abiesPalma, null, null);
1138
//        abiesPalmaNode.setUuid(abiesPalmaNodeUuid);
1139
//        TaxonNode pinusNode = checklist.addChildTaxon(pinus, null, null);
1140
//        pinusNode.setUuid(pinusNodeUuid);
1141
//
1142
//        taxonService.saveOrUpdate(campanula);
1143
//        taxonService.saveOrUpdate(campanulaPersicifolia);
1144
//        classificationService.saveOrUpdate(checklist2);
1145
//
1146
//        taxonService.saveOrUpdate(abies);
1147
//        taxonService.saveOrUpdate(abiesAlba);
1148
//        taxonService.saveOrUpdate(abiesAlbaSubBrota);
1149
//        taxonService.saveOrUpdate(abiesPalma);
1150
//        taxonService.saveOrUpdate(pinus);
1151
//        classificationService.saveOrUpdate(checklist);
1152
//
1153
//
1154
//        setComplete();
1155
//        endTransaction();
1156
//
1157
//        String fileNameAppendix = "testFindCommonParentNode";
1158
//
1159
//        writeDbUnitDataSetFile(new String[] {
1160
//            "TAXONBASE", "TAXONNAME",
1161
//            "TAXONRELATIONSHIP",
1162
//            "HOMOTYPICALGROUP",
1163
//            "CLASSIFICATION", "TAXONNODE",
1164
//            "LANGUAGESTRING",
1165
//            "HIBERNATE_SEQUENCES" // IMPORTANT!!!
1166
//            },
1167
//            fileNameAppendix );
1168

    
1169
        Classification classification = classificationService.load(classificationUuid);
1170

    
1171
        TaxonNode campanula = taxonNodeService.load(campanulaNodeUuid);
1172
        TaxonNode campanulaPersicifolia = taxonNodeService.load(campanulaPersicifoliaNodeUuid);
1173
        TaxonNode abies = taxonNodeService.load(abiesNodeUuid);
1174
        TaxonNode abiesAlba = taxonNodeService.load(abiesAlbaNodeUuid);
1175
        TaxonNode abiesPalma = taxonNodeService.load(abiesPalmaNodeUuid);
1176
        TaxonNode pinus = taxonNodeService.load(pinusNodeUuid);
1177

    
1178
        //check initial state
1179
        assertTrue(campanula!=null);
1180
        assertTrue(campanulaPersicifolia!=null);
1181
        assertTrue(abies!=null);
1182
        assertTrue(abiesAlba!=null);
1183
        assertTrue(abiesPalma!=null);
1184
        assertTrue(pinus!=null);
1185

    
1186
        TaxonNodeDto classificationRootNodeDto = new TaxonNodeDto(classification.getRootNode());
1187
        TaxonNodeDto campanulaDto = new TaxonNodeDto(campanula);
1188
        TaxonNodeDto campanulaPersicifoliaDto = new TaxonNodeDto(campanulaPersicifolia);
1189
        TaxonNodeDto abiesDto = new TaxonNodeDto(abies);
1190
        TaxonNodeDto abiesAlbaDto = new TaxonNodeDto(abiesAlba);
1191
        TaxonNodeDto abiesPalmaDto = new TaxonNodeDto(abiesPalma);
1192
        TaxonNodeDto pinusDto = new TaxonNodeDto(pinus);
1193

    
1194
        List<TaxonNodeDto> nodes = new ArrayList<>();
1195
        nodes.add(campanulaDto);
1196
        TaxonNodeDto commonParentNodeDto = taxonNodeService.findCommonParentDto(nodes);
1197
        assertEquals(campanulaDto.getUuid(), commonParentNodeDto.getUuid());
1198

    
1199
        nodes = new ArrayList<>();
1200
        nodes.add(campanulaDto);
1201
        nodes.add(campanulaPersicifoliaDto);
1202
        commonParentNodeDto = taxonNodeService.findCommonParentDto(nodes);
1203
        assertEquals(campanulaDto.getUuid(), commonParentNodeDto.getUuid());
1204

    
1205
        nodes = new ArrayList<>();
1206
        nodes.add(campanulaDto);
1207
        nodes.add(abiesAlbaDto);
1208
        commonParentNodeDto = taxonNodeService.findCommonParentDto(nodes);
1209
        assertNull(commonParentNodeDto);
1210

    
1211
        nodes = new ArrayList<>();
1212
        nodes.add(abiesAlbaDto);
1213
        nodes.add(abiesPalmaDto);
1214
        commonParentNodeDto = taxonNodeService.findCommonParentDto(nodes);
1215
        assertEquals(abiesDto.getUuid(), commonParentNodeDto.getUuid());
1216

    
1217
        nodes = new ArrayList<>();
1218
        nodes.add(abiesDto);
1219
        nodes.add(pinusDto);
1220
        commonParentNodeDto = taxonNodeService.findCommonParentDto(nodes);
1221
        assertEquals(classificationRootNodeDto.getUuid(), commonParentNodeDto.getUuid());
1222
    }
1223

    
1224
    @Test
1225
    @DataSet
1226
    @Ignore //test for #8857 which is not yet solved; see also #testSaveNewTaxonNodeReference()
1227
    public void testSaveNewTaxonNode(){
1228
        //make the sec reference persistent
1229
        Person secAndNameAuthor = (Person)agentService.find(person1uuid);
1230
        Reference sec = ReferenceFactory.newBook();
1231
        sec.setAuthorship(secAndNameAuthor);
1232
        referenceService.save(sec);
1233
        commitAndStartNewTransaction();
1234

    
1235
        TaxonName taxonName = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
1236
        taxonName.setCombinationAuthorship(secAndNameAuthor);
1237
        Taxon newTaxon = Taxon.NewInstance(taxonName, sec);
1238
        node2 = taxonNodeService.find(node2Uuid);
1239
        TaxonNode newTaxonNode = node2.addChildTaxon(newTaxon, null, null);
1240
        taxonNodeService.saveNewTaxonNode(newTaxonNode);
1241
    }
1242

    
1243
    @Test
1244
    @DataSet
1245
    @Ignore //test for #8857 which is not yet solved, same as #testSaveNewTaxonNode() but with reference as duplicate
1246
    public void testSaveNewTaxonNodeReference(){
1247
        Reference sec = referenceService.find(referenceUuid);
1248
        commitAndStartNewTransaction();
1249

    
1250
        TaxonName taxonName = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
1251
        taxonName.setNomenclaturalReference(sec);
1252
        Taxon newTaxon = Taxon.NewInstance(taxonName, sec);
1253
        node2 = taxonNodeService.find(node2Uuid);
1254
        TaxonNode newTaxonNode = node2.addChildTaxon(newTaxon, null, null);
1255
        taxonNodeService.saveNewTaxonNode(newTaxonNode);
1256
    }
1257

    
1258

    
1259
    @Test
1260
    @DataSet("ClassificationServiceImplTest.xml")
1261
    public final void testCloneClassification(){
1262

    
1263
        Classification originalClassification = classificationDao.load(ClassificationServiceImplTest.CLASSIFICATION_UUID);
1264

    
1265
        SubtreeCloneConfigurator config = SubtreeCloneConfigurator.NewBaseInstance(
1266
                originalClassification.getRootNode().getUuid(), "Cloned classification");
1267

    
1268
        Classification classificationClone = (Classification) taxonNodeService.cloneSubtree(config).getCdmEntity();
1269

    
1270
        assertEquals("# of direct children does not match", originalClassification.getChildNodes().size(), classificationClone.getChildNodes().size());
1271
        assertEquals("# of all nodes does not match", originalClassification.getAllNodes().size(), classificationClone.getAllNodes().size());
1272

    
1273
        Set<UUID> originalTaxonSecUuids = originalClassification.getAllNodes().stream().map(tn -> tn.getTaxon().getSec().getUuid()).collect(Collectors.toSet());
1274
        for (TaxonNode clonedTaxonNode : classificationClone.getChildNodes()) {
1275
            //test no reuse of taxon
1276
            Taxon clonedTaxon = clonedTaxonNode.getTaxon();
1277
            TaxonNode originalNode = originalClassification.getNode(clonedTaxon);
1278
            assertNull(originalNode);
1279

    
1280
            //check relationship
1281
            assertEquals(0, clonedTaxon.getRelationsFromThisTaxon().size());
1282

    
1283
            //test taxon sec
1284
            assertTrue(originalTaxonSecUuids.contains(clonedTaxon.getSec().getUuid()));
1285
        }
1286
        commitAndStartNewTransaction();
1287

    
1288
        //test reuse taxon
1289
        config.setReuseTaxa(true);
1290
        classificationClone = (Classification) taxonNodeService.cloneSubtree(config).getCdmEntity();
1291
        assertEquals("# of direct children does not match", originalClassification.getChildNodes().size(), classificationClone.getChildNodes().size());
1292
        originalTaxonSecUuids = originalClassification.getAllNodes().stream().map(tn -> tn.getTaxon().getSec().getUuid()).collect(Collectors.toSet());
1293
        for (TaxonNode taxonNode : classificationClone.getChildNodes()) {
1294
            //test no reuse of taxon
1295
            Taxon clonedTaxon = taxonNode.getTaxon();
1296
            TaxonNode originalNode = originalClassification.getNode(clonedTaxon);
1297
            assertNotNull(originalNode);
1298
            Taxon originalTaxon = originalNode.getTaxon();
1299
            assertNotNull(originalTaxon);
1300

    
1301
            //check relationship
1302
            assertEquals(0, clonedTaxon.getRelationsFromThisTaxon().size());
1303

    
1304
            //test taxon sec
1305
            assertEquals(originalTaxon.getSec().getUuid(), clonedTaxon.getSec().getUuid());
1306
        }
1307
        commitAndStartNewTransaction();
1308

    
1309
        config.setReuseTaxa(false);  //reset
1310
        config.setRelationTypeToOldTaxon(TaxonRelationshipType.CONGRUENT_TO());
1311
        Reference sec = referenceDao.findByUuid(UUID.fromString("719d136b-409e-40d0-9561-46f6999465b4"));
1312
        config.setTaxonSecundumUuid(sec.getUuid());
1313
        classificationClone = (Classification) taxonNodeService.cloneSubtree(config).getCdmEntity();
1314
        originalTaxonSecUuids = originalClassification.getAllNodes().stream().map(tn -> tn.getTaxon().getSec().getUuid()).collect(Collectors.toSet());
1315
        for (TaxonNode taxonNode : classificationClone.getChildNodes()) {
1316
            //test no reuse of taxon
1317
            Taxon clonedTaxon = taxonNode.getTaxon();
1318
            TaxonNode originalNode = originalClassification.getNode(clonedTaxon);
1319
            assertNull(originalNode);
1320

    
1321
            //check relationship
1322
            TaxonRelationship relShip = clonedTaxon.getRelationsFromThisTaxon().iterator().next();
1323
            Taxon relatedTaxon = relShip.getToTaxon();
1324
            Taxon relatedOriginalTaxon = originalClassification.getNode(relatedTaxon).getTaxon();
1325
            assertEquals(relatedOriginalTaxon.getName(), clonedTaxon.getName());
1326
            assertTrue(relShip.getType().equals(TaxonRelationshipType.CONGRUENT_TO()));
1327

    
1328
            //test taxon sec
1329
            assertEquals(relatedOriginalTaxon.getSec().getUuid(), clonedTaxon.getSec().getUuid());
1330
        }
1331
        commitAndStartNewTransaction();
1332

    
1333
        //no recursive for root
1334
        config = SubtreeCloneConfigurator.NewBaseInstance(
1335
                originalClassification.getRootNode().getUuid(), "Cloned classification");
1336
        config.setDoRecursive(false);
1337
        classificationClone = (Classification) taxonNodeService.cloneSubtree(config).getCdmEntity();
1338
        Assert.assertTrue(classificationClone.getRootNode().getChildNodes().isEmpty());
1339

    
1340
        //no recursive for root
1341
        config = SubtreeCloneConfigurator.NewBaseInstance(
1342
                UUID.fromString("26cc5c08-72df-45d4-84ea-ce81e7e53114"), "Cloned classification");
1343
        config.setDoRecursive(false);
1344
        classificationClone = (Classification) taxonNodeService.cloneSubtree(config).getCdmEntity();
1345
        List<TaxonNode> nodes = classificationClone.getRootNode().getChildNodes();
1346
        Assert.assertEquals(1, nodes.size());
1347
        Taxon clonedTaxon = nodes.iterator().next().getTaxon();
1348
        Assert.assertEquals("Name should be the same as for the original taxon", UUID.fromString("301e2bf0-85a4-442a-93f6-63d3b9ee8c3d"), clonedTaxon.getName().getUuid());
1349
        Assert.assertTrue(nodes.iterator().next().getChildNodes().isEmpty());
1350
    }
1351

    
1352
    @Override
1353
//    @Test
1354
    public void createTestDataSet() throws FileNotFoundException {
1355
        UUID checklist2Uuid = UUID.fromString("c6e3a598-3b6c-4ef5-8b01-5bdb3de5a9fd");
1356
        UUID campanulaNodeUuid = UUID.fromString("62fa918d-a1d8-4284-ae4b-93478bde8656");
1357
        UUID campanulaPersicifoliaNodeUuid = UUID.fromString("dce3defa-5123-44a7-8008-0cc9b27461f6");
1358

    
1359
        UUID classificationUuid = UUID.fromString("029b4c07-5903-4dcf-87e8-406ed0e0285f");
1360
        UUID abiesNodeUuid = UUID.fromString("f8306fd3-9825-41bf-94aa-a7b5790b553e");
1361
        UUID abiesAlbaNodeUuid = UUID.fromString("c70f76e5-2dcb-41c5-ae6f-d756e0a0fae0");
1362
        UUID abiesAlbaSubBrotaNodeUuid = UUID.fromString("06d58161-7707-44b5-b720-6c0eb916b37c");
1363
        UUID abiesPalmaNodeUuid = UUID.fromString("6dfd30dd-e589-493a-b66a-19c4cb374f92");
1364

    
1365
        UUID pinusNodeUuid = UUID.fromString("5d8e8341-f5e9-4616-96cf-f0351dda42f4");
1366

    
1367
        /*
1368
         * Checklist2
1369
         *  - Campanula
1370
         *   - Campanula persicifolia
1371
         * Checklist
1372
         *  - Abies
1373
         *   - Abies alba
1374
         *    - Abieas alba subs. brota
1375
         *   - Abies palma
1376
         *  -Pinus
1377
         */
1378
        Classification checklist2 = Classification.NewInstance("Checklist2");
1379
        checklist2.setUuid(checklist2Uuid);
1380

    
1381
        IBotanicalName campanulaName = TaxonNameFactory.NewBotanicalInstance(Rank.GENUS());
1382
        campanulaName.setGenusOrUninomial("Campanula");
1383
        Taxon campanula = Taxon.NewInstance(campanulaName, null);
1384

    
1385
        IBotanicalName campanulaPersicifoliaName = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
1386
        campanulaPersicifoliaName.setGenusOrUninomial("Campanula");
1387
        campanulaPersicifoliaName.setSpecificEpithet("persicifolia");
1388
        Taxon campanulaPersicifolia = Taxon.NewInstance(campanulaPersicifoliaName, null);
1389

    
1390
        TaxonNode campanulaNode = checklist2.addChildTaxon(campanula, null, null);
1391
        campanulaNode.setUuid(campanulaNodeUuid);
1392
        TaxonNode campanulaPersicifoliaNode = checklist2.addParentChild(campanula, campanulaPersicifolia, null, null);
1393
        campanulaPersicifoliaNode.setUuid(campanulaPersicifoliaNodeUuid);
1394

    
1395
        Classification checklist = Classification.NewInstance("Checklist");
1396
        checklist.setUuid(classificationUuid);
1397

    
1398
        IBotanicalName abiesName = TaxonNameFactory.NewBotanicalInstance(Rank.GENUS());
1399
        abiesName.setGenusOrUninomial("Abies");
1400
        Taxon abies = Taxon.NewInstance(abiesName, null);
1401

    
1402
        IBotanicalName abiesAlbaName = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
1403
        abiesAlbaName.setGenusOrUninomial("Abies");
1404
        abiesAlbaName.setSpecificEpithet("alba");
1405
        Taxon abiesAlba = Taxon.NewInstance(abiesAlbaName, null);
1406

    
1407
        IBotanicalName abiesAlbaSubBrotaName = TaxonNameFactory.NewBotanicalInstance(Rank.SUBSPECIES());
1408
        abiesAlbaSubBrotaName.setGenusOrUninomial("Abies");
1409
        abiesAlbaSubBrotaName.setSpecificEpithet("alba");
1410
        abiesAlbaSubBrotaName.setInfraSpecificEpithet("brota");
1411
        Taxon abiesAlbaSubBrota = Taxon.NewInstance(abiesAlbaSubBrotaName, null);
1412

    
1413
        IBotanicalName abiesPalmaName = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES());
1414
        abiesPalmaName.setGenusOrUninomial("Abies");
1415
        abiesPalmaName.setSpecificEpithet("palma");
1416
        Taxon abiesPalma = Taxon.NewInstance(abiesPalmaName, null);
1417

    
1418
        IBotanicalName pinusName = TaxonNameFactory.NewBotanicalInstance(Rank.GENUS());
1419
        pinusName.setGenusOrUninomial("Pinus");
1420
        Taxon pinus = Taxon.NewInstance(pinusName, null);
1421

    
1422
        TaxonNode abiesNode = checklist.addChildTaxon(abies, null, null);
1423
        abiesNode.setUuid(abiesNodeUuid);
1424
        TaxonNode abiesAlbaNode = checklist.addParentChild(abies, abiesAlba, null, null);
1425
        abiesAlbaNode.setUuid(abiesAlbaNodeUuid);
1426
        TaxonNode abiesAlbaSubBrotaNode = checklist.addParentChild(abiesAlba, abiesAlbaSubBrota, null, null);
1427
        abiesAlbaSubBrotaNode.setUuid(abiesAlbaSubBrotaNodeUuid);
1428
        TaxonNode abiesPalmaNode = checklist.addParentChild(abies, abiesPalma, null, null);
1429
        abiesPalmaNode.setUuid(abiesPalmaNodeUuid);
1430
        TaxonNode pinusNode = checklist.addChildTaxon(pinus, null, null);
1431
        pinusNode.setUuid(pinusNodeUuid);
1432

    
1433
        taxonService.saveOrUpdate(campanula);
1434
        taxonService.saveOrUpdate(campanulaPersicifolia);
1435
        classificationService.saveOrUpdate(checklist2);
1436

    
1437
        taxonService.saveOrUpdate(abies);
1438
        taxonService.saveOrUpdate(abiesAlba);
1439
        taxonService.saveOrUpdate(abiesAlbaSubBrota);
1440
        taxonService.saveOrUpdate(abiesPalma);
1441
        taxonService.saveOrUpdate(pinus);
1442
        classificationService.saveOrUpdate(checklist);
1443

    
1444
        setComplete();
1445
        endTransaction();
1446

    
1447
        String fileNameAppendix = "testFindCommonParentNode";
1448

    
1449
        writeDbUnitDataSetFile(new String[] {
1450
            "TAXONBASE", "TAXONNAME",
1451
            "TAXONRELATIONSHIP",
1452
            "HOMOTYPICALGROUP",
1453
            "CLASSIFICATION", "TAXONNODE",
1454
            "LANGUAGESTRING",
1455
            "HIBERNATE_SEQUENCES" // IMPORTANT!!!
1456
            },
1457
            fileNameAppendix, true );
1458
    }
1459
}
(29-29/40)