package org.limewire.core.impl.monitor;
import org.limewire.collection.glazedlists.GlazedListsFactory;
import org.limewire.core.api.monitor.IncomingSearchManager;
import org.limewire.inject.EagerSingleton;
import ca.odell.glazedlists.BasicEventList;
import ca.odell.glazedlists.EventList;
import com.google.inject.Inject;
/**
* An implementation of <code>IncomingSearchManager</code> for the live core.
*/
@EagerSingleton
public class CoreIncomingSearchManager
implements IncomingSearchManager, IncomingSearchListener {
/** List of incoming search phrases. */
private final EventList<String> incomingSearchList;
/** Indicator to enable list. */
private boolean listEnabled = true;
/** Number of list elements. */
private int listSize = 32;
/**
* Constructs the live implementation of IncomingSearchManager using the
* specified incoming search listener list.
*/
@Inject
public CoreIncomingSearchManager(IncomingSearchListenerList incomingListenerList) {
// Create list of incoming search text.
incomingSearchList = GlazedListsFactory.threadSafeList(
new BasicEventList<String>());
// Add manager as listener for incoming search events.
incomingListenerList.addIncomingSearchListener(this);
}
/**
* Returns a read-only list of incoming search phrases. An application
* should NOT assume that the returned list is Swing-compatible; Swing is
* supported by wrapping the resulting list via a call to <code>
* GlazedListsFactory.swingThreadProxyEventList()</code>.
*/
@Override
public EventList<String> getIncomingSearchList() {
return GlazedListsFactory.readOnlyList(incomingSearchList);
}
/**
* Sets an indicator to enable the list.
*/
@Override
public void setListEnabled(boolean enabled) {
incomingSearchList.getReadWriteLock().writeLock().lock();
try {
listEnabled = enabled;
} finally {
incomingSearchList.getReadWriteLock().writeLock().unlock();
}
}
/**
* Sets the size of the list.
*/
@Override
public void setListSize(int size) {
incomingSearchList.getReadWriteLock().writeLock().lock();
try {
// Set size, and reduce list to fit.
listSize = size;
reduceList(size);
} finally {
incomingSearchList.getReadWriteLock().writeLock().unlock();
}
}
/**
* Adds the specified query text to the list.
*/
@Override
public void handleQueryString(String query) {
incomingSearchList.getReadWriteLock().writeLock().lock();
try {
// Reduce list and add query text if enabled.
if (listEnabled) {
incomingSearchList.add(0, query);
reduceList(listSize);
}
} finally {
incomingSearchList.getReadWriteLock().writeLock().unlock();
}
}
/**
* Reduces the incoming search list to the specified size. Elements are
* removed from the end of the list.
*/
private void reduceList(int size) {
// Reduce list to fit specified size.
while ((size >= 0) && (incomingSearchList.size() > size)) {
incomingSearchList.remove(incomingSearchList.size() - 1);
}
}
}