// Path: access-control/src/main/java/org/archive/accesscontrol/LruCache.java
// public class LruCache<K, V> extends LinkedHashMap<K, V> {
//     private static final long serialVersionUID = 1L;
//     private int maxEntries = 100;
//     private long maxCacheTime = 10 * 60 * 1000; // ten minutes
//     private Map<K, Date> refreshTimes = new HashMap<K, Date>();
// 
//     protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
//         return size() > maxEntries
//                 || new Date().getTime()
//                         - refreshTimes.get(eldest.getKey()).getTime() > maxCacheTime;
//     }
// 
//     public int getMaxEntries() {
//         return maxEntries;
//     }
// 
//     /**
//      * Set the maximum number of entries to be stored in the cache.
//      * 
//      * @param maxEntries
//      */
//     public void setMaxEntries(int maxEntries) {
//         this.maxEntries = maxEntries;
//     }
// 
//     public long getMaxCacheTime() {
//         return maxCacheTime;
//     }
// 
//     /**
//      * Set the maximum time in milliseconds an entry should be cached for.
//      * 
//      * @param maxCacheTime
//      */
//     public void setMaxCacheTime(long maxCacheTime) {
//         this.maxCacheTime = maxCacheTime;
//     }
// 
//     @Override
//     public V put(K key, V value) {
//         refreshTimes.put(key, new Date());
//         return super.put(key, value);
//     }
// 
//     @Override
//     public V remove(Object key) {
//         refreshTimes.remove(key);
//         return super.remove(key);
//     }
// }
// 
// Path: access-control/src/main/java/org/archive/accesscontrol/RobotsUnavailableException.java
// public class RobotsUnavailableException extends AccessControlException {
// 
//     /**
//      * 
//      */
//     private static final long serialVersionUID = -6268896797166951256L;
// 
//     public RobotsUnavailableException() {
//         super();
//         // TODO Auto-generated constructor stub
//     }
// 
//     public RobotsUnavailableException(String arg0, Throwable arg1) {
//         super(arg0, arg1);
//         // TODO Auto-generated constructor stub
//     }
// 
//     public RobotsUnavailableException(String arg0) {
//         super(arg0);
//         // TODO Auto-generated constructor stub
//     }
// 
//     public RobotsUnavailableException(Throwable arg0) {
//         super(arg0);
//         // TODO Auto-generated constructor stub
//     }
// 
// }


import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.logging.Logger;
import org.archive.accesscontrol.LruCache;
import org.archive.accesscontrol.RobotsUnavailableException;
package org.archive.accesscontrol.robotstxt;



/**
 * The CchingRobotClient wraps another RobotClient and caches requests.
 * 
 * @author aosborne
 *
 */
public class CachingRobotClient extends RobotClient {
    private static final Logger LOGGER = Logger.getLogger(
            CachingRobotClient.class.getName());
// Path: access-control/src/main/java/org/archive/accesscontrol/LruCache.java
// public class LruCache<K, V> extends LinkedHashMap<K, V> {
//     private static final long serialVersionUID = 1L;
//     private int maxEntries = 100;
//     private long maxCacheTime = 10 * 60 * 1000; // ten minutes
//     private Map<K, Date> refreshTimes = new HashMap<K, Date>();
// 
//     protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
//         return size() > maxEntries
//                 || new Date().getTime()
//                         - refreshTimes.get(eldest.getKey()).getTime() > maxCacheTime;
//     }
// 
//     public int getMaxEntries() {
//         return maxEntries;
//     }
// 
//     /**
//      * Set the maximum number of entries to be stored in the cache.
//      * 
//      * @param maxEntries
//      */
//     public void setMaxEntries(int maxEntries) {
//         this.maxEntries = maxEntries;
//     }
// 
//     public long getMaxCacheTime() {
//         return maxCacheTime;
//     }
// 
//     /**
//      * Set the maximum time in milliseconds an entry should be cached for.
//      * 
//      * @param maxCacheTime
//      */
//     public void setMaxCacheTime(long maxCacheTime) {
//         this.maxCacheTime = maxCacheTime;
//     }
// 
//     @Override
//     public V put(K key, V value) {
//         refreshTimes.put(key, new Date());
//         return super.put(key, value);
//     }
// 
//     @Override
//     public V remove(Object key) {
//         refreshTimes.remove(key);
//         return super.remove(key);
//     }
// }
// 
// Path: access-control/src/main/java/org/archive/accesscontrol/RobotsUnavailableException.java
// public class RobotsUnavailableException extends AccessControlException {
// 
//     /**
//      * 
//      */
//     private static final long serialVersionUID = -6268896797166951256L;
// 
//     public RobotsUnavailableException() {
//         super();
//         // TODO Auto-generated constructor stub
//     }
// 
//     public RobotsUnavailableException(String arg0, Throwable arg1) {
//         super(arg0, arg1);
//         // TODO Auto-generated constructor stub
//     }
// 
//     public RobotsUnavailableException(String arg0) {
//         super(arg0);
//         // TODO Auto-generated constructor stub
//     }
// 
//     public RobotsUnavailableException(Throwable arg0) {
//         super(arg0);
//         // TODO Auto-generated constructor stub
//     }
// 
// }


// Path: access-control/src/main/java/org/archive/accesscontrol/robotstxt/CachingRobotClient.java
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.logging.Logger;
import org.archive.accesscontrol.LruCache;
import org.archive.accesscontrol.RobotsUnavailableException;

package org.archive.accesscontrol.robotstxt;



/**
 * The CchingRobotClient wraps another RobotClient and caches requests.
 * 
 * @author aosborne
 *
 */
public class CachingRobotClient extends RobotClient {
    private static final Logger LOGGER = Logger.getLogger(
            CachingRobotClient.class.getName());
    protected LruCache<String, RobotRules> cache = new LruCache<String, RobotRules>();