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.
10 package eu
.etaxonomy
.cdm
.api
.service
;
12 import static org
.junit
.Assert
.*;
13 import static org
.junit
.Assert
.assertNotNull
;
14 import static org
.junit
.Assert
.assertTrue
;
16 import java
.io
.FileNotFoundException
;
17 import java
.io
.FileOutputStream
;
18 import java
.io
.IOException
;
19 import java
.util
.Arrays
;
20 import java
.util
.List
;
22 import java
.util
.UUID
;
24 import org
.apache
.commons
.lang
.RandomStringUtils
;
25 import org
.apache
.log4j
.Logger
;
26 import org
.apache
.lucene
.document
.Document
;
27 import org
.apache
.lucene
.index
.CorruptIndexException
;
28 import org
.apache
.lucene
.queryParser
.ParseException
;
29 import org
.junit
.Assert
;
30 import org
.junit
.Ignore
;
31 import org
.junit
.Test
;
32 import org
.unitils
.dbunit
.annotation
.DataSet
;
33 import org
.unitils
.spring
.annotation
.SpringBeanByType
;
35 import com
.mchange
.util
.AssertException
;
37 import eu
.etaxonomy
.cdm
.api
.service
.config
.ITaxonServiceConfigurator
;
38 import eu
.etaxonomy
.cdm
.api
.service
.config
.TaxonServiceConfiguratorImpl
;
39 import eu
.etaxonomy
.cdm
.api
.service
.pager
.Pager
;
40 import eu
.etaxonomy
.cdm
.api
.service
.search
.SearchResult
;
41 import eu
.etaxonomy
.cdm
.model
.common
.IdentifiableEntity
;
42 import eu
.etaxonomy
.cdm
.model
.common
.Language
;
43 import eu
.etaxonomy
.cdm
.model
.description
.CategoricalData
;
44 import eu
.etaxonomy
.cdm
.model
.description
.CommonTaxonName
;
45 import eu
.etaxonomy
.cdm
.model
.description
.DescriptionBase
;
46 import eu
.etaxonomy
.cdm
.model
.description
.DescriptionElementBase
;
47 import eu
.etaxonomy
.cdm
.model
.description
.Distribution
;
48 import eu
.etaxonomy
.cdm
.model
.description
.Feature
;
49 import eu
.etaxonomy
.cdm
.model
.description
.Modifier
;
50 import eu
.etaxonomy
.cdm
.model
.description
.State
;
51 import eu
.etaxonomy
.cdm
.model
.description
.StateData
;
52 import eu
.etaxonomy
.cdm
.model
.description
.TaxonDescription
;
53 import eu
.etaxonomy
.cdm
.model
.description
.TextData
;
54 import eu
.etaxonomy
.cdm
.model
.name
.BotanicalName
;
55 import eu
.etaxonomy
.cdm
.model
.name
.NonViralName
;
56 import eu
.etaxonomy
.cdm
.model
.name
.Rank
;
57 import eu
.etaxonomy
.cdm
.model
.name
.TaxonNameBase
;
58 import eu
.etaxonomy
.cdm
.model
.reference
.Reference
;
59 import eu
.etaxonomy
.cdm
.model
.reference
.ReferenceFactory
;
60 import eu
.etaxonomy
.cdm
.model
.taxon
.Classification
;
61 import eu
.etaxonomy
.cdm
.model
.taxon
.Synonym
;
62 import eu
.etaxonomy
.cdm
.model
.taxon
.SynonymRelationshipType
;
63 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
64 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonBase
;
65 import eu
.etaxonomy
.cdm
.persistence
.query
.MatchMode
;
66 import eu
.etaxonomy
.cdm
.search
.ICdmMassIndexer
;
67 import eu
.etaxonomy
.cdm
.test
.integration
.CdmTransactionalIntegrationTest
;
68 import eu
.etaxonomy
.cdm
.test
.unitils
.CleanSweepInsertLoadStrategy
;
72 * @author a.babadshanjan, a.kohlbecker
77 public class TaxonServiceSearchTest
extends CdmTransactionalIntegrationTest
{
79 private static final String CLASSIFICATION_UUID
= "2a5ceebb-4830-4524-b330-78461bf8cb6b";
81 private static final String D_ABIES_ALBA_UUID
= "900108d8-e6ce-495e-b32e-7aad3099135e";
83 private static final int NUM_OF_NEW_RADOM_ENTITIES
= 1000;
85 private static Logger logger
= Logger
.getLogger(TaxonServiceSearchTest
.class);
88 private ITaxonService taxonService
;
90 private ITermService termService
;
92 private IClassificationService classificationService
;
94 private IReferenceService referenceService
;
96 private IDescriptionService descriptionService
;
98 private INameService nameService
;
100 private ICdmMassIndexer indexer
;
102 private static final int BENCHMARK_ROUNDS
= 300;
105 public void testDbUnitUsageTest() throws Exception
{
106 assertNotNull("taxonService should exist", taxonService
);
107 assertNotNull("nameService should exist", nameService
);
112 * {@link eu.etaxonomy.cdm.api.service.TaxonServiceImpl#findTaxaAndNames(eu.etaxonomy.cdm.api.service.config.ITaxonServiceConfigurator)}
117 public final void testFindTaxaAndNames() {
120 ITaxonServiceConfigurator configurator
= new TaxonServiceConfiguratorImpl();
121 configurator
.setTitleSearchString("Abies*");
122 configurator
.setMatchMode(MatchMode
.BEGINNING
);
123 configurator
.setDoTaxa(true);
124 configurator
.setDoSynonyms(true);
125 configurator
.setDoNamesWithoutTaxa(true);
126 configurator
.setDoTaxaByCommonNames(true);
128 Pager
<IdentifiableEntity
> pager
= taxonService
.findTaxaAndNames(configurator
);
129 List
<IdentifiableEntity
> list
= pager
.getRecords();
131 if (logger
.isDebugEnabled()) {
132 for (int i
= 0; i
< list
.size(); i
++) {
133 String nameCache
= "";
134 if (list
.get(i
) instanceof NonViralName
) {
135 nameCache
= ((NonViralName
<?
>) list
.get(i
)).getNameCache();
136 } else if (list
.get(i
) instanceof TaxonBase
) {
137 TaxonNameBase taxonNameBase
= ((TaxonBase
) list
.get(i
)).getName();
138 nameCache
= ((NonViralName
) taxonNameBase
).getNameCache();
141 logger
.debug(list
.get(i
).getClass() + "(" + i
+ ")" + ": Name Cache = " + nameCache
+ ", Title Cache = "
142 + list
.get(i
).getTitleCache());
146 logger
.debug("number of taxa: " + list
.size());
147 assertEquals(7, list
.size());
150 // configurator.setDoTaxaByCommonNames(false);
151 // configurator.setDoMisappliedNames(true);
152 // configurator.setClassification(classificationService.load(UUID.fromString(CLASSIFICATION_UUID)));
153 // pager = taxonService.findTaxaAndNames(configurator);
154 // list = pager.getRecords();
155 // assertEquals(0, list.size());
161 * {@link eu.etaxonomy.cdm.api.service.TaxonServiceImpl#searchTaxaByName(java.lang.String, eu.etaxonomy.cdm.model.reference.Reference)}
166 public final void testSearchTaxaByName() {
167 logger
.warn("testSearchTaxaByName not yet implemented"); // TODO
170 @SuppressWarnings("rawtypes")
173 public final void testFindByDescriptionElementFullText_CommonName() throws CorruptIndexException
, IOException
, ParseException
{
175 refreshLuceneIndex();
177 Pager
<SearchResult
<TaxonBase
>> pager
;
179 pager
= taxonService
.findByDescriptionElementFullText(CommonTaxonName
.class, "Weiß*", null, null, null, null, null);
180 Assert
.assertEquals("Expecting one entity when searching for CommonTaxonName", Integer
.valueOf(1), pager
.getCount());
182 pager
= taxonService
.findByDescriptionElementFullText(CommonTaxonName
.class, "Weiß*", Arrays
.asList(new Language
[]{Language
.GERMAN()}), null, null, null, null);
183 Assert
.assertEquals("Expecting one entity when searching in German", Integer
.valueOf(1), pager
.getCount());
185 pager
= taxonService
.findByDescriptionElementFullText(CommonTaxonName
.class, "Weiß*", Arrays
.asList(new Language
[]{Language
.RUSSIAN()}), null, null, null, null);
186 Assert
.assertEquals("Expecting no entity when searching in Russian", Integer
.valueOf(0), pager
.getCount());
189 @SuppressWarnings("rawtypes")
192 public final void testFindByDescriptionElementFullText_TextData() throws CorruptIndexException
, IOException
, ParseException
{
194 refreshLuceneIndex();
196 Pager
<SearchResult
<TaxonBase
>> pager
;
197 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "Abies", null, null, null, null, null);
198 Assert
.assertEquals("Expecting one entity when searching for any TextData", Integer
.valueOf(1), pager
.getCount());
199 Assert
.assertEquals("Abies balsamea sec. ", pager
.getRecords().get(0).getEntity().getTitleCache());
200 Assert
.assertEquals("Abies balsamea sec. ", pager
.getRecords().get(0).getDoc().get("inDescription.taxon.titleCache"));
202 pager
= taxonService
.findByDescriptionElementFullText(null, "Abies", null, null, null, null, null);
203 Assert
.assertEquals("Expecting one entity when searching for any type", Integer
.valueOf(1), pager
.getCount());
205 pager
= taxonService
.findByDescriptionElementFullText(Distribution
.class, "Abies", null, null, null, null, null);
206 Assert
.assertEquals("Expecting no entity when searching for Distribution", Integer
.valueOf(0), pager
.getCount());
208 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "Бальзам", Arrays
.asList(new Language
[]{}), null, null, null, null);
209 Assert
.assertEquals("Expecting one entity", Integer
.valueOf(1), pager
.getCount());
210 Assert
.assertEquals("Abies balsamea sec. ", pager
.getRecords().get(0).getEntity().getTitleCache());
212 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "Бальзам", Arrays
.asList(new Language
[]{Language
.RUSSIAN()}), null, null, null, null);
213 Assert
.assertEquals("Expecting one entity", Integer
.valueOf(1), pager
.getCount());
214 Assert
.assertEquals("Abies balsamea sec. ", pager
.getRecords().get(0).getEntity().getTitleCache());
216 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "Бальзам", Arrays
.asList(new Language
[]{Language
.GERMAN()}), null, null, null, null);
217 Assert
.assertEquals("Expecting no entity", Integer
.valueOf(0), pager
.getCount());
219 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "Balsam-Tanne", Arrays
.asList(new Language
[]{Language
.GERMAN(), Language
.RUSSIAN()}), null, null, null, null);
220 Assert
.assertEquals("Expecting one entity", Integer
.valueOf(1), pager
.getCount());
221 Assert
.assertEquals("Abies balsamea sec. ", pager
.getRecords().get(0).getEntity().getTitleCache());
224 // modify the DescriptionElement
225 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "Balsam-Tanne", Arrays
.asList(new Language
[]{Language
.GERMAN(), Language
.RUSSIAN()}), null, null, null, null);
226 Document indexDocument
= pager
.getRecords().get(0).getDoc();
227 String
[] descriptionElementUuidStr
= indexDocument
.getValues("uuid");
228 String
[] inDescriptionUuidStr
= indexDocument
.getValues("inDescription.uuid");
230 DescriptionElementBase textData
= descriptionService
.getDescriptionElementByUuid(UUID
.fromString(descriptionElementUuidStr
[0]));
232 ((TextData
)textData
).removeText(Language
.GERMAN());
233 ((TextData
)textData
).putText(Language
.SPANISH_CASTILIAN(), "abeto balsámico");
235 descriptionService
.saveDescriptionElement(textData
);
236 commitAndStartNewTransaction(null);
237 // printDataSet(System.out, new String[] {
238 // "DESCRIPTIONELEMENTBASE", "LANGUAGESTRING", "DESCRIPTIONELEMENTBASE_LANGUAGESTRING" }
242 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "Balsam-Tanne", Arrays
.asList(new Language
[]{Language
.GERMAN(), Language
.RUSSIAN()}), null, null, null, null);
243 Assert
.assertEquals("The german 'Balsam-Tanne' TextData should no longer be indexed", Integer
.valueOf(0), pager
.getCount());
244 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "abeto", Arrays
.asList(new Language
[]{Language
.SPANISH_CASTILIAN()}), null, null, null, null);
245 Assert
.assertEquals("expecting to find the SPANISH_CATALAN 'abeto balsámico'", Integer
.valueOf(1), pager
.getCount());
246 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "balsámico", null, null, null, null, null);
247 Assert
.assertEquals("expecting to find the SPANISH_CATALAN 'abeto balsámico'", Integer
.valueOf(1), pager
.getCount());
250 // modify the DescriptionElement via the Description object
251 DescriptionBase description
= descriptionService
.find(UUID
.fromString(inDescriptionUuidStr
[0]));
252 Set
<DescriptionElementBase
> elements
= description
.getElements();
253 for( DescriptionElementBase elm
: elements
){
254 if(elm
.getUuid().toString().equals(descriptionElementUuidStr
[0])){
255 ((TextData
)elm
).removeText(Language
.SPANISH_CASTILIAN());
256 ((TextData
)elm
).putText(Language
.POLISH(), "Jodła balsamiczna");
260 descriptionService
.saveOrUpdate(description
);
261 commitAndStartNewTransaction(null);
263 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "abeto", Arrays
.asList(new Language
[]{Language
.SPANISH_CASTILIAN()}), null, null, null, null);
264 Assert
.assertEquals("The spanish 'abeto balsámico' TextData should no longer be indexed", Integer
.valueOf(0), pager
.getCount());
265 pager
= taxonService
.findByDescriptionElementFullText(TextData
.class, "balsamiczna", Arrays
.asList(new Language
[]{Language
.POLISH()}), null, null, null, null);
266 Assert
.assertEquals("expecting to find the POLISH 'Jodła balsamiczna'", Integer
.valueOf(1), pager
.getCount());
269 // String newName = "Quercus robur";
270 // taxon.setTitleCache(newName + " sec. ", true);
272 // taxonService.saveOrUpdate(taxon);
273 // commitAndStartNewTransaction(null);
275 // taxon = taxonService.load(taxon.getUuid());
276 // Assert.assertEquals(newName + " sec. ", taxon.getTitleCache());
279 @SuppressWarnings("rawtypes")
282 public final void testFindByDescriptionElementFullText_CategoricalData() throws CorruptIndexException
, IOException
, ParseException
{
284 // add CategoricalData
285 DescriptionBase d_abies_balsamea
= descriptionService
.find(UUID
.fromString(D_ABIES_ALBA_UUID
));
287 CategoricalData cdata
= CategoricalData
.NewInstance();
288 cdata
.setFeature(Feature
.DESCRIPTION());
289 State state
= State
.NewInstance("green", "green", "gn");
291 StateData statedata
= StateData
.NewInstance(state
);
292 statedata
.putModifyingText(Language
.ENGLISH(), "always, even during winter");
293 cdata
.addState(statedata
);
294 d_abies_balsamea
.addElement(cdata
);
296 termService
.save(state
);
297 descriptionService
.save(d_abies_balsamea
);
299 commitAndStartNewTransaction(null);
301 printDataSet(System
.out
, new String
[] {
302 "STATEDATA", "STATEDATA_DEFINEDTERMBASE", "STATEDATA_LANGUAGESTRING", "LANGUAGESTRING"});
304 refreshLuceneIndex();
306 Pager
<SearchResult
<TaxonBase
>> pager
;
307 pager
= taxonService
.findByDescriptionElementFullText(CategoricalData
.class, "green", null, null, null, null, null);
308 Assert
.assertEquals("Expecting one entity", Integer
.valueOf(1), pager
.getCount());
309 Assert
.assertEquals("Abies balsamea sec. ", pager
.getRecords().get(0).getEntity().getTitleCache());
310 Assert
.assertEquals("Abies balsamea sec. ", pager
.getRecords().get(0).getDoc().get("inDescription.taxon.titleCache"));
313 //TODO modify the StateData
314 TaxonBase taxon
= pager
.getRecords().get(0).getEntity();
316 String newName
= "Quercus robur";
317 taxon
.setTitleCache(newName
+ " sec. ", true);
319 taxonService
.saveOrUpdate(taxon
);
320 commitAndStartNewTransaction(null);
322 taxon
= taxonService
.load(taxon
.getUuid());
323 Assert
.assertEquals(newName
+ " sec. ", taxon
.getTitleCache());
329 private void refreshLuceneIndex() {
331 commitAndStartNewTransaction(null);
334 commitAndStartNewTransaction(null);
337 @SuppressWarnings("rawtypes")
340 public final void testFindByCommonNameHqlBenchmark() throws CorruptIndexException
, IOException
, ParseException
{
342 // printDataSet(System.err, new String[] { "TaxonBase" });
344 createRandomTaxonWithCommonName(NUM_OF_NEW_RADOM_ENTITIES
);
346 ITaxonServiceConfigurator configurator
= new TaxonServiceConfiguratorImpl();
347 configurator
.setTitleSearchString("Weiß%");
348 configurator
.setMatchMode(MatchMode
.BEGINNING
);
349 configurator
.setDoTaxa(false);
350 configurator
.setDoSynonyms(false);
351 configurator
.setDoNamesWithoutTaxa(false);
352 configurator
.setDoTaxaByCommonNames(true);
354 Pager
<IdentifiableEntity
> pager
;
356 long startMillis
= System
.currentTimeMillis();
357 for (int indx
= 0; indx
< BENCHMARK_ROUNDS
; indx
++) {
358 pager
= taxonService
.findTaxaAndNames(configurator
);
359 if (logger
.isDebugEnabled()) {
360 logger
.debug("[" + indx
+ "]" + pager
.getRecords().get(0).getTitleCache());
363 double duration
= ((double) (System
.currentTimeMillis() - startMillis
)) / BENCHMARK_ROUNDS
;
364 logger
.info("Benchmark result - [find taxon by CommonName via HQL] : " + duration
+ "ms (" + BENCHMARK_ROUNDS
+ " benchmark rounds )");
367 @SuppressWarnings("rawtypes")
370 public final void testFindByCommonNameLuceneBenchmark() throws CorruptIndexException
, IOException
, ParseException
{
372 // printDataSet(System.err, new String[] { "TaxonBase" });
374 createRandomTaxonWithCommonName(NUM_OF_NEW_RADOM_ENTITIES
);
376 refreshLuceneIndex();
378 Pager
<SearchResult
<TaxonBase
>> pager
;
380 long startMillis
= System
.currentTimeMillis();
381 for (int indx
= 0; indx
< BENCHMARK_ROUNDS
; indx
++) {
382 pager
= taxonService
.findByDescriptionElementFullText(CommonTaxonName
.class, "Weiß*", null, null, null, null, null);
383 if (logger
.isDebugEnabled()) {
384 logger
.debug("[" + indx
+ "]" + pager
.getRecords().get(0).getEntity().getTitleCache());
387 double duration
= ((double) (System
.currentTimeMillis() - startMillis
)) / BENCHMARK_ROUNDS
;
388 logger
.info("Benchmark result - [find taxon by CommonName via lucene] : " + duration
+ "ms (" + BENCHMARK_ROUNDS
+ " benchmark rounds )");
392 @DataSet(loadStrategy
=CleanSweepInsertLoadStrategy
.class, value
="BlankDataSet.xml")
393 public final void createDataSet() throws FileNotFoundException
{
395 // Classification classification = Classification.NewInstance("European Abies for testing");
396 // classification.setUuid(UUID.fromString(CLASSIFICATION_UUID));
397 // classificationService.save(classification);
399 Reference sec
= ReferenceFactory
.newBook();
400 referenceService
.save(sec
);
402 BotanicalName n_abies
= BotanicalName
.NewInstance(Rank
.GENUS());
403 n_abies
.setNameCache("Abies", true);
404 Taxon t_abies
= Taxon
.NewInstance(n_abies
, sec
);
405 taxonService
.save(t_abies
);
407 BotanicalName n_abies_alba
= BotanicalName
.NewInstance(Rank
.SPECIES());
408 n_abies_alba
.setNameCache("Abies alba", true);
409 Taxon t_abies_alba
= Taxon
.NewInstance(n_abies_alba
, sec
);
410 taxonService
.save(t_abies_alba
);
412 BotanicalName n_abies_balsamea
= BotanicalName
.NewInstance(Rank
.SPECIES());
413 n_abies_balsamea
.setNameCache("Abies balsamea", true);
414 Taxon t_abies_balsamea
= Taxon
.NewInstance(n_abies_balsamea
, sec
);
415 taxonService
.save(t_abies_balsamea
);
417 BotanicalName n_abies_grandis
= BotanicalName
.NewInstance(Rank
.SPECIES());
418 n_abies_grandis
.setNameCache("Abies grandis", true);
419 Taxon t_abies_grandis
= Taxon
.NewInstance(n_abies_grandis
, sec
);
420 taxonService
.save(t_abies_grandis
);
422 BotanicalName n_abies_kawakamii
= BotanicalName
.NewInstance(Rank
.SPECIES());
423 n_abies_kawakamii
.setNameCache("Abies kawakamii", true);
424 Taxon t_abies_kawakamii
= Taxon
.NewInstance(n_abies_kawakamii
, sec
);
425 taxonService
.save(t_abies_kawakamii
);
427 BotanicalName n_abies_subalpina
= BotanicalName
.NewInstance(Rank
.SPECIES());
428 n_abies_subalpina
.setNameCache("Abies subalpina", true);
429 Synonym s_abies_subalpina
= Synonym
.NewInstance(n_abies_subalpina
, sec
);
430 taxonService
.save(s_abies_subalpina
);
432 BotanicalName n_abies_lasiocarpa
= BotanicalName
.NewInstance(Rank
.SPECIES());
433 n_abies_lasiocarpa
.setNameCache("Abies lasiocarpa", true);
434 Taxon t_abies_lasiocarpa
= Taxon
.NewInstance(n_abies_lasiocarpa
, sec
);
435 t_abies_lasiocarpa
.addSynonym(s_abies_subalpina
, SynonymRelationshipType
.SYNONYM_OF());
436 taxonService
.save(t_abies_lasiocarpa
);
441 TaxonDescription d_abies_alba
= TaxonDescription
.NewInstance(t_abies_alba
);
443 d_abies_alba
.setUuid(UUID
.fromString(D_ABIES_ALBA_UUID
));
445 d_abies_alba
.addElement(CommonTaxonName
.NewInstance("Weißtanne", Language
.GERMAN()));
446 d_abies_alba
.addElement(CommonTaxonName
.NewInstance("silver fir", Language
.ENGLISH()));
448 TaxonDescription d_abies_balsamea
= TaxonDescription
.NewInstance(t_abies_balsamea
);
452 "Die Balsam-Tanne (Abies balsamea) ist eine Pflanzenart aus der Gattung der Tannen (Abies). Sie wächst im nordöstlichen Nordamerika, wo sie sowohl Tief- als auch Bergland besiedelt. Sie gilt als relativ anspruchslos gegenüber dem Standort und ist frosthart. In vielen Teilen des natürlichen Verbreitungsgebietes stellt sie die Klimaxbaumart dar.",
453 Language
.GERMAN(), null));
457 "Бальзам ньыв (лат. Abies balsamea) – быдмассэзлӧн пожум котырись ньыв увтырын торья вид. Ньывпуыс быдмӧ 14–20 метра вылына да овлӧ 10–60 см кыза диаметрын. Ньывпу пантасьӧ Ойвыв Америкаын.",
458 Language
.RUSSIAN(), null));
462 printDataSet(new FileOutputStream("TaxonServiceSearchTest.xml"), new String
[] { "TAXONBASE", "TAXONNAMEBASE", "SYNONYMRELATIONSHIP", "REFERENCE", "DESCRIPTIONELEMENTBASE",
463 "DESCRIPTIONBASE", "AGENTBASE", "HOMOTYPICALGROUP", "CLASSIFICATION", "LANGUAGESTRING", "DESCRIPTIONELEMENTBASE_LANGUAGESTRING" });
471 private void createRandomTaxonWithCommonName(int numberOfNew
) {
473 logger
.debug(String
.format("creating %1$s random taxan with CommonName", numberOfNew
));
475 Reference sec
= ReferenceFactory
.newBook();
476 referenceService
.save(sec
);
478 for (int i
= numberOfNew
; i
< numberOfNew
; i
++) {
479 RandomStringUtils
.randomAlphabetic(10);
480 String radomName
= RandomStringUtils
.randomAlphabetic(5) + " " + RandomStringUtils
.randomAlphabetic(10);
481 String radomCommonName
= RandomStringUtils
.randomAlphabetic(10);
483 BotanicalName name
= BotanicalName
.NewInstance(Rank
.SPECIES());
484 name
.setNameCache(radomName
, true);
485 Taxon taxon
= Taxon
.NewInstance(name
, sec
);
486 taxonService
.save(taxon
);
488 TaxonDescription description
= TaxonDescription
.NewInstance(taxon
);
489 description
.addElement(CommonTaxonName
.NewInstance(radomCommonName
, Language
.GERMAN()));
490 descriptionService
.save(description
);
493 commitAndStartNewTransaction(null);