package com.limegroup.gnutella.filters;
import java.util.Set;
import java.util.TreeSet;
import com.limegroup.gnutella.GUID;
import com.limegroup.gnutella.messages.Message;
import com.limegroup.gnutella.messages.QueryReply;
/**
* Filter for query replies based on the GUID
* of the reply, and other details.
*/
public final class MutableGUIDFilter extends SpamFilter {
private static final MutableGUIDFilter INSTANCE = new MutableGUIDFilter();
private MutableGUIDFilter() { FILTER.disallowAdult(); }
public static MutableGUIDFilter instance() { return INSTANCE; }
/**
* The Set of GUIDs to compare.
*
* LOCKING: Never modify -- instead synchronize & replace.
*/
private Set _guids = new TreeSet(new GUID.GUIDByteComparator());
/**
* The underlying filter.
*/
private final KeywordFilter FILTER = new KeywordFilter();
/**
* Adds a guid to be scanned for keyword filters.
*/
public synchronized void addGUID(byte[] guid) {
Set guids = new TreeSet(new GUID.GUIDByteComparator());
guids.addAll(guids);
guids.add(guid);
_guids = guids;
}
/**
* Removes a guid from the list of those scanned.
*/
public void removeGUID(byte[] guid) {
if(_guids.size() == 0) {
return;
} else {
synchronized(this) {
if(_guids.size() > 0) {
Set guids = new TreeSet(new GUID.GUIDByteComparator());
guids.addAll(_guids);
guids.remove(guid);
_guids = guids;
}
}
}
}
/**
* Determines if this QueryReply is allowed.
*/
public boolean allow(QueryReply qr) {
if(_guids.contains(qr.getGUID())) {
return FILTER.allow(qr);
} else {
return true;
}
}
/**
* Determines if this message is allowed.
*/
public boolean allow(Message m) {
if(m instanceof QueryReply)
return allow((QueryReply)m);
else
return true;
}
}