package org.limewire.core.impl.search;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.limegroup.gnutella.URN;
import org.limewire.core.api.FilePropertyKey;
import org.limewire.core.api.search.Search;
import org.limewire.core.api.search.SearchCategory;
import org.limewire.core.api.search.SearchDetails;
import org.limewire.core.api.search.SearchListener;
import org.limewire.core.api.search.SearchManager;
import org.limewire.core.api.search.SearchFactory;
import org.limewire.core.api.search.SearchResult;
import org.limewire.core.api.search.sponsored.SponsoredResult;
import org.limewire.io.GUID;
@Singleton
public
class SearchManagerImpl implements SearchManager {
private List<SearchWithResults> searchList;
private SearchFactory searchFactory;
@Inject
public SearchManagerImpl(SearchFactory searchFactory) {
this.searchFactory = searchFactory;
this.searchList = new ArrayList<SearchWithResults>();
}
@Override
public SearchWithResults getSearchByGuid(GUID guid) {
for (SearchWithResults search : this.searchList) {
if(search.getQueryGuid().toHexString().contentEquals(guid.toHexString())) {
return search;
}
}
return null;
}
@Override
public List<SearchWithResults> getAllSearches() {
return this.searchList;
}
public SearchWithResults createSearchFromQuery(String query) {
SearchDetails searchDetails = new Details(query);
Search search = searchFactory.createSearch(searchDetails);
SearchWithResults searchWithResults = new SearchWithResults(search);
this.searchList.add(searchWithResults);
return searchWithResults;
}
public class Listener implements SearchListener {
private List<SearchResult> searchResults;
public Listener() {
this.searchResults = new ArrayList<SearchResult>();
}
@Override
public void searchStopped(Search search) {
// Do nothing
}
@Override
public void handleSponsoredResults(Search search, List<SponsoredResult> sponsoredResult) {
// Do nothing
}
@Override
public void handleSearchResult(Search search, SearchResult searchResult) {
this.searchResults.add(searchResult);
}
@Override
public void searchStarted(Search search) {
// Do nothing
}
@Override
public void handleSearchResults(Search search,
Collection<? extends SearchResult> searchResults) {
this.searchResults.addAll(searchResults);
}
}
public class Details implements SearchDetails {
private String query;
public Details(String query) {
this.query = query;
}
@Override
public SearchCategory getSearchCategory() {
return SearchCategory.ALL;
}
@Override
public String getSearchQuery() {
return this.query;
}
@Override
public SearchType getSearchType() {
return SearchType.KEYWORD;
}
@Override
public Map<FilePropertyKey, String> getAdvancedDetails() {
// TODO Auto-generated method stub
return null;
}
}
public class SearchWithResults {
private Search search;
private Listener listener;
public SearchWithResults(Search search) {
System.out.println(search.toString());
this.search = search;
this.listener = new Listener();
this.search.addSearchListener(this.listener);
}
public GUID getQueryGuid() {
return this.search.getQueryGuid();
}
public Search getSearch() {
return this.search;
}
public List<SearchResult> getSearchResults() {
return this.listener.searchResults;
}
public void start() {
this.search.start();
}
public void stop() {
this.search.stop();
}
public String getQueryString() {
return this.search.getQuery();
}
public List<? extends SearchResult> getSearchResultsFromUrn(URN urn) {
List<SearchResult> urnResults = new ArrayList<SearchResult>();
for(SearchResult result : this.listener.searchResults) {
if(result.getUrn().toString().equals(urn.toString())) { urnResults.add(result); }
}
return urnResults;
}
}
}