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

Reply via email to