diff --git a/elasticsearch/pack/src/webapp/WEB-INF/components.xml b/elasticsearch/pack/src/webapp/WEB-INF/components.xml
index eea772d..30294c3 100644
--- a/elasticsearch/pack/src/webapp/WEB-INF/components.xml
+++ b/elasticsearch/pack/src/webapp/WEB-INF/components.xml
@@ -1,7 +1,7 @@
-
-
+
@@ -15,7 +15,7 @@
-
diff --git a/search-impl/impl/src/java/org/sakaiproject/search/adapter/SearchIndexBuilderAdapter.java b/search-impl/impl/src/java/org/sakaiproject/search/adapter/SearchIndexBuilderAdapter.java
new file mode 100644
index 0000000..2ba3e95
--- /dev/null
+++ b/search-impl/impl/src/java/org/sakaiproject/search/adapter/SearchIndexBuilderAdapter.java
@@ -0,0 +1,116 @@
+package org.sakaiproject.search.adapter;
+
+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.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 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 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 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 getSiteMasterSearchItems() {
+ return searchIndexBuilder.getSiteMasterSearchItems();
+ }
+
+ @Override
+ public List getGlobalMasterSearchItems() {
+ return searchIndexBuilder.getGlobalMasterSearchItems();
+ }
+
+ @Override
+ public boolean isOnlyIndexSearchToolSites() {
+ return searchIndexBuilder.isOnlyIndexSearchToolSites();
+ }
+
+ @Override
+ public boolean isExcludeUserSites() {
+ return searchIndexBuilder.isExcludeUserSites();
+ }
+}
diff --git a/search-impl/impl/src/java/org/sakaiproject/search/adapter/SearchServiceAdapter.java b/search-impl/impl/src/java/org/sakaiproject/search/adapter/SearchServiceAdapter.java
new file mode 100644
index 0000000..6fdc74a
--- /dev/null
+++ b/search-impl/impl/src/java/org/sakaiproject/search/adapter/SearchServiceAdapter.java
@@ -0,0 +1,172 @@
+package org.sakaiproject.search.adapter;
+
+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.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 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 contexts, int searchStart, int searchEnd)
+ throws InvalidSearchQueryException {
+ return searchService.search(searchTerms, contexts, searchStart, searchEnd);
+ }
+
+ @Override
+ public SearchList search(String searchTerms, List 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 getAllSearchItems() {
+ return searchService.getAllSearchItems();
+ }
+
+ @Override
+ public List getSiteMasterSearchItems() {
+ return searchService.getSiteMasterSearchItems();
+ }
+
+ @Override
+ public List 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);
+ }
+
+ @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();
+ }
+}
diff --git a/search-impl/pack/src/webapp/WEB-INF/components.xml b/search-impl/pack/src/webapp/WEB-INF/components.xml
index 1ed4f96..dc4ef44 100644
--- a/search-impl/pack/src/webapp/WEB-INF/components.xml
+++ b/search-impl/pack/src/webapp/WEB-INF/components.xml
@@ -26,11 +26,14 @@
+
-
-
-
+
+
+
+
diff --git a/search-impl/pack/src/webapp/WEB-INF/coreSearchComponents.xml b/search-impl/pack/src/webapp/WEB-INF/coreSearchComponents.xml
index 113dc31..d398df4 100644
--- a/search-impl/pack/src/webapp/WEB-INF/coreSearchComponents.xml
+++ b/search-impl/pack/src/webapp/WEB-INF/coreSearchComponents.xml
@@ -22,10 +22,10 @@
*
**********************************************************************************/
-->
-
+
-
@@ -67,7 +67,7 @@
-
diff --git a/search-impl/pack/src/webapp/WEB-INF/parallelIndexComponents.xml b/search-impl/pack/src/webapp/WEB-INF/parallelIndexComponents.xml
index 8ce4b44..f70f392 100644
--- a/search-impl/pack/src/webapp/WEB-INF/parallelIndexComponents.xml
+++ b/search-impl/pack/src/webapp/WEB-INF/parallelIndexComponents.xml
@@ -22,7 +22,7 @@
*
**********************************************************************************/
-->
-
+
@@ -79,7 +79,7 @@
-
@@ -119,7 +119,7 @@
-