2 * Copyright (C) 2009 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
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.
9 package eu
.etaxonomy
.cdm
.api
.service
;
11 import java
.io
.FileNotFoundException
;
13 import java
.util
.UUID
;
15 import org
.apache
.log4j
.Logger
;
16 import org
.junit
.Assert
;
17 import org
.junit
.Ignore
;
18 import org
.junit
.Test
;
19 import org
.unitils
.dbunit
.annotation
.DataSet
;
20 import org
.unitils
.spring
.annotation
.SpringBeanByType
;
22 import eu
.etaxonomy
.cdm
.api
.service
.config
.NameDeletionConfigurator
;
23 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
24 import eu
.etaxonomy
.cdm
.model
.common
.Language
;
25 import eu
.etaxonomy
.cdm
.model
.description
.DescriptionElementSource
;
26 import eu
.etaxonomy
.cdm
.model
.description
.Feature
;
27 import eu
.etaxonomy
.cdm
.model
.description
.TaxonDescription
;
28 import eu
.etaxonomy
.cdm
.model
.description
.TaxonNameDescription
;
29 import eu
.etaxonomy
.cdm
.model
.description
.TextData
;
30 import eu
.etaxonomy
.cdm
.model
.name
.BotanicalName
;
31 import eu
.etaxonomy
.cdm
.model
.name
.HybridRelationshipType
;
32 import eu
.etaxonomy
.cdm
.model
.name
.NameRelationshipType
;
33 import eu
.etaxonomy
.cdm
.model
.name
.NameTypeDesignation
;
34 import eu
.etaxonomy
.cdm
.model
.name
.NameTypeDesignationStatus
;
35 import eu
.etaxonomy
.cdm
.model
.name
.NomenclaturalStatus
;
36 import eu
.etaxonomy
.cdm
.model
.name
.NomenclaturalStatusType
;
37 import eu
.etaxonomy
.cdm
.model
.name
.NonViralName
;
38 import eu
.etaxonomy
.cdm
.model
.name
.Rank
;
39 import eu
.etaxonomy
.cdm
.model
.name
.SpecimenTypeDesignation
;
40 import eu
.etaxonomy
.cdm
.model
.name
.SpecimenTypeDesignationStatus
;
41 import eu
.etaxonomy
.cdm
.model
.name
.TaxonNameBase
;
42 import eu
.etaxonomy
.cdm
.model
.name
.TypeDesignationBase
;
43 import eu
.etaxonomy
.cdm
.model
.occurrence
.DerivedUnit
;
44 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
45 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonBase
;
46 import eu
.etaxonomy
.cdm
.test
.integration
.CdmTransactionalIntegrationTest
;
47 import eu
.etaxonomy
.cdm
.test
.unitils
.CleanSweepInsertLoadStrategy
;
53 public class NameServiceImplTest
extends CdmTransactionalIntegrationTest
{
54 private static final Logger logger
= Logger
.getLogger(NameServiceImplTest
.class);
57 private INameService nameService
;
60 private IOccurrenceService occurrenceService
;
63 private ITaxonService taxonService
;
66 private ITermService termService
;
69 /* ******************** TESTS ********************************************/
72 * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#setDao(eu.etaxonomy.cdm.persistence.dao.name.ITaxonNameDao)}.
75 public void testSetDao() {
76 // Assert.assertNotNull(((NameServiceImpl)nameService).dao);
80 * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#setVocabularyDao(eu.etaxonomy.cdm.persistence.dao.common.ITermVocabularyDao)}.
83 public void testSetVocabularyDao() {
84 // Assert.assertNotNull(( (NameServiceImpl)nameService).vocabularyDao);
88 * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#getNamesByName(java.lang.String)}.
91 public void testGetNamesByName() {
92 logger
.warn("Not yet implemented");
97 * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#getAllNames(int, int)}.
100 public void testGetAllNames() {
101 logger
.warn("Not yet implemented");
107 * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#generateTitleCache()}.
110 public void testGenerateTitleCache() {
111 logger
.warn("Not yet implemented");
115 * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#generateTitleCache()}.
118 @DataSet(loadStrategy
=CleanSweepInsertLoadStrategy
.class)
119 public void testDeleteTaxonNameBaseWithNameRelations() {
121 final String
[] tableNames
= new String
[]{"USERACCOUNT", "TaxonNameBase","NameRelationship","HybridRelationship","DescriptionBase","NomenclaturalStatus","TaxonBase","SpecimenOrObservationBase","OriginalSourceBase","DescriptionElementBase"};
122 // printDataSetWithNull(System.err, true, null);
124 NonViralName
<?
> name1
= BotanicalName
.NewInstance(getSpeciesRank());
125 name1
.setTitleCache("Name1", true);
126 TaxonNameBase
<?
,?
> nameWithBasionym
= BotanicalName
.NewInstance(getSpeciesRank());
127 nameWithBasionym
.setTitleCache("nameWithBasionym", true);
129 NameRelationshipType nameRelType
= (NameRelationshipType
)termService
.find(NameRelationshipType
.BASIONYM().getUuid());
130 name1
.addRelationshipToName(nameWithBasionym
,nameRelType
, null, null, null);
131 // nameWithBasionym.addBasionym(name1);
132 nameService
.save(name1
);
133 commitAndStartNewTransaction(tableNames
);
136 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
137 DeleteResult result
= nameService
.delete(name1
);
139 Exception e
= result
.getExceptions().iterator().next();
140 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());
144 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
145 Assert
.assertNotNull("Name should still be in database",name1
);
146 nameWithBasionym
= name1
.getNameRelations().iterator().next().getToName();
147 nameWithBasionym
.removeBasionyms();
149 result
= nameService
.delete(name1
); //should throw now exception
153 commitAndStartNewTransaction(tableNames
);
154 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
155 Assert
.assertNull("Name should not be in database anymore",name1
);
161 * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#generateTitleCache()}.
165 @DataSet(loadStrategy
=CleanSweepInsertLoadStrategy
.class)
166 public void testDeleteTaxonNameBaseConfiguratorWithNameRelations() {
167 final String
[] tableNames
= new String
[]{"TaxonNameBase","NameRelationship","HybridRelationship"};
169 // printDataSet(System.err, new String[]{"TaxonNameBase","NameRelationship","HybridRelationship","DescriptionBase","NomenclaturalStatus","TaxonBase","SpecimenOrObservationBase","OriginalSourceBase",
170 // "DescriptionElementBase",
171 // "AGENTBASE", "USERACCOUNT", "PERMISSIONGROUP", "USERACCOUNT_PERMISSIONGROUP", "USERACCOUNT_GRANTEDAUTHORITYIMPL", "GRANTEDAUTHORITYIMPL"});
173 NonViralName
<?
> name1
= BotanicalName
.NewInstance(getSpeciesRank());
174 name1
.setTitleCache("Name1", true);
175 TaxonNameBase
<?
,?
> nameWithBasionym
= BotanicalName
.NewInstance(getSpeciesRank());
176 nameWithBasionym
.setTitleCache("nameWithBasionym", true);
178 NameRelationshipType nameRelType
= (NameRelationshipType
)termService
.find(NameRelationshipType
.BASIONYM().getUuid());
179 name1
.addRelationshipToName(nameWithBasionym
,nameRelType
, null, null, null);
180 nameService
.save(name1
);
181 commitAndStartNewTransaction(tableNames
);
182 NameDeletionConfigurator config
= new NameDeletionConfigurator();
184 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
185 DeleteResult result
= nameService
.delete(name1
.getUuid(), config
);
187 Assert
.fail("This should throw an error as long as name relationships exist.");
191 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
192 Assert
.assertNotNull("Name should still be in database",name1
);
194 //ignore is basionym for
195 config
.setIgnoreIsBasionymFor(true);
197 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
198 nameService
.delete(name1
.getUuid(), config
);
199 commitAndStartNewTransaction(tableNames
);
200 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
201 Assert
.assertNull("Name should not be in database anymore",name1
);
206 * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#generateTitleCache()}.
209 public void testDeleteTaxonNameBaseConfiguratorWithNameRelationsAll() {
210 final String
[] tableNames
= new String
[]{"TaxonNameBase","NameRelationship","HybridRelationship"};
212 NonViralName
<?
> name1
= BotanicalName
.NewInstance(getSpeciesRank());
213 name1
.setTitleCache("Name1", true);
214 TaxonNameBase
<?
,?
> nameWithBasionym
= BotanicalName
.NewInstance(getSpeciesRank());
215 nameWithBasionym
.setTitleCache("nameWithBasionym", true);
217 NameRelationshipType nameRelType
= (NameRelationshipType
)termService
.find(NameRelationshipType
.BASIONYM().getUuid());
218 name1
.addRelationshipToName(nameWithBasionym
,nameRelType
, null, null, null);
219 nameService
.save(name1
);
220 commitAndStartNewTransaction(tableNames
);
221 NameDeletionConfigurator config
= new NameDeletionConfigurator();
223 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
224 DeleteResult result
= nameService
.delete(name1
.getUuid(), config
);
226 Assert
.fail("Delete should throw an error as long as name relationships exist.");
230 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
231 Assert
.assertNotNull("Name should still be in database",name1
);
233 //ignore all name relationships
234 config
.setRemoveAllNameRelationships(true);
236 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
237 result
= nameService
.delete(name1
.getUuid(), config
);
238 logger
.debug(result
);
239 commitAndStartNewTransaction(tableNames
);
240 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
241 Assert
.assertNull("Name should not be in database anymore",name1
);
246 * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#generateTitleCache()}.
249 public void testDeleteTaxonNameBaseConfiguratorWithHasBasionym() {
250 final String
[] tableNames
= new String
[]{"TaxonNameBase","NameRelationship","HybridRelationship"};
252 NonViralName
<?
> name1
= BotanicalName
.NewInstance(getSpeciesRank());
253 name1
.setTitleCache("Name1", true);
254 TaxonNameBase
<?
,?
> basionym
= BotanicalName
.NewInstance(getSpeciesRank());
255 basionym
.setTitleCache("basionym", true);
257 NameRelationshipType nameRelType
= (NameRelationshipType
)termService
.find(NameRelationshipType
.BASIONYM().getUuid());
258 basionym
.addRelationshipToName(name1
,nameRelType
, null, null, null);
259 nameService
.save(name1
);
260 commitAndStartNewTransaction(tableNames
);
261 NameDeletionConfigurator config
= new NameDeletionConfigurator();
262 config
.setIgnoreHasBasionym(false);
264 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
265 DeleteResult result
= nameService
.delete(name1
.getUuid(), config
);
267 Assert
.fail("Delete should throw an error as long as name relationships exist.");
271 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
272 Assert
.assertNotNull("Name should still be in database",name1
);
274 //ignore has basionym
275 config
.setIgnoreHasBasionym(true);
277 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
278 result
= nameService
.delete(name1
.getUuid(), config
);
279 logger
.debug(result
);
280 commitAndStartNewTransaction(tableNames
);
281 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
282 Assert
.assertNull("Name should not be in database anymore",name1
);
283 } catch (Exception e
) {
284 Assert
.fail("Delete should not throw an error for .");
290 * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#generateTitleCache()}.
293 // @Ignore //currently does not run in suite
294 public void testDeleteTaxonNameBaseWithHybridRelations() {
295 final String
[] tableNames
= new String
[]{"TaxonNameBase","NameRelationship","HybridRelationship"};
297 NonViralName
<?
> name1
= BotanicalName
.NewInstance(getSpeciesRank());
298 name1
.setTitleCache("Name1", true);
299 NonViralName
<?
> parent
= BotanicalName
.NewInstance(getSpeciesRank());
300 parent
.setTitleCache("parent", true);
301 NonViralName
<?
> child
= BotanicalName
.NewInstance(getSpeciesRank());
302 child
.setTitleCache("child", true);
304 HybridRelationshipType relType
= (HybridRelationshipType
)termService
.find(HybridRelationshipType
.FIRST_PARENT().getUuid());
305 name1
.addHybridParent(parent
, relType
, null);
306 nameService
.save(name1
);
307 commitAndStartNewTransaction(tableNames
); //otherwise first save is rolled back with following failing delete
308 Assert
.assertEquals("'Parent' should be a parent in a hybrid relation.", 1,parent
.getHybridParentRelations().size());
309 // printDataSet(System.out, tableNames);
313 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
314 DeleteResult result
= nameService
.delete(name1
);
315 if (result
.isError()){
316 Assert
.fail("Delete should throw NO exception when deleting a hybrid child: " + result
.getExceptions().iterator().next().getMessage());
318 commitAndStartNewTransaction(tableNames
);
319 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
320 Assert
.assertNull("Name should not be in database anymore",name1
);
321 parent
= (NonViralName
<?
>)nameService
.find(parent
.getUuid());
322 Assert
.assertEquals("'Parent' should not be a parent anymore.", 0,parent
.getHybridParentRelations().size());
325 name1
= BotanicalName
.NewInstance(getSpeciesRank());
326 name1
.addHybridChild(child
, relType
, null);
327 nameService
.save(name1
);
328 commitAndStartNewTransaction(tableNames
);
331 result
= nameService
.delete(name1
);
333 Assert
.fail("Delete should throw an error as long as hybrid child exist.");
335 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
336 Assert
.assertNotNull("Name should still be in database",name1
);
337 name1
.removeHybridChild(child
);
339 result
= nameService
.delete(name1
); //should throw now exception
340 if (result
.isError()){
341 Assert
.fail("Delete should throw NO exception when deleting a hybrid child: " +result
.getExceptions().iterator().next().getMessage());
344 commitAndStartNewTransaction(tableNames
);
345 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
346 Assert
.assertNull("Name should not be in database anymore",name1
);
350 * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#generateTitleCache()}.
353 @DataSet(loadStrategy
=CleanSweepInsertLoadStrategy
.class)
354 public void testDeleteTaxonNameBaseInConcept() {
355 final String
[] tableNames
= new String
[]{"TaxonNameBase","TaxonBase"};
357 NonViralName
<?
> name1
= BotanicalName
.NewInstance(getSpeciesRank());
358 name1
.setTitleCache("Name1", true);
359 TaxonNameBase
<?
,?
> basionym
= BotanicalName
.NewInstance(getSpeciesRank());
360 basionym
.setTitleCache("basionym", true);
362 Taxon taxon
= Taxon
.NewInstance(name1
, null);
363 nameService
.save(name1
);
364 taxonService
.save(taxon
);
365 commitAndStartNewTransaction(tableNames
);
368 DeleteResult result
= nameService
.delete(name1
);
371 Assert
.fail("Delete should throw an error as long as name is used in a concept.");
373 TaxonNameBase nameBase
=nameService
.find(name1
.getUuid());
374 Assert
.assertNotNull("Name should still be in database",nameBase
);
375 TaxonBase taxonBase
= taxonService
.find(taxon
.getUuid());
376 Assert
.assertNotNull("Taxon should still be in database",taxonBase
);
377 taxon
= (Taxon
)taxonBase
;
378 taxon
.setName(basionym
);
379 taxonService
.save(taxon
);
380 nameBase
=nameService
.find(name1
.getUuid());
385 result
= nameService
.delete(nameBase
); //should throw no exception
386 if (result
.isError()){
387 Assert
.fail("Delete should throw NO error ");
389 commitAndStartNewTransaction(tableNames
);
390 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
391 Assert
.assertNull("Name should still be in database",name1
);
392 taxon
= (Taxon
)taxonService
.find(taxon
.getUuid());
393 Assert
.assertNotNull("Taxon should still be in database",taxon
);
397 * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#generateTitleCache()}.
400 public void testDeleteTaxonNameBaseAsStoredUnder() {
401 final String
[] tableNames
= new String
[]{"TaxonNameBase","SpecimenOrObservationBase"};
403 NonViralName
<?
> name1
= BotanicalName
.NewInstance(getSpeciesRank());
404 name1
.setTitleCache("Name1", true);
405 DerivedUnit specimen
= DerivedUnit
.NewPreservedSpecimenInstance();
406 specimen
.setStoredUnder(name1
);
408 occurrenceService
.save(specimen
);
409 UUID uuidName1
= nameService
.save(name1
);
411 commitAndStartNewTransaction(tableNames
);
412 DeleteResult result
= nameService
.delete(name1
);
414 Assert
.fail("This should throw an error because name is used for specimen#storedUnder.");
416 commitAndStartNewTransaction(tableNames
);
418 name1
= (NonViralName
<?
>)nameService
.find(uuidName1
);
419 Assert
.assertNotNull("Name should still be in database",name1
);
420 specimen
= (DerivedUnit
)occurrenceService
.find(specimen
.getUuid());
421 Assert
.assertNotNull("Specimen should still be in database",name1
);
422 specimen
.setStoredUnder(null);
423 occurrenceService
.saveOrUpdate(specimen
);
425 nameService
.delete(name1
); //should throw no exception
428 name1
= (NonViralName
<?
>)nameService
.find(uuidName1
);
429 Assert
.assertNull("Name should not be in database anymore",name1
);
430 specimen
= (DerivedUnit
)occurrenceService
.find(specimen
.getUuid());
431 Assert
.assertNotNull("Specimen should still be in database",specimen
);
433 occurrenceService
.delete(specimen
); //this is to better run this test in the test suit
438 * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#generateTitleCache()}.
441 @Ignore //currently does not run in suite
442 public void testDeleteTaxonNameBaseInSource() {
443 final String
[] tableNames
= new String
[]{"TaxonNameBase","DescriptionBase","TaxonBase","OriginalSourceBase","DescriptionElementBase"};
445 NonViralName
<?
> name1
= BotanicalName
.NewInstance(getSpeciesRank());
446 name1
.setTitleCache("Name1", true);
447 TaxonNameBase
<?
,?
> taxonName
= BotanicalName
.NewInstance(getSpeciesRank());
448 taxonName
.setTitleCache("taxonName", true);
449 Taxon taxon
= Taxon
.NewInstance(taxonName
, null);
451 TaxonDescription taxonDescription
= TaxonDescription
.NewInstance(taxon
);
452 Feature feature
= (Feature
)termService
.find(Feature
.DESCRIPTION().getUuid());
453 Language lang
= (Language
)termService
.find(Language
.DEFAULT().getUuid());
454 TextData textData
= TextData
.NewInstance("Any text", lang
, null);
455 textData
.setFeature(feature
);
456 taxonDescription
.addElement(textData
);
457 DescriptionElementSource source
= DescriptionElementSource
.NewPrimarySourceInstance(null, null, name1
, "");
458 textData
.addSource(source
);
459 taxonService
.saveOrUpdate(taxon
);
460 nameService
.save(name1
);
462 commitAndStartNewTransaction(tableNames
);
463 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
464 nameService
.delete(name1
);
465 Assert
.fail("Delete should throw an error as long as name is used in a source.");
466 } catch (Exception e
) {
467 if (e
.getMessage().contains("Name can't be deleted as it is used as descriptionElementSource#nameUsedInSource")){
469 endTransaction(); //exception rolls back transaction!
470 startNewTransaction();
472 Assert
.fail("Unexpected error occurred when trying to delete taxon name: " + e
.getMessage());
475 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
476 Assert
.assertNotNull("Name should still be in database",name1
);
477 taxon
= (Taxon
)taxonService
.find(taxon
.getUuid());
478 Assert
.assertNotNull("Taxon should still be in database",name1
);
479 source
= taxon
.getDescriptions().iterator().next().getElements().iterator().next().getSources().iterator().next();
480 source
.setNameUsedInSource(null);
481 taxonService
.saveOrUpdate(taxon
);
483 nameService
.delete(name1
); //should throw now exception
485 commitAndStartNewTransaction(tableNames
);
486 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
487 Assert
.assertNull("Name should not be in database anymore",name1
);
488 taxon
= (Taxon
)taxonService
.find(taxon
.getUuid());
489 Assert
.assertNotNull("Taxon should still be in database",taxon
);
490 source
= taxon
.getDescriptions().iterator().next().getElements().iterator().next().getSources().iterator().next();
491 Assert
.assertNull("Source should not have a nameUsedInSource anymore",source
.getNameUsedInSource());
496 * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#generateTitleCache()}.
500 public void testDeleteTaxonNameBaseAsType() {
501 final String
[] tableNames
= new String
[]{"TaxonNameBase","TypeDesignationBase","TaxonNameBase_TypeDesignationBase"};
503 NonViralName
<?
> name1
= BotanicalName
.NewInstance(getSpeciesRank());
504 name1
.setTitleCache("Name used as type", true);
506 NonViralName
<?
> higherName
= BotanicalName
.NewInstance(getGenusRank());
507 higherName
.setTitleCache("genus name", true);
508 NameTypeDesignationStatus typeStatus
= (NameTypeDesignationStatus
)termService
.find(NameTypeDesignationStatus
.AUTOMATIC().getUuid());
509 boolean addToAllHomotypicNames
= true;
510 higherName
.addNameTypeDesignation(name1
, null, null, null, typeStatus
, addToAllHomotypicNames
);
511 nameService
.save(higherName
);
513 commitAndStartNewTransaction(tableNames
);
514 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
515 DeleteResult result
= nameService
.delete(name1
);
517 Assert
.fail("This should throw an error because name is used in a type designation.");
520 commitAndStartNewTransaction(tableNames
);
521 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
522 Assert
.assertNotNull("Name should still be in database",name1
);
523 higherName
= (NonViralName
<?
>)nameService
.find(higherName
.getUuid());
524 higherName
.getNameTypeDesignations().iterator().next().removeType(); //keeps the designation but removes the name from it
525 // nameService.deleteTypeDesignation(higherName,commitAndStartNewTransaction(tableNames) ); //deletes the complete designation //both options can be used
527 nameService
.delete(name1
); //should throw now exception
529 commitAndStartNewTransaction(tableNames
);
530 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
531 Assert
.assertNull("Name should not be in database anymore",name1
);
532 higherName
= (NonViralName
<?
>)nameService
.find(higherName
.getUuid());
533 Assert
.assertNotNull("Higher name should still exist in database",higherName
);
534 Assert
.assertEquals("Higher name should not have type designations anymore",1, higherName
.getTypeDesignations().size());
540 * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#generateTitleCache()}.
544 public void testDeleteTaxonNameBase() {
545 final String
[] tableNames
= new String
[]{"TaxonNameBase","NameRelationship","HybridRelationship","DescriptionBase","NomenclaturalStatus","TaxonBase","SpecimenOrObservationBase","OriginalSourceBase","DescriptionElementBase","TypeDesignationBase","TaxonNameBase_TypeDesignationBase"};
547 NonViralName
<?
> name1
= BotanicalName
.NewInstance(getSpeciesRank());
548 name1
.setTitleCache("Name1", true);
550 //TaxonNameDescription
551 name1
= BotanicalName
.NewInstance(getSpeciesRank());
552 TaxonNameDescription
.NewInstance(name1
);
553 nameService
.saveOrUpdate(name1
);
554 commitAndStartNewTransaction(tableNames
);
556 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
557 DeleteResult result
= nameService
.delete(name1
);//should throw now exception
561 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
562 Assert
.assertNull("Name should not be in database anymore",name1
);
564 // printDataSet(System.out, tableNames);
567 //NomenclaturalStatus
568 name1
= BotanicalName
.NewInstance(getSpeciesRank());
569 NomenclaturalStatusType nomStatusType
= (NomenclaturalStatusType
)termService
.find(NomenclaturalStatusType
.ILLEGITIMATE().getUuid());
570 NomenclaturalStatus status
= NomenclaturalStatus
.NewInstance(nomStatusType
);
571 name1
.addStatus(status
);
572 nameService
.saveOrUpdate(name1
);
573 commitAndStartNewTransaction(tableNames
);
575 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
577 nameService
.delete(name1
); //should throw now exception
583 // printDataSet(System.out, tableNames);
587 name1
= BotanicalName
.NewInstance(getSpeciesRank());
588 name1
.setTitleCache("Name with type designation", true);
589 SpecimenTypeDesignation typeDesignation
= SpecimenTypeDesignation
.NewInstance();
590 SpecimenTypeDesignationStatus typeStatus
= (SpecimenTypeDesignationStatus
)termService
.find(SpecimenTypeDesignationStatus
.HOLOTYPE().getUuid());
591 typeDesignation
.setTypeStatus(typeStatus
);
592 DerivedUnit specimen
= DerivedUnit
.NewPreservedSpecimenInstance();
593 specimen
.setTitleCache("Type specimen", true);
594 occurrenceService
.save(specimen
);
595 typeDesignation
.setTypeSpecimen(specimen
);
597 name1
.addTypeDesignation(typeDesignation
, true);
598 nameService
.save(name1
);
599 commitAndStartNewTransaction(tableNames
);
600 // printDataSet(System.out, tableNames);
602 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
604 result
= nameService
.delete(name1
); //should throw now exception
610 // printDataSet(System.out, tableNames);
615 * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#generateTitleCache()}.
619 public void testDeleteTaxonNameBaseWithTypeInHomotypicalGroup() {
620 final String
[] tableNames
= new String
[]{"TaxonNameBase","NameRelationship","HybridRelationship","DescriptionBase","NomenclaturalStatus","TaxonBase","SpecimenOrObservationBase","OriginalSourceBase","DescriptionElementBase","TypeDesignationBase","TaxonNameBase_TypeDesignationBase"};
622 //Type Designations for homotypical group with > 1 names
623 NonViralName
<?
> name1
= BotanicalName
.NewInstance(getSpeciesRank());
624 name1
.setTitleCache("Name1 with type designation", true);
625 NonViralName
<?
> name2
= BotanicalName
.NewInstance(getSpeciesRank());
626 name2
.setTitleCache("Name2 with type designation", true);
627 name2
.setHomotypicalGroup(name1
.getHomotypicalGroup());
629 DerivedUnit specimen
= DerivedUnit
.NewPreservedSpecimenInstance();
630 specimen
.setTitleCache("Type specimen 2", true);
631 occurrenceService
.save(specimen
);
632 SpecimenTypeDesignationStatus typeStatus
= (SpecimenTypeDesignationStatus
)termService
.find(SpecimenTypeDesignationStatus
.HOLOTYPE().getUuid());
634 SpecimenTypeDesignation typeDesignation
= SpecimenTypeDesignation
.NewInstance();
635 typeDesignation
.setTypeStatus(typeStatus
);
636 typeDesignation
.setTypeSpecimen(specimen
);
638 boolean addToAllNames
= true;
639 name1
.addTypeDesignation(typeDesignation
, addToAllNames
);
640 nameService
.saveOrUpdate(name1
);
641 commitAndStartNewTransaction(tableNames
);
643 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
645 nameService
.delete(name1
); //should throw now exception
649 // printDataSet(System.out, tableNames);
654 @DataSet(loadStrategy
=CleanSweepInsertLoadStrategy
.class)
655 public void testDeleteTypeDesignation() {
656 final String
[] tableNames
= new String
[]{
657 "TaxonNameBase","TypeDesignationBase","TaxonNameBase_TypeDesignationBase",
658 "SpecimenOrObservationBase"};
660 // BotanicalName name1 = BotanicalName.NewInstance(getSpeciesRank());
661 // name1.setTitleCache("Name1");
662 // name1.setUuid(UUID.fromString("6dbd41d1-fe13-4d9c-bb58-31f051c2c384"));
664 // BotanicalName name2 = BotanicalName.NewInstance(getSpeciesRank());
665 // name2.setTitleCache("Name2");
666 // name2.setUuid(UUID.fromString("f9e9c13f-5fa5-48d3-88cf-712c921a099e"));
668 // BotanicalName name3 = BotanicalName.NewInstance(getGenusRank());
669 // name3.setTitleCache("Name3");
670 // name3.setUuid(UUID.fromString("e1e66264-f16a-4df9-80fd-6ab5028a3c28"));
673 // SpecimenTypeDesignation desig1 = SpecimenTypeDesignation.NewInstance();
674 // desig1.setUuid(UUID.fromString("1357c307-00c3-499c-8e20-0849d4706125"));
675 // name1.addTypeDesignation(desig1, true);
676 // name2.addTypeDesignation(desig1, true);
678 // SpecimenTypeDesignation desig2 = SpecimenTypeDesignation.NewInstance();
679 // desig2.setUuid(UUID.fromString("9bbda70b-7272-4e65-a807-852a3f2eba63"));
680 // name1.addTypeDesignation(desig2, true);
682 // Specimen specimen1 = Specimen.NewInstance();
683 // Fossil specimen2 = Fossil.NewInstance();
685 // desig1.setTypeSpecimen(specimen1);
686 // desig2.setTypeSpecimen(specimen2);
688 // NameTypeDesignation nameDesig = NameTypeDesignation.NewInstance();
689 // nameDesig.setTypeName(name1);
690 // name3.addTypeDesignation(nameDesig, true);
692 // nameService.save(name1);
693 // nameService.save(name2);
694 // nameService.save(name3);
696 // commitAndStartNewTransaction(tableNames);
698 // printDataSet(System.out, tableNames);
702 TaxonNameBase name1
= this.nameService
.load(UUID
.fromString("6dbd41d1-fe13-4d9c-bb58-31f051c2c384"));
703 TaxonNameBase name2
= this.nameService
.load(UUID
.fromString("f9e9c13f-5fa5-48d3-88cf-712c921a099e"));
704 TaxonNameBase name3
= this.nameService
.load(UUID
.fromString("e1e66264-f16a-4df9-80fd-6ab5028a3c28"));
705 DerivedUnit specimen1
= CdmBase
.deproxy(this.occurrenceService
.load(UUID
.fromString("0d19a9ca-21a7-4adb-8640-8d6719e15eea")), DerivedUnit
.class);
706 DerivedUnit fossil
= CdmBase
.deproxy(this.occurrenceService
.load(UUID
.fromString("4c48b7c8-4c8d-4e48-b083-0837fe51a0a9")), DerivedUnit
.class);
708 Set
<TypeDesignationBase
> desigs1
= name1
.getTypeDesignations();
709 Set
<TypeDesignationBase
> desigs2
= name2
.getTypeDesignations();
710 Set
<TypeDesignationBase
> desigs3
= name3
.getTypeDesignations();
712 Assert
.assertEquals("name1 should have 2 type designations", 2, desigs1
.size());
713 Assert
.assertEquals("name2 should have 1 type designations", 1, desigs2
.size());
714 Assert
.assertEquals("name3 should have 1 type designations", 1, desigs3
.size());
715 Assert
.assertEquals("Specimen1 should be used in 1 type designation", 1, specimen1
.getSpecimenTypeDesignations().size());
716 Assert
.assertEquals("Fossil should be used in 1 type designation", 1, fossil
.getSpecimenTypeDesignations().size());
718 nameService
.deleteTypeDesignation(null, null);
720 commitAndStartNewTransaction(tableNames
);
722 name1
= this.nameService
.load(UUID
.fromString("6dbd41d1-fe13-4d9c-bb58-31f051c2c384"));
723 name2
= this.nameService
.load(UUID
.fromString("f9e9c13f-5fa5-48d3-88cf-712c921a099e"));
724 name3
= this.nameService
.load(UUID
.fromString("e1e66264-f16a-4df9-80fd-6ab5028a3c28"));
725 specimen1
= CdmBase
.deproxy(this.occurrenceService
.load(UUID
.fromString("0d19a9ca-21a7-4adb-8640-8d6719e15eea")), DerivedUnit
.class);
726 fossil
= CdmBase
.deproxy(this.occurrenceService
.load(UUID
.fromString("4c48b7c8-4c8d-4e48-b083-0837fe51a0a9")), DerivedUnit
.class);
728 desigs1
= name1
.getTypeDesignations();
729 desigs2
= name2
.getTypeDesignations();
730 desigs3
= name3
.getTypeDesignations();
731 //nothing should be deleted
732 Assert
.assertEquals("name1 should have 2 type designations", 2, desigs1
.size());
733 Assert
.assertEquals("name2 should have 1 type designations", 1, desigs2
.size());
734 Assert
.assertEquals("name3 should have 1 type designations", 1, desigs3
.size());
735 Assert
.assertEquals("Specimen1 should be used in 1 type designation", 1, specimen1
.getSpecimenTypeDesignations().size());
736 Assert
.assertEquals("Fossil should be used in 1 type designation", 1, fossil
.getSpecimenTypeDesignations().size());
738 nameService
.deleteTypeDesignation(name1
, null);
740 commitAndStartNewTransaction(tableNames
);
742 name1
= this.nameService
.load(UUID
.fromString("6dbd41d1-fe13-4d9c-bb58-31f051c2c384"));
743 name2
= this.nameService
.load(UUID
.fromString("f9e9c13f-5fa5-48d3-88cf-712c921a099e"));
744 name3
= this.nameService
.load(UUID
.fromString("e1e66264-f16a-4df9-80fd-6ab5028a3c28"));
745 specimen1
= CdmBase
.deproxy(this.occurrenceService
.load(UUID
.fromString("0d19a9ca-21a7-4adb-8640-8d6719e15eea")), DerivedUnit
.class);
746 fossil
= CdmBase
.deproxy(this.occurrenceService
.load(UUID
.fromString("4c48b7c8-4c8d-4e48-b083-0837fe51a0a9")), DerivedUnit
.class);
748 desigs1
= name1
.getTypeDesignations();
749 desigs2
= name2
.getTypeDesignations();
750 desigs3
= name3
.getTypeDesignations();
751 //only the types of name1 should be deleted
752 Assert
.assertEquals("name1 should have 0 type designations", 0, desigs1
.size());
753 Assert
.assertEquals("name2 should have 1 type designations", 1, desigs2
.size());
754 Assert
.assertEquals("name3 should have 1 type designations", 1, desigs3
.size());
755 Assert
.assertEquals("Specimen1 should be used in 1 type designation", 1, specimen1
.getSpecimenTypeDesignations().size());
756 Assert
.assertEquals("Fossil should be used in 0 type designation", 0, fossil
.getSpecimenTypeDesignations().size());
758 SpecimenTypeDesignation desig2
= (SpecimenTypeDesignation
)name2
.getTypeDesignations().iterator().next();
759 nameService
.deleteTypeDesignation(name2
, desig2
);
761 commitAndStartNewTransaction(tableNames
);
763 name1
= this.nameService
.load(UUID
.fromString("6dbd41d1-fe13-4d9c-bb58-31f051c2c384"));
764 name2
= this.nameService
.load(UUID
.fromString("f9e9c13f-5fa5-48d3-88cf-712c921a099e"));
765 name3
= this.nameService
.load(UUID
.fromString("e1e66264-f16a-4df9-80fd-6ab5028a3c28"));
766 specimen1
= CdmBase
.deproxy(this.occurrenceService
.load(UUID
.fromString("0d19a9ca-21a7-4adb-8640-8d6719e15eea")), DerivedUnit
.class);
767 fossil
= CdmBase
.deproxy(this.occurrenceService
.load(UUID
.fromString("4c48b7c8-4c8d-4e48-b083-0837fe51a0a9")), DerivedUnit
.class);
769 desigs1
= name1
.getTypeDesignations();
770 desigs2
= name2
.getTypeDesignations();
771 desigs3
= name3
.getTypeDesignations();
773 Assert
.assertEquals("name1 should have 0 type designations", 0, desigs1
.size());
774 Assert
.assertEquals("name2 should have 0 type designations", 0, desigs2
.size());
775 Assert
.assertEquals("name3 should have 1 type designations", 1, desigs3
.size());
776 Assert
.assertEquals("Specimen1 should be used in 0 type designation", 0, specimen1
.getSpecimenTypeDesignations().size());
777 Assert
.assertEquals("Fossil should be used in 0 type designation", 0, fossil
.getSpecimenTypeDesignations().size());
779 NameTypeDesignation desig3
= (NameTypeDesignation
)name3
.getTypeDesignations().iterator().next();
780 name3
.addTypeDesignation(SpecimenTypeDesignation
.NewInstance(), false);
781 this.nameService
.update(name3
);
783 this.nameService
.load(UUID
.fromString("e1e66264-f16a-4df9-80fd-6ab5028a3c28"));
784 desigs3
= name3
.getTypeDesignations();
785 Assert
.assertEquals("name3 should have 2 type designations", 2, desigs3
.size());
787 nameService
.deleteTypeDesignation(name3
, desig3
);
788 commitAndStartNewTransaction(tableNames
);
791 name1
= this.nameService
.load(UUID
.fromString("6dbd41d1-fe13-4d9c-bb58-31f051c2c384"));
792 name2
= this.nameService
.load(UUID
.fromString("f9e9c13f-5fa5-48d3-88cf-712c921a099e"));
793 name3
= this.nameService
.load(UUID
.fromString("e1e66264-f16a-4df9-80fd-6ab5028a3c28"));
794 specimen1
= CdmBase
.deproxy(this.occurrenceService
.load(UUID
.fromString("0d19a9ca-21a7-4adb-8640-8d6719e15eea")), DerivedUnit
.class);
795 fossil
= CdmBase
.deproxy(this.occurrenceService
.load(UUID
.fromString("4c48b7c8-4c8d-4e48-b083-0837fe51a0a9")), DerivedUnit
.class);
797 desigs1
= name1
.getTypeDesignations();
798 desigs2
= name2
.getTypeDesignations();
799 desigs3
= name3
.getTypeDesignations();
801 Assert
.assertEquals("name1 should have 0 type designations", 0, desigs1
.size());
802 Assert
.assertEquals("name2 should have 0 type designations", 0, desigs2
.size());
803 Assert
.assertEquals("name3 should have 0 type designations", 1, desigs3
.size());
804 Assert
.assertEquals("Specimen1 should be used in 0 type designation", 0, specimen1
.getSpecimenTypeDesignations().size());
805 Assert
.assertEquals("Fossil should be used in 0 type designation", 0, fossil
.getSpecimenTypeDesignations().size());
811 public void testDeleteTypeDesignationAllNames() {
812 final String
[] tableNames
= new String
[]{
813 "TaxonNameBase","TypeDesignationBase",
814 "TaxonNameBase_TypeDesignationBase","SpecimenOrObservationBase"};
817 TaxonNameBase name1
= this.nameService
.load(UUID
.fromString("6dbd41d1-fe13-4d9c-bb58-31f051c2c384"));
818 TaxonNameBase name2
= this.nameService
.load(UUID
.fromString("f9e9c13f-5fa5-48d3-88cf-712c921a099e"));
819 TaxonNameBase name3
= this.nameService
.load(UUID
.fromString("e1e66264-f16a-4df9-80fd-6ab5028a3c28"));
820 DerivedUnit specimen1
= CdmBase
.deproxy(this.occurrenceService
.load(UUID
.fromString("0d19a9ca-21a7-4adb-8640-8d6719e15eea")), DerivedUnit
.class);
821 DerivedUnit fossil
= CdmBase
.deproxy(this.occurrenceService
.load(UUID
.fromString("4c48b7c8-4c8d-4e48-b083-0837fe51a0a9")), DerivedUnit
.class);
823 Set
<TypeDesignationBase
> desigs1
= name1
.getTypeDesignations();
824 Set
<TypeDesignationBase
> desigs2
= name2
.getTypeDesignations();
825 Set
<TypeDesignationBase
> desigs3
= name3
.getTypeDesignations();
827 Assert
.assertEquals("name1 should have 2 type designations", 2, desigs1
.size());
828 Assert
.assertEquals("name2 should have 1 type designations", 1, desigs2
.size());
829 Assert
.assertEquals("name3 should have 1 type designations", 1, desigs3
.size());
830 Assert
.assertEquals("Specimen1 should be used in 1 type designation", 1, specimen1
.getSpecimenTypeDesignations().size());
831 Assert
.assertEquals("Fossil should be used in 1 type designation", 1, fossil
.getSpecimenTypeDesignations().size());
833 SpecimenTypeDesignation desig2
= (SpecimenTypeDesignation
)name2
.getTypeDesignations().iterator().next();
835 nameService
.deleteTypeDesignation(null, desig2
);
837 commitAndStartNewTransaction(tableNames
);
839 name1
= this.nameService
.load(UUID
.fromString("6dbd41d1-fe13-4d9c-bb58-31f051c2c384"));
840 name2
= this.nameService
.load(UUID
.fromString("f9e9c13f-5fa5-48d3-88cf-712c921a099e"));
841 name3
= this.nameService
.load(UUID
.fromString("e1e66264-f16a-4df9-80fd-6ab5028a3c28"));
842 specimen1
= CdmBase
.deproxy(this.occurrenceService
.load(UUID
.fromString("0d19a9ca-21a7-4adb-8640-8d6719e15eea")), DerivedUnit
.class);
843 fossil
= CdmBase
.deproxy(this.occurrenceService
.load(UUID
.fromString("4c48b7c8-4c8d-4e48-b083-0837fe51a0a9")), DerivedUnit
.class);
845 desigs1
= name1
.getTypeDesignations();
846 desigs2
= name2
.getTypeDesignations();
847 desigs3
= name3
.getTypeDesignations();
849 Assert
.assertEquals("name1 should have 1 type designations", 1, desigs1
.size());
850 Assert
.assertEquals("name2 should have 0 type designations", 0, desigs2
.size());
851 Assert
.assertEquals("name3 should have 1 type designations", 1, desigs3
.size());
852 Assert
.assertEquals("Specimen1 should be used in 0 type designation", 0, specimen1
.getSpecimenTypeDesignations().size());
853 Assert
.assertEquals("Fossil should be used in 1 type designation", 1, fossil
.getSpecimenTypeDesignations().size());
860 private Rank
getSpeciesRank() {
861 return (Rank
)termService
.find(Rank
.uuidSpecies
);
867 private Rank
getGenusRank() {
868 return (Rank
)termService
.find(Rank
.uuidGenus
);
872 * @see eu.etaxonomy.cdm.test.integration.CdmIntegrationTest#createTestData()
875 public void createTestDataSet() throws FileNotFoundException
{
876 // TODO Auto-generated method stub