Project

General

Profile

Download (48.2 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2007 EDIT
3
* European Distributed Institute of Taxonomy
4
* http://www.e-taxonomy.eu
5
*
6
* The contents of this file are subject to the Mozilla Public License Version 1.1
7
* See LICENSE.TXT at the top of this package for the full license terms.
8
*/
9

    
10
package eu.etaxonomy.cdm.api.service;
11

    
12
import java.io.IOException;
13
import java.util.EnumSet;
14
import java.util.List;
15
import java.util.Map;
16
import java.util.Set;
17
import java.util.UUID;
18

    
19
import eu.etaxonomy.cdm.api.service.config.IFindTaxaAndNamesConfigurator;
20
import eu.etaxonomy.cdm.api.service.config.IncludedTaxonConfiguration;
21
import eu.etaxonomy.cdm.api.service.config.MatchingTaxonConfigurator;
22
import eu.etaxonomy.cdm.api.service.config.SynonymDeletionConfigurator;
23
import eu.etaxonomy.cdm.api.service.config.TaxonDeletionConfigurator;
24
import eu.etaxonomy.cdm.api.service.dto.IdentifiedEntityDTO;
25
import eu.etaxonomy.cdm.api.service.dto.IncludedTaxaDTO;
26
import eu.etaxonomy.cdm.api.service.dto.MarkedEntityDTO;
27
import eu.etaxonomy.cdm.api.service.dto.TaxonRelationshipsDTO;
28
import eu.etaxonomy.cdm.api.service.exception.DataChangeNoRollbackException;
29
import eu.etaxonomy.cdm.api.service.exception.HomotypicalGroupChangeException;
30
import eu.etaxonomy.cdm.api.service.pager.Pager;
31
import eu.etaxonomy.cdm.api.service.search.LuceneMultiSearchException;
32
import eu.etaxonomy.cdm.api.service.search.LuceneParseException;
33
import eu.etaxonomy.cdm.api.service.search.SearchResult;
34
import eu.etaxonomy.cdm.api.util.TaxonRelationshipEdge;
35
import eu.etaxonomy.cdm.exception.UnpublishedException;
36
import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
37
import eu.etaxonomy.cdm.model.common.Language;
38
import eu.etaxonomy.cdm.model.common.MarkerType;
39
import eu.etaxonomy.cdm.model.common.RelationshipBase.Direction;
40
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
41
import eu.etaxonomy.cdm.model.description.Feature;
42
import eu.etaxonomy.cdm.model.description.PresenceAbsenceTerm;
43
import eu.etaxonomy.cdm.model.location.NamedArea;
44
import eu.etaxonomy.cdm.model.media.Media;
45
import eu.etaxonomy.cdm.model.metadata.SecReferenceHandlingEnum;
46
import eu.etaxonomy.cdm.model.name.HomotypicalGroup;
47
import eu.etaxonomy.cdm.model.name.Rank;
48
import eu.etaxonomy.cdm.model.name.TaxonName;
49
import eu.etaxonomy.cdm.model.reference.Reference;
50
import eu.etaxonomy.cdm.model.taxon.Classification;
51
import eu.etaxonomy.cdm.model.taxon.Synonym;
52
import eu.etaxonomy.cdm.model.taxon.SynonymType;
53
import eu.etaxonomy.cdm.model.taxon.Taxon;
54
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
55
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
56
import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;
57
import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
58
import eu.etaxonomy.cdm.model.term.DefinedTerm;
59
import eu.etaxonomy.cdm.persistence.dao.common.Restriction;
60
import eu.etaxonomy.cdm.persistence.dao.initializer.IBeanInitializer;
61
import eu.etaxonomy.cdm.persistence.dto.UuidAndTitleCache;
62
import eu.etaxonomy.cdm.persistence.query.MatchMode;
63
import eu.etaxonomy.cdm.persistence.query.OrderHint;
64
import eu.etaxonomy.cdm.persistence.query.TaxonTitleType;
65

    
66

    
67
public interface ITaxonService
68
             extends IIdentifiableEntityService<TaxonBase>, IPublishableService<TaxonBase>{
69

    
70
    /**
71
     * {@inheritDoc}
72
     * <BR><BR>
73
     * NOTE: Also taxa with <code>publish=false</code> are returned.
74
     */
75
    @Override
76
    public TaxonBase load(UUID uuid, List<String> propertyPaths);
77

    
78
    /**
79
     * Returns a list of taxa that matches the name string and the sec reference
80
     * @param name the name string to search for
81
     * @param sec the taxons sec reference
82
     * @return a list of taxa matching the name and the sec reference
83
     */
84
    public List<TaxonBase> searchByName(String name, boolean includeUnpublished, Reference sec);
85

    
86
    /**
87
     * Swaps given synonym and accepted taxon.
88
     * In particular:
89
     * <ul>
90
     * 		<li>A new accepted taxon with the synonyms name is created</li>
91
     * 		<li>The synonym is deleted from the old accepted taxons synonym list</li>
92
     * 		<li>A new synonym with the name of the old accepted taxon is created</li>
93
     * 		<li>The newly created synonym get related to the newly created accepted taxon</li>
94
     * </ul>
95
     *
96
     * @param synonym
97
     * @param acceptedTaxon
98
     * @param setNameInSource
99
     * @return
100
     */
101
    public UpdateResult swapSynonymAndAcceptedTaxon(Synonym synonym, Taxon acceptedTaxon, boolean setNameInSource);
102

    
103
    /**
104
     * Changes a synonym into an accepted taxon and removes
105
     * the synonym relationship to the given accepted taxon.
106
     * Other synonyms homotypic to the synonym to change are
107
     * moved to the same new accepted taxon as homotypic
108
     * synonyms. The new accepted taxon has the same name and
109
     * the same sec reference as the old synonym.<BR>
110
     * If the given accepted taxon and the synonym are homotypic
111
     * to each other an exception may be thrown as taxonomically it doesn't
112
     * make sense to have two accepted taxa in the same homotypic group
113
     * but also it is than difficult to decide how to handle other names
114
     * in the homotypic group. It is up to the implementing class to
115
     * handle this situation via an exception or in another way.
116
     *
117
     *
118
     * @param synonym
119
     * 				the synonym to change into an accepted taxon
120
     * @param acceptedTaxon
121
     * 				an accepted taxon, the synonym had a relationship to
122
     * @param deleteSynonym
123
     * 			if true the method tries to delete the old synonym from the database
124
     * @return
125
     * 			the newly created accepted taxon
126
     * @throws IllegalArgumentException
127
     * 			if the given accepted taxon and the synonym are homotypic
128
     * 		    to each other an exception may be thrown as taxonomically it doesn't
129
     * 			make sense to have two accepted taxa in the same homotypic group
130
     *          but also it is than difficult to decide how to handle other names
131
     *          in the homotypic group. It is up to the implementing class to
132
     *          handle this situation via an exception or in another way.
133
     */
134
    public UpdateResult changeSynonymToAcceptedTaxon(Synonym synonym, Taxon acceptedTaxon,Reference newSecRef, String microRef, SecReferenceHandlingEnum secHandling, boolean deleteSynonym) throws HomotypicalGroupChangeException;
135

    
136
    /**
137
     * @param synonymUuid
138
     * @param acceptedTaxonUuid
139
     * @param newParentNodeUuid
140
     * @param deleteSynonym
141
     * @return
142
     * @throws HomotypicalGroupChangeException
143
     */
144
    public UpdateResult changeSynonymToAcceptedTaxon(UUID synonymUuid, UUID acceptedTaxonUuid, UUID newParentNodeUuid, UUID newSecRef, String microRef, SecReferenceHandlingEnum secHandling,
145
            boolean deleteSynonym)
146
            throws HomotypicalGroupChangeException;
147

    
148
    /**
149
     * Change a synonym into a related concept
150
     *
151
     * @param synonym
152
     * 				the synonym to change into the concept taxon
153
     * @param toTaxon
154
     * 				the taxon the newly created concept should be related to
155
     * @param taxonRelationshipType
156
     * 				the type of relationship
157
     * @param reference
158
     * @param microReference
159
     * @return
160
     * 				update result with the newly created concept
161
     */
162
    public UpdateResult changeSynonymToRelatedTaxon(Synonym synonym, Taxon toTaxon, TaxonRelationshipType taxonRelationshipType, Reference reference, String microReference);
163

    
164
    /**
165
     *
166
     * Change a related concept into synonym
167
     *
168
     * @param synonym
169
     * 				the concept taxon to change into a synonym
170
     * @param toTaxon
171
     * 				the taxon the newly created synonym should be related to
172
     * @param oldRelationshipType
173
     *              the type of old concept relationship
174
     * @param synonymRelationshipType
175
     * 				the type of new synonym relationship
176
     *
177
     * @return
178
     * 				update result with the newly created synonym
179
     * @throws DataChangeNoRollbackException
180
     */
181
  public 	UpdateResult changeRelatedTaxonToSynonym(Taxon fromTaxon, Taxon toTaxon,
182
             TaxonRelationshipType oldRelationshipType,
183
            SynonymType synonymType) throws DataChangeNoRollbackException;
184

    
185
    /**
186
     * Changes the homotypic group of a synonym into the new homotypic group.
187
     * All relations to taxa are updated correctly depending on the homotypic
188
     * group of the accepted taxon. <BR>
189
     * All existing basionym relationships to and from this name are removed.<BR>
190
     * If the parameter <code>targetTaxon</code> is defined, the synonym is
191
     * added to this taxon irrespctive of if it has been related to this
192
     * taxon before.<BR>
193
     * If <code>setBasionymRelationIfApplicable</code> is true a basionym relationship
194
     * between the existing basionym(s) of the new homotypic group and the synonyms name
195
     * is added.<BR>
196
     *
197
     * @param synonym
198
     * @param newHomotypicalGroup
199
     * @param taxon
200
     * @param setBasionymRelationIfApplicable
201
     */
202
    public void changeHomotypicalGroupOfSynonym(Synonym synonym, HomotypicalGroup newHomotypicalGroup,
203
            Taxon targetTaxon, boolean setBasionymRelationIfApplicable);
204

    
205
    /**
206
     * See {@link #moveSynonymToAnotherTaxon(Synonym, Taxon, boolean, SynonymType, Reference, String, boolean)}
207
     * @param oldSynonym
208
     * @param newTaxon
209
     * @param moveHomotypicGroup
210
     * @param newSynonymType
211
     * @return
212
     * @throws HomotypicalGroupChangeException
213
     */
214
    public UpdateResult moveSynonymToAnotherTaxon(Synonym oldSynonym, Taxon newTaxon, boolean moveHomotypicGroup,
215
            SynonymType newSynonymType) throws HomotypicalGroupChangeException;
216

    
217

    
218
    /**
219
     * Moves a synonym to another taxon and removes the old synonym relationship.
220
     *
221
     * @param oldSynonym the old synonym to move.
222
     * @param newTaxon the taxon the synonym will be moved to
223
     * @param moveHomotypicGroup if the synonym belongs to a homotypic group with other synonyms and
224
     * 		<code>moveHomotypicGroup</code> is <code>true</code> all these synonyms are moved to the new taxon,
225
     * 		if <code>false</code> a {@link HomotypicalGroupChangeException} is thrown.
226
     * 		<code>moveHomotypicGroup</code> has no effect if the synonym is the only synonym in it's homotypic group.
227
     * @param newSynonymType the synonym type of the new synonyms. Default is
228
     * 		{@link SynonymType#HETEROTYPIC_SYNONYM_OF() heterotypic}.
229
     * @param newSecundum The secundum for the new synonyms).
230
     * @param newSecundumDetail The secundum micro reference for the new synonym(s).
231
     * @param keepSecundumIfUndefined if no <code>newSecundum</code> and/or no <code>newSecundumDetail</code>
232
     * 		is defined they are taken from the old synonym(s) if <code>keepSecundumIfUndefined</code> is
233
     * 		<code>true</code>. If <code>false</code> the secundum and the secundum detail will be taken
234
     * 		only from the <code>newSecundum</code> and <code>newSecundumDetail</code> even if they are
235
     *      undefined (<code>null</code>).
236
     * @return The new synonym relationship. If <code>moveHomotypicGroup</code> is <code>true</code> additionally
237
     * 		created new synonym relationships must be retrieved separately from the new taxon.
238
     * @throws HomotypicalGroupChangeException Exception is thrown if (1) synonym is homotypic to the old accepted taxon or
239
     * 		(2) synonym is in homotypic group with other synonyms and <code>moveHomotypicGroup</code> is false
240
     */
241
    public UpdateResult moveSynonymToAnotherTaxon(Synonym oldSynonym, Taxon newTaxon, boolean moveHomotypicGroup,
242
            SynonymType newSynonymType, Reference newSecundum,
243
            String newSecundumDetail, boolean keepSecundumIfUndefined) throws HomotypicalGroupChangeException;
244

    
245

    
246
    /**
247
     * @param oldSynonym
248
     * @param newTaxonUUID
249
     * @param moveHomotypicGroup
250
     * @param newSynonymType
251
     * @param reference
252
     * @param referenceDetail
253
     * @param keepReference
254
     * @return
255
     * @throws HomotypicalGroupChangeException
256
     *
257
     * @see {@link #moveSynonymToAnotherTaxon(Synonym, Taxon, boolean, SynonymType, Reference, String, boolean)}
258
     */
259
    public UpdateResult moveSynonymToAnotherTaxon(Synonym oldSynonym,
260
            UUID newTaxonUUID, boolean moveHomotypicGroup,
261
            SynonymType newSynonymType,
262
            Reference newSecundum, String newSecundumDetail, boolean keepSecundumIfUndefined)
263
            throws HomotypicalGroupChangeException;
264

    
265
    /**
266
     * Returns the TaxonRelationships (of where relationship.type == type, if this argument is supplied)
267
     * where the supplied taxon is relatedTo.
268
     *
269
     * @param taxon The taxon that is relatedTo
270
     * @param type The type of TaxonRelationship (can be null)
271
     * @param includeUnpublished should unpublished related taxa also be returned?
272
     * @param pageSize The maximum number of relationships returned (can be null for all relationships)
273
     * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)
274
     * @param orderHints Properties to order by
275
     * @param propertyPaths Properties to initialize in the returned entities, following the syntax described in {@link IBeanInitializer#initialize(Object, List)}
276
     * @return a List of TaxonRelationship instances
277
     */
278
    public List<TaxonRelationship> listToTaxonRelationships(Taxon taxon, TaxonRelationshipType type,
279
            boolean includeUnpublished, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths);
280

    
281

    
282
    /**
283
     * Returns the TaxonRelationships (of where relationship.type == type, if this arguement is supplied)
284
     * where the supplied taxon is relatedTo.
285
     *
286
     * @param taxon The taxon that is relatedTo
287
     * @param type The type of TaxonRelationship (can be null)
288
     * @param includeUnpublished should unpublished related taxa also be returned?
289
     * @param pageSize The maximum number of relationships returned (can be null for all relationships)
290
     * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)
291
     * @param orderHints Properties to order by
292
     * @param propertyPaths Properties to initialize in the returned entities, following the syntax described in {@link IBeanInitializer#initialize(Object, List)}
293
     * @return a Pager of TaxonRelationship instances
294
     */
295
    public Pager<TaxonRelationship> pageToTaxonRelationships(Taxon taxon, TaxonRelationshipType type,
296
            boolean includeUnpublished, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths);
297

    
298
    /**
299
     * Returns the TaxonRelationships (of where relationship.type == type, if this argument is supplied)
300
     * where the supplied taxon is relatedFrom.
301
     *
302
     * @param taxon The taxon that is relatedFrom
303
     * @param type The type of TaxonRelationship (can be null)
304
     * @param includeUnpublished should unpublished related taxa also be returned?
305
     * @param pageSize The maximum number of relationships returned (can be null for all relationships)
306
     * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)
307
     * @param orderHints Properties to order by
308
     * @param propertyPaths Properties to initialize in the returned entities, following the syntax described in {@link IBeanInitializer#initialize(Object, List)}
309
     * @return a List of TaxonRelationship instances
310
     */
311
    public List<TaxonRelationship> listFromTaxonRelationships(Taxon taxon, TaxonRelationshipType type,
312
            boolean includeUnpublished, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths);
313

    
314

    
315
    /**
316
     * Returns the TaxonRelationships (of where relationship.type == type, if this argument is supplied)
317
     * where the supplied taxon is relatedFrom.
318
     *
319
     * @param taxon The taxon that is relatedFrom
320
     * @param type The type of TaxonRelationship (can be null)
321
     * @param includeUnpublished should unpublished related taxa also be returned?
322
     * @param pageSize The maximum number of relationships returned (can be null for all relationships)
323
     * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)
324
     * @param orderHints Properties to order by
325
     * @param propertyPaths Properties to initialize in the returned entities, following the syntax described in {@link IBeanInitializer#initialize(Object, List)}
326
     * @return a Pager of TaxonRelationship instances
327
     */
328
    public Pager<TaxonRelationship> pageFromTaxonRelationships(Taxon taxon, TaxonRelationshipType type,
329
            boolean includeUnpublished, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths);
330

    
331
    /**
332
     * lists all taxa which are related to the <code>taxon</code> given as
333
     * parameter.
334
     *
335
     * @param taxon
336
     * @param includeRelationships
337
     * @param maxDepth
338
     *            <code>1</code> for one level, <code>null</code> for infinite
339
     *            depth, <code>0</code> will completely omit collecting related taxa.
340
     * @param limit
341
     * @param start
342
     * @param propertyPaths
343
     * @return
344
     */
345
    public Set<Taxon> listRelatedTaxa(Taxon taxon, Set<TaxonRelationshipEdge> includeRelationships, Integer maxDepth,
346
            boolean includeUnpublished, Integer limit, Integer start, List<String> propertyPaths);
347

    
348

    
349
    /**
350
     * Returns all or a page of all taxon concept relationships in the database.
351
     * The result can be filtered by relationship types.
352
     *
353
     * @param types The taxon relationship type filter, if <code>null</code> no filter is set, if empty the result will also be empty
354
     * @param pageSize the page size
355
     * @param pageStart the number of the page
356
     * @param orderHints the order hints
357
     * @param propertyPaths the property path to initialize the resulting objects
358
     * @return list of taxon relationships matching the filter criteria
359
     */
360
    public List<TaxonRelationship> listTaxonRelationships(Set<TaxonRelationshipType> types,
361
            Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths);
362

    
363
    /**
364
     * Lists all classifications the given taxon/synonym is used in{@link Synonym}
365
     *
366
     * @param taxonBase
367
     * @param limit
368
     * @param start
369
     * @param propertyPaths
370
     * @return
371
     */
372
    public List<Classification> listClassifications(TaxonBase taxonBase, Integer limit, Integer start, List<String> propertyPaths);
373

    
374
    /**
375
     * Returns the Synonyms (with the given synonym relationship type, if this argument is supplied)
376
     * that do have the supplied taxon as accepted taxon.
377
     *
378
     * @param taxon The accepted taxon
379
     * @param type The type of Synonym (can be null)
380
     * @param pageSize The maximum number of synonyms returned (can be null for returning synonyms)
381
     * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)
382
     * * @param orderHints Properties to order by
383
     * @param propertyPaths Properties to initialize in the returned entities, following the syntax described in {@link IBeanInitializer#initialize(Object, List)}
384
     * @return a Pager of {@link Synonym} instances
385
     */
386
    public Pager<Synonym> getSynonyms(Taxon taxon, SynonymType type, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths);
387

    
388
    /**
389
     * This method returns in the first entry the list of synonyms of the
390
     * homotypic group of the accepted taxon. All other entries represent the lists of heterotypic
391
     * synonym groups. For detailed information about these 2 groups see
392
     * {@link #getHomotypicSynonymsByHomotypicGroup(Taxon, List)} and
393
     * {@link #getHeterotypicSynonymyGroups(Taxon, List)}
394
     *
395
     * @see			#getSynonyms()
396
     * @see			SynonymType#HETEROTYPIC_SYNONYM_OF()
397
     * @see			eu.etaxonomy.cdm.model.name.HomotypicalGroup
398

    
399
     * @param taxon the accepted taxon
400
     * @param propertyPaths the property path
401
     * @return the list of groups of synonyms
402
     */
403
    public List<List<Synonym>> getSynonymsByHomotypicGroup(Taxon taxon, List<String> propertyPaths);
404

    
405

    
406
    /**
407
     * Returns the list of all synonyms that share the same homotypical group with the given taxon.
408
     * Only those homotypic synonyms are returned that do have a synonym relationship with the accepted taxon.
409
     * @param taxon
410
     * @param propertyPaths
411
     * @return
412
     */
413
    public List<Synonym> getHomotypicSynonymsByHomotypicGroup(Taxon taxon, List<String> propertyPaths);
414

    
415
    /**
416
     * Returns the ordered list of all {@link eu.etaxonomy.cdm.model.name.HomotypicalGroup homotypical groups}
417
     * that contain {@link Synonym synonyms} that are heterotypic to the given taxon.
418
     * {@link eu.etaxonomy.cdm.model.name.TaxonName Taxon names} of heterotypic synonyms
419
     * belong to a homotypical group which cannot be the homotypical group to which the
420
     * taxon name of the given taxon belongs. This method does not return the homotypic group the given
421
     * taxon belongs to.<BR>
422
     * This method does neglect the type of synonym relationship that is defined between the given taxon
423
     * and the synonym. So the synonym relationship may be homotypic however a synonym is returned
424
     * in one of the result lists as long as the synonym does not belong to the same homotypic group as
425
     * the given taxon.<BR>
426
     * The list returned is ordered according to the date of publication of the
427
     * first published name within each homotypical group.
428
     *
429
     * @see			#getHeterotypicSynonymyGroups()
430
     * @see			#getSynonyms()
431
     * @see			SynonymType#HETEROTYPIC_SYNONYM_OF()
432
     * @see			eu.etaxonomy.cdm.model.name.HomotypicalGroup
433

    
434
     * @param taxon
435
     * @param propertyPaths
436
     * @return
437
     */
438
    public List<List<Synonym>> getHeterotypicSynonymyGroups(Taxon taxon, List<String> propertyPaths);
439

    
440
    /**
441
     * Returns a Paged List of TaxonBase instances where the default field matches the String queryString (as interpreted by the Lucene QueryParser)
442
     *
443
     * @param clazz filter the results by class (or pass null to return all TaxonBase instances)
444
     * @param queryString
445
     * @param pageSize The maximum number of taxa returned (can be null for all matching taxa)
446
     * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)
447
     * @param orderHints
448
     *            Supports path like <code>orderHints.propertyNames</code> which
449
     *            include *-to-one properties like createdBy.username or
450
     *            authorTeam.persistentTitleCache
451
     * @param propertyPaths properties to be initialized
452
     * @return a Pager Taxon instances
453
     * @see <a href="http://lucene.apache.org/java/2_4_0/queryparsersyntax.html">Apache Lucene - Query Parser Syntax</a>
454
     */
455
    @Override
456
    public Pager<TaxonBase> search(Class<? extends TaxonBase> clazz, String queryString, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths);
457

    
458
    /**
459
     * Returns a list of TaxonBase instances where the
460
     * taxon.name properties match the parameters passed. In order to search for any string value, pass '*', passing the string value of
461
     * <i>null</i> will search for those taxa with a value of null in that field
462
     *
463
     * @param clazz optionally filter by class (can be null to return all taxa)
464
     * @param uninomial
465
     * @param infragenericEpithet
466
     * @param specificEpithet
467
     * @param infraspecificEpithet
468
     * @param rank
469
     * @param pageSize The maximum number of taxa returned (can be null for all matching taxa)
470
     * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)
471
     * @return a list of TaxonBase instances
472
     */
473
    public <T extends TaxonBase>  Pager<T> findTaxaByName(Class<T> clazz, String uninomial, String infragenericEpithet, String specificEpithet,
474
            String infraspecificEpithet, String authorshipCache, Rank rank, Integer pageSize, Integer pageNumber, List<String> propertyPaths);
475

    
476
    /**
477
     * Returns a list of TaxonBase instances where the
478
     * taxon.name properties match the parameters passed. In order to search for any string value, pass '*', passing the string value of
479
     * <i>null</i> will search for those taxa with a value of null in that field
480
     *
481
     * @param clazz optionally filter by class
482
     * @param uninomial
483
     * @param infragenericEpithet
484
     * @param specificEpithet
485
     * @param infraspecificEpithet
486
     * @param rank
487
     * @param authorshipCache
488
     * @param pageSize The maximum number of taxa returned (can be null for all matching taxa)
489
     * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)
490
     * @return a List of TaxonBase instances
491
     */
492
    public <T extends TaxonBase> List<T> listTaxaByName(Class<T> clazz, String uninomial, String infragenericEpithet, String specificEpithet,
493
            String infraspecificEpithet, String authorshipCache, Rank rank, Integer pageSize, Integer pageNumber, List<String> propertyPaths);
494

    
495
    /**
496
     * Returns a list of IdentifiableEntity instances (in particular, TaxonName and TaxonBase instances)
497
     * that match the properties specified in the configurator.
498
     * @param configurator
499
     * @return
500
     */
501
    public Pager<IdentifiableEntity> findTaxaAndNames(IFindTaxaAndNamesConfigurator configurator);
502

    
503
    /**
504
     * performes a union searches for TaxonBase instances on all available
505
     * free text indexes. At the time of writing this documentation it combines
506
     * {@link #findByDescriptionElementFullText(Class, String, Classification, List, List, boolean, Integer, Integer, List, List)}
507
     * and {@link #findByFullText(Class, String, Classification, List, boolean, Integer, Integer, List, List)
508
     *
509
     * @param queryString
510
     *            the query string
511
     * @param classification
512
     *            Additional filter criterion: If a taxonomic classification
513
     *            three is specified here the result set will only contain taxa
514
     *            of the given classification
515
     * @param languages
516
     *            Additional filter criterion: Search only in these languages.
517
     *            Not all text fields in the cdm model are multilingual, thus
518
     *            this setting will only apply to the multilingiual fields.
519
     *            Other fields are searched nevertheless if this parameter is
520
     *            set or not.
521
     * @param highlightFragments
522
     *            TODO
523
     * @param pageSize
524
     *            The maximum number of objects returned (can be null for all
525
     *            objects)
526
     * @param pageNumber
527
     *            The offset (in pageSize chunks) from the start of the result
528
     *            set (0 - based)
529
     * @param orderHints
530
     *            Supports path like <code>orderHints.propertyNames</code> which
531
     *            include *-to-one properties like createdBy.username or
532
     *            authorTeam.persistentTitleCache
533
     * @param propertyPaths
534
     *            properties to initialize - see
535
     *            {@link IBeanInitializer#initialize(Object, List)}
536
     * @return a paged list of instances of type T matching the queryString and
537
     *         the additional filter criteria
538
     * @return
539
     * @throws LuceneCorruptIndexException
540
     * @throws IOException
541
     * @throws LuceneParseException
542
     * @throws LuceneMultiSearchException
543
     * @deprecated this search should fully be covered by the new method
544
     *      {@link #findTaxaAndNamesByFullText(EnumSet, String, Classification, Set, List, boolean, Integer, Integer, List, List)}
545
     *      , maybe we should rename this latter method to give it a more meaningful name
546
     */
547
    @Deprecated
548
    public Pager<SearchResult<TaxonBase>> findByEverythingFullText(String queryString,
549
            Classification classification, TaxonNode subtree, boolean includeUnpublished, List<Language> languages, boolean highlightFragments,
550
            Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) throws IOException, LuceneParseException, LuceneMultiSearchException;
551

    
552
    /**
553
     * Searches for TaxonBase instances using the TaxonBase free text index.
554
     *
555
     * <h4>This is an experimental feature, it may be moved, modified, or even
556
     * removed in future releases!!!</h4>
557
     *
558
     * @param clazz
559
     *            Additional filter criterion: The specific TaxonBase subclass
560
     *            to search for
561
     * @param queryString
562
     *            the query string
563
     * @param classification
564
     *            Additional filter criterion: If a taxonomic classification
565
     *            three is specified here the result set will only contain taxa
566
     *            of the given classification
567
     * @param languages
568
     *            Additional filter criterion: Search only in these languages.
569
     *            Not all text fields in the cdm model are multilingual, thus
570
     *            this setting will only apply to the multilingiual fields.
571
     *            Other fields are searched nevertheless if this parameter is
572
     *            set or not.
573
     * @param highlightFragments
574
     *            TODO
575
     * @param pageSize
576
     *            The maximum number of objects returned (can be null for all
577
     *            objects)
578
     * @param pageNumber
579
     *            The offset (in pageSize chunks) from the start of the result
580
     *            set (0 - based)
581
     * @param orderHints
582
     *            Supports path like <code>orderHints.propertyNames</code> which
583
     *            include *-to-one properties like createdBy.username or
584
     *            authorTeam.persistentTitleCache
585
     * @param propertyPaths
586
     *            properties to initialize - see
587
     *            {@link IBeanInitializer#initialize(Object, List)}
588
     * @return a paged list of instances of type T matching the queryString and
589
     *         the additional filter criteria
590
     * @throws LuceneCorruptIndexException
591
     * @throws IOException
592
     * @throws LuceneParseException
593
     */
594
    public Pager<SearchResult<TaxonBase>> findByFullText(Class<? extends TaxonBase> clazz, String queryString,
595
            Classification classification, TaxonNode subtree,
596
            boolean includeUnpublished, List<Language> languages,
597
            boolean highlightFragments, Integer pageSize, Integer pageNumber,
598
            List<OrderHint> orderHints, List<String> propertyPaths)
599
                    throws IOException, LuceneParseException;
600

    
601

    
602
    /**
603
     * @param areaFilter
604
     * @param statusFilter
605
     * @param classification
606
     *            Additional filter criterion: If a taxonomic classification
607
     *            three is specified here the result set will only contain taxa
608
     *            of the given classification
609
     * @param highlightFragments
610
     * @param pageSize
611
     *            The maximum number of objects returned (can be null for all
612
     *            objects)
613
     * @param pageNumber
614
     *            The offset (in pageSize chunks) from the start of the result
615
     *            set (0 - based)
616
     * @param orderHints
617
     *            Supports path like <code>orderHints.propertyNames</code> which
618
     *            include *-to-one properties like createdBy.username or
619
     *            authorTeam.persistentTitleCache
620
     * @param propertyPath
621
     *            Common properties to initialize the instances of the
622
     *            CDM types ({@link Taxon} and {@link Synonym}
623
     *            this method can return - see {@link IBeanInitializer#initialize(Object, List)}
624
     * @return a paged list of instances of {@link Taxon} instances
625
     * @throws IOException
626
     * @throws LuceneParseException
627
     */
628
    //TODO needed? currently only used in test
629
    public Pager<SearchResult<TaxonBase>> findByDistribution(List<NamedArea> areaFilter, List<PresenceAbsenceTerm> statusFilter,
630
            Classification classification, TaxonNode subtree,
631
            Integer pageSize, Integer pageNumber,
632
            List<OrderHint> orderHints, List<String> propertyPaths) throws IOException, LuceneParseException;
633

    
634
    /**
635
     * Searches for TaxonBase instances using the TaxonBase free text index.
636
     *
637
     *
638
     *
639
     * <h4>This is an experimental feature, it may be moved, modified, or even
640
     * removed in future releases!!!</h4>
641
     * @param searchModes
642
     *            Additional filter criterion: defaults to [doTaxa] if set null
643
     * @param queryString
644
     *            the query string
645
     * @param classification
646
     *            Additional filter criterion: If a taxonomic classification
647
     *            three is specified here the result set will only contain taxa
648
     *            of the given classification
649
     * @param subtree
650
     * @param namedAreas
651
     * @param distributionStatus
652
     * @param languages
653
     *            Additional filter criterion: Search only in these languages.
654
     *            Not all text fields in the cdm model are multilingual, thus
655
     *            this setting will only apply to the multilingiual fields.
656
     *            Other fields are searched nevertheless if this parameter is
657
     *            set or not.
658
     * @param highlightFragments
659
     *            TODO
660
     * @param pageSize
661
     *            The maximum number of objects returned (can be null for all
662
     *            objects)
663
     * @param pageNumber
664
     *            The offset (in pageSize chunks) from the start of the result
665
     *            set (0 - based)
666
     * @param orderHints
667
     *            Supports path like <code>orderHints.propertyNames</code> which
668
     *            include *-to-one properties like createdBy.username or
669
     *            authorTeam.persistentTitleCache
670
     * @param propertyPath
671
     *            Common properties to initialize the instances of the
672
     *            CDM types ({@link Taxon} and {@link Synonym}
673
     *            this method can return - see {@link IBeanInitializer#initialize(Object, List)}
674
     * @return a paged list of instances of {@link Taxon}, {@link Synonym}, matching the queryString and
675
     *         the additional filter criteria
676
     * @throws LuceneCorruptIndexException
677
     * @throws IOException
678
     * @throws LuceneParseException
679
     * @throws LuceneMultiSearchException
680
     */
681
    public Pager<SearchResult<TaxonBase>> findTaxaAndNamesByFullText(
682
            EnumSet<TaxaAndNamesSearchMode> searchModes,
683
            String queryString, Classification classification, TaxonNode subtree,
684
            Set<NamedArea> namedAreas, Set<PresenceAbsenceTerm> distributionStatus,
685
            List<Language> languages, boolean highlightFragments, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints,
686
            List<String> propertyPaths) throws IOException, LuceneParseException, LuceneMultiSearchException;
687

    
688
    /**
689
     * Searches for TaxonBase instances by using the DescriptionElement free text index.
690
     *
691
     * <h4>This is an experimental feature, it may be moved, modified, or even
692
     * removed in future releases!!!</h4>
693
     *
694
     * @param clazz
695
     *            Additional filter criterion:
696
     * @param queryString
697
     *            the query string to filter by
698
     * @param classification
699
     *            Additional filter criterion: If a taxonomic classification
700
     *            tree is specified here the result set will only contain taxa
701
     *            of the given classification
702
     * @param subtree
703
     *            Additional filter criterion: If a taxonomic classification
704
     *            subtree is specified here the result set will only contain taxa
705
     *            of the given subtree
706
     * @param features
707
     *            TODO
708
     * @param languages
709
     *            Additional filter criterion: Search only in these languages.
710
     *            Not all text fields in the CDM model are multi-lingual, thus
711
     *            this setting will only apply to the multi-lingual fields.
712
     *            Other fields are searched nevertheless if this parameter is
713
     *            set or not.
714
     * @param highlightFragments
715
     *            TODO
716
     * @param pageSize
717
     *            The maximum number of objects returned (can be null for all
718
     *            objects)
719
     * @param pageNumber
720
     *            The offset (in pageSize chunks) from the start of the result
721
     *            set (0 - based)
722
     * @param orderHints
723
     *            Supports path like <code>orderHints.propertyNames</code> which
724
     *            include *-to-one properties like createdBy.username or
725
     *            authorTeam.persistentTitleCache
726
     * @param propertyPaths
727
     *            properties to initialize - see
728
     *            {@link IBeanInitializer#initialize(Object, List)}
729
     * @return a paged list of instances of type T matching the queryString and
730
     *         the additional filter criteria
731
     * @throws IOException
732
     * @throws LuceneCorruptIndexException
733
     * @throws LuceneParseException
734
     */
735
    public Pager<SearchResult<TaxonBase>> findByDescriptionElementFullText(Class<? extends DescriptionElementBase> clazz,
736
            String queryString, Classification classification, TaxonNode subtree, List<Feature> features, List<Language> languages, boolean highlightFragments, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) throws IOException, LuceneParseException;
737

    
738
    /**
739
     * Lists all Media found in an any TaxonDescription associated with this
740
     * taxon.
741
     *
742
     * @param taxon
743
     * @param includeRelationships
744
     *            the given list of TaxonRelationshipEdges will be taken into
745
     *            account when retrieving media associated with the given taxon.
746
     *            Can be NULL.
747
     * @param limitToGalleries
748
     *            whether to take only TaxonDescription into account which are
749
     *            marked as gallery
750
     * @return
751
     * @deprecated use {@link #listMedia(Taxon, Set, boolean, boolean, List)} instead
752
     */
753
    @Deprecated
754
    public List<Media> listTaxonDescriptionMedia(Taxon taxon, Set<TaxonRelationshipEdge> includeRelationships, boolean limitToGalleries, List<String> propertyPath);
755

    
756
    /**
757
     * Lists all Media found in an any TaxonDescription, NameDescription,
758
     * SpecimenOrObservationBase, DnaSample Chromatograms, etc. associated with this taxon.
759
     *
760
     * @param taxon
761
     * @param includeRelationships
762
     *            the given list of TaxonRelationshipEdges will be taken into
763
     *            account when retrieving media associated with the given taxon.
764
     *            Can be NULL.
765
     * @param limitToGalleries
766
     *            whether to take only descriptions into account which are
767
     *            marked as gallery, can be NULL
768
     * @param includeTaxonDescriptions
769
     *            whether to take TaxonDescriptions into account, can be NULL
770
     * @param includeOccurrences
771
     *          whether to take TaxonDescriptions into account, can be NULL
772
     * @param includeTaxonNameDescriptions
773
     *       whether to take TaxonNameDescriptions into account, can be NULL
774
     * @param propertyPath
775
     * @return
776
     */
777
    public List<Media> listMedia(Taxon taxon, Set<TaxonRelationshipEdge> includeRelationships,
778
            Boolean limitToGalleries, Boolean includeTaxonDescriptions, Boolean includeOccurrences,
779
            Boolean includeTaxonNameDescriptions, List<String> propertyPath);
780

    
781
    public List<TaxonBase> findTaxaByID(Set<Integer> listOfIDs);
782

    
783
    /**
784
     * Returns the TaxonBase with the given UUID
785
     * using the given match mode and initialization strategy
786
     *
787
     * @param uuid
788
     * @param propertyPaths
789
     * @return
790
     */
791
    public TaxonBase findTaxonByUuid(UUID uuid, List<String> propertyPaths);
792

    
793
    /**
794
     * Counts the number of synonyms
795
     * @param onlyAttachedToTaxon if <code>true</code> only those synonyms being attached to
796
     * an accepted taxon are counted
797
     * @return the number of synonyms
798
     */
799
    public long countSynonyms(boolean onlyAttachedToTaxon);
800

    
801
    /**
802
     * Returns a map of taxon names that have identical name caches but derive from different sources.
803
     * The sources are defined via the sources reference uuid.
804
     *
805
     * @return map of nameCaches and taxon name maps where the key is the UUID of the according sourceRefUuid
806
     */
807
    public Map<String, Map<UUID,Set<TaxonName>>> findIdenticalTaxonNames(List<UUID> sourceRefUuids, List<String> propertyPaths);
808

    
809
    /**
810
     * Returns all {@link Taxon taxa} which are {@link TaxonRelationshipType#CONGRUENT_TO() congruent} or
811
     * {@link TaxonRelationshipType#INCLUDES() included} in the taxon represented by the given taxon uuid.
812
     * The result also returns the path to these taxa represented by the uuids of
813
     * the {@link TaxonRelationshipType taxon relationships types} and doubtful information.
814
     * If classificationUuids is set only taxa of classifications are returned which are included
815
     * in the given {@link Classification classifications}. ALso the path to these taxa may not include
816
     * taxa from other classifications.
817
     * @param taxonUuid uuid of the original taxon
818
     * @param classificationUuids List of uuids of classifications used as a filter
819
     * @param includeDoubtful set to <code>true</code> if also doubtfully included taxa should be included in the result
820
     * @return a DTO which includes a list of taxa with the pathes from the original taxon to the given taxon as well
821
     * as doubtful and date information. The original taxon is included in the result.
822
     */
823
    public IncludedTaxaDTO listIncludedTaxa(UUID taxonUuid, IncludedTaxonConfiguration configuration);
824

    
825

    
826
   /**
827
     * Removes a synonym.<BR><BR>
828
     *
829
     * In detail it removes
830
     *  <li>the synonym concept</li>
831
     *  <BR><BR>
832
     *  If <code>removeNameIfPossible</code> is true
833
     *  it also removes the synonym name if it is not used in any other context
834
     *  (part of a concept, in DescriptionElementSource, part of a name relationship, used inline, ...)<BR><BR>
835
     *  If <code>newHomotypicGroupIfNeeded</code> is <code>true</code> and the synonym name
836
     *  is not deleted and the name is homotypic to the taxon
837
     *  the name is moved to a new homotypic group.<BR><BR>
838
     *
839
     *  If synonym is <code>null</code> the method has no effect.
840
     *
841
     * @param taxon
842
     * @param synonym
843
     * @param removeNameIfPossible
844
     * @return deleteResult
845
     *
846
     */
847
    public DeleteResult deleteSynonym(Synonym synonym, SynonymDeletionConfigurator config);
848

    
849
    /**
850
     * Removes a synonym.
851
     *
852
     * The method essentially loads the synonym and calls the
853
     * {@link #deleteSynonym(Synonym, SynonymDeletionConfigurator) deleteSynonym} method
854
     *
855
     * @param synonymUuid
856
     * @param config
857
     * @return
858
     */
859
    public DeleteResult deleteSynonym(UUID synonymUuid, SynonymDeletionConfigurator config);
860

    
861
    /**
862
     * @param tnb
863
     * @return
864
     */
865
    public Taxon findBestMatchingTaxon(String taxonName);
866

    
867
    public Taxon findBestMatchingTaxon(MatchingTaxonConfigurator config);
868

    
869
    public Synonym findBestMatchingSynonym(String taxonName, boolean includeUnpublished);
870

    
871
     public List<UuidAndTitleCache<? extends IdentifiableEntity>> findTaxaAndNamesForEditor(IFindTaxaAndNamesConfigurator configurator);
872

    
873
    /**
874
     * Creates the specified inferred synonyms for the taxon in the classification, but do not insert it to the database
875
     * @param taxon
876
     * @param tree
877
     * @return list of inferred synonyms
878
     */
879
    public List<Synonym> createInferredSynonyms(Taxon taxon, Classification tree, SynonymType type, boolean doWithMisappliedNames);
880

    
881
    /**
882
     * Creates all inferred synonyms for the taxon in the classification, but do not insert it to the database
883
     * @param taxon
884
     * @param tree
885
     * @param iDatabase
886
     * @return list of inferred synonyms
887
     */
888
    public List<Synonym>  createAllInferredSynonyms(Taxon taxon, Classification tree, boolean doWithMisappliedNames);
889

    
890
    public Taxon findAcceptedTaxonFor(UUID synonymUuid, UUID classificationUuid, boolean includeUnpublished,
891
            List<String> propertyPaths) throws UnpublishedException;
892

    
893
    public List<TaxonBase> findTaxaByName(MatchingTaxonConfigurator config);
894

    
895

    
896
    /**
897
     * @param clazz the optional {@link TaxonBase} subclass
898
     * @param identifier the identifier string
899
     * @param identifierType the identifier type
900
     * @param subtreeFilter filter on a classification subtree (TaxonNode)
901
     * @param matchmode the match mode for the identifier string
902
     * @param includeEntity should the taxon as an object be included in the result
903
     * @param pageSize page size
904
     * @param pageNumber page number
905
     * @param propertyPaths property path for initializing the returned taxon object (requires includeEntity=true)
906
     * @return the resulting {@link IdentifiedEntityDTO} pager
907
     * @see IIdentifiableEntityService#findByIdentifier(Class, String, DefinedTerm, MatchMode, boolean, Integer, Integer, List)
908
     */
909
    public <S extends TaxonBase> Pager<IdentifiedEntityDTO<S>> findByIdentifier(
910
			Class<S> clazz, String identifier, DefinedTerm identifierType, TaxonNode subtreeFilter,
911
			MatchMode matchmode, boolean includeEntity, Integer pageSize,
912
			Integer pageNumber,	List<String> propertyPaths);
913

    
914
    /**
915
     * Returns a pager for {@link MarkedEntityDTO DTOs} that hold the marker including type, title and uuid
916
     * and the according {@link TaxonBase} information (uuid, title and the taxon object itself (optional)).
917
     *
918
     * @param clazz The optional {@link TaxonBase} subclass
919
     * @param markerType the obligatory marker type, if not given, the results will always be empty
920
     * @param markerValue the optional
921
     * @param subtreeFilter filter on a classification subtree (TaxonNode)
922
     * @param includeEntity should the taxon as an object be included in the result
923
     * @param titleType which label to give the returned entity, taxon.titleCache, name.titleCache or name.nameCache
924
     * @param pageSize page size
925
     * @param pageNumber page number
926
     * @param propertyPaths property path for initializing the returned taxon object (requires includeEntity=true)
927
     * @return the resulting {@link MarkedEntityDTO} pager
928
     * @see IIdentifiableEntityService#findByMarker(Class, MarkerType, Boolean, boolean, Integer, Integer, List)
929
     */
930
    public <S extends TaxonBase> Pager<MarkedEntityDTO<S>> findByMarker(
931
            Class<S> clazz, MarkerType markerType, Boolean markerValue,
932
            TaxonNode subtreeFilter, boolean includeEntity, TaxonTitleType titleType,
933
            Integer pageSize, Integer pageNumber, List<String> propertyPaths);
934

    
935
    /**
936
     * @param synonymUUid
937
     * @param acceptedTaxonUuid
938
     * @param setNameInSource
939
     * @return
940
     */
941
    public UpdateResult swapSynonymAndAcceptedTaxon(UUID synonymUUid, UUID acceptedTaxonUuid, boolean setNameInSource);
942

    
943
    /**
944
     * @param taxonUuid
945
     * @param config
946
     * @param classificationUuid
947
     * @return
948
     */
949
    public DeleteResult deleteTaxon(UUID taxonUuid, TaxonDeletionConfigurator config, UUID classificationUuid);
950

    
951

    
952
	public UpdateResult moveFactualDateToAnotherTaxon(UUID fromTaxonUuid,
953
			UUID toTaxonUuid);
954

    
955

    
956
    /**
957
     * @param synonymUuid
958
     * @param toTaxonUuid
959
     * @param taxonRelationshipType
960
     * @param citation
961
     * @param microcitation
962
     * @return
963
     */
964
    public UpdateResult changeSynonymToRelatedTaxon(UUID synonymUuid, UUID toTaxonUuid, TaxonRelationshipType taxonRelationshipType,
965
            Reference citation, String microcitation);
966

    
967
    /**
968
     * @param fromTaxonUuid
969
     * @param toTaxonUuid
970
     * @param oldRelationshipType
971
     * @param synonymType
972
     * @return
973
     * @throws DataChangeNoRollbackException
974
     */
975
    public UpdateResult changeRelatedTaxonToSynonym(UUID fromTaxonUuid, UUID toTaxonUuid,
976
            TaxonRelationshipType oldRelationshipType, SynonymType synonymType) throws DataChangeNoRollbackException;
977

    
978
    /**
979
     * Returns a list of taxon relationships for a given taxon as DTO.
980
     * @param taxonUuid
981
     * @param directTypes
982
     * @param inversTypes
983
     * @param direction
984
     * @param groupMisapplications
985
     * @param includeUnpublished
986
     * @param pageSize
987
     * @param pageNumber
988
     * @return
989
     */
990
    public TaxonRelationshipsDTO listTaxonRelationships(UUID taxonUuid,
991
            Set<TaxonRelationshipType> directTypes,
992
            Set<TaxonRelationshipType> inversTypes, Direction direction, boolean groupMisapplications,
993
            boolean includeUnpublished, Integer pageSize, Integer pageNumber);
994

    
995
    /**
996
     * @param clazz
997
     * @param restrictions
998
     * @param pageSize
999
     * @param pageIndex
1000
     * @param orderHints
1001
     * @param propertyPaths
1002
     * @param includeUnpublished
1003
     * @return
1004
     */
1005
    public <S extends TaxonBase> Pager<S> page(Class<S> clazz, List<Restriction<?>> restrictions, Integer pageSize, Integer pageIndex,
1006
            List<OrderHint> orderHints, List<String> propertyPaths, boolean includeUnpublished);
1007

    
1008

    
1009

    
1010

    
1011

    
1012
}
(58-58/97)