View Javadoc

1   /**
2    * Copyright 2010 The Kuali Foundation Licensed under the
3    * Educational Community License, Version 2.0 (the "License"); you may
4    * not use this file except in compliance with the License. You may
5    * obtain a copy of the License at
6    *
7    * http://www.osedu.org/licenses/ECL-2.0
8    *
9    * Unless required by applicable law or agreed to in writing,
10   * software distributed under the License is distributed on an "AS IS"
11   * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
12   * or implied. See the License for the specific language governing
13   * permissions and limitations under the License.
14   */
15  
16  package org.kuali.student.common.search.service.impl;
17  
18  import java.util.ArrayList;
19  import java.util.HashMap;
20  import java.util.List;
21  import java.util.Map;
22  
23  import org.apache.log4j.Logger;
24  import org.kuali.student.common.exceptions.OperationFailedException;
25  import org.kuali.student.common.search.dto.SearchRequest;
26  import org.kuali.student.common.search.dto.SearchResult;
27  import org.kuali.student.common.search.dto.SearchTypeInfo;
28  import org.kuali.student.common.search.service.SearchDispatcher;
29  import org.kuali.student.common.search.service.SearchService;
30  
31  public class SearchDispatcherImpl implements SearchDispatcher{
32  	final Logger LOG = Logger.getLogger(SearchDispatcherImpl.class);
33  	
34  	private List<SearchService> services;
35  	
36  	//Map of search key->service
37  	private Map<String,SearchService> serviceMap = null;
38  	
39  	
40  	
41  	public SearchDispatcherImpl() {
42  		super();
43  	}
44  
45  	public SearchDispatcherImpl(SearchService... services){
46  		super();
47  		this.services = new ArrayList<SearchService>();
48  		if(services!=null){
49  			for(SearchService service:services){
50  				this.services.add(service);
51  			}
52  		}
53  	}
54  	
55  	public synchronized void init(){
56  		if(serviceMap==null){
57  			serviceMap = new HashMap<String,SearchService>();
58  			
59  			//Look through each service, grab it's search keys and add them to the map
60  			for(SearchService service:services){
61  				if(null==service){
62  					LOG.warn("Null service passed to SearchDelegator");
63  				}else{
64  					try {
65  						List<SearchTypeInfo> searchTypes = service.getSearchTypes();
66  						if(searchTypes!=null){
67  							for(SearchTypeInfo searchType:searchTypes){
68  								serviceMap.put(searchType.getKey(),service);
69  							}
70  						}
71  					} catch (OperationFailedException e) {
72  						LOG.warn("Error getting searchTypes",e);
73  					}
74  				}
75  			}
76  		}
77  	}
78  	
79  	
80  	/**
81  	 * Delegates to the service responsible for the given search type key
82  	 * @param searchRequest
83  	 * @return The searchResult from the delegated search or null
84  	 */
85  	public SearchResult dispatchSearch(SearchRequest searchRequest) {
86  		//Lazy Load service map.  THis might cause synchronization issues?
87  		//Needed because of circular bean dependencies... dispatch->serviceImpl->searchMgr->crossSvcMgr->dispatch
88  		if(serviceMap==null){
89  			init();
90  		}
91  		//Lookup which service to call for given search key and do the search
92  		if(searchRequest != null){
93  			String searchKey = searchRequest.getSearchKey();
94  			SearchService searchService = serviceMap.get(searchKey);
95  			if(searchService != null){
96  				SearchResult searchResult;
97  				try {
98  					searchResult = searchService.search(searchRequest);
99  				} catch (Exception e) {
100 					LOG.warn("Error invoking search",e);
101 					return null;
102 				}
103 				return searchResult;
104 			}
105 			LOG.error("Error Dispatching, Search Service not found for search key:"+searchRequest.getSearchKey());
106 		}
107 		return null;
108 	}
109 
110 	public void setServices(List<SearchService> services) {
111 		this.services = services;
112 	}
113 }