3 * Copyright (C) 2007 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
11 package eu
.etaxonomy
.taxeditor
.store
;
13 import java
.util
.ArrayList
;
14 import java
.util
.Arrays
;
15 import java
.util
.List
;
17 import org
.eclipse
.jface
.dialogs
.MessageDialog
;
18 import org
.eclipse
.swt
.widgets
.Display
;
20 import eu
.etaxonomy
.cdm
.api
.service
.IAgentService
;
21 import eu
.etaxonomy
.cdm
.api
.service
.IGroupService
;
22 import eu
.etaxonomy
.cdm
.api
.service
.INameService
;
23 import eu
.etaxonomy
.cdm
.api
.service
.IOccurrenceService
;
24 import eu
.etaxonomy
.cdm
.api
.service
.IReferenceService
;
25 import eu
.etaxonomy
.cdm
.api
.service
.ITaxonService
;
26 import eu
.etaxonomy
.cdm
.api
.service
.IUserService
;
27 import eu
.etaxonomy
.cdm
.api
.service
.config
.IIdentifiableEntityServiceConfigurator
;
28 import eu
.etaxonomy
.cdm
.api
.service
.config
.ITaxonServiceConfigurator
;
29 import eu
.etaxonomy
.cdm
.model
.agent
.AgentBase
;
30 import eu
.etaxonomy
.cdm
.model
.common
.Group
;
31 import eu
.etaxonomy
.cdm
.model
.common
.User
;
32 import eu
.etaxonomy
.cdm
.model
.common
.UuidAndTitleCache
;
33 import eu
.etaxonomy
.cdm
.model
.name
.TaxonNameBase
;
34 import eu
.etaxonomy
.cdm
.model
.occurrence
.SpecimenOrObservationBase
;
35 import eu
.etaxonomy
.cdm
.model
.reference
.Reference
;
36 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonBase
;
40 * @created Dec 8, 2010
43 public class SearchManager
{
45 public static final List NO_RESULTS
= Arrays
.asList(new Object
[]{});
47 public static final String WILDCARD
= "*";
49 public static int NO_COUNT
= -1;
51 // TODO make this configurable via preferences
52 private static final int MAX_RESULTS_BEFORE_WARNING
= 500;
57 * @param configurator a {@link eu.etaxonomy.cdm.api.service.config.IIdentifiableEntityServiceConfigurator} object.
58 * @return a {@link java.util.List} object.
60 public List
<TaxonNameBase
> findNames(IIdentifiableEntityServiceConfigurator configurator
){
61 // TODO we want to use IIdentifiableEntityServiceConfigurator for all find methods
62 // unfortunately this is not consistently implemented in the library.
63 // FIXME use proper method once it is implemented in the library
64 String titleSearchString
= getTitleSearchString(configurator
);
66 return checkLargeResult(configurator
, countNames(configurator
)) ? CdmStore
.getService(INameService
.class).getNamesByName(titleSearchString
) : NO_RESULTS
;
71 private int countNames(IIdentifiableEntityServiceConfigurator configurator
){
76 * <p>findTaxaAndNames</p>
78 * @param configurator a {@link eu.etaxonomy.cdm.api.service.config.ITaxonServiceConfigurator} object.
79 * @return a {@link java.util.List} object.
81 public List
<UuidAndTitleCache
<TaxonBase
>> findTaxaAndNames(ITaxonServiceConfigurator configurator
){
83 return checkLargeResult(configurator
, countTaxaAndNames(configurator
)) ? CdmStore
.getService(ITaxonService
.class).findTaxaAndNamesForEditor(configurator
) : NO_RESULTS
;
86 private int countTaxaAndNames(ITaxonServiceConfigurator configurator
){
91 * <p>findReferences</p>
93 * @param configurator a {@link eu.etaxonomy.cdm.api.service.config.IIdentifiableEntityServiceConfigurator} object.
94 * @return a {@link java.util.List} object.
96 public List
<Reference
> findReferences(IIdentifiableEntityServiceConfigurator configurator
){
97 // TODO we want to use IIdentifiableEntityServiceConfigurator for all find methods
98 // unfortunately this is not consistently implemented in the library.
99 // FIXME use proper method once it is implemented in the library
100 String titleSearchString
= getTitleSearchString(configurator
);
102 return checkLargeResult(configurator
, countReferences(configurator
)) ? CdmStore
.getService(IReferenceService
.class).findByTitle(null, titleSearchString
, null, null, null, null, null, null).getRecords() : NO_RESULTS
;
105 private int countReferences(IIdentifiableEntityServiceConfigurator configurator
){
112 * @param configurator a {@link eu.etaxonomy.cdm.api.service.config.IIdentifiableEntityServiceConfigurator} object.
113 * @return a {@link java.util.List} object.
115 public List
<AgentBase
> findAgents(IIdentifiableEntityServiceConfigurator configurator
){
116 // TODO we want to use IIdentifiableEntityServiceConfigurator for all find methods
117 // unfortunately this is not consistently implemented in the library.
118 // FIXME use proper method once it is implemented in the library
119 String titleSearchString
= getTitleSearchString(configurator
);
121 return checkLargeResult(configurator
, countAgents(configurator
)) ? CdmStore
.getService(IAgentService
.class).findByTitle(null, titleSearchString
, null, null, null, null, null, null).getRecords() : NO_RESULTS
;
124 private int countAgents(IIdentifiableEntityServiceConfigurator configurator
){
129 * <p>findTeamOrPersons</p>
131 * @param configurator a {@link eu.etaxonomy.cdm.api.service.config.IIdentifiableEntityServiceConfigurator} object.
132 * @return a {@link java.util.List} object.
134 public List
<AgentBase
> findTeamOrPersons(IIdentifiableEntityServiceConfigurator configurator
){
135 // TODO move this to cdmlib
136 List
<AgentBase
> result
= new ArrayList
<AgentBase
>();
137 for (AgentBase agent
: findAgents(configurator
)) {
144 * @param configurator
147 private int countTeamOrPersons(IIdentifiableEntityServiceConfigurator configurator
) {
152 * <p>findOccurrences</p>
154 * @param configurator a {@link eu.etaxonomy.cdm.api.service.config.IIdentifiableEntityServiceConfigurator} object.
155 * @return a {@link java.util.List} object.
157 public List
<SpecimenOrObservationBase
> findOccurrences(IIdentifiableEntityServiceConfigurator configurator
){
158 // TODO we want to use IIdentifiableEntityServiceConfigurator for all find methods
159 // unfortunately this is not consistently implemented in the library.
160 // FIXME use proper method once it is implemented in the library
161 String titleSearchString
= getTitleSearchString(configurator
);
163 return checkLargeResult(configurator
, countOccurrences(configurator
)) ? CdmStore
.getService(IOccurrenceService
.class).findByTitle(SpecimenOrObservationBase
.class, titleSearchString
, null, null, null, null, null, null).getRecords() : NO_RESULTS
;
166 private int countOccurrences(IIdentifiableEntityServiceConfigurator configurator
){
170 public List
<User
> findUsers(IIdentifiableEntityServiceConfigurator configurator
){
171 String userNameSearchString
= getTitleSearchString(configurator
);
173 return checkLargeResult(configurator
, countUsers(configurator
)) ? CdmStore
.getService(IUserService
.class).listByUsername(userNameSearchString
, null, null, null, null, null, null) : NO_RESULTS
;
176 private int countUsers(IIdentifiableEntityServiceConfigurator configurator
){
180 public List
<Group
> findGroups(IIdentifiableEntityServiceConfigurator configurator
){
181 String groupNameSearchString
= getTitleSearchString(configurator
);
183 return checkLargeResult(configurator
, countGroups(configurator
)) ? CdmStore
.getService(IGroupService
.class).listByName(groupNameSearchString
, null, null, null, null, null, null) : NO_RESULTS
;
186 private int countGroups(IIdentifiableEntityServiceConfigurator configurator
){
194 private boolean checkLargeResult(IIdentifiableEntityServiceConfigurator configurator
, int countNames
) {
195 if(isWildCardOnly(configurator
) || countNames
> MAX_RESULTS_BEFORE_WARNING
){
196 return MessageDialog
.openConfirm(Display
.getDefault().getActiveShell(), "Large result exptected", "The current search could lead to a very large result. Retrieving this result set might take a long time and/or render the editor unusable.");
202 private boolean isWildCardOnly(IIdentifiableEntityServiceConfigurator configurator
){
203 return WILDCARD
.equals(configurator
.getTitleSearchString());
207 * TODO this will be obsolete once IIdentifiableEntityServiceConfigurator is implemented in find* methods
209 * @param configurator
212 private String
getTitleSearchString(IIdentifiableEntityServiceConfigurator configurator
){
213 return configurator
.getTitleSearchString().replace(WILDCARD
, "%");