package org.sakaiproject.search.adapter;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.component.cover.ComponentManager;
import org.sakaiproject.component.cover.ServerConfigurationService;
import org.sakaiproject.search.api.*;
import org.sakaiproject.search.model.SearchBuilderItem;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Map;
/**
* Adapter allowing to easily switch the search implementation with a configuration in sakai.properties.
*
* @author Colin Hebert
*/
public class SearchServiceAdapter implements SearchService {
private static Log log = LogFactory.getLog(SearchServiceAdapter.class);
private static final String SEARCH_IMPL_PROPERTY = "search.service.impl";
/**
* Defaults to the elastic search implementation if nothing was provided.
*/
private static final String DEFAULT_IMPL = "org.sakaiproject.search.component.service.impl.ConcurrentSearchServiceImpl";
private final SearchService searchService;
public SearchServiceAdapter() {
String searchServiceImplementation = ServerConfigurationService.getString(SEARCH_IMPL_PROPERTY, DEFAULT_IMPL);
searchService = (SearchService) ComponentManager.get(searchServiceImplementation);
}
@Override
public SearchList search(String searchTerms, List<String> contexts, int searchStart, int searchEnd)
throws InvalidSearchQueryException {
return searchService.search(searchTerms, contexts, searchStart, searchEnd);
}
@Override
public SearchList search(String searchTerms, List<String> contexts, int start, int end,
String filterName, String sorterName)
throws InvalidSearchQueryException {
return searchService.search(searchTerms, contexts, start, end, filterName, sorterName);
}
@Override
public void registerFunction(String function) {
searchService.registerFunction(function);
}
@Override
public void reload() {
searchService.reload();
}
@Override
public void refreshInstance() {
searchService.refreshInstance();
}
@Override
public void rebuildInstance() {
searchService.rebuildInstance();
}
@Override
public void refreshSite(String currentSiteId) {
searchService.refreshSite(currentSiteId);
}
@Override
public void rebuildSite(String currentSiteId) {
searchService.rebuildSite(currentSiteId);
}
@Override
public String getStatus() {
return searchService.getStatus();
}
@Override
public int getNDocs() {
return searchService.getNDocs();
}
@Override
public int getPendingDocs() {
return searchService.getPendingDocs();
}
@Override
public List<SearchBuilderItem> getAllSearchItems() {
return searchService.getAllSearchItems();
}
@Override
public List<SearchBuilderItem> getSiteMasterSearchItems() {
return searchService.getSiteMasterSearchItems();
}
@Override
public List<SearchBuilderItem> getGlobalMasterSearchItems() {
return searchService.getGlobalMasterSearchItems();
}
@Override
public SearchStatus getSearchStatus() {
return searchService.getSearchStatus();
}
@Override
public boolean removeWorkerLock() {
return searchService.removeWorkerLock();
}
@Override
public List getSegmentInfo() {
return searchService.getSegmentInfo();
}
@Override
public void forceReload() {
searchService.forceReload();
}
@Override
public TermFrequency getTerms(int documentId) throws IOException {
return searchService.getTerms(documentId);
}
@Override
public String searchXML(Map parameterMap) {
return searchService.searchXML(parameterMap);
}
@Override
public boolean isEnabled() {
return searchService.isEnabled();
}
@Override
public String getDigestStoragePath() {
return searchService.getDigestStoragePath();
}
@Override
public String getSearchSuggestion(String searchString) {
return searchService.getSearchSuggestion(searchString);
}
@Override
public String[] getSearchSuggestions(String searchString, String currentSite, boolean allMySites) {
return searchService.getSearchSuggestions(searchString, currentSite, allMySites);
}
/**
* provides some backwards compatibility for impls that doesn't support setting this property.
* @param searchServer
*/
public void setSearchServer(boolean searchServer) {
try {
Method method = searchService.getClass().getMethod("setSearchServer", new Class[]{boolean.class});
method.invoke(searchService, searchServer);
log.trace("######### searchService.getSearchServer() = " + searchService.isSearchServer());
} catch (NoSuchMethodException e) {
log.debug(searchService.getClass().getName() + " does not have a method called setSearchServer.");
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
@Override
public boolean isSearchServer() {
return searchService.isSearchServer();
}
@Override
public void enableDiagnostics() {
searchService.enableDiagnostics();
}
@Override
public void disableDiagnostics() {
searchService.disableDiagnostics();
}
@Override
public boolean hasDiagnostics() {
return searchService.hasDiagnostics();
}
}