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.event.api.Event; import org.sakaiproject.event.api.Notification; import org.sakaiproject.search.api.EntityContentProducer; import org.sakaiproject.search.api.SearchIndexBuilder; import org.sakaiproject.search.model.SearchBuilderItem; import java.lang.reflect.Method; import java.util.List; /** * Simple adapter allowing to switch easily between Search implementations with a property in sakai.properties. * * @author Colin Hebert */ public class SearchIndexBuilderAdapter implements SearchIndexBuilder { private static Log log = LogFactory.getLog(SearchIndexBuilderAdapter.class); private static final String SEARCH_BUILDER_IMPL_PROPERTY = "search.indexbuilder.impl"; /** * Defaults to the elastic search implementation if nothing was provided. */ private static final String DEFAULT_IMPL = "org.sakaiproject.search.component.service.impl.SearchIndexBuilderImpl"; private final SearchIndexBuilder searchIndexBuilder; public SearchIndexBuilderAdapter() { String searchIndexBuilderImplementation = ServerConfigurationService.getString(SEARCH_BUILDER_IMPL_PROPERTY, DEFAULT_IMPL); searchIndexBuilder = (SearchIndexBuilder) ComponentManager.get(searchIndexBuilderImplementation); } @Override public void addResource(Notification notification, Event event) { searchIndexBuilder.addResource(notification, event); } @Override public void registerEntityContentProducer(EntityContentProducer ecp) { searchIndexBuilder.registerEntityContentProducer(ecp); } @Override public void refreshIndex() { searchIndexBuilder.refreshIndex(); } @Override public void rebuildIndex() { searchIndexBuilder.rebuildIndex(); } @Override public boolean isBuildQueueEmpty() { return searchIndexBuilder.isBuildQueueEmpty(); } @Override public List<EntityContentProducer> getContentProducers() { return searchIndexBuilder.getContentProducers(); } @Override public void destroy() { searchIndexBuilder.destroy(); } @Override public int getPendingDocuments() { return searchIndexBuilder.getPendingDocuments(); } @Override public void rebuildIndex(String currentSiteId) { searchIndexBuilder.rebuildIndex(currentSiteId); } @Override public void refreshIndex(String currentSiteId) { searchIndexBuilder.refreshIndex(currentSiteId); } @Override public List<SearchBuilderItem> getAllSearchItems() { return searchIndexBuilder.getAllSearchItems(); } @Override public EntityContentProducer newEntityContentProducer(Event event) { return searchIndexBuilder.newEntityContentProducer(event); } @Override public EntityContentProducer newEntityContentProducer(String ref) { return searchIndexBuilder.newEntityContentProducer(ref); } @Override public List<SearchBuilderItem> getSiteMasterSearchItems() { return searchIndexBuilder.getSiteMasterSearchItems(); } @Override public List<SearchBuilderItem> getGlobalMasterSearchItems() { return searchIndexBuilder.getGlobalMasterSearchItems(); } @Override public boolean isOnlyIndexSearchToolSites() { return searchIndexBuilder.isOnlyIndexSearchToolSites(); } @Override public boolean isExcludeUserSites() { return searchIndexBuilder.isExcludeUserSites(); } public void setOnlyIndexSearchToolSites(boolean onlyIndexSearchToolSites) { try { Method method = searchIndexBuilder.getClass().getMethod("setOnlyIndexSearchToolSites", new Class[]{boolean.class}); method.invoke(searchIndexBuilder, onlyIndexSearchToolSites); log.trace("######### searchIndexBuilder.getSearchServer() = " + searchIndexBuilder.isOnlyIndexSearchToolSites()); } catch (NoSuchMethodException e) { log.debug(searchIndexBuilder.getClass().getName() + " does not have a method called setOnlyIndexSearchToolSites."); } catch (Exception e) { log.error(e.getMessage(), e); } } public void setExcludeUserSites(boolean excludeUserSites) { try { Method method = searchIndexBuilder.getClass().getMethod("setExcludeUserSites", new Class[]{boolean.class}); method.invoke(searchIndexBuilder, excludeUserSites); log.trace("######### searchIndexBuilder.getSearchServer() = " + searchIndexBuilder.isExcludeUserSites()); } catch (NoSuchMethodException e) { log.debug(searchIndexBuilder.getClass().getName() + " does not have a method called setExcludeUserSites."); } catch (Exception e) { log.error(e.getMessage(), e); } } }