package com.limegroup.gnutella.filters.response; import java.util.Set; import java.util.TreeSet; import org.limewire.io.GUID; import org.limewire.logging.Log; import org.limewire.logging.LogFactory; import com.google.inject.Singleton; import com.limegroup.gnutella.Response; import com.limegroup.gnutella.filters.KeywordFilter; import com.limegroup.gnutella.messages.QueryReply; /** * Response filter based on the GUID of the query reply. Used for * selectively filtering responses to "what's new" queries. */ @Singleton public final class MutableGUIDFilter implements ResponseFilter { private static Log LOG = LogFactory.getLog(MutableGUIDFilter.class); /** * The Set of GUIDs to compare. * <p> * LOCKING: Never modify -- instead synchronize & replace. */ private Set<byte[]> _guids = new TreeSet<byte[]>(new GUID.GUIDByteComparator()); /** * The underlying filter. */ private final KeywordFilter keywordFilter; MutableGUIDFilter() { keywordFilter = new XMLDocFilter(true, false); } MutableGUIDFilter(KeywordFilter keywordFilter) { this.keywordFilter = keywordFilter; } /** * Adds a guid to be scanned for keyword filters. */ public synchronized void addGUID(byte[] guid) { if (LOG.isDebugEnabled()) LOG.debugf("adding guid: {0}", new GUID(guid)); Set<byte[]> guids = new TreeSet<byte[]>(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 (LOG.isDebugEnabled()) LOG.debugf("removing guid: {0}", new GUID(guid)); if(_guids.size() == 0) { return; } else { synchronized(this) { if(_guids.size() > 0) { Set<byte[]> guids = new TreeSet<byte[]>(new GUID.GUIDByteComparator()); guids.addAll(_guids); guids.remove(guid); _guids = guids; } } } } @Override public boolean allow(QueryReply qr, Response response) { if(_guids.contains(qr.getGUID())) { if (LOG.isDebugEnabled()) LOG.debugf("filtering for guid: {0}", new GUID(qr.getGUID())); boolean allowed = keywordFilter.allow(qr, response); if (LOG.isDebugEnabled()) LOG.debugf("{0} allowed {1}", allowed, response); return allowed; } else { if (LOG.isDebugEnabled()) LOG.debugf("not filtering for guid: {0}", new GUID(qr.getGUID())); return true; } } }