Project

General

Profile

Download (55.7 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2009 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
package eu.etaxonomy.cdm.api.service;
10

    
11
import static org.junit.Assert.assertEquals;
12
import static org.junit.Assert.assertTrue;
13

    
14
import java.io.FileNotFoundException;
15
import java.lang.reflect.Field;
16
import java.util.Arrays;
17
import java.util.List;
18
import java.util.Set;
19
import java.util.UUID;
20

    
21
import org.apache.log4j.Logger;
22
import org.junit.Assert;
23
import org.junit.Ignore;
24
import org.junit.Test;
25
import org.springframework.security.authentication.AbstractAuthenticationToken;
26
import org.springframework.security.authentication.AuthenticationManager;
27
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
28
import org.springframework.security.core.Authentication;
29
import org.springframework.security.core.context.SecurityContextHolder;
30
import org.springframework.security.core.context.SecurityContextImpl;
31
import org.unitils.dbunit.annotation.DataSet;
32
import org.unitils.spring.annotation.SpringBeanByName;
33
import org.unitils.spring.annotation.SpringBeanByType;
34

    
35
import eu.etaxonomy.cdm.api.service.config.IdentifiableServiceConfiguratorFactory;
36
import eu.etaxonomy.cdm.api.service.config.IdentifiableServiceConfiguratorImpl;
37
import eu.etaxonomy.cdm.api.service.config.NameDeletionConfigurator;
38
import eu.etaxonomy.cdm.api.service.pager.Pager;
39
import eu.etaxonomy.cdm.model.common.CdmBase;
40
import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
41
import eu.etaxonomy.cdm.model.common.Language;
42
import eu.etaxonomy.cdm.model.description.DescriptionElementSource;
43
import eu.etaxonomy.cdm.model.description.Feature;
44
import eu.etaxonomy.cdm.model.description.TaxonDescription;
45
import eu.etaxonomy.cdm.model.description.TaxonNameDescription;
46
import eu.etaxonomy.cdm.model.description.TextData;
47
import eu.etaxonomy.cdm.model.name.HybridRelationship;
48
import eu.etaxonomy.cdm.model.name.HybridRelationshipType;
49
import eu.etaxonomy.cdm.model.name.NameRelationshipType;
50
import eu.etaxonomy.cdm.model.name.NameTypeDesignation;
51
import eu.etaxonomy.cdm.model.name.NameTypeDesignationStatus;
52
import eu.etaxonomy.cdm.model.name.NomenclaturalCode;
53
import eu.etaxonomy.cdm.model.name.NomenclaturalStatus;
54
import eu.etaxonomy.cdm.model.name.NomenclaturalStatusType;
55
import eu.etaxonomy.cdm.model.name.Rank;
56
import eu.etaxonomy.cdm.model.name.Registration;
57
import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation;
58
import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignationStatus;
59
import eu.etaxonomy.cdm.model.name.TaxonName;
60
import eu.etaxonomy.cdm.model.name.TaxonNameFactory;
61
import eu.etaxonomy.cdm.model.name.TypeDesignationBase;
62
import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;
63
import eu.etaxonomy.cdm.model.taxon.Taxon;
64
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
65
import eu.etaxonomy.cdm.persistence.dao.common.Restriction;
66
import eu.etaxonomy.cdm.persistence.dao.common.Restriction.Operator;
67
import eu.etaxonomy.cdm.persistence.query.MatchMode;
68
import eu.etaxonomy.cdm.persistence.query.OrderHint;
69
import eu.etaxonomy.cdm.test.integration.CdmTransactionalIntegrationTest;
70
import eu.etaxonomy.cdm.test.unitils.CleanSweepInsertLoadStrategy;
71

    
72
/**
73
 * @author a.mueller
74
 */
75
public class NameServiceImplTest extends CdmTransactionalIntegrationTest {
76

    
77
    private static final Logger logger = Logger.getLogger(NameServiceImplTest.class);
78

    
79
    private static final UUID NAME1_UUID = UUID.fromString("6dbd41d1-fe13-4d9c-bb58-31f051c2c384");
80
    private static final int NAME1_ID = 10;
81
    private static final UUID NAME2_UUID = UUID.fromString("f9e9c13f-5fa5-48d3-88cf-712c921a099e");
82
    private static final int NAME2_ID = 11;
83
    private static final UUID NAME3_UUID = UUID.fromString("e1e66264-f16a-4df9-80fd-6ab5028a3c28");
84
    private static final int NAME3_ID = 12;
85

    
86
    @SpringBeanByType
87
    private INameService nameService;
88

    
89
    @SpringBeanByType
90
    private IOccurrenceService occurrenceService;
91

    
92
    @SpringBeanByType
93
    private IRegistrationService registrationService;
94

    
95
    @SpringBeanByType
96
    private ITaxonService taxonService;
97

    
98
    @SpringBeanByType
99
    private ITermService termService;
100

    
101
    @SpringBeanByName
102
    private AuthenticationManager authenticationManager;
103

    
104
    private void setAuthentication(AbstractAuthenticationToken token) {
105
       Authentication authentication = authenticationManager.authenticate(token);
106

    
107
       SecurityContextImpl secureContext = new SecurityContextImpl();
108
       SecurityContextHolder.setContext(secureContext);
109
       secureContext.setAuthentication(authentication);
110
    }
111

    
112
    private void unsetAuthentication() {
113

    
114
        SecurityContextImpl secureContext = new SecurityContextImpl();
115
        SecurityContextHolder.setContext(secureContext);
116
        secureContext.setAuthentication(null);
117
     }
118

    
119

    
120
/* ******************** TESTS ********************************************/
121

    
122
    /**
123
     * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#setDao(eu.etaxonomy.cdm.persistence.dao.name.ITaxonNameDao)}.
124
     */
125
    @Test
126
    public void testSetDao() {
127
//		Assert.assertNotNull(((NameServiceImpl)nameService).dao);
128
    }
129

    
130
    /**
131
     * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#setVocabularyDao(eu.etaxonomy.cdm.persistence.dao.common.ITermVocabularyDao)}.
132
     */
133
    @Test
134
    public void testSetVocabularyDao() {
135
//        Assert.assertNotNull(( (NameServiceImpl)nameService.vocabularyDao);
136
    }
137

    
138
    /**
139
     * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#getNamesByName(java.lang.String)}.
140
     */
141
    @Test
142
    public void testGetNamesByName() {
143
        logger.warn("Not yet implemented");
144
    }
145

    
146

    
147
    @Test
148
    @DataSet(loadStrategy=CleanSweepInsertLoadStrategy.class)
149
    public void testDeleteTaxonNameWithNameRelations() {
150

    
151
        final String[] tableNames = new String[]{"USERACCOUNT", "TaxonName","NameRelationship","HybridRelationship","DescriptionBase","NomenclaturalStatus","TaxonBase","SpecimenOrObservationBase","OriginalSourceBase","DescriptionElementBase"};
152
//        printDataSet(System.err, true, null);
153

    
154
        TaxonName name1 = TaxonNameFactory.NewBotanicalInstance(getSpeciesRank());
155
        name1.setTitleCache("Name1", true);
156
        TaxonName nameWithBasionym = TaxonNameFactory.NewBotanicalInstance(getSpeciesRank());
157
        nameWithBasionym.setTitleCache("nameWithBasionym", true);
158

    
159
        NameRelationshipType nameRelType = (NameRelationshipType)termService.find(NameRelationshipType.BASIONYM().getUuid());
160
        name1.addRelationshipToName(nameWithBasionym,nameRelType , null, null, null, null);
161
//		nameWithBasionym.addBasionym(name1);
162
        nameService.save(name1);
163
        nameService.save(nameWithBasionym);
164
        commitAndStartNewTransaction(tableNames);
165

    
166

    
167
        name1 = nameService.find(name1.getUuid());
168
        DeleteResult result = nameService.delete(name1);
169
        if (!result.isOk()){
170
        	Exception e = result.getExceptions().iterator().next();
171
        	Assert.assertEquals("The Ecxeption should be a ReferencedObjectException because it is a basionym", "Name can't be deleted as it is a basionym.", e.getMessage());
172
        } else{
173
        	Assert.fail();
174
        }
175
        name1 = nameService.find(name1.getUuid());
176
        Assert.assertNotNull("Name should still be in database",name1);
177
        nameWithBasionym = name1.getNameRelations().iterator().next().getToName();
178
        nameWithBasionym.removeBasionyms();
179

    
180
        result = nameService.delete(name1); //should throw now exception
181

    
182

    
183

    
184
        commitAndStartNewTransaction(tableNames);
185
        name1 = nameService.find(name1.getUuid());
186
        Assert.assertNull("Name should not be in database anymore",name1);
187

    
188
    }
189

    
190
    @Test
191
    @DataSet(loadStrategy=CleanSweepInsertLoadStrategy.class)
192
    public void testDeleteTaxonNameConfiguratorWithNameRelations() {
193
        final String[] tableNames = new String[]{"TaxonName","NameRelationship","HybridRelationship"};
194

    
195
//        printDataSet(System.err, new String[]{"TaxonName","NameRelationship","HybridRelationship","DescriptionBase","NomenclaturalStatus","TaxonBase","SpecimenOrObservationBase","OriginalSourceBase",
196
//                "DescriptionElementBase",
197
//                "AGENTBASE", "USERACCOUNT", "PERMISSIONGROUP", "USERACCOUNT_PERMISSIONGROUP", "USERACCOUNT_GRANTEDAUTHORITYIMPL", "GRANTEDAUTHORITYIMPL"});
198

    
199
        TaxonName name1 = TaxonNameFactory.NewBotanicalInstance(getSpeciesRank());
200
        name1.setTitleCache("Name1", true);
201
        TaxonName nameWithBasionym = TaxonNameFactory.NewBotanicalInstance(getSpeciesRank());
202
        nameWithBasionym.setTitleCache("nameWithBasionym", true);
203

    
204
        NameRelationshipType nameRelType = (NameRelationshipType)termService.find(NameRelationshipType.BASIONYM().getUuid());
205
        name1.addRelationshipToName(nameWithBasionym,nameRelType , null, null, null, null);
206
        nameService.save(name1);
207
        nameService.save(nameWithBasionym);
208
        commitAndStartNewTransaction(tableNames);
209
        NameDeletionConfigurator config = new NameDeletionConfigurator();
210

    
211
        name1 = nameService.find(name1.getUuid());
212
        DeleteResult result = nameService.delete(name1.getUuid(), config);
213
        if (result.isOk()){
214
        	Assert.fail("This should throw an error as long as name relationships exist.");
215
        }
216

    
217

    
218
        name1 = nameService.find(name1.getUuid());
219
        Assert.assertNotNull("Name should still be in database",name1);
220

    
221
        //ignore is basionym for
222
        config.setIgnoreIsBasionymFor(true);
223

    
224
        name1 = nameService.find(name1.getUuid());
225
        nameService.delete(name1.getUuid(),  config);
226
        commitAndStartNewTransaction(tableNames);
227
        name1 = nameService.find(name1.getUuid());
228
        Assert.assertNull("Name should not be in database anymore",name1);
229

    
230
    }
231

    
232
    @Test
233
    public void testDeleteTaxonNameConfiguratorWithNameRelationsAll() {
234
        final String[] tableNames = new String[]{"TaxonName","NameRelationship","HybridRelationship"};
235

    
236
        TaxonName name1 = TaxonNameFactory.NewBotanicalInstance(getSpeciesRank());
237
        name1.setTitleCache("Name1", true);
238
        TaxonName nameWithBasionym = TaxonNameFactory.NewBotanicalInstance(getSpeciesRank());
239
        nameWithBasionym.setTitleCache("nameWithBasionym", true);
240

    
241
        NameRelationshipType nameRelType = (NameRelationshipType)termService.find(NameRelationshipType.BASIONYM().getUuid());
242
        name1.addRelationshipToName(nameWithBasionym,nameRelType , null, null, null, null);
243
        nameService.save(name1);
244
        nameService.save(nameWithBasionym);
245
        commitAndStartNewTransaction(tableNames);
246
        NameDeletionConfigurator config = new NameDeletionConfigurator();
247

    
248
        name1 = nameService.find(name1.getUuid());
249
        DeleteResult result = nameService.delete(name1.getUuid(), config);
250
        if (result.isOk()){
251
    	   Assert.fail("Delete should throw an error as long as name relationships exist.");
252
        }
253

    
254
        name1 = nameService.find(name1.getUuid());
255
        Assert.assertNotNull("Name should still be in database",name1);
256

    
257
        //ignore all name relationships
258
        config.setRemoveAllNameRelationships(true);
259

    
260
        name1 = nameService.find(name1.getUuid());
261
        result = nameService.delete(name1.getUuid(), config);
262
        logger.debug(result);
263
        commitAndStartNewTransaction(tableNames);
264
        name1 = nameService.find(name1.getUuid());
265
        Assert.assertNull("Name should not be in database anymore",name1);
266
    }
267

    
268
    @Test
269
    public void testDeleteTaxonNameConfiguratorWithHasBasionym() {
270
        final String[] tableNames = new String[]{"TaxonName","NameRelationship","HybridRelationship"};
271

    
272
        TaxonName name1 = TaxonNameFactory.NewBotanicalInstance(getSpeciesRank());
273
        name1.setTitleCache("Name1", true);
274
        TaxonName basionym = TaxonNameFactory.NewBotanicalInstance(getSpeciesRank());
275
        basionym.setTitleCache("basionym", true);
276

    
277
        NameRelationshipType nameRelType = (NameRelationshipType)termService.find(NameRelationshipType.BASIONYM().getUuid());
278
        basionym.addRelationshipToName(name1,nameRelType , null, null, null, null);
279
        nameService.save(name1);
280
        nameService.save(basionym);
281
        commitAndStartNewTransaction(tableNames);
282
        NameDeletionConfigurator config = new NameDeletionConfigurator();
283
        config.setIgnoreHasBasionym(false);
284

    
285
        name1 = nameService.find(name1.getUuid());
286
        DeleteResult result = nameService.delete(name1.getUuid(), config);
287
        if (result.isOk()){
288
    	    Assert.fail("Delete should throw an error as long as name relationships exist.");
289
        }
290

    
291
        name1 = nameService.find(name1.getUuid());
292
        Assert.assertNotNull("Name should still be in database",name1);
293

    
294
        //ignore has basionym
295
        config.setIgnoreHasBasionym(true);
296
        try {
297
            name1 = nameService.find(name1.getUuid());
298
            result = nameService.delete(name1.getUuid(), config);
299
            logger.debug(result);
300
            commitAndStartNewTransaction(tableNames);
301
            name1 = nameService.find(name1.getUuid());
302
            Assert.assertNull("Name should not be in database anymore",name1);
303
        } catch (Exception e) {
304
            Assert.fail("Delete should not throw an error for .");
305
        }
306
    }
307

    
308
    @Test
309
    public void testDeleteTaxonNameWithHybridRelations() {
310
        final String[] tableNames = new String[]{"TaxonName","NameRelationship","HybridRelationship"};
311

    
312
        TaxonName name1 = TaxonNameFactory.NewBotanicalInstance(getSpeciesRank());
313
        name1.setTitleCache("Name1", true);
314
        TaxonName parent = TaxonNameFactory.NewBotanicalInstance(getSpeciesRank());
315
        parent.setTitleCache("parent", true);
316
        TaxonName child = TaxonNameFactory.NewBotanicalInstance(getSpeciesRank());
317
        child.setTitleCache("child", true);
318

    
319
        TaxonName hybrid = TaxonNameFactory.PARSED_BOTANICAL("Abies alba x Pinus beta");
320

    
321
        Set<HybridRelationship> childRelations = hybrid.getHybridChildRelations();
322
       for (HybridRelationship rel : childRelations){
323
           nameService.save(rel.getHybridName());
324
           nameService.save(rel.getParentName());
325
       }
326

    
327
        commitAndStartNewTransaction(tableNames); //otherwise first save is rolled back with following failing delete
328
        HybridRelationshipType relType = (HybridRelationshipType)termService.find(HybridRelationshipType.FIRST_PARENT().getUuid());
329
        name1.addHybridParent(parent, relType, null);
330
        nameService.save(name1);
331
        nameService.save(parent);
332
        commitAndStartNewTransaction(tableNames); //otherwise first save is rolled back with following failing delete
333
        Assert.assertEquals("'Parent' should be a parent in a hybrid relation.", 1,parent.getHybridParentRelations().size());
334

    
335
        //parent
336

    
337
        name1 = nameService.find(name1.getUuid());
338
        DeleteResult result = nameService.delete(name1);
339
        if (result.isError()){
340
            Assert.fail("Delete should throw NO exception when deleting a hybrid child: " + result.getExceptions().iterator().next().getMessage());
341
        }
342
        commitAndStartNewTransaction(tableNames);
343
        name1 = nameService.find(name1.getUuid());
344
        Assert.assertNull("Name should not be in database anymore",name1);
345
        parent = nameService.find(parent.getUuid());
346
        Assert.assertEquals("'Parent' should not be a parent anymore.", 0,parent.getHybridParentRelations().size());
347

    
348
        //child
349
        name1 = TaxonNameFactory.NewBotanicalInstance(getSpeciesRank());
350
        name1.addHybridChild(child, relType, null);
351
        nameService.save(name1);
352
        nameService.save(child);
353
        commitAndStartNewTransaction(tableNames);
354

    
355

    
356
        result = nameService.delete(name1);
357
        if (result.isOk()){
358
            Assert.fail("Delete should throw an error as long as hybrid child exist.");
359
        }
360
        name1 = nameService.find(name1.getUuid());
361
        Assert.assertNotNull("Name should still be in database",name1);
362
        name1.removeHybridChild(child);
363

    
364
        result = nameService.delete(name1); //should throw now exception
365
        if (result.isError()){
366
        	Assert.fail("Delete should throw NO exception when deleting a hybrid child: " +result.getExceptions().iterator().next().getMessage());
367
        }
368

    
369
        commitAndStartNewTransaction(tableNames);
370
        name1 = nameService.find(name1.getUuid());
371
        Assert.assertNull("Name should not be in database anymore",name1);
372
    }
373

    
374
    @Test
375
    @DataSet(loadStrategy=CleanSweepInsertLoadStrategy.class)
376
    public void testDeleteTaxonNameInConcept() {
377
        final String[] tableNames = new String[]{"TaxonName","TaxonBase"};
378

    
379
        TaxonName name1 = TaxonNameFactory.NewBotanicalInstance(getSpeciesRank());
380
        name1.setTitleCache("Name1", true);
381
        TaxonName basionym = TaxonNameFactory.NewBotanicalInstance(getSpeciesRank());
382
        basionym.setTitleCache("basionym", true);
383

    
384
        Taxon taxon = Taxon.NewInstance(name1, null);
385
        nameService.save(name1);
386
        taxonService.save(taxon);
387
        commitAndStartNewTransaction(tableNames);
388

    
389
        DeleteResult result = nameService.delete(name1);
390

    
391
        if (result.isOk()){
392
        	Assert.fail("Delete should throw an error as long as name is used in a concept.");
393
        }
394
        TaxonName nameBase =nameService.find(name1.getUuid());
395
        Assert.assertNotNull("Name should still be in database",nameBase);
396
        TaxonBase<?> taxonBase = taxonService.find(taxon.getUuid());
397
        Assert.assertNotNull("Taxon should still be in database",taxonBase);
398
        taxon = (Taxon)taxonBase;
399
        taxon.setName(basionym);
400
        taxonService.save(taxon);
401
        nameBase =nameService.find(name1.getUuid());
402

    
403

    
404
        result = nameService.delete(nameBase); //should throw no exception
405
        if (result.isError()){
406
        	Assert.fail("Delete should throw NO error ");
407
        }
408
        commitAndStartNewTransaction(tableNames);
409
        name1 = nameService.find(name1.getUuid());
410
        Assert.assertNull("Name should still be in database",name1);
411
        taxon = (Taxon)taxonService.find(taxon.getUuid());
412
        Assert.assertNotNull("Taxon should still be in database",taxon);
413
    }
414

    
415
    @Test
416
    @DataSet(loadStrategy=CleanSweepInsertLoadStrategy.class)
417
    public void testDeleteTaxonNameAsStoredUnder() {
418
        final String[] tableNames = new String[]{"TaxonName","SpecimenOrObservationBase"};
419

    
420
        TaxonName name1 = TaxonNameFactory.NewBotanicalInstance(getSpeciesRank());
421
        name1.setTitleCache("Name1", true);
422
        DerivedUnit specimen = DerivedUnit.NewPreservedSpecimenInstance();
423
        specimen.setStoredUnder(name1);
424

    
425
        occurrenceService.save(specimen);
426
        UUID uuidName1 = nameService.save(name1).getUuid();
427

    
428
        commitAndStartNewTransaction(tableNames);
429
        DeleteResult result = nameService.delete(name1);
430
        if (result.isOk()){
431
    	   Assert.fail("This should throw an error because name is used for specimen#storedUnder.");
432
        }
433
        commitAndStartNewTransaction(tableNames);
434

    
435
        name1 = nameService.find(uuidName1);
436
        Assert.assertNotNull("Name should still be in database",name1);
437
        specimen = (DerivedUnit)occurrenceService.find(specimen.getUuid());
438
        Assert.assertNotNull("Specimen should still be in database",name1);
439
        specimen.setStoredUnder(null);
440
        occurrenceService.saveOrUpdate(specimen);
441

    
442
        nameService.delete(name1); //should throw no exception
443
        commitAndStartNewTransaction(tableNames);
444

    
445
        name1 = nameService.find(uuidName1);
446
        Assert.assertNull("Name should not be in database anymore",name1);
447
        specimen = (DerivedUnit)occurrenceService.find(specimen.getUuid());
448
        Assert.assertNotNull("Specimen should still be in database",specimen);
449

    
450
        occurrenceService.delete(specimen); //this is to better run this test in the test suit
451

    
452
    }
453

    
454
    @Test
455
    @Ignore //currently does not run in suite
456
    public void testDeleteTaxonNameInSource() {
457
        final String[] tableNames = new String[]{"TaxonName","DescriptionBase","TaxonBase","OriginalSourceBase","DescriptionElementBase"};
458

    
459
        TaxonName name1 = TaxonNameFactory.NewBotanicalInstance(getSpeciesRank());
460
        name1.setTitleCache("Name1", true);
461
        TaxonName taxonName = TaxonNameFactory.NewBotanicalInstance(getSpeciesRank());
462
        taxonName.setTitleCache("taxonName", true);
463
        Taxon taxon = Taxon.NewInstance(taxonName, null);
464

    
465
        TaxonDescription taxonDescription = TaxonDescription.NewInstance(taxon);
466
        Feature feature = (Feature)termService.find(Feature.DESCRIPTION().getUuid());
467
        Language lang = (Language)termService.find(Language.DEFAULT().getUuid());
468
        TextData textData = TextData.NewInstance("Any text", lang, null);
469
        textData.setFeature(feature);
470
        taxonDescription.addElement(textData);
471
        DescriptionElementSource source = DescriptionElementSource.NewPrimarySourceInstance(null, null, name1, "");
472
        textData.addSource(source);
473
        taxonService.saveOrUpdate(taxon);
474
        nameService.save(name1);
475
        try {
476
            commitAndStartNewTransaction(tableNames);
477
            name1 = nameService.find(name1.getUuid());
478
            nameService.delete(name1);
479
            Assert.fail("Delete should throw an error as long as name is used in a source.");
480
        } catch (Exception e) {
481
            if (e.getMessage().contains("Name can't be deleted as it is used as descriptionElementSource#nameUsedInSource")){
482
                //ok
483
                endTransaction();  //exception rolls back transaction!
484
                startNewTransaction();
485
            }else{
486
                Assert.fail("Unexpected error occurred when trying to delete taxon name: " + e.getMessage());
487
            }
488
        }
489
        name1 = nameService.find(name1.getUuid());
490
        Assert.assertNotNull("Name should still be in database",name1);
491
        taxon = (Taxon)taxonService.find(taxon.getUuid());
492
        Assert.assertNotNull("Taxon should still be in database",name1);
493
        source = taxon.getDescriptions().iterator().next().getElements().iterator().next().getSources().iterator().next();
494
        source.setNameUsedInSource(null);
495
        taxonService.saveOrUpdate(taxon);
496

    
497
        nameService.delete(name1);  //should throw now exception
498

    
499
        commitAndStartNewTransaction(tableNames);
500
        name1 = nameService.find(name1.getUuid());
501
        Assert.assertNull("Name should not be in database anymore",name1);
502
        taxon = (Taxon)taxonService.find(taxon.getUuid());
503
        Assert.assertNotNull("Taxon should still be in database",taxon);
504
        source = taxon.getDescriptions().iterator().next().getElements().iterator().next().getSources().iterator().next();
505
        Assert.assertNull("Source should not have a nameUsedInSource anymore",source.getNameUsedInSource());
506
    }
507

    
508

    
509
    @Test
510
    public void testDeleteTaxonNameAsType() {
511
        final String[] tableNames = new String[]{"TaxonName","TypeDesignationBase","TaxonName_TypeDesignationBase"};
512

    
513
        TaxonName name1 = TaxonNameFactory.NewBotanicalInstance(getSpeciesRank());
514
        name1.setTitleCache("Name used as type", true);
515

    
516
        TaxonName higherName = TaxonNameFactory.NewBotanicalInstance(getGenusRank());
517
        higherName.setTitleCache("genus name", true);
518
        NameTypeDesignationStatus typeStatus = (NameTypeDesignationStatus)termService.find(NameTypeDesignationStatus.AUTOMATIC().getUuid());
519
        boolean addToAllHomotypicNames = true;
520
        higherName.addNameTypeDesignation(name1, null, null, null, typeStatus, addToAllHomotypicNames);
521
        nameService.save(higherName);
522

    
523
       commitAndStartNewTransaction(tableNames);
524
       name1 = nameService.find(name1.getUuid());
525
       DeleteResult result = nameService.delete(name1);
526
       if (result.isOk()){
527
    	   Assert.fail("This should throw an error because name is used in a type designation.");
528
        }
529

    
530
        commitAndStartNewTransaction(tableNames);
531
        name1 = nameService.find(name1.getUuid());
532
        Assert.assertNotNull("Name should still be in database",name1);
533
        higherName = nameService.find(higherName.getUuid());
534
        higherName.getNameTypeDesignations().iterator().next().removeType();  //keeps the designation but removes the name from it
535
//		nameService.deleteTypeDesignation(higherName,commitAndStartNewTransaction(tableNames) );  //deletes the complete designation  //both options can be used
536

    
537
    	nameService.delete(name1);  //should throw now exception
538

    
539
    	commitAndStartNewTransaction(tableNames);
540
        name1 = nameService.find(name1.getUuid());
541
        Assert.assertNull("Name should not be in database anymore",name1);
542
        higherName = nameService.find(higherName.getUuid());
543
        Assert.assertNotNull("Higher name should still exist in database",higherName);
544
        Assert.assertEquals("Higher name should not have type designations anymore",1, higherName.getTypeDesignations().size());
545
    }
546

    
547

    
548
    @Test
549
    public void testDeleteTaxonName() {
550
        final String[] tableNames = new String[]{"TaxonName","NameRelationship","HybridRelationship","DescriptionBase","NomenclaturalStatus","TaxonBase","SpecimenOrObservationBase","OriginalSourceBase","DescriptionElementBase","TypeDesignationBase","TaxonName_TypeDesignationBase"};
551

    
552
        TaxonName name1 = TaxonNameFactory.NewBotanicalInstance(getSpeciesRank());
553
        name1.setTitleCache("Name1", true);
554

    
555
        //TaxonNameDescription
556
        name1 = TaxonNameFactory.NewBotanicalInstance(getSpeciesRank());
557
        TaxonNameDescription.NewInstance(name1);
558
        nameService.saveOrUpdate(name1);
559
        commitAndStartNewTransaction(tableNames);
560

    
561
        name1 = nameService.find(name1.getUuid());
562
        DeleteResult result = nameService.delete(name1);//should throw now exception
563

    
564
        setComplete();
565
        endTransaction();
566
        name1 = nameService.find(name1.getUuid());
567
        Assert.assertNull("Name should not be in database anymore",name1);
568

    
569
//		printDataSet(System.out, tableNames);
570

    
571

    
572
        //NomenclaturalStatus
573
        name1 = TaxonNameFactory.NewBotanicalInstance(getSpeciesRank());
574
        NomenclaturalStatusType nomStatusType = (NomenclaturalStatusType)termService.find(NomenclaturalStatusType.ILLEGITIMATE().getUuid());
575
        NomenclaturalStatus status = NomenclaturalStatus.NewInstance(nomStatusType);
576
        name1.addStatus(status);
577
        nameService.saveOrUpdate(name1);
578
        commitAndStartNewTransaction(tableNames);
579

    
580
        name1 = nameService.find(name1.getUuid());
581

    
582
        nameService.delete(name1);  //should throw now exception
583
        if (!result.isOk()){
584
        	Assert.fail();
585
        }
586
        setComplete();
587
        endTransaction();
588
//		printDataSet(System.out, tableNames);
589

    
590

    
591
        //Type Designations
592
        name1 = TaxonNameFactory.NewBotanicalInstance(getSpeciesRank());
593
        name1.setTitleCache("Name with type designation", true);
594
        SpecimenTypeDesignation typeDesignation = SpecimenTypeDesignation.NewInstance();
595
        SpecimenTypeDesignationStatus typeStatus = (SpecimenTypeDesignationStatus)termService.find(SpecimenTypeDesignationStatus.HOLOTYPE().getUuid());
596
        typeDesignation.setTypeStatus(typeStatus);
597
        DerivedUnit specimen = DerivedUnit.NewPreservedSpecimenInstance();
598
        specimen.setTitleCache("Type specimen", true);
599
        occurrenceService.save(specimen);
600
        typeDesignation.setTypeSpecimen(specimen);
601

    
602
        name1.addTypeDesignation(typeDesignation, true);
603
        nameService.save(name1);
604
        commitAndStartNewTransaction(tableNames);
605
//		printDataSet(System.out, tableNames);
606

    
607
        name1 = nameService.find(name1.getUuid());
608

    
609
        result = nameService.delete(name1);  //should throw now exception
610
        if (!result.isOk()){
611
        	Assert.fail();
612
        }
613
        setComplete();
614
        endTransaction();
615
//		printDataSet(System.out, tableNames);
616

    
617
    }
618

    
619
    @Test
620
    public void testDeleteTaxonNameWithTypeInHomotypicalGroup() {
621
        final String[] tableNames = new String[]{"TaxonName","NameRelationship","HybridRelationship","DescriptionBase","NomenclaturalStatus","TaxonBase","SpecimenOrObservationBase","OriginalSourceBase","DescriptionElementBase","TypeDesignationBase","TaxonName_TypeDesignationBase"};
622

    
623
        //Type Designations for homotypical group with > 1 names
624
        TaxonName name1 = TaxonNameFactory.NewBotanicalInstance(getSpeciesRank());
625
        name1.setTitleCache("Name1 with type designation", true);
626
        TaxonName name2 = TaxonNameFactory.NewBotanicalInstance(getSpeciesRank());
627
        name2.setTitleCache("Name2 with type designation", true);
628
        name2.setHomotypicalGroup(name1.getHomotypicalGroup());
629

    
630
        DerivedUnit specimen = DerivedUnit.NewPreservedSpecimenInstance();
631
        specimen.setTitleCache("Type specimen 2", true);
632
        occurrenceService.save(specimen);
633
        SpecimenTypeDesignationStatus typeStatus = (SpecimenTypeDesignationStatus)termService.find(SpecimenTypeDesignationStatus.HOLOTYPE().getUuid());
634

    
635
        SpecimenTypeDesignation typeDesignation = SpecimenTypeDesignation.NewInstance();
636
        typeDesignation.setTypeStatus(typeStatus);
637
        typeDesignation.setTypeSpecimen(specimen);
638

    
639
        boolean addToAllNames = true;
640
        name1.addTypeDesignation(typeDesignation, addToAllNames);
641
        nameService.saveOrUpdate(name1);
642
        commitAndStartNewTransaction(tableNames);
643

    
644
        name1 = nameService.find(name1.getUuid());
645

    
646
        nameService.delete(name1);  //should throw now exception
647

    
648
        setComplete();
649
        endTransaction();
650
    }
651

    
652
    @Test
653
    @DataSet(loadStrategy=CleanSweepInsertLoadStrategy.class)
654
    public void testDeleteTypeDesignation() {
655

    
656
//        final String[] tableNames = new String[]{
657
//                "TaxonName","TypeDesignationBase","TaxonName_TypeDesignationBase",
658
//                "SpecimenOrObservationBase"};
659

    
660
        TaxonName name1 =  this.nameService.load(UUID.fromString("6dbd41d1-fe13-4d9c-bb58-31f051c2c384"));
661
        TaxonName name2 = this.nameService.load(UUID.fromString("f9e9c13f-5fa5-48d3-88cf-712c921a099e"));
662
        TaxonName name3 = this.nameService.load(UUID.fromString("e1e66264-f16a-4df9-80fd-6ab5028a3c28"));
663
        DerivedUnit specimen1 = CdmBase.deproxy(this.occurrenceService.load(UUID.fromString("0d19a9ca-21a7-4adb-8640-8d6719e15eea")), DerivedUnit.class);
664
        DerivedUnit fossil = CdmBase.deproxy(this.occurrenceService.load(UUID.fromString("4c48b7c8-4c8d-4e48-b083-0837fe51a0a9")), DerivedUnit.class);
665

    
666
        @SuppressWarnings("rawtypes")
667
        Set<TypeDesignationBase> desigs1 = name1.getTypeDesignations();
668
        @SuppressWarnings("rawtypes")
669
        Set<TypeDesignationBase> desigs2 = name2.getTypeDesignations();
670
        @SuppressWarnings("rawtypes")
671
        Set<TypeDesignationBase> desigs3 = name3.getTypeDesignations();
672

    
673
        Assert.assertEquals("name1 should have 2 type designations", 2, desigs1.size());
674
        Assert.assertEquals("name2 should have 1 type designations", 1, desigs2.size());
675
        Assert.assertEquals("name3 should have 1 type designations", 1, desigs3.size());
676
        Assert.assertEquals("Specimen1 should be used in 1 type designation", 1, specimen1.getSpecimenTypeDesignations().size());
677
        Assert.assertEquals("Fossil should be used in 1 type designation", 1, fossil.getSpecimenTypeDesignations().size());
678

    
679
        nameService.deleteTypeDesignation((TaxonName)null, null);
680

    
681
        commitAndStartNewTransaction(/*tableNames*/);
682

    
683
        name1 =  this.nameService.load(UUID.fromString("6dbd41d1-fe13-4d9c-bb58-31f051c2c384"));
684
        name2 = this.nameService.load(UUID.fromString("f9e9c13f-5fa5-48d3-88cf-712c921a099e"));
685
        name3 = this.nameService.load(UUID.fromString("e1e66264-f16a-4df9-80fd-6ab5028a3c28"));
686
        specimen1 = CdmBase.deproxy(this.occurrenceService.load(UUID.fromString("0d19a9ca-21a7-4adb-8640-8d6719e15eea")), DerivedUnit.class);
687
        fossil = CdmBase.deproxy(this.occurrenceService.load(UUID.fromString("4c48b7c8-4c8d-4e48-b083-0837fe51a0a9")), DerivedUnit.class);
688

    
689
        desigs1 = name1.getTypeDesignations();
690
        desigs2 = name2.getTypeDesignations();
691
        desigs3 = name3.getTypeDesignations();
692
        //nothing should be deleted
693
        Assert.assertEquals("name1 should have 2 type designations", 2, desigs1.size());
694
        Assert.assertEquals("name2 should have 1 type designations", 1, desigs2.size());
695
        Assert.assertEquals("name3 should have 1 type designations", 1, desigs3.size());
696
        Assert.assertEquals("Specimen1 should be used in 1 type designation", 1, specimen1.getSpecimenTypeDesignations().size());
697
        Assert.assertEquals("Fossil should be used in 1 type designation", 1, fossil.getSpecimenTypeDesignations().size());
698

    
699
        nameService.deleteTypeDesignation(name1, null);
700

    
701
        commitAndStartNewTransaction(/*tableNames*/);
702

    
703
        name1 =  this.nameService.load(UUID.fromString("6dbd41d1-fe13-4d9c-bb58-31f051c2c384"));
704
        name2 = this.nameService.load(UUID.fromString("f9e9c13f-5fa5-48d3-88cf-712c921a099e"));
705
        name3 = this.nameService.load(UUID.fromString("e1e66264-f16a-4df9-80fd-6ab5028a3c28"));
706
        specimen1 = CdmBase.deproxy(this.occurrenceService.load(UUID.fromString("0d19a9ca-21a7-4adb-8640-8d6719e15eea")), DerivedUnit.class);
707
        fossil = CdmBase.deproxy(this.occurrenceService.load(UUID.fromString("4c48b7c8-4c8d-4e48-b083-0837fe51a0a9")), DerivedUnit.class);
708

    
709
        desigs1 = name1.getTypeDesignations();
710
        desigs2 = name2.getTypeDesignations();
711
        desigs3 = name3.getTypeDesignations();
712
        //only the types of name1 should be deleted
713
        Assert.assertEquals("name1 should have 0 type designations", 0, desigs1.size());
714
        Assert.assertEquals("name2 should have 1 type designations", 1, desigs2.size());
715
        Assert.assertEquals("name3 should have 1 type designations", 1, desigs3.size());
716
        Assert.assertEquals("Specimen1 should be used in 1 type designation", 1, specimen1.getSpecimenTypeDesignations().size());
717
        Assert.assertEquals("Fossil should be used in 0 type designation", 0, fossil.getSpecimenTypeDesignations().size());
718

    
719
        SpecimenTypeDesignation desig2 = (SpecimenTypeDesignation)name2.getTypeDesignations().iterator().next();
720
        nameService.deleteTypeDesignation(name2, desig2);
721

    
722
        commitAndStartNewTransaction(/*tableNames*/);
723

    
724
        name1 =  this.nameService.load(UUID.fromString("6dbd41d1-fe13-4d9c-bb58-31f051c2c384"));
725
        name2 = this.nameService.load(UUID.fromString("f9e9c13f-5fa5-48d3-88cf-712c921a099e"));
726
        name3 = this.nameService.load(UUID.fromString("e1e66264-f16a-4df9-80fd-6ab5028a3c28"));
727
        specimen1 = CdmBase.deproxy(this.occurrenceService.load(UUID.fromString("0d19a9ca-21a7-4adb-8640-8d6719e15eea")), DerivedUnit.class);
728
        fossil = CdmBase.deproxy(this.occurrenceService.load(UUID.fromString("4c48b7c8-4c8d-4e48-b083-0837fe51a0a9")), DerivedUnit.class);
729

    
730
        desigs1 = name1.getTypeDesignations();
731
        desigs2 = name2.getTypeDesignations();
732
        desigs3 = name3.getTypeDesignations();
733

    
734
        Assert.assertEquals("name1 should have 0 type designations", 0, desigs1.size());
735
        Assert.assertEquals("name2 should have 0 type designations", 0, desigs2.size());
736
        Assert.assertEquals("name3 should have 1 type designations", 1, desigs3.size());
737
        Assert.assertEquals("Specimen1 should be used in 0 type designation", 0, specimen1.getSpecimenTypeDesignations().size());
738
        Assert.assertEquals("Fossil should be used in 0 type designation", 0, fossil.getSpecimenTypeDesignations().size());
739

    
740
        NameTypeDesignation desig3 = (NameTypeDesignation)name3.getTypeDesignations().iterator().next();
741
        name3.addTypeDesignation(SpecimenTypeDesignation.NewInstance(), false);
742
        this.nameService.update(name3);
743

    
744
        this.nameService.load(UUID.fromString("e1e66264-f16a-4df9-80fd-6ab5028a3c28"));
745
        desigs3 = name3.getTypeDesignations();
746

    
747
        commitAndStartNewTransaction(/*tableNames*/);
748
        name3 = nameService.load(name3.getUuid());
749

    
750
        Assert.assertEquals("name3 should have 2 type designations", 2, desigs3.size());
751

    
752
        nameService.deleteTypeDesignation(name3, desig3);
753
        commitAndStartNewTransaction(/*tableNames*/);
754

    
755
        name1 =  this.nameService.load(UUID.fromString("6dbd41d1-fe13-4d9c-bb58-31f051c2c384"));
756
        name2 = this.nameService.load(UUID.fromString("f9e9c13f-5fa5-48d3-88cf-712c921a099e"));
757
        name3 = this.nameService.load(UUID.fromString("e1e66264-f16a-4df9-80fd-6ab5028a3c28"));
758
        specimen1 = CdmBase.deproxy(this.occurrenceService.load(UUID.fromString("0d19a9ca-21a7-4adb-8640-8d6719e15eea")), DerivedUnit.class);
759
        fossil = CdmBase.deproxy(this.occurrenceService.load(UUID.fromString("4c48b7c8-4c8d-4e48-b083-0837fe51a0a9")), DerivedUnit.class);
760

    
761
        desigs1 = name1.getTypeDesignations();
762
        desigs2 = name2.getTypeDesignations();
763
        desigs3 = name3.getTypeDesignations();
764

    
765
        Assert.assertEquals("name1 should have 0 type designations", 0, desigs1.size());
766
        Assert.assertEquals("name2 should have 0 type designations", 0, desigs2.size());
767
        Assert.assertEquals("name3 should have 0 type designations", 1, desigs3.size());
768
        Assert.assertEquals("Specimen1 should be used in 0 type designation", 0, specimen1.getSpecimenTypeDesignations().size());
769
        Assert.assertEquals("Fossil should be used in 0 type designation", 0, fossil.getSpecimenTypeDesignations().size());
770
    }
771

    
772
    @Test
773
    @DataSet(loadStrategy=CleanSweepInsertLoadStrategy.class)
774
    public void testDeleteTypeDesignationWithRegistration() {
775
//        final String[] tableNames = new String[]{
776
//                "TaxonName","TypeDesignationBase","TaxonName_TypeDesignationBase",
777
//                "SpecimenOrObservationBase"};
778

    
779
        TaxonName name3 = this.nameService.load(UUID.fromString("e1e66264-f16a-4df9-80fd-6ab5028a3c28"));
780

    
781
        @SuppressWarnings("rawtypes")
782
        Set<TypeDesignationBase> desigs3 = name3.getTypeDesignations();
783

    
784
        NameTypeDesignation desig3 = (NameTypeDesignation)name3.getTypeDesignations().iterator().next();
785
        name3.addTypeDesignation(SpecimenTypeDesignation.NewInstance(), false);
786
        this.nameService.update(name3);
787

    
788
        name3 = this.nameService.load(UUID.fromString("e1e66264-f16a-4df9-80fd-6ab5028a3c28"));
789
        desigs3 = name3.getTypeDesignations();
790

    
791
        NameTypeDesignation desigNew = NameTypeDesignation.NewInstance();
792

    
793
        UsernamePasswordAuthenticationToken submiterToken = new UsernamePasswordAuthenticationToken("admin","sPePhAz6");
794
        setAuthentication(submiterToken);
795
        Registration registration = Registration.NewInstance("abc", "abc", name3, null);
796
        registration.addTypeDesignation(desigNew);
797
        registrationService.saveOrUpdate(registration);
798
        unsetAuthentication();
799

    
800
        commitAndStartNewTransaction(/*tableNames*/);
801

    
802
        name3 = nameService.load(name3.getUuid());
803

    
804
        Set<Registration> regs = name3.getRegistrations();
805
        desigs3 = name3.getTypeDesignations();
806
        Assert.assertEquals("name3 should have 2 type designations", 2, desigs3.size());
807
        Assert.assertEquals("name should have 1 registrations", 1, regs.size());
808
        Assert.assertEquals("registration should have 1 type designations",1, regs.iterator().next().getTypeDesignations().size());
809

    
810
        nameService.deleteTypeDesignation(name3, desig3);
811
        commitAndStartNewTransaction(/*tableNames*/);
812

    
813
        name3 = this.nameService.load(UUID.fromString("e1e66264-f16a-4df9-80fd-6ab5028a3c28"));
814

    
815
        regs = name3.getRegistrations();
816
        Assert.assertEquals("name3 should have 1 registration", 1, regs.size());
817
        Assert.assertEquals("registration should have 1 type designations",1, regs.iterator().next().getTypeDesignations().size());
818

    
819
        desigs3 = name3.getTypeDesignations();
820

    
821
        nameService.deleteTypeDesignation(name3, desigNew);
822
        commitAndStartNewTransaction(/*tableNames*/);
823
        name3 = this.nameService.load(UUID.fromString("e1e66264-f16a-4df9-80fd-6ab5028a3c28"));
824
        regs = name3.getRegistrations();
825
        desigs3 = name3.getTypeDesignations();
826

    
827
        Assert.assertEquals("name3 should have 1 type designations", 1, desigs3.size());
828
        Assert.assertEquals("registration should have 0 type designations",0, regs.iterator().next().getTypeDesignations().size());
829
    }
830

    
831
    @Test
832
    @DataSet
833
    public void testDeleteTypeDesignationAllNames() {
834
//        final String[] tableNames = new String[]{
835
//                "TaxonName","TypeDesignationBase",
836
//                "TaxonName_TypeDesignationBase","SpecimenOrObservationBase"};
837

    
838
        TaxonName name1 =  this.nameService.load(UUID.fromString("6dbd41d1-fe13-4d9c-bb58-31f051c2c384"));
839
        TaxonName name2 = this.nameService.load(UUID.fromString("f9e9c13f-5fa5-48d3-88cf-712c921a099e"));
840
        TaxonName name3 = this.nameService.load(UUID.fromString("e1e66264-f16a-4df9-80fd-6ab5028a3c28"));
841
        DerivedUnit specimen1 = CdmBase.deproxy(this.occurrenceService.load(UUID.fromString("0d19a9ca-21a7-4adb-8640-8d6719e15eea")), DerivedUnit.class);
842
        DerivedUnit fossil = CdmBase.deproxy(this.occurrenceService.load(UUID.fromString("4c48b7c8-4c8d-4e48-b083-0837fe51a0a9")), DerivedUnit.class);
843

    
844
        @SuppressWarnings("rawtypes")
845
        Set<TypeDesignationBase> desigs1 = name1.getTypeDesignations();
846
        @SuppressWarnings("rawtypes")
847
        Set<TypeDesignationBase> desigs2 = name2.getTypeDesignations();
848
        @SuppressWarnings("rawtypes")
849
        Set<TypeDesignationBase> desigs3 = name3.getTypeDesignations();
850

    
851
        Assert.assertEquals("name1 should have 2 type designations", 2, desigs1.size());
852
        Assert.assertEquals("name2 should have 1 type designations", 1, desigs2.size());
853
        Assert.assertEquals("name3 should have 1 type designations", 1, desigs3.size());
854
        Assert.assertEquals("Specimen1 should be used in 1 type designation", 1, specimen1.getSpecimenTypeDesignations().size());
855
        Assert.assertEquals("Fossil should be used in 1 type designation", 1, fossil.getSpecimenTypeDesignations().size());
856

    
857
        SpecimenTypeDesignation desig2 = (SpecimenTypeDesignation)name2.getTypeDesignations().iterator().next();
858

    
859
        nameService.deleteTypeDesignation(null, desig2);
860

    
861
        commitAndStartNewTransaction(/*tableNames*/);
862

    
863
        name1 =  this.nameService.load(UUID.fromString("6dbd41d1-fe13-4d9c-bb58-31f051c2c384"));
864
        name2 = this.nameService.load(UUID.fromString("f9e9c13f-5fa5-48d3-88cf-712c921a099e"));
865
        name3 = this.nameService.load(UUID.fromString("e1e66264-f16a-4df9-80fd-6ab5028a3c28"));
866
        specimen1 = CdmBase.deproxy(this.occurrenceService.load(UUID.fromString("0d19a9ca-21a7-4adb-8640-8d6719e15eea")), DerivedUnit.class);
867
        fossil = CdmBase.deproxy(this.occurrenceService.load(UUID.fromString("4c48b7c8-4c8d-4e48-b083-0837fe51a0a9")), DerivedUnit.class);
868

    
869
        desigs1 = name1.getTypeDesignations();
870
        desigs2 = name2.getTypeDesignations();
871
        desigs3 = name3.getTypeDesignations();
872

    
873
        Assert.assertEquals("name1 should have 1 type designations", 1, desigs1.size());
874
        Assert.assertEquals("name2 should have 0 type designations", 0, desigs2.size());
875
        Assert.assertEquals("name3 should have 1 type designations", 1, desigs3.size());
876
        Assert.assertEquals("Specimen1 should be used in 0 type designation", 0, specimen1.getSpecimenTypeDesignations().size());
877
        Assert.assertEquals("Fossil should be used in 1 type designation", 1, fossil.getSpecimenTypeDesignations().size());
878
    }
879

    
880
    @Test
881
    @DataSet
882
    public void findByTitleWithRestrictions(){
883

    
884
        // The following typeDesignations per name are assumed:
885
        // Name1 -> SpecimenTypeDesignation -> Specimen1
886
        //       -> SpecimenTypeDesignation -> Specimen2
887
        // Name2 -> SpecimenTypeDesignation -> Specimen2
888

    
889
        // Logger.getLogger("org.hibernate.SQL").setLevel(Level.TRACE);
890

    
891
        List<Restriction<?>> restrictions;
892
        Pager<TaxonName> result;
893

    
894
        result = nameService.findByTitleWithRestrictions(null, "Name1", MatchMode.EXACT, null, null, null, null, null);
895
        assertEquals(1l, result.getCount().longValue());
896
        assertEquals("Name1", result.getRecords().iterator().next().getTitleCache());
897

    
898
        result = nameService.findByTitleWithRestrictions(null, "Name", MatchMode.BEGINNING, null, null, null, null, null);
899
        assertEquals(3l, result.getCount().longValue());
900

    
901
        restrictions = Arrays.asList(new Restriction<UUID>("typeDesignations.uuid", null, UUID.fromString("9bbda70b-7272-4e65-a807-852a3f2eba63")));
902
        result = nameService.findByTitleWithRestrictions(null, "Name", MatchMode.BEGINNING, restrictions, null, null, null, null);
903
        assertEquals(1l, result.getCount().longValue());
904
        assertEquals("Name1", result.getRecords().iterator().next().getTitleCache());
905

    
906
        result = nameService.findByTitleWithRestrictions(null, "me1", MatchMode.END, restrictions, null, null, null, null);
907
        assertEquals(1l, result.getCount().longValue());
908
        assertEquals("Name1", result.getRecords().iterator().next().getTitleCache());
909

    
910
        result = nameService.findByTitleWithRestrictions(null, "Name2", MatchMode.EXACT, restrictions, null, null, null, null);
911
        assertEquals(0l, result.getCount().longValue());
912

    
913
        // Logger.getLogger("eu.etaxonomy.cdm.persistence.dao.hibernate.common").setLevel(Level.DEBUG);
914

    
915
        restrictions = Arrays.asList(new Restriction<String>("typeDesignations.typeSpecimen.titleCache", MatchMode.EXACT, "Specimen2"));
916
        result = nameService.findByTitleWithRestrictions(null, "Name2", MatchMode.EXACT, restrictions, null, null, null, null);
917
        assertEquals(1l, result.getCount().longValue());
918
        assertEquals("Name2", result.getRecords().iterator().next().getTitleCache());
919

    
920
        restrictions = Arrays.asList(new Restriction<String>("typeDesignations.typeSpecimen.titleCache", MatchMode.EXACT, "Specimen1"));
921
        result = nameService.findByTitleWithRestrictions(null, "Name2", MatchMode.EXACT, restrictions, null, null, null, null);
922
        assertEquals(0l, result.getCount().longValue());
923

    
924
        restrictions = Arrays.asList(new Restriction<String>("typeDesignations.typeSpecimen.titleCache", Restriction.Operator.OR, MatchMode.EXACT, "Specimen1"));
925
        result = nameService.findByTitleWithRestrictions(null, "Name2", MatchMode.EXACT, restrictions, null, null, null, null);
926
        assertEquals(2l, result.getCount().longValue());
927

    
928
        restrictions = Arrays.asList(new Restriction<String>("typeDesignations.typeSpecimen.titleCache", MatchMode.BEGINNING, "Specimen"));
929
        result = nameService.findByTitleWithRestrictions(null, "Name1", MatchMode.EXACT, restrictions, null, null, null, null);
930
        assertEquals("names with multiple matching typeSpecimens must be deduplicated", 1l, result.getCount().longValue());
931
        assertEquals("Name1", result.getRecords().iterator().next().getTitleCache());
932

    
933
        restrictions = Arrays.asList(new Restriction<String>("typeDesignations.typeSpecimen.titleCache", MatchMode.BEGINNING, "Specimen"));
934
        result = nameService.findByTitleWithRestrictions(null, "Name", MatchMode.BEGINNING, restrictions, null, null, null, null);
935
        assertEquals(2l, result.getCount().longValue());
936
    }
937

    
938
    @Test
939
    @DataSet
940
    public void testFindByTitleTitleWithRestrictionsMultiValue(){
941

    
942
        // The following typedesigbnations per name are assumed:
943
        // Name1 -> SpecimenTypeDesignation -> Specimen1
944
        //       -> SpecimenTypeDesignation -> Specimen2
945
        // Name2 -> SpecimenTypeDesignation -> Specimen2
946
        // Name3 -> NameTypeDesignaton-> typeName = Name1
947

    
948
        List<Restriction<?>> restrictions;
949
        Pager<TaxonName> result;
950

    
951
        restrictions = Arrays.asList(new Restriction<UUID>("typeDesignations.uuid", null, UUID.fromString("9bbda70b-7272-4e65-a807-852a3f2eba63"), UUID.fromString("1357c307-00c3-499c-8e20-0849d4706125")));
952
        result = nameService.findByTitleWithRestrictions(null, "Name", MatchMode.BEGINNING, restrictions, null, null, null, null);
953
        assertEquals(2l, result.getCount().longValue());
954

    
955
        restrictions = Arrays.asList(new Restriction<String>("typeDesignations.typeSpecimen.titleCache", null, "Specimen1", "Specimen2"));
956
        result = nameService.findByTitleWithRestrictions(null, "Name1", MatchMode.EXACT, restrictions, null, null, null, null);
957
        assertEquals("names with multiple matching typeSpecimens must be distinct", 1l, result.getCount().longValue());
958
        assertEquals("Name1", result.getRecords().iterator().next().getTitleCache());
959
    }
960

    
961
    @Test
962
    @DataSet
963
    public void testFindByTitleTitleWithRestrictionsLogicalOperators(){
964

    
965
        // The following typedesigbnations per name are assumed:
966
        // Name1 -> SpecimenTypeDesignation -> Specimen1
967
        //       -> SpecimenTypeDesignation -> Specimen2
968
        // Name2 -> SpecimenTypeDesignation -> Specimen2
969
        // Name3 -> NameTypeDesignaton-> typeName = Name1
970

    
971
        List<Restriction<?>> restrictions;
972
        Pager<TaxonName> result;
973

    
974
        //Logger.getLogger("org.hibernate.SQL").setLevel(Level.TRACE);
975

    
976
        restrictions = Arrays.asList(new Restriction<String>("typeDesignations.typeName.titleCache", Operator.AND, null, "Name1"));
977
        result = nameService.findByTitleWithRestrictions(null, "Name3", MatchMode.EXACT, restrictions, null, null, null, null);
978
        assertEquals(1l, result.getCount().longValue());
979

    
980
        restrictions = Arrays.asList(new Restriction<String>("typeDesignations.typeName.titleCache", Operator.AND_NOT, null, "Name1"));
981
        result = nameService.findByTitleWithRestrictions(null, "Name", MatchMode.BEGINNING, restrictions, null, null, null, null);
982
        assertEquals(2l, result.getCount().longValue());
983

    
984
        restrictions = Arrays.asList(new Restriction<String>("titleCache", Operator.AND_NOT, null, "Name1", "Name2"));
985
        result = nameService.findByTitleWithRestrictions(null, "Name", MatchMode.BEGINNING, restrictions, null, null, null, null);
986
        assertEquals(1l, result.getCount().longValue());
987
        assertEquals("Name3", result.getRecords().get(0).getTitleCache());
988

    
989
        restrictions = Arrays.asList(new Restriction<String>("typeDesignations.typeName.titleCache", Operator.OR, null, "Name1"));
990
        result = nameService.findByTitleWithRestrictions(null, "Name1", MatchMode.EXACT, restrictions, null, null, null, null);
991
        assertEquals(2l, result.getCount().longValue());
992

    
993
        restrictions = Arrays.asList(new Restriction<String>("typeDesignations.typeName.titleCache", Operator.OR_NOT, null, "Name1"));
994
        result = nameService.findByTitleWithRestrictions(null, "Name1", MatchMode.EXACT, restrictions, null, null, null, null);
995
        assertEquals(2l, result.getCount().longValue());
996
    }
997

    
998
    @Test
999
    @DataSet
1000
    public void testFindByTitleTitle_using_Configurator(){
1001

    
1002
        String searchString = "*";
1003
        IdentifiableServiceConfiguratorImpl<TaxonName> searchConfigurator = new IdentifiableServiceConfiguratorImpl<TaxonName>();
1004

    
1005
        searchConfigurator = IdentifiableServiceConfiguratorFactory.getConfigurator(TaxonName.class);
1006
        searchConfigurator.setTitleSearchString(searchString);
1007
        searchConfigurator.setMatchMode(null);
1008
        searchConfigurator.setOrderHints(OrderHint.ORDER_BY_TITLE_CACHE.asList());
1009

    
1010
        Pager<TaxonName> results = nameService.findByTitle(searchConfigurator);
1011
        assertTrue(results.getRecords().size() > 0);
1012
    }
1013

    
1014
    @Test  //7874 //8030
1015
    @DataSet(loadStrategy=CleanSweepInsertLoadStrategy.class, value="NameServiceImplTest.testUpdateCaches.xml")
1016
    public void testUpdateCaches() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{
1017

    
1018
        Field titleCacheField = IdentifiableEntity.class.getDeclaredField("titleCache");
1019
        titleCacheField.setAccessible(true);
1020
        Field nameCacheField = TaxonName.class.getDeclaredField("nameCache");
1021
        nameCacheField.setAccessible(true);
1022
        Field authorCacheField = TaxonName.class.getDeclaredField("authorshipCache");
1023
        authorCacheField.setAccessible(true);
1024
        Field fullTitleCacheField = TaxonName.class.getDeclaredField("fullTitleCache");
1025
        fullTitleCacheField.setAccessible(true);
1026

    
1027
        TaxonName name1 = nameService.loadWithoutInitializing(NAME1_ID);
1028
        TaxonName name2 = nameService.loadWithoutInitializing(NAME2_ID);
1029
        TaxonName name3 = nameService.loadWithoutInitializing(NAME3_ID);
1030

    
1031
        name1 = CdmBase.deproxy(name1);
1032
        assertEquals("TitleCache should be the persisted one", "Name1", titleCacheField.get(name1));
1033
        assertEquals("NameCache should be the persisted one", "", nameCacheField.get(name1));
1034
        assertEquals("AuthorCache should be the persisted one", "", authorCacheField.get(name1));
1035
        assertEquals("FullTitleCache should be the persisted one", "", fullTitleCacheField.get(name1));
1036

    
1037
        name2 = CdmBase.deproxy(name2);
1038
        assertEquals("TitleCache should be the persisted one", "Name2", titleCacheField.get(name2));
1039
        assertEquals("NameCache should be the persisted one", "Protected name", nameCacheField.get(name2));
1040
        assertEquals("AuthorCache should be the persisted one", null, authorCacheField.get(name2));
1041
        assertEquals("FullTitleCache should be the persisted one", "", fullTitleCacheField.get(name2));
1042

    
1043
        name3 = CdmBase.deproxy(name3);
1044
        assertEquals("TitleCache should be the persisted one", "Name3", titleCacheField.get(name3));
1045
        assertEquals("NameCache should be the persisted one", "", nameCacheField.get(name3));
1046
        assertEquals("AuthorCache should be the persisted one", "No-author", authorCacheField.get(name3));
1047
        assertEquals("FullTitleCache should be the persisted one", "", fullTitleCacheField.get(name3));
1048

    
1049
        nameService.updateCaches();
1050

    
1051
        assertEquals("Expecting titleCache to be updated", "First name Turl.", titleCacheField.get(name1));
1052
        assertEquals("Expecting nameCache to be updated", "First name", nameCacheField.get(name1));
1053
        assertEquals("Expecting authorshipCache to be updated", "Turl.", authorCacheField.get(name1));
1054
        assertEquals("Expecting fullTitleCache to be updated", "First name Turl.", fullTitleCacheField.get(name1));
1055

    
1056
        assertEquals("Expecting titleCache to be updated", "Protected name", titleCacheField.get(name2));
1057
        assertEquals("Expecting nameCache to not be updated", "Protected name", nameCacheField.get(name2));
1058
        assertEquals("Expecting authorshipCache to be updated", "", authorCacheField.get(name2));
1059
        assertEquals("Expecting fullTitleCache to be updated", "Protected name", fullTitleCacheField.get(name2));
1060

    
1061
        assertEquals("Expecting titleCache to be updated", "Name3", titleCacheField.get(name3));
1062
        assertEquals("Expecting nameCache to be updated", "Third", nameCacheField.get(name3));
1063
        assertEquals("Expecting authorshipCache to be updated", "No-author", authorCacheField.get(name3));
1064
        assertEquals("Expecting fullTitleCache to be updated", "Name3", fullTitleCacheField.get(name3));
1065
    }
1066

    
1067
    @Test  //#3666 and others
1068
    @DataSet(loadStrategy=CleanSweepInsertLoadStrategy.class, value="NameServiceImplTest.xml")
1069
    public void testParseName() {
1070
        Assert.assertEquals(3, nameService.count(TaxonName.class));
1071
        String nameToParseStr = "Abies alba Mill, Sp. Pl. 2: 333. 1751 [as \"alpa\"]";
1072
        TaxonName parsedName = (TaxonName)nameService.parseName(nameToParseStr, NomenclaturalCode.ICNAFP, Rank.SPECIES(), true).getCdmEntity();
1073
        UUID parsedNameUuid = parsedName.getUuid();
1074
        UUID originalSpellingUuid = parsedName.getOriginalSpelling().getUuid();
1075
        nameService.save(parsedName);
1076

    
1077
        TaxonName parsedName2 = (TaxonName)nameService.parseName(nameToParseStr, NomenclaturalCode.ICNAFP, Rank.SPECIES(), true).getCdmEntity();
1078
        UUID parsedNameUuid2 = parsedName2.getUuid();
1079
        UUID originalSpelling2Uuid = parsedName2.getOriginalSpelling().getUuid();
1080
        Assert.assertEquals(originalSpellingUuid, originalSpelling2Uuid);
1081
        Assert.assertNotEquals(parsedNameUuid, parsedNameUuid2);  //currently we do not deduplicate the main name yet
1082

    
1083
        //tbc
1084
    }
1085

    
1086
    private Rank getSpeciesRank() {
1087
        return (Rank)termService.find(Rank.uuidSpecies);
1088
    }
1089

    
1090
    private Rank getGenusRank() {
1091
        return (Rank)termService.find(Rank.uuidGenus);
1092
    }
1093

    
1094
    @Override
1095
    public void createTestDataSet() throws FileNotFoundException {}
1096
}
(13-13/37)