package org.limewire.core.impl.search;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import org.limewire.core.api.search.Search;
import org.limewire.core.api.search.SearchDetails;
import org.limewire.core.api.search.SearchManager;
import org.limewire.core.api.search.SearchResultList;
import org.limewire.inject.LazySingleton;
import org.limewire.io.GUID;
import com.google.inject.Inject;
/**
* Implementation of SearchManager for the live core.
*/
@LazySingleton
public class CoreSearchManager implements SearchManager {
private final List<SearchResultList> threadSafeSearchList;
private final SearchMonitor searchMonitor;
/**
* Constructs a CoreSearchManager with the specified services.
*/
@Inject
public CoreSearchManager(SearchMonitor searchMonitor) {
this.searchMonitor = searchMonitor;
this.threadSafeSearchList = new CopyOnWriteArrayList<SearchResultList>();
}
@Inject
void register() {
searchMonitor.setSearchManager(this);
}
@Override
public SearchResultList addMonitoredSearch(Search search, SearchDetails searchDetails) {
// Add search.
SearchResultList resultList = addSearch(search, searchDetails);
// Add search result list to monitor.
searchMonitor.addSearch(resultList);
return resultList;
}
@Override
public SearchResultList addSearch(Search search, SearchDetails searchDetails) {
// Create result list.
SearchResultList resultList = new CoreSearchResultList(search, searchDetails);
// Add result list to collection.
threadSafeSearchList.add(resultList);
return resultList;
}
@Override
public void removeSearch(Search search) {
// Dispose of result list and remove from collection.
for (SearchResultList resultList : threadSafeSearchList) {
if (search.equals(resultList.getSearch())) {
// Dispose search and remove from management.
resultList.dispose();
threadSafeSearchList.remove(resultList);
// Remove from search monitor.
searchMonitor.removeSearch(resultList);
break;
}
}
}
@Override
public void stopSearch(SearchResultList resultList) {
// Stop search and remove from management.
resultList.getSearch().stop();
resultList.dispose();
threadSafeSearchList.remove(resultList);
}
@Override
public List<SearchResultList> getActiveSearchLists() {
List<SearchResultList> list = new ArrayList<SearchResultList>();
// Add active searches to list.
for (SearchResultList resultList : threadSafeSearchList) {
if (resultList.getGuid() != null) {
// Update search monitor.
searchMonitor.updateSearch(resultList);
list.add(resultList);
}
}
return list;
}
@Override
public SearchResultList getSearchResultList(GUID guid) {
// Return result list from collection.
for (SearchResultList resultList : threadSafeSearchList) {
if (guid.equals(resultList.getGuid())) {
// Update search monitor.
searchMonitor.updateSearch(resultList);
return resultList;
}
}
// Return null if search not found.
return null;
}
@Override
public SearchResultList getSearchResultList(Search search) {
// Return result list from collection.
for (SearchResultList resultList : threadSafeSearchList) {
if (search.equals(resultList.getSearch())) {
// Update search monitor.
searchMonitor.updateSearch(resultList);
return resultList;
}
}
// Return null if search not found.
return null;
}
}