1 package org.columba.core.search; 2 3 import java.util.Collections ; 4 import java.util.Hashtable ; 5 import java.util.Iterator ; 6 import java.util.List ; 7 import java.util.Map ; 8 import java.util.Vector ; 9 import java.util.logging.Logger ; 10 11 import javax.swing.SwingUtilities ; 12 import javax.swing.event.EventListenerList ; 13 14 import org.columba.api.command.IWorkerStatusController; 15 import org.columba.core.command.Command; 16 import org.columba.core.command.CommandProcessor; 17 import org.columba.core.search.api.IResultEvent; 18 import org.columba.core.search.api.IResultListener; 19 import org.columba.core.search.api.ISearchCriteria; 20 import org.columba.core.search.api.ISearchManager; 21 import org.columba.core.search.api.ISearchProvider; 22 import org.columba.core.search.api.ISearchRequest; 23 import org.columba.core.search.api.ISearchResult; 24 25 public class SearchManager implements ISearchManager { 26 27 private static final Logger LOG = Logger 28 .getLogger("org.columba.core.search.SearchManager"); 29 30 protected EventListenerList listenerList = new EventListenerList (); 31 32 private Map <String , ISearchProvider> providerMap = new Hashtable <String , ISearchProvider>(); 33 34 38 private Map <String , Command> commandMap = new Hashtable <String , Command>(); 39 40 public SearchManager() { 41 commandMap = Collections.synchronizedMap(commandMap); 43 44 } 45 46 50 public void executeSearch(String searchTerm, boolean searchInside, 51 int startIndex, int resultCount) { 52 if (searchTerm == null) 53 throw new IllegalArgumentException ("searchTerm == null"); 54 if (startIndex < 0) 55 throw new IllegalArgumentException ("startIndex must be >= 0"); 56 if (resultCount <= 0) 57 throw new IllegalArgumentException ("resultCount must be > 0"); 58 59 60 Command command = new SearchCommand(new SearchCommandReference(searchTerm, 61 startIndex, resultCount, searchInside)); 62 63 CommandProcessor.getInstance().addOp(command); 65 } 66 67 71 public void executeSearch(String searchTerm, String providerName, boolean searchInside, 72 int startIndex, int resultCount) { 73 if (searchTerm == null) 74 throw new IllegalArgumentException ("searchTerm == null"); 75 if (providerName == null) 76 throw new IllegalArgumentException ("providerName == null"); 77 if (startIndex < 0) 78 throw new IllegalArgumentException ("startIndex must be >= 0"); 79 if (resultCount <= 0) 80 throw new IllegalArgumentException ("resultCount must be > 0"); 81 82 83 Command command = new SearchCommand(new SearchCommandReference(searchTerm, 84 providerName, startIndex, resultCount)); 85 CommandProcessor.getInstance().addOp(command); 87 } 88 89 public void executeSearch(String searchTerm, String providerName, 90 String criteriaName, boolean searchInside, int startIndex, int resultCount) { 91 if (searchTerm == null) 92 throw new IllegalArgumentException ("searchTerm == null"); 93 if (providerName == null) 94 throw new IllegalArgumentException ("providerName == null"); 95 if (criteriaName == null) 96 throw new IllegalArgumentException ("criteriaName == null"); 97 if (startIndex < 0) 98 throw new IllegalArgumentException ("startIndex must be >= 0"); 99 if (resultCount <= 0) 100 throw new IllegalArgumentException ("resultCount must be > 0"); 101 102 Command command = new SearchCommand(new SearchCommandReference(searchTerm, 103 providerName, criteriaName, searchInside, startIndex, resultCount)); 104 105 CommandProcessor.getInstance().addOp(command); 107 } 108 109 public void executeSearch(List <ISearchRequest> requests, 110 boolean allCriteria, boolean searchInside, int startIndex, 111 int resultCount) { 112 if (requests == null) 113 throw new IllegalArgumentException ("requests == null"); 114 if (startIndex < 0) 115 throw new IllegalArgumentException ("startIndex must be >= 0"); 116 if (resultCount <= 0) 117 throw new IllegalArgumentException ("resultCount must be > 0"); 118 119 Command command = new SearchCommand(new SearchCommandReference( 120 requests, allCriteria, startIndex, resultCount, searchInside)); 121 122 CommandProcessor.getInstance().addOp(command); 123 } 124 125 128 public Iterator <ISearchProvider> getAllProviders() { 129 return providerMap.values().iterator(); 130 } 131 132 135 public void clearSearch(String searchTerm) { 136 if (commandMap.containsKey(searchTerm)) 139 commandMap.remove(searchTerm); 140 141 fireClearSearch(searchTerm); 142 } 143 144 public void reset() { 145 fireReset(); 146 } 147 148 152 protected void fireNewResultArrived(String searchTerm, 153 String providerTechnicalName, ISearchCriteria criteria, 154 List <ISearchResult> result, int totalResultCount) { 155 156 IResultEvent e = new ResultEvent(this, searchTerm, 157 providerTechnicalName, criteria, result, totalResultCount); 158 Object [] listeners = listenerList.getListenerList(); 160 161 for (int i = listeners.length - 2; i >= 0; i -= 2) { 164 if (listeners[i] == IResultListener.class) { 165 ((IResultListener) listeners[i + 1]).resultArrived(e); 166 } 167 } 168 } 169 170 protected void fireNewResultArrived(String providerTechnicalName, 171 List <ISearchResult> result, int totalResultCount) { 172 173 IResultEvent e = new ResultEvent(this, providerTechnicalName, result, 174 totalResultCount); 175 Object [] listeners = listenerList.getListenerList(); 177 178 for (int i = listeners.length - 2; i >= 0; i -= 2) { 181 if (listeners[i] == IResultListener.class) { 182 ((IResultListener) listeners[i + 1]).resultArrived(e); 183 } 184 } 185 } 186 187 protected void fireFinished() { 188 IResultEvent e = new ResultEvent(this); 189 Object [] listeners = listenerList.getListenerList(); 191 192 for (int i = listeners.length - 2; i >= 0; i -= 2) { 195 if (listeners[i] == IResultListener.class) { 196 ((IResultListener) listeners[i + 1]).finished(e); 197 } 198 } 199 200 } 201 202 205 protected void fireClearSearch(String searchTerm) { 206 207 IResultEvent e = new ResultEvent(this, searchTerm); 208 Object [] listeners = listenerList.getListenerList(); 210 211 for (int i = listeners.length - 2; i >= 0; i -= 2) { 214 if (listeners[i] == IResultListener.class) { 215 ((IResultListener) listeners[i + 1]).clearSearch(e); 216 } 217 } 218 } 219 220 protected void fireReset() { 221 222 IResultEvent e = new ResultEvent(this); 223 Object [] listeners = listenerList.getListenerList(); 225 226 for (int i = listeners.length - 2; i >= 0; i -= 2) { 229 if (listeners[i] == IResultListener.class) { 230 ((IResultListener) listeners[i + 1]).reset(e); 231 } 232 } 233 } 234 235 238 public void addResultListener(IResultListener l) { 239 listenerList.add(IResultListener.class, l); 240 241 } 242 243 246 public void removeResultListener(IResultListener l) { 247 listenerList.remove(IResultListener.class, l); 248 249 } 250 251 262 class SearchCommand extends Command { 263 264 public SearchCommand(SearchCommandReference reference) { 265 super(reference); 266 } 267 268 @Override 269 public void execute(IWorkerStatusController worker) throws Exception { 270 final SearchCommandReference ref = (SearchCommandReference) getReference(); 271 272 if (ref.getType().equals(SearchCommandReference.TYPE.SIMPLE_ALL)) { 273 Iterator <ISearchProvider> it = getAllProviders(); 274 while (it.hasNext()) { 275 final ISearchProvider p = it.next(); 276 277 Iterator <ISearchCriteria> it2 = p.getAllCriteria( 279 ref.getSearchTerm()).iterator(); 280 while (it2.hasNext()) { 281 ISearchCriteria c = it2.next(); 282 String searchCriteriaTechnicalName = c 283 .getTechnicalName(); 284 doExecute(ref.getSearchTerm(), p, 286 searchCriteriaTechnicalName, ref 287 .isSearchInside(), ref.getStartIndex(), 288 ref.getResultCount()); 289 } 290 291 } 292 } else if (ref.getType().equals( 293 SearchCommandReference.TYPE.SIMPLE_SPECIFIC_PROVIDER)) { 294 String providerTechnicalName = ref.getProviderTechnicalName(); 295 ISearchProvider p = getProvider(providerTechnicalName); 296 Iterator <ISearchCriteria> it2 = p.getAllCriteria( 298 ref.getSearchTerm()).iterator(); 299 while (it2.hasNext()) { 300 ISearchCriteria c = it2.next(); 301 String searchCriteriaTechnicalName = c.getTechnicalName(); 302 doExecute(ref.getSearchTerm(), p, 304 searchCriteriaTechnicalName, ref.isSearchInside(), 305 ref.getStartIndex(), ref.getResultCount()); 306 } 307 } else if (ref.getType().equals( 308 SearchCommandReference.TYPE.SIMPLE_SPECIFIC_CRITERIA)) { 309 String providerTechnicalName = ref.getProviderTechnicalName(); 310 ISearchProvider p = getProvider(providerTechnicalName); 311 doExecute(ref.getSearchTerm(), p, ref 312 .getSearchCriteriaTechnicalName(), 313 ref.isSearchInside(), ref.getStartIndex(), ref 314 .getResultCount()); 315 } else if (ref.getType() 316 .equals(SearchCommandReference.TYPE.COMPLEX)) { 317 318 Map <String , Vector <ISearchRequest>> map = new Hashtable <String , Vector <ISearchRequest>>(); 320 Iterator <ISearchRequest> it = ref.getRequest().iterator(); 321 while (it.hasNext()) { 322 ISearchRequest r = it.next(); 323 String providerName = r.getProvider(); 324 325 if (map.containsKey(providerName)) { 326 Vector <ISearchRequest> v = map.get(providerName); 327 v.add(r); 328 } else { 329 Vector <ISearchRequest> v = new Vector <ISearchRequest>(); 330 v.add(r); 331 map.put(providerName, v); 332 } 333 } 334 335 Iterator <String > it2 = map.keySet().iterator(); 337 while (it2.hasNext()) { 338 final String providerName = it2.next(); 339 ISearchProvider p = getProvider(providerName); 340 Vector <ISearchRequest> v = map.get(providerName); 341 final List <ISearchResult> resultList = p.query(v, ref 342 .isMatchAll(), ref.isSearchInside(), ref 343 .getStartIndex(), ref.getResultCount()); 344 345 final int totalResultCount = p.getTotalResultCount(); 346 347 349 Runnable run = new Runnable () { 351 public void run() { 352 fireNewResultArrived(providerName, resultList, 353 totalResultCount); 354 } 355 }; 356 SwingUtilities.invokeLater(run); 357 } 358 359 } 360 361 Runnable run = new Runnable () { 363 public void run() { 364 fireFinished(); 365 } 366 }; 367 SwingUtilities.invokeLater(run); 368 369 407 } 408 409 private void doExecute(final String searchTerm, 410 final ISearchProvider p, 411 final String searchCriteriaTechnicalName, 412 final boolean searchInside, final int startIndex, 413 final int resultCount) { 414 415 final List <ISearchResult> resultList = p.query(searchTerm, 417 searchCriteriaTechnicalName, searchInside, startIndex, 418 resultCount); 419 420 final int totalResultCount = p.getTotalResultCount(); 422 423 425 Runnable run = new Runnable () { 427 public void run() { 428 429 fireNewResultArrived(searchTerm, p.getTechnicalName(), p 430 .getCriteria(searchCriteriaTechnicalName, 431 searchTerm), resultList, totalResultCount); 432 433 } 434 }; 435 SwingUtilities.invokeLater(run); 436 } 437 438 } 439 440 443 public ISearchProvider getProvider(String technicalName) { 444 return providerMap.get(technicalName); 445 } 446 447 public void registerProvider(ISearchProvider p) { 448 providerMap.put(p.getTechnicalName(), p); 449 } 450 451 public void unregisterProvider(ISearchProvider p) { 452 providerMap.remove(p.getTechnicalName()); 453 } 454 455 } 456 | Popular Tags |