Temporary fix for #2366; fixes #2368; Refactoring annotations in the name editor
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / store / SearchManager.java
1 // $Id$
2 /**
3 * Copyright (C) 2007 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
6 *
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.
9 */
10
11 package eu.etaxonomy.taxeditor.store;
12
13 import java.util.ArrayList;
14 import java.util.Arrays;
15 import java.util.List;
16
17 import org.eclipse.jface.dialogs.MessageDialog;
18 import org.eclipse.swt.widgets.Display;
19
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;
37
38 /**
39 * @author n.hoffmann
40 * @created Dec 8, 2010
41 * @version 1.0
42 */
43 public class SearchManager {
44
45 public static final List NO_RESULTS = Arrays.asList(new Object[]{});
46
47 public static final String WILDCARD = "*";
48
49 public static int NO_COUNT = -1;
50
51 // TODO make this configurable via preferences
52 private static final int MAX_RESULTS_BEFORE_WARNING = 500;
53
54 /**
55 * <p>findNames</p>
56 *
57 * @param configurator a {@link eu.etaxonomy.cdm.api.service.config.IIdentifiableEntityServiceConfigurator} object.
58 * @return a {@link java.util.List} object.
59 */
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);
65
66 return checkLargeResult(configurator, countNames(configurator)) ? CdmStore.getService(INameService.class).getNamesByName(titleSearchString) : NO_RESULTS;
67 }
68
69
70
71 private int countNames(IIdentifiableEntityServiceConfigurator configurator){
72 return NO_COUNT;
73 }
74
75 /**
76 * <p>findTaxaAndNames</p>
77 *
78 * @param configurator a {@link eu.etaxonomy.cdm.api.service.config.ITaxonServiceConfigurator} object.
79 * @return a {@link java.util.List} object.
80 */
81 public List<UuidAndTitleCache<TaxonBase>> findTaxaAndNames(ITaxonServiceConfigurator configurator){
82
83 return checkLargeResult(configurator, countTaxaAndNames(configurator)) ? CdmStore.getService(ITaxonService.class).findTaxaAndNamesForEditor(configurator) : NO_RESULTS;
84 }
85
86 private int countTaxaAndNames(ITaxonServiceConfigurator configurator){
87 return NO_COUNT;
88 }
89
90 /**
91 * <p>findReferences</p>
92 *
93 * @param configurator a {@link eu.etaxonomy.cdm.api.service.config.IIdentifiableEntityServiceConfigurator} object.
94 * @return a {@link java.util.List} object.
95 */
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);
101
102 return checkLargeResult(configurator, countReferences(configurator)) ? CdmStore.getService(IReferenceService.class).findByTitle(null, titleSearchString, null, null, null, null, null, null).getRecords() : NO_RESULTS;
103 }
104
105 private int countReferences(IIdentifiableEntityServiceConfigurator configurator){
106 return NO_COUNT;
107 }
108
109 /**
110 * <p>findAgents</p>
111 *
112 * @param configurator a {@link eu.etaxonomy.cdm.api.service.config.IIdentifiableEntityServiceConfigurator} object.
113 * @return a {@link java.util.List} object.
114 */
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);
120
121 return checkLargeResult(configurator, countAgents(configurator)) ? CdmStore.getService(IAgentService.class).findByTitle(null, titleSearchString, null, null, null, null, null, null).getRecords() : NO_RESULTS;
122 }
123
124 private int countAgents(IIdentifiableEntityServiceConfigurator configurator){
125 return NO_COUNT;
126 }
127
128 /**
129 * <p>findTeamOrPersons</p>
130 *
131 * @param configurator a {@link eu.etaxonomy.cdm.api.service.config.IIdentifiableEntityServiceConfigurator} object.
132 * @return a {@link java.util.List} object.
133 */
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)) {
138 result.add(agent);
139 }
140 return result;
141 }
142
143 /**
144 * @param configurator
145 * @return
146 */
147 private int countTeamOrPersons(IIdentifiableEntityServiceConfigurator configurator) {
148 return NO_COUNT;
149 }
150
151 /**
152 * <p>findOccurrences</p>
153 *
154 * @param configurator a {@link eu.etaxonomy.cdm.api.service.config.IIdentifiableEntityServiceConfigurator} object.
155 * @return a {@link java.util.List} object.
156 */
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);
162
163 return checkLargeResult(configurator, countOccurrences(configurator)) ? CdmStore.getService(IOccurrenceService.class).findByTitle(SpecimenOrObservationBase.class, titleSearchString, null, null, null, null, null, null).getRecords() : NO_RESULTS;
164 }
165
166 private int countOccurrences(IIdentifiableEntityServiceConfigurator configurator){
167 return NO_COUNT;
168 }
169
170 public List<User> findUsers(IIdentifiableEntityServiceConfigurator configurator){
171 String userNameSearchString = getTitleSearchString(configurator);
172
173 return checkLargeResult(configurator, countUsers(configurator)) ? CdmStore.getService(IUserService.class).listByUsername(userNameSearchString, null, null, null, null, null, null) : NO_RESULTS;
174 }
175
176 private int countUsers(IIdentifiableEntityServiceConfigurator configurator){
177 return NO_COUNT;
178 }
179
180 public List<Group> findGroups(IIdentifiableEntityServiceConfigurator configurator){
181 String groupNameSearchString = getTitleSearchString(configurator);
182
183 return checkLargeResult(configurator, countGroups(configurator)) ? CdmStore.getService(IGroupService.class).listByName(groupNameSearchString, null, null, null, null, null, null) : NO_RESULTS;
184 }
185
186 private int countGroups(IIdentifiableEntityServiceConfigurator configurator){
187 return NO_COUNT;
188 }
189
190 /**
191 * @param countNames
192 * @return
193 */
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.");
197 }else{
198 return true;
199 }
200 }
201
202 private boolean isWildCardOnly(IIdentifiableEntityServiceConfigurator configurator){
203 return WILDCARD.equals(configurator.getTitleSearchString());
204 }
205
206 /**
207 * TODO this will be obsolete once IIdentifiableEntityServiceConfigurator is implemented in find* methods
208 *
209 * @param configurator
210 * @return
211 */
212 private String getTitleSearchString(IIdentifiableEntityServiceConfigurator configurator){
213 return configurator.getTitleSearchString().replace(WILDCARD, "%");
214 }
215 }