package org.limewire.core.impl.search.browse;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ExecutorService;
import org.limewire.core.api.library.RemoteLibraryManager;
import org.limewire.core.api.search.SearchListener;
import org.limewire.core.api.search.SearchResult;
import org.limewire.core.api.search.browse.BrowseStatus;
import org.limewire.core.api.search.browse.BrowseStatusListener;
import org.limewire.core.api.search.browse.BrowseStatus.BrowseState;
import org.limewire.io.GUID;
import ca.odell.glazedlists.event.ListEvent;
import ca.odell.glazedlists.event.ListEventListener;
class AllFriendsBrowseSearch extends AbstractBrowseSearch {
private final RemoteLibraryManager remoteLibraryManager;
private final ExecutorService backgroundExecutor;
private final ListEventListener<SearchResult> listEventListener = new AllFriendsListEventListener<SearchResult>();
public AllFriendsBrowseSearch(RemoteLibraryManager remoteLibraryManager, ExecutorService backgroundExecutor) {
this.remoteLibraryManager = remoteLibraryManager;
this.backgroundExecutor = backgroundExecutor;
}
@Override
public void start() {
backgroundExecutor.execute(new Runnable() {
@Override
public void run() {
for (SearchListener listener : searchListeners) {
listener.searchStarted(AllFriendsBrowseSearch.this);
}
installListener();
loadSnapshot();
}
});
}
@Override
public void stop() {
for (SearchListener listener : searchListeners) {
listener.searchStopped(AllFriendsBrowseSearch.this);
}
removeListener();
}
private void loadSnapshot() {
List<SearchResult> remoteFileItems = new ArrayList<SearchResult>();
remoteLibraryManager.getAllFriendsFileList().getModel().getReadWriteLock().readLock().lock();
try {
remoteFileItems.addAll(remoteLibraryManager.getAllFriendsFileList().getModel());
} finally {
remoteLibraryManager.getAllFriendsFileList().getModel().getReadWriteLock().readLock().unlock();
}
//add all files
for (SearchListener listener : searchListeners) {
listener.handleSearchResults(this, remoteFileItems);
}
//browse is finished
for (SearchListener listener : searchListeners) {
listener.searchStopped(AllFriendsBrowseSearch.this);
}
BrowseStatus status = (remoteFileItems.size() > 0) ? new BrowseStatus(AllFriendsBrowseSearch.this, BrowseState.LOADED) :
new BrowseStatus(AllFriendsBrowseSearch.this, BrowseState.NO_FRIENDS_SHARING);
for (BrowseStatusListener listener : browseStatusListeners){
listener.statusChanged(status);
}
}
private void installListener(){
remoteLibraryManager.getAllFriendsFileList().getModel().addListEventListener(listEventListener);
}
private void removeListener(){
remoteLibraryManager.getAllFriendsFileList().getModel().removeListEventListener(listEventListener);
}
private class AllFriendsListEventListener<E> implements ListEventListener<E> {
@Override
public void listChanged(ListEvent listChanges) {
BrowseStatus status = new BrowseStatus(AllFriendsBrowseSearch.this, BrowseState.UPDATED);
for (BrowseStatusListener listener : browseStatusListeners){
listener.statusChanged(status);
}
}
}
@Override
public void repeat() {
loadSnapshot();
}
@Override
public CopyOnWriteArrayList<SearchListener> getListenerList() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getQuery() {
// TODO Auto-generated method stub
return null;
}
@Override
public GUID getQueryGuid() {
// TODO Auto-generated method stub
return null;
}
}