Update of /cvsroot/freenet/freenet/src/freenet/support
In directory sc8-pr-cvs1:/tmp/cvs-serv17928/freenet/support
Added Files:
BlackLRUQueue.java
Log Message:
Forgot a file from last commit
--- NEW FILE: BlackLRUQueue.java ---
package freenet.support;
import java.util.Enumeration;
import java.util.Hashtable;
public class BlackLRUQueue {
private long maxQueueTimeMillis=60000;
private int maxQueueElements=200;
private int maxFailures=3;
private final DoublyLinkedListImpl list = new DoublyLinkedListImpl();
private final Hashtable hash = new Hashtable();
/*
* This structure is designed for blacklisting things...
* if you push an item into it, it is blacklisted for as
* long as it is in there, pushing it again moves it to
* the head and keeps it in the queue.
*/
public BlackLRUQueue() {
}
public BlackLRUQueue(long maxQueueTimeMillis, int maxQueueElements, int
maxFailures) {
this.maxQueueTimeMillis = maxQueueTimeMillis;
this.maxQueueElements = maxQueueElements;
this.maxFailures = maxFailures;
}
/**
* push()ing an object that is already in
* the queue moves that object to the most
* recently used position, and resets it's
* blacklist timer, but doesn't add a
* duplicate entry in the queue.
*/
public final synchronized void push(Object obj) {
QItem insert = (QItem)hash.get(obj);
if (insert == null) {
insert = new QItem(obj);
hash.put(obj,insert);
} else {
list.remove(insert);
insert.touch();
}
list.unshift(insert);
}
/* This method should be called before checking if an object is still
* blacklisted, otherwise you will get false positives.
*/
public final synchronized void clean() {
while ( list.size() > maxQueueElements ) {
hash.remove(((QItem)list.pop()).obj);
}
while ( list.size() > 0 &&
((QItem)list.tail()).olderThan(System.currentTimeMillis() -
maxQueueTimeMillis) ) {
hash.remove(((QItem)list.pop()).obj);
}
}
public final synchronized boolean containsKey(Object obj) {
return hash.containsKey(obj);
}
public final synchronized boolean isBlackListed(Object obj) {
QItem temp = (QItem)hash.get(obj);
return temp==null?false:temp.worseThan(maxFailures);
}
// Least recently pushed Object.
public final synchronized Object pop() {
if ( list.size() > 0 ) {
return ((QItem)hash.remove(((QItem)list.pop()).obj)).obj;
} else {
return null;
}
}
public final int size() {
return list.size();
}
public final synchronized void remove(Object obj) {
list.remove((QItem)hash.remove(obj));
}
public Enumeration elements() {
return new ItemEnumeration();
}
private class ItemEnumeration implements Enumeration {
private Enumeration source = list.reverseElements();
public boolean hasMoreElements() {
return source.hasMoreElements();
}
public Object nextElement() {
return ((QItem) source.nextElement()).obj;
}
}
private static class QItem extends DoublyLinkedListImpl.Item {
public Object obj;
private long lastTouchedTimeMillis;
private int failures=0;
public boolean olderThan(long oldestBlackList) {
return lastTouchedTimeMillis < oldestBlackList;
}
public boolean worseThan(int maxFailures) {
return failures >= maxFailures;
}
public void touch() {
lastTouchedTimeMillis = System.currentTimeMillis();
failures++;
}
public QItem(Object obj) {
this.obj = obj;
touch();
}
}
}
_______________________________________________
cvs mailing list
[EMAIL PROTECTED]
http://dodo.freenetproject.org/cgi-bin/mailman/listinfo/cvs