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 static org
.junit
.Assert
.assertEquals
;
12 import static org
.junit
.Assert
.assertNotNull
;
13 import static org
.junit
.Assert
.assertSame
;
15 import java
.io
.FileOutputStream
;
17 import java
.util
.UUID
;
19 import org
.apache
.log4j
.Logger
;
20 import org
.junit
.Assert
;
21 import org
.junit
.Ignore
;
22 import org
.junit
.Test
;
23 import org
.unitils
.dbunit
.annotation
.DataSet
;
24 import org
.unitils
.spring
.annotation
.SpringBeanByType
;
26 import eu
.etaxonomy
.cdm
.api
.service
.config
.NameDeletionConfigurator
;
27 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
28 import eu
.etaxonomy
.cdm
.model
.common
.DescriptionElementSource
;
29 import eu
.etaxonomy
.cdm
.model
.common
.Language
;
30 import eu
.etaxonomy
.cdm
.model
.common
.OrderedTermVocabulary
;
31 import eu
.etaxonomy
.cdm
.model
.description
.Feature
;
32 import eu
.etaxonomy
.cdm
.model
.description
.TaxonDescription
;
33 import eu
.etaxonomy
.cdm
.model
.description
.TaxonNameDescription
;
34 import eu
.etaxonomy
.cdm
.model
.description
.TextData
;
35 import eu
.etaxonomy
.cdm
.model
.name
.BotanicalName
;
36 import eu
.etaxonomy
.cdm
.model
.name
.HybridRelationshipType
;
37 import eu
.etaxonomy
.cdm
.model
.name
.NameRelationship
;
38 import eu
.etaxonomy
.cdm
.model
.name
.NameRelationshipType
;
39 import eu
.etaxonomy
.cdm
.model
.name
.NameTypeDesignation
;
40 import eu
.etaxonomy
.cdm
.model
.name
.NameTypeDesignationStatus
;
41 import eu
.etaxonomy
.cdm
.model
.name
.NomenclaturalStatus
;
42 import eu
.etaxonomy
.cdm
.model
.name
.NomenclaturalStatusType
;
43 import eu
.etaxonomy
.cdm
.model
.name
.NonViralName
;
44 import eu
.etaxonomy
.cdm
.model
.name
.Rank
;
45 import eu
.etaxonomy
.cdm
.model
.name
.SpecimenTypeDesignation
;
46 import eu
.etaxonomy
.cdm
.model
.name
.SpecimenTypeDesignationStatus
;
47 import eu
.etaxonomy
.cdm
.model
.name
.TaxonNameBase
;
48 import eu
.etaxonomy
.cdm
.model
.name
.TypeDesignationBase
;
49 import eu
.etaxonomy
.cdm
.model
.occurrence
.Fossil
;
50 import eu
.etaxonomy
.cdm
.model
.occurrence
.Specimen
;
51 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
52 import eu
.etaxonomy
.cdm
.test
.integration
.CdmTransactionalIntegrationTest
;
54 import eu
.etaxonomy
.cdm
.test
.unitils
.CleanSweepInsertLoadStrategy
;
60 public class NameServiceImplTest
extends CdmTransactionalIntegrationTest
{
61 private static final Logger logger
= Logger
.getLogger(NameServiceImplTest
.class);
64 private INameService nameService
;
67 private IOccurrenceService occurrenceService
;
70 private ITaxonService taxonService
;
73 private ITermService termService
;
76 /* ******************** TESTS ********************************************/
79 * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#setDao(eu.etaxonomy.cdm.persistence.dao.name.ITaxonNameDao)}.
82 public void testSetDao() {
83 // Assert.assertNotNull(((NameServiceImpl)nameService).dao);
87 * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#setVocabularyDao(eu.etaxonomy.cdm.persistence.dao.common.ITermVocabularyDao)}.
90 public void testSetVocabularyDao() {
91 // Assert.assertNotNull(( (NameServiceImpl)nameService).vocabularyDao);
95 * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#getNamesByName(java.lang.String)}.
98 public void testGetNamesByName() {
99 logger
.warn("Not yet implemented");
103 * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#getTaxonNameByUuid(java.util.UUID)}.
106 public void testGetTaxonNameByUuid() {
107 logger
.warn("Not yet implemented");
111 * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#saveTaxonName(eu.etaxonomy.cdm.model.name.TaxonNameBase)}.
114 public void testSaveTaxonName() {
115 logger
.warn("Not yet implemented");
119 * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#saveTaxonNameAll(java.util.Collection)}.
122 public void testSaveTaxonNameAll() {
123 logger
.warn("Not yet implemented");
127 * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#removeTaxon(eu.etaxonomy.cdm.model.name.TaxonNameBase)}.
130 public void testRemoveTaxon() {
131 logger
.warn("Not yet implemented");
135 * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#getAllNames(int, int)}.
138 public void testGetAllNames() {
139 logger
.warn("Not yet implemented");
143 * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#getRankVocabulary()}.
146 @Ignore //FIXME assertSame does not work yet
147 public void testGetRankVocabulary() {
148 //TODO move test to vocabulary service
149 OrderedTermVocabulary
<Rank
> rankVocabulary
= nameService
.getRankVocabulary();
150 assertNotNull(rankVocabulary
);
151 assertEquals(66, rankVocabulary
.size());
152 Rank highestRank
= rankVocabulary
.getHighestTerm();
153 assertEquals(Rank
.EMPIRE(), highestRank
);
154 assertEquals(Rank
.DOMAIN(), rankVocabulary
.getNextLowerTerm(highestRank
));
155 assertSame(Rank
.EMPIRE(), highestRank
);
156 assertSame(Rank
.DOMAIN(), rankVocabulary
.getNextLowerTerm(highestRank
));
160 * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#getTypeDesignationVocabulary()}.
163 @Ignore //not yet correctly implemented
164 public void testGetTypeDesignationVocabulary() {
165 //TODO move test to vocabulary service
166 OrderedTermVocabulary
<SpecimenTypeDesignationStatus
> typeDesignationVocabulary
=
167 nameService
.getSpecimenTypeDesignationVocabulary();
168 assertNotNull(typeDesignationVocabulary
);
169 assertEquals(20, typeDesignationVocabulary
.size());
170 SpecimenTypeDesignationStatus highestType
= typeDesignationVocabulary
.getHighestTerm();
171 assertEquals(SpecimenTypeDesignationStatus
.EPITYPE(), highestType
);
172 assertEquals(SpecimenTypeDesignationStatus
.HOLOTYPE(), typeDesignationVocabulary
.getNextLowerTerm(highestType
));
173 assertSame(SpecimenTypeDesignationStatus
.EPITYPE(), highestType
);
174 assertSame(SpecimenTypeDesignationStatus
.HOLOTYPE(), typeDesignationVocabulary
.getNextLowerTerm(highestType
));
178 * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#generateTitleCache()}.
181 public void testGenerateTitleCache() {
182 logger
.warn("Not yet implemented");
186 * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#generateTitleCache()}.
189 @DataSet(loadStrategy
=CleanSweepInsertLoadStrategy
.class)
190 public void testDeleteTaxonNameBaseWithNameRelations() {
191 final String
[] tableNames
= new String
[]{"TaxonNameBase","NameRelationship","HybridRelationship","DescriptionBase","NomenclaturalStatus","TaxonBase","SpecimenOrObservationBase","OriginalSourceBase","DescriptionElementBase"};
193 NonViralName
<?
> name1
= BotanicalName
.NewInstance(getSpeciesRank());
194 name1
.setTitleCache("Name1", true);
195 TaxonNameBase
<?
,?
> nameWithBasionym
= BotanicalName
.NewInstance(getSpeciesRank());
196 nameWithBasionym
.setTitleCache("nameWithBasionym", true);
198 NameRelationshipType nameRelType
= (NameRelationshipType
)termService
.find(NameRelationshipType
.BASIONYM().getUuid());
199 name1
.addRelationshipToName(nameWithBasionym
,nameRelType
, null, null, null);
200 // nameWithBasionym.addBasionym(name1);
201 nameService
.save(name1
);
202 commitAndStartNewTransaction(tableNames
);
205 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
206 nameService
.delete(name1
);
207 Assert
.fail("Delete should throw an error as long as name relationships exist.");
208 } catch (Exception e
) {
209 if (e
.getMessage().contains("Name can't be deleted as it is used in name relationship")){
211 endTransaction(); //exception rolls back transaction!
212 // printDataSet(System.out, tableNames);
213 startNewTransaction();
215 Assert
.fail("Unexpected error occurred when trying to delete taxon name: " + e
.getMessage());
218 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
219 Assert
.assertNotNull("Name should still be in database",name1
);
220 nameWithBasionym
= ((NameRelationship
)name1
.getNameRelations().iterator().next()).getToName();
221 nameWithBasionym
.removeBasionyms();
222 nameService
.delete(name1
); //should throw now exception
223 commitAndStartNewTransaction(tableNames
);
224 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
225 Assert
.assertNull("Name should not be in database anymore",name1
);
231 * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#generateTitleCache()}.
235 @DataSet(loadStrategy
=CleanSweepInsertLoadStrategy
.class)
236 public void testDeleteTaxonNameBaseConfiguratorWithNameRelations() {
237 final String
[] tableNames
= new String
[]{"TaxonNameBase","NameRelationship","HybridRelationship"};
239 NonViralName
<?
> name1
= BotanicalName
.NewInstance(getSpeciesRank());
240 name1
.setTitleCache("Name1", true);
241 TaxonNameBase
<?
,?
> nameWithBasionym
= BotanicalName
.NewInstance(getSpeciesRank());
242 nameWithBasionym
.setTitleCache("nameWithBasionym", true);
244 NameRelationshipType nameRelType
= (NameRelationshipType
)termService
.find(NameRelationshipType
.BASIONYM().getUuid());
245 name1
.addRelationshipToName(nameWithBasionym
,nameRelType
, null, null, null);
246 nameService
.save(name1
);
247 commitAndStartNewTransaction(tableNames
);
248 NameDeletionConfigurator config
= new NameDeletionConfigurator();
250 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
251 nameService
.delete(name1
, config
);
252 Assert
.fail("Delete should throw an error as long as name relationships exist.");
253 } catch (Exception e
) {
254 if (e
.getMessage().startsWith("Name can't be deleted as it is used in name relationship")){
256 endTransaction(); //exception rolls back transaction!
257 // printDataSet(System.out, tableNames);
258 startNewTransaction();
260 Assert
.fail("Unexpected error occurred when trying to delete taxon name: " + e
.getMessage());
263 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
264 Assert
.assertNotNull("Name should still be in database",name1
);
266 //ignore is basionym for
267 config
.setIgnoreIsBasionymFor(true);
269 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
270 nameService
.delete(name1
, config
);
271 commitAndStartNewTransaction(tableNames
);
272 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
273 Assert
.assertNull("Name should not be in database anymore",name1
);
274 } catch (Exception e
) {
275 Assert
.fail("Delete should not throw an error for .");
280 * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#generateTitleCache()}.
283 public void testDeleteTaxonNameBaseConfiguratorWithNameRelationsAll() {
284 final String
[] tableNames
= new String
[]{"TaxonNameBase","NameRelationship","HybridRelationship"};
286 NonViralName
<?
> name1
= BotanicalName
.NewInstance(getSpeciesRank());
287 name1
.setTitleCache("Name1", true);
288 TaxonNameBase
<?
,?
> nameWithBasionym
= BotanicalName
.NewInstance(getSpeciesRank());
289 nameWithBasionym
.setTitleCache("nameWithBasionym", true);
291 NameRelationshipType nameRelType
= (NameRelationshipType
)termService
.find(NameRelationshipType
.BASIONYM().getUuid());
292 name1
.addRelationshipToName(nameWithBasionym
,nameRelType
, null, null, null);
293 nameService
.save(name1
);
294 commitAndStartNewTransaction(tableNames
);
295 NameDeletionConfigurator config
= new NameDeletionConfigurator();
297 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
298 nameService
.delete(name1
, config
);
299 Assert
.fail("Delete should throw an error as long as name relationships exist.");
300 } catch (Exception e
) {
301 if (e
.getMessage().startsWith("Name can't be deleted as it is used in name relationship")){
303 endTransaction(); //exception rolls back transaction!
304 // printDataSet(System.out, tableNames);
305 startNewTransaction();
307 Assert
.fail("Unexpected error occurred when trying to delete taxon name: " + e
.getMessage());
310 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
311 Assert
.assertNotNull("Name should still be in database",name1
);
313 //ignore all name relationships
314 config
.setRemoveAllNameRelationships(true);
316 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
317 nameService
.delete(name1
, config
);
318 commitAndStartNewTransaction(tableNames
);
319 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
320 Assert
.assertNull("Name should not be in database anymore",name1
);
321 } catch (Exception e
) {
322 Assert
.fail("Delete should not throw an error for .");
327 * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#generateTitleCache()}.
330 public void testDeleteTaxonNameBaseConfiguratorWithHasBasionym() {
331 final String
[] tableNames
= new String
[]{"TaxonNameBase","NameRelationship","HybridRelationship"};
333 NonViralName
<?
> name1
= BotanicalName
.NewInstance(getSpeciesRank());
334 name1
.setTitleCache("Name1", true);
335 TaxonNameBase
<?
,?
> basionym
= BotanicalName
.NewInstance(getSpeciesRank());
336 basionym
.setTitleCache("basionym", true);
338 NameRelationshipType nameRelType
= (NameRelationshipType
)termService
.find(NameRelationshipType
.BASIONYM().getUuid());
339 basionym
.addRelationshipToName(name1
,nameRelType
, null, null, null);
340 nameService
.save(name1
);
341 commitAndStartNewTransaction(tableNames
);
342 NameDeletionConfigurator config
= new NameDeletionConfigurator();
343 config
.setIgnoreHasBasionym(false);
345 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
346 nameService
.delete(name1
, config
);
347 Assert
.fail("Delete should throw an error as long as name relationships exist.");
348 } catch (Exception e
) {
349 if (e
.getMessage().startsWith("Name can't be deleted as it is used in name relationship")){
351 endTransaction(); //exception rolls back transaction!
352 // printDataSet(System.out, tableNames);
353 startNewTransaction();
355 Assert
.fail("Unexpected error occurred when trying to delete taxon name: " + e
.getMessage());
358 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
359 Assert
.assertNotNull("Name should still be in database",name1
);
361 //ignore has basionym
362 config
.setIgnoreHasBasionym(true);
364 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
365 nameService
.delete(name1
, config
);
366 commitAndStartNewTransaction(tableNames
);
367 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
368 Assert
.assertNull("Name should not be in database anymore",name1
);
369 } catch (Exception e
) {
370 Assert
.fail("Delete should not throw an error for .");
376 * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#generateTitleCache()}.
379 @Ignore //currently does not run in suite
380 public void testDeleteTaxonNameBaseWithHybridRelations() {
381 final String
[] tableNames
= new String
[]{"TaxonNameBase","NameRelationship","HybridRelationship"};
383 NonViralName
<?
> name1
= BotanicalName
.NewInstance(getSpeciesRank());
384 name1
.setTitleCache("Name1", true);
385 NonViralName
<?
> parent
= BotanicalName
.NewInstance(getSpeciesRank());
386 parent
.setTitleCache("parent", true);
387 NonViralName
<?
> child
= BotanicalName
.NewInstance(getSpeciesRank());
388 child
.setTitleCache("child", true);
390 HybridRelationshipType relType
= (HybridRelationshipType
)termService
.find(HybridRelationshipType
.FIRST_PARENT().getUuid());
391 name1
.addHybridParent(parent
, relType
, null);
392 nameService
.save(name1
);
393 commitAndStartNewTransaction(tableNames
); //otherwise first save is rolled back with following failing delete
394 Assert
.assertEquals("'Parent' should be a parent in a hybrid relation.", 1,parent
.getHybridParentRelations().size());
395 // printDataSet(System.out, tableNames);
399 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
400 nameService
.delete(name1
);
401 //delete via cascade -> no exception
402 } catch (Exception e
) {
403 Assert
.fail("Delete should throw NO exception when deleting a hybrid child: " + e
.getMessage());
405 commitAndStartNewTransaction(tableNames
);
406 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
407 Assert
.assertNull("Name should not be in database anymore",name1
);
408 parent
= (NonViralName
<?
>)nameService
.find(parent
.getUuid());
409 Assert
.assertEquals("'Parent' should not be a parent anymore.", 0,parent
.getHybridParentRelations().size());
412 name1
= BotanicalName
.NewInstance(getSpeciesRank());
413 name1
.addHybridChild(child
, relType
, null);
414 nameService
.save(name1
);
415 commitAndStartNewTransaction(tableNames
);
418 nameService
.delete(name1
);
419 Assert
.fail("Delete should throw an error as long as hybrid child exist.");
420 } catch (Exception e
) {
421 if (e
.getMessage().contains("Name can't be deleted as it is a parent in")){
423 endTransaction(); //exception rolls back transaction!
424 startNewTransaction();
426 Assert
.fail("Unexpected error occurred when trying to delete taxon name: " + e
.getMessage());
429 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
430 Assert
.assertNotNull("Name should still be in database",name1
);
431 name1
.removeHybridChild(child
);
432 nameService
.delete(name1
); //should throw now exception
433 commitAndStartNewTransaction(tableNames
);
434 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
435 Assert
.assertNull("Name should not be in database anymore",name1
);
439 * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#generateTitleCache()}.
442 @Ignore //currently does not run in suite
443 public void testDeleteTaxonNameBaseInConcept() {
444 final String
[] tableNames
= new String
[]{"TaxonNameBase","TaxonBase"};
446 NonViralName
<?
> name1
= BotanicalName
.NewInstance(getSpeciesRank());
447 name1
.setTitleCache("Name1", true);
448 TaxonNameBase
<?
,?
> basionym
= BotanicalName
.NewInstance(getSpeciesRank());
449 basionym
.setTitleCache("basionym", true);
451 Taxon taxon
= Taxon
.NewInstance(name1
, null);
452 nameService
.save(name1
);
453 taxonService
.save(taxon
);
454 commitAndStartNewTransaction(tableNames
);
457 nameService
.delete(name1
);
458 Assert
.fail("Delete should throw an error as long as name is used in a concept.");
459 } catch (Exception e
) {
460 if (e
.getMessage().contains("Name can't be deleted as it is used in concept")){
462 endTransaction(); //exception rolls back transaction!
463 startNewTransaction();
465 Assert
.fail("Unexpected error occurred when trying to delete taxon name: " + e
.getMessage());
468 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
469 Assert
.assertNotNull("Name should still be in database",name1
);
470 taxon
= (Taxon
)taxonService
.find(taxon
.getUuid());
471 Assert
.assertNotNull("Taxon should still be in database",taxon
);
472 taxon
.setName(basionym
);
473 taxonService
.save(taxon
);
474 nameService
.delete(name1
); //should throw now exception
475 commitAndStartNewTransaction(tableNames
);
476 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
477 Assert
.assertNull("Name should not be in database anymore",name1
);
478 taxon
= (Taxon
)taxonService
.find(taxon
.getUuid());
479 Assert
.assertNotNull("Taxon should still be in database",taxon
);
483 * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#generateTitleCache()}.
486 @Ignore //currently does not run in suite
487 public void testDeleteTaxonNameBaseAsStoredUnder() {
488 final String
[] tableNames
= new String
[]{"TaxonNameBase","SpecimenOrObservationBase"};
490 NonViralName
<?
> name1
= BotanicalName
.NewInstance(getSpeciesRank());
491 name1
.setTitleCache("Name1", true);
492 Specimen specimen
= Specimen
.NewInstance();
493 specimen
.setStoredUnder(name1
);
495 occurrenceService
.save(specimen
);
496 nameService
.save(name1
);
498 commitAndStartNewTransaction(tableNames
);
499 nameService
.delete(name1
);
500 Assert
.fail("Delete should throw an error as long as name is used for specimen#storedUnder.");
501 } catch (Exception e
) {
502 if (e
.getMessage().contains("Name can't be deleted as it is used as derivedUnit#storedUnder")){
504 endTransaction(); //exception rolls back transaction!
505 startNewTransaction();
507 Assert
.fail("Unexpected error occurred when trying to delete taxon name: " + e
.getMessage());
510 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
511 Assert
.assertNotNull("Name should still be in database",name1
);
512 specimen
= (Specimen
)occurrenceService
.find(specimen
.getUuid());
513 Assert
.assertNotNull("Specimen should still be in database",name1
);
514 specimen
.setStoredUnder(null);
515 occurrenceService
.saveOrUpdate(specimen
);
516 nameService
.delete(name1
); //should throw now exception
517 commitAndStartNewTransaction(tableNames
);
518 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
519 Assert
.assertNull("Name should not be in database anymore",name1
);
520 specimen
= (Specimen
)occurrenceService
.find(specimen
.getUuid());
521 Assert
.assertNotNull("Specimen should still be in database",specimen
);
523 occurrenceService
.delete(specimen
); //this is to better run this test in the test suit
528 * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#generateTitleCache()}.
531 @Ignore //currently does not run in suite
532 public void testDeleteTaxonNameBaseInSource() {
533 final String
[] tableNames
= new String
[]{"TaxonNameBase","DescriptionBase","TaxonBase","OriginalSourceBase","DescriptionElementBase"};
535 NonViralName
<?
> name1
= BotanicalName
.NewInstance(getSpeciesRank());
536 name1
.setTitleCache("Name1", true);
537 TaxonNameBase
<?
,?
> taxonName
= BotanicalName
.NewInstance(getSpeciesRank());
538 taxonName
.setTitleCache("taxonName", true);
539 Taxon taxon
= Taxon
.NewInstance(taxonName
, null);
541 TaxonDescription taxonDescription
= TaxonDescription
.NewInstance(taxon
);
542 Feature feature
= (Feature
)termService
.find(Feature
.DESCRIPTION().getUuid());
543 Language lang
= (Language
)termService
.find(Language
.DEFAULT().getUuid());
544 TextData textData
= TextData
.NewInstance("Any text", lang
, null);
545 textData
.setFeature(feature
);
546 taxonDescription
.addElement(textData
);
547 DescriptionElementSource source
= DescriptionElementSource
.NewInstance(null, null, name1
, "");
548 textData
.addSource(source
);
549 taxonService
.saveOrUpdate(taxon
);
550 nameService
.save(name1
);
552 commitAndStartNewTransaction(tableNames
);
553 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
554 nameService
.delete(name1
);
555 Assert
.fail("Delete should throw an error as long as name is used in a source.");
556 } catch (Exception e
) {
557 if (e
.getMessage().contains("Name can't be deleted as it is used as descriptionElementSource#nameUsedInSource")){
559 endTransaction(); //exception rolls back transaction!
560 startNewTransaction();
562 Assert
.fail("Unexpected error occurred when trying to delete taxon name: " + e
.getMessage());
565 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
566 Assert
.assertNotNull("Name should still be in database",name1
);
567 taxon
= (Taxon
)taxonService
.find(taxon
.getUuid());
568 Assert
.assertNotNull("Taxon should still be in database",name1
);
569 source
= taxon
.getDescriptions().iterator().next().getElements().iterator().next().getSources().iterator().next();
570 source
.setNameUsedInSource(null);
571 taxonService
.saveOrUpdate(taxon
);
572 nameService
.delete(name1
); //should throw now exception
573 commitAndStartNewTransaction(tableNames
);
574 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
575 Assert
.assertNull("Name should not be in database anymore",name1
);
576 taxon
= (Taxon
)taxonService
.find(taxon
.getUuid());
577 Assert
.assertNotNull("Taxon should still be in database",taxon
);
578 source
= taxon
.getDescriptions().iterator().next().getElements().iterator().next().getSources().iterator().next();
579 Assert
.assertNull("Source should not have a nameUsedInSource anymore",source
.getNameUsedInSource());
584 * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#generateTitleCache()}.
587 @Ignore //currently does not run in suite
588 public void testDeleteTaxonNameBaseAsType() {
589 final String
[] tableNames
= new String
[]{"TaxonNameBase","TypeDesignationBase","TaxonNameBase_TypeDesignationBase"};
591 NonViralName
<?
> name1
= BotanicalName
.NewInstance(getSpeciesRank());
592 name1
.setTitleCache("Name used as type", true);
594 NonViralName
<?
> higherName
= BotanicalName
.NewInstance(getGenusRank());
595 higherName
.setTitleCache("genus name", true);
596 NameTypeDesignationStatus typeStatus
= (NameTypeDesignationStatus
)termService
.find(NameTypeDesignationStatus
.AUTOMATIC().getUuid());
597 boolean addToAllHomotypicNames
= true;
598 higherName
.addNameTypeDesignation(name1
, null, null, null, typeStatus
, addToAllHomotypicNames
);
599 nameService
.save(higherName
);
601 commitAndStartNewTransaction(tableNames
);
602 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
603 nameService
.delete(name1
);
604 Assert
.fail("Delete should throw an error as long as name is used in a type designation.");
605 } catch (Exception e
) {
606 if (e
.getMessage().contains("Name can't be deleted as it is used as a name type")){
608 endTransaction(); //exception rolls back transaction!
609 startNewTransaction();
611 Assert
.fail("Unexpected error occurred when trying to delete taxon name: " + e
.getMessage());
614 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
615 Assert
.assertNotNull("Name should still be in database",name1
);
616 higherName
= (NonViralName
<?
>)nameService
.find(higherName
.getUuid());
617 higherName
.getNameTypeDesignations().iterator().next().removeType(); //keeps the designation but removes the name from it
618 // nameService.deleteTypeDesignation(higherName,commitAndStartNewTransaction(tableNames) ); //deletes the complete designation //both options can be used
619 nameService
.delete(name1
); //should throw now exception
620 commitAndStartNewTransaction(tableNames
);
621 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
622 Assert
.assertNull("Name should not be in database anymore",name1
);
623 higherName
= (NonViralName
<?
>)nameService
.find(higherName
.getUuid());
624 Assert
.assertNotNull("Higher name should still exist in database",higherName
);
625 Assert
.assertEquals("Higher name should not have type designations anymore",1, higherName
.getTypeDesignations().size());
631 * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#generateTitleCache()}.
634 @Ignore //currently does not run in suite
635 public void testDeleteTaxonNameBase() {
636 final String
[] tableNames
= new String
[]{"TaxonNameBase","NameRelationship","HybridRelationship","DescriptionBase","NomenclaturalStatus","TaxonBase","SpecimenOrObservationBase","OriginalSourceBase","DescriptionElementBase","TypeDesignationBase","TaxonNameBase_TypeDesignationBase"};
638 NonViralName
<?
> name1
= BotanicalName
.NewInstance(getSpeciesRank());
639 name1
.setTitleCache("Name1", true);
641 //TaxonNameDescription
642 name1
= BotanicalName
.NewInstance(getSpeciesRank());
643 TaxonNameDescription
.NewInstance(name1
);
644 nameService
.saveOrUpdate(name1
);
645 commitAndStartNewTransaction(tableNames
);
647 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
648 nameService
.delete(name1
); //should throw now exception
651 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
652 Assert
.assertNull("Name should not be in database anymore",name1
);
654 // printDataSet(System.out, tableNames);
657 //NomenclaturalStatus
658 name1
= BotanicalName
.NewInstance(getSpeciesRank());
659 NomenclaturalStatusType nomStatusType
= (NomenclaturalStatusType
)termService
.find(NomenclaturalStatusType
.ILLEGITIMATE().getUuid());
660 NomenclaturalStatus status
= NomenclaturalStatus
.NewInstance(nomStatusType
);
661 name1
.addStatus(status
);
662 nameService
.saveOrUpdate(name1
);
663 commitAndStartNewTransaction(tableNames
);
665 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
666 nameService
.delete(name1
); //should throw now exception
669 // printDataSet(System.out, tableNames);
673 name1
= BotanicalName
.NewInstance(getSpeciesRank());
674 name1
.setTitleCache("Name with type designation", true);
675 SpecimenTypeDesignation typeDesignation
= SpecimenTypeDesignation
.NewInstance();
676 SpecimenTypeDesignationStatus typeStatus
= (SpecimenTypeDesignationStatus
)termService
.find(SpecimenTypeDesignationStatus
.HOLOTYPE().getUuid());
677 typeDesignation
.setTypeStatus(typeStatus
);
678 Specimen specimen
= Specimen
.NewInstance();
679 specimen
.setTitleCache("Type specimen", true);
680 occurrenceService
.save(specimen
);
681 typeDesignation
.setTypeSpecimen(specimen
);
683 name1
.addTypeDesignation(typeDesignation
, true);
684 nameService
.save(name1
);
685 commitAndStartNewTransaction(tableNames
);
686 // printDataSet(System.out, tableNames);
688 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
689 nameService
.delete(name1
); //should throw now exception
692 // printDataSet(System.out, tableNames);
697 * Test method for {@link eu.etaxonomy.cdm.api.service.NameServiceImpl#generateTitleCache()}.
700 @Ignore //currently does not run in suite
701 public void testDeleteTaxonNameBaseWithTypeInHomotypicalGroup() {
702 final String
[] tableNames
= new String
[]{"TaxonNameBase","NameRelationship","HybridRelationship","DescriptionBase","NomenclaturalStatus","TaxonBase","SpecimenOrObservationBase","OriginalSourceBase","DescriptionElementBase","TypeDesignationBase","TaxonNameBase_TypeDesignationBase"};
704 //Type Designations for homotypical group with > 1 names
705 NonViralName
<?
> name1
= BotanicalName
.NewInstance(getSpeciesRank());
706 name1
.setTitleCache("Name1 with type designation", true);
707 NonViralName
<?
> name2
= BotanicalName
.NewInstance(getSpeciesRank());
708 name2
.setTitleCache("Name2 with type designation", true);
709 name2
.setHomotypicalGroup(name1
.getHomotypicalGroup());
711 Specimen specimen
= Specimen
.NewInstance();
712 specimen
.setTitleCache("Type specimen 2", true);
713 occurrenceService
.save(specimen
);
714 SpecimenTypeDesignationStatus typeStatus
= (SpecimenTypeDesignationStatus
)termService
.find(SpecimenTypeDesignationStatus
.HOLOTYPE().getUuid());
716 SpecimenTypeDesignation typeDesignation
= SpecimenTypeDesignation
.NewInstance();
717 typeDesignation
.setTypeStatus(typeStatus
);
718 typeDesignation
.setTypeSpecimen(specimen
);
720 boolean addToAllNames
= true;
721 name1
.addTypeDesignation(typeDesignation
, addToAllNames
);
722 nameService
.saveOrUpdate(name1
);
723 commitAndStartNewTransaction(tableNames
);
725 name1
= (NonViralName
<?
>)nameService
.find(name1
.getUuid());
726 nameService
.delete(name1
); //should throw now exception
729 // printDataSet(System.out, tableNames);
734 @DataSet(loadStrategy
=CleanSweepInsertLoadStrategy
.class)
735 public void testDeleteTypeDesignation() {
736 final String
[] tableNames
= new String
[]{
737 "TaxonNameBase","TypeDesignationBase","TaxonNameBase_TypeDesignationBase",
738 "SpecimenOrObservationBase"};
740 // BotanicalName name1 = BotanicalName.NewInstance(getSpeciesRank());
741 // name1.setTitleCache("Name1");
742 // name1.setUuid(UUID.fromString("6dbd41d1-fe13-4d9c-bb58-31f051c2c384"));
744 // BotanicalName name2 = BotanicalName.NewInstance(getSpeciesRank());
745 // name2.setTitleCache("Name2");
746 // name2.setUuid(UUID.fromString("f9e9c13f-5fa5-48d3-88cf-712c921a099e"));
748 // BotanicalName name3 = BotanicalName.NewInstance(getGenusRank());
749 // name3.setTitleCache("Name3");
750 // name3.setUuid(UUID.fromString("e1e66264-f16a-4df9-80fd-6ab5028a3c28"));
753 // SpecimenTypeDesignation desig1 = SpecimenTypeDesignation.NewInstance();
754 // desig1.setUuid(UUID.fromString("1357c307-00c3-499c-8e20-0849d4706125"));
755 // name1.addTypeDesignation(desig1, true);
756 // name2.addTypeDesignation(desig1, true);
758 // SpecimenTypeDesignation desig2 = SpecimenTypeDesignation.NewInstance();
759 // desig2.setUuid(UUID.fromString("9bbda70b-7272-4e65-a807-852a3f2eba63"));
760 // name1.addTypeDesignation(desig2, true);
762 // Specimen specimen1 = Specimen.NewInstance();
763 // Fossil specimen2 = Fossil.NewInstance();
765 // desig1.setTypeSpecimen(specimen1);
766 // desig2.setTypeSpecimen(specimen2);
768 // NameTypeDesignation nameDesig = NameTypeDesignation.NewInstance();
769 // nameDesig.setTypeName(name1);
770 // name3.addTypeDesignation(nameDesig, true);
772 // nameService.save(name1);
773 // nameService.save(name2);
774 // nameService.save(name3);
776 // commitAndStartNewTransaction(tableNames);
778 // printDataSet(System.out, tableNames);
782 TaxonNameBase name1
= this.nameService
.load(UUID
.fromString("6dbd41d1-fe13-4d9c-bb58-31f051c2c384"));
783 TaxonNameBase name2
= this.nameService
.load(UUID
.fromString("f9e9c13f-5fa5-48d3-88cf-712c921a099e"));
784 TaxonNameBase name3
= this.nameService
.load(UUID
.fromString("e1e66264-f16a-4df9-80fd-6ab5028a3c28"));
785 Specimen specimen1
= CdmBase
.deproxy(this.occurrenceService
.load(UUID
.fromString("0d19a9ca-21a7-4adb-8640-8d6719e15eea")),Specimen
.class);
786 Fossil fossil
= CdmBase
.deproxy(this.occurrenceService
.load(UUID
.fromString("4c48b7c8-4c8d-4e48-b083-0837fe51a0a9")),Fossil
.class);
788 Set
<TypeDesignationBase
> desigs1
= name1
.getTypeDesignations();
789 Set
<TypeDesignationBase
> desigs2
= name2
.getTypeDesignations();
790 Set
<TypeDesignationBase
> desigs3
= name3
.getTypeDesignations();
792 Assert
.assertEquals("name1 should have 2 type designations", 2, desigs1
.size());
793 Assert
.assertEquals("name2 should have 1 type designations", 1, desigs2
.size());
794 Assert
.assertEquals("name3 should have 1 type designations", 1, desigs3
.size());
795 Assert
.assertEquals("Specimen1 should be used in 1 type designation", 1, specimen1
.getSpecimenTypeDesignations().size());
796 Assert
.assertEquals("Fossil should be used in 1 type designation", 1, fossil
.getSpecimenTypeDesignations().size());
798 nameService
.deleteTypeDesignation(null, null);
800 commitAndStartNewTransaction(tableNames
);
802 name1
= this.nameService
.load(UUID
.fromString("6dbd41d1-fe13-4d9c-bb58-31f051c2c384"));
803 name2
= this.nameService
.load(UUID
.fromString("f9e9c13f-5fa5-48d3-88cf-712c921a099e"));
804 name3
= this.nameService
.load(UUID
.fromString("e1e66264-f16a-4df9-80fd-6ab5028a3c28"));
805 specimen1
= CdmBase
.deproxy(this.occurrenceService
.load(UUID
.fromString("0d19a9ca-21a7-4adb-8640-8d6719e15eea")),Specimen
.class);
806 fossil
= CdmBase
.deproxy(this.occurrenceService
.load(UUID
.fromString("4c48b7c8-4c8d-4e48-b083-0837fe51a0a9")),Fossil
.class);
808 desigs1
= name1
.getTypeDesignations();
809 desigs2
= name2
.getTypeDesignations();
810 desigs3
= name3
.getTypeDesignations();
812 Assert
.assertEquals("name1 should have 2 type designations", 2, desigs1
.size());
813 Assert
.assertEquals("name2 should have 1 type designations", 1, desigs2
.size());
814 Assert
.assertEquals("name3 should have 1 type designations", 1, desigs3
.size());
815 Assert
.assertEquals("Specimen1 should be used in 1 type designation", 1, specimen1
.getSpecimenTypeDesignations().size());
816 Assert
.assertEquals("Fossil should be used in 1 type designation", 1, fossil
.getSpecimenTypeDesignations().size());
818 nameService
.deleteTypeDesignation(name1
, null);
820 commitAndStartNewTransaction(tableNames
);
822 name1
= this.nameService
.load(UUID
.fromString("6dbd41d1-fe13-4d9c-bb58-31f051c2c384"));
823 name2
= this.nameService
.load(UUID
.fromString("f9e9c13f-5fa5-48d3-88cf-712c921a099e"));
824 name3
= this.nameService
.load(UUID
.fromString("e1e66264-f16a-4df9-80fd-6ab5028a3c28"));
825 specimen1
= CdmBase
.deproxy(this.occurrenceService
.load(UUID
.fromString("0d19a9ca-21a7-4adb-8640-8d6719e15eea")),Specimen
.class);
826 fossil
= CdmBase
.deproxy(this.occurrenceService
.load(UUID
.fromString("4c48b7c8-4c8d-4e48-b083-0837fe51a0a9")),Fossil
.class);
828 desigs1
= name1
.getTypeDesignations();
829 desigs2
= name2
.getTypeDesignations();
830 desigs3
= name3
.getTypeDesignations();
832 Assert
.assertEquals("name1 should have 0 type designations", 0, desigs1
.size());
833 Assert
.assertEquals("name2 should have 1 type designations", 1, desigs2
.size());
834 Assert
.assertEquals("name3 should have 1 type designations", 1, desigs3
.size());
835 Assert
.assertEquals("Specimen1 should be used in 1 type designation", 1, specimen1
.getSpecimenTypeDesignations().size());
836 Assert
.assertEquals("Fossil should be used in 0 type designation", 0, fossil
.getSpecimenTypeDesignations().size());
838 SpecimenTypeDesignation desig2
= (SpecimenTypeDesignation
)name2
.getTypeDesignations().iterator().next();
839 nameService
.deleteTypeDesignation(name2
, desig2
);
841 commitAndStartNewTransaction(tableNames
);
843 name1
= this.nameService
.load(UUID
.fromString("6dbd41d1-fe13-4d9c-bb58-31f051c2c384"));
844 name2
= this.nameService
.load(UUID
.fromString("f9e9c13f-5fa5-48d3-88cf-712c921a099e"));
845 name3
= this.nameService
.load(UUID
.fromString("e1e66264-f16a-4df9-80fd-6ab5028a3c28"));
846 specimen1
= CdmBase
.deproxy(this.occurrenceService
.load(UUID
.fromString("0d19a9ca-21a7-4adb-8640-8d6719e15eea")),Specimen
.class);
847 fossil
= CdmBase
.deproxy(this.occurrenceService
.load(UUID
.fromString("4c48b7c8-4c8d-4e48-b083-0837fe51a0a9")),Fossil
.class);
849 desigs1
= name1
.getTypeDesignations();
850 desigs2
= name2
.getTypeDesignations();
851 desigs3
= name3
.getTypeDesignations();
853 Assert
.assertEquals("name1 should have 0 type designations", 0, desigs1
.size());
854 Assert
.assertEquals("name2 should have 0 type designations", 0, desigs2
.size());
855 Assert
.assertEquals("name3 should have 1 type designations", 1, desigs3
.size());
856 Assert
.assertEquals("Specimen1 should be used in 0 type designation", 0, specimen1
.getSpecimenTypeDesignations().size());
857 Assert
.assertEquals("Fossil should be used in 0 type designation", 0, fossil
.getSpecimenTypeDesignations().size());
859 NameTypeDesignation desig3
= (NameTypeDesignation
)name3
.getTypeDesignations().iterator().next();
860 nameService
.deleteTypeDesignation(name3
, desig3
);
862 commitAndStartNewTransaction(tableNames
);
864 name1
= this.nameService
.load(UUID
.fromString("6dbd41d1-fe13-4d9c-bb58-31f051c2c384"));
865 name2
= this.nameService
.load(UUID
.fromString("f9e9c13f-5fa5-48d3-88cf-712c921a099e"));
866 name3
= this.nameService
.load(UUID
.fromString("e1e66264-f16a-4df9-80fd-6ab5028a3c28"));
867 specimen1
= CdmBase
.deproxy(this.occurrenceService
.load(UUID
.fromString("0d19a9ca-21a7-4adb-8640-8d6719e15eea")),Specimen
.class);
868 fossil
= CdmBase
.deproxy(this.occurrenceService
.load(UUID
.fromString("4c48b7c8-4c8d-4e48-b083-0837fe51a0a9")),Fossil
.class);
870 desigs1
= name1
.getTypeDesignations();
871 desigs2
= name2
.getTypeDesignations();
872 desigs3
= name3
.getTypeDesignations();
874 Assert
.assertEquals("name1 should have 0 type designations", 0, desigs1
.size());
875 Assert
.assertEquals("name2 should have 0 type designations", 0, desigs2
.size());
876 Assert
.assertEquals("name3 should have 0 type designations", 0, desigs3
.size());
877 Assert
.assertEquals("Specimen1 should be used in 0 type designation", 0, specimen1
.getSpecimenTypeDesignations().size());
878 Assert
.assertEquals("Fossil should be used in 0 type designation", 0, fossil
.getSpecimenTypeDesignations().size());
884 public void testDeleteTypeDesignationAllNames() {
885 final String
[] tableNames
= new String
[]{
886 "TaxonNameBase","TypeDesignationBase",
887 "TaxonNameBase_TypeDesignationBase","SpecimenOrObservationBase"};
890 TaxonNameBase name1
= this.nameService
.load(UUID
.fromString("6dbd41d1-fe13-4d9c-bb58-31f051c2c384"));
891 TaxonNameBase name2
= this.nameService
.load(UUID
.fromString("f9e9c13f-5fa5-48d3-88cf-712c921a099e"));
892 TaxonNameBase name3
= this.nameService
.load(UUID
.fromString("e1e66264-f16a-4df9-80fd-6ab5028a3c28"));
893 Specimen specimen1
= CdmBase
.deproxy(this.occurrenceService
.load(UUID
.fromString("0d19a9ca-21a7-4adb-8640-8d6719e15eea")),Specimen
.class);
894 Fossil fossil
= CdmBase
.deproxy(this.occurrenceService
.load(UUID
.fromString("4c48b7c8-4c8d-4e48-b083-0837fe51a0a9")),Fossil
.class);
896 Set
<TypeDesignationBase
> desigs1
= name1
.getTypeDesignations();
897 Set
<TypeDesignationBase
> desigs2
= name2
.getTypeDesignations();
898 Set
<TypeDesignationBase
> desigs3
= name3
.getTypeDesignations();
900 Assert
.assertEquals("name1 should have 2 type designations", 2, desigs1
.size());
901 Assert
.assertEquals("name2 should have 1 type designations", 1, desigs2
.size());
902 Assert
.assertEquals("name3 should have 1 type designations", 1, desigs3
.size());
903 Assert
.assertEquals("Specimen1 should be used in 1 type designation", 1, specimen1
.getSpecimenTypeDesignations().size());
904 Assert
.assertEquals("Fossil should be used in 1 type designation", 1, fossil
.getSpecimenTypeDesignations().size());
906 SpecimenTypeDesignation desig2
= (SpecimenTypeDesignation
)name2
.getTypeDesignations().iterator().next();
908 nameService
.deleteTypeDesignation(null, desig2
);
910 commitAndStartNewTransaction(tableNames
);
912 name1
= this.nameService
.load(UUID
.fromString("6dbd41d1-fe13-4d9c-bb58-31f051c2c384"));
913 name2
= this.nameService
.load(UUID
.fromString("f9e9c13f-5fa5-48d3-88cf-712c921a099e"));
914 name3
= this.nameService
.load(UUID
.fromString("e1e66264-f16a-4df9-80fd-6ab5028a3c28"));
915 specimen1
= CdmBase
.deproxy(this.occurrenceService
.load(UUID
.fromString("0d19a9ca-21a7-4adb-8640-8d6719e15eea")),Specimen
.class);
916 fossil
= CdmBase
.deproxy(this.occurrenceService
.load(UUID
.fromString("4c48b7c8-4c8d-4e48-b083-0837fe51a0a9")),Fossil
.class);
918 desigs1
= name1
.getTypeDesignations();
919 desigs2
= name2
.getTypeDesignations();
920 desigs3
= name3
.getTypeDesignations();
922 Assert
.assertEquals("name1 should have 1 type designations", 1, desigs1
.size());
923 Assert
.assertEquals("name2 should have 0 type designations", 0, desigs2
.size());
924 Assert
.assertEquals("name3 should have 1 type designations", 1, desigs3
.size());
925 Assert
.assertEquals("Specimen1 should be used in 0 type designation", 0, specimen1
.getSpecimenTypeDesignations().size());
926 Assert
.assertEquals("Fossil should be used in 1 type designation", 1, fossil
.getSpecimenTypeDesignations().size());
933 private Rank
getSpeciesRank() {
934 return (Rank
)termService
.find(Rank
.uuidSpecies
);
940 private Rank
getGenusRank() {
941 return (Rank
)termService
.find(Rank
.uuidGenus
);