From: <al...@us...> - 2008-02-08 21:56:08
|
Revision: 2196 http://archive-access.svn.sourceforge.net/archive-access/?rev=2196&view=rev Author: alexoz Date: 2008-02-08 13:56:01 -0800 (Fri, 08 Feb 2008) Log Message: ----------- * HttpRuleDao.java, RuleDao.java Moved out of the model package for better organization. * CachingRuleDao.java, LruCache.java Implemented a simple LRU caching mechanism for rule trees. * AccessControlClient.java Changed to using CachingRuleDao by default. Modified Paths: -------------- trunk/archive-access/projects/access-control/.classpath trunk/archive-access/projects/access-control/access-control/src/main/java/org/archive/accesscontrol/AccessControlClient.java trunk/archive-access/projects/access-control/access-control/src/test/java/org/archive/accesscontrol/AccessControlClientTest.java trunk/archive-access/projects/access-control/oracle/src/main/java/org/archive/accesscontrol/model/HibernateRuleDao.java Added Paths: ----------- trunk/archive-access/projects/access-control/access-control/src/main/java/org/archive/accesscontrol/CachingRuleDao.java trunk/archive-access/projects/access-control/access-control/src/main/java/org/archive/accesscontrol/HttpRuleDao.java trunk/archive-access/projects/access-control/access-control/src/main/java/org/archive/accesscontrol/LruCache.java trunk/archive-access/projects/access-control/access-control/src/main/java/org/archive/accesscontrol/RuleDao.java trunk/archive-access/projects/access-control/access-control/src/test/java/org/archive/accesscontrol/LruCacheTest.java Removed Paths: ------------- trunk/archive-access/projects/access-control/access-control/src/main/java/org/archive/accesscontrol/model/HttpRuleDao.java trunk/archive-access/projects/access-control/access-control/src/main/java/org/archive/accesscontrol/model/RuleDao.java Modified: trunk/archive-access/projects/access-control/.classpath =================================================================== --- trunk/archive-access/projects/access-control/.classpath 2008-02-08 01:13:57 UTC (rev 2195) +++ trunk/archive-access/projects/access-control/.classpath 2008-02-08 21:56:01 UTC (rev 2196) @@ -3,7 +3,6 @@ <classpathentry kind="src" path="access-control/src/main/java"/> <classpathentry kind="src" path="access-control/src/test/java"/> <classpathentry excluding="**" kind="src" output="access-control/src/main/resources" path="access-control/src/main/resources"/> - <classpathentry excluding="**" kind="src" output="access-control/src/test/resources" path="access-control/src/test/resources"/> <classpathentry kind="src" path="oracle/src/main/java"/> <classpathentry kind="src" path="oracle/src/test/java"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> Modified: trunk/archive-access/projects/access-control/access-control/src/main/java/org/archive/accesscontrol/AccessControlClient.java =================================================================== --- trunk/archive-access/projects/access-control/access-control/src/main/java/org/archive/accesscontrol/AccessControlClient.java 2008-02-08 01:13:57 UTC (rev 2195) +++ trunk/archive-access/projects/access-control/access-control/src/main/java/org/archive/accesscontrol/AccessControlClient.java 2008-02-08 21:56:01 UTC (rev 2196) @@ -2,9 +2,7 @@ import java.util.Date; -import org.archive.accesscontrol.model.HttpRuleDao; import org.archive.accesscontrol.model.Rule; -import org.archive.accesscontrol.model.RuleDao; import org.archive.accesscontrol.model.RuleSet; import org.archive.net.PublicSuffixes; import org.archive.util.SURT; @@ -27,14 +25,14 @@ } /** - * Create a new client to query a remote oracle. + * Create a new (caching) client to query a remote oracle. * * @param oracleUrl * Base url of the oracle webapp. eg. * "http://localhost:8080/exclusions-oracle/" */ public AccessControlClient(String oracleUrl) { - this(new HttpRuleDao(oracleUrl)); + this(new CachingRuleDao(oracleUrl)); } /** @@ -79,6 +77,7 @@ surt = stripScheme(surt); RuleSet rules = ruleDao.getRuleTree("(" + publicSuffix); + Rule matchingRule = rules.getMatchingRule(surt, captureDate, retrievalDate, who); return matchingRule; Added: trunk/archive-access/projects/access-control/access-control/src/main/java/org/archive/accesscontrol/CachingRuleDao.java =================================================================== --- trunk/archive-access/projects/access-control/access-control/src/main/java/org/archive/accesscontrol/CachingRuleDao.java (rev 0) +++ trunk/archive-access/projects/access-control/access-control/src/main/java/org/archive/accesscontrol/CachingRuleDao.java 2008-02-08 21:56:01 UTC (rev 2196) @@ -0,0 +1,42 @@ +package org.archive.accesscontrol; + +import org.archive.accesscontrol.model.RuleSet; + +/** + * CachingRuleDao is a wrapper for another RuleDao that implements in-memory + * caching of the rule trees. + * + * @author aosborne + * + */ +public class CachingRuleDao extends LruCache<String, RuleSet> implements + RuleDao { + private static final long serialVersionUID = 1L; + protected RuleDao ruleDao; + + public CachingRuleDao(RuleDao ruleDao) { + super(); + this.ruleDao = ruleDao; + } + + public CachingRuleDao(String oracleUrl) { + this(new HttpRuleDao(oracleUrl)); + } + + public RuleDao getRuleDao() { + return ruleDao; + } + + public void setRuleDao(RuleDao ruleDao) { + this.ruleDao = ruleDao; + } + + public RuleSet getRuleTree(String surt) { + RuleSet rules = super.get(surt); + if (rules == null) { + rules = ruleDao.getRuleTree(surt); + super.put(surt, rules); + } + return rules; + } +} Copied: trunk/archive-access/projects/access-control/access-control/src/main/java/org/archive/accesscontrol/HttpRuleDao.java (from rev 2186, trunk/archive-access/projects/access-control/access-control/src/main/java/org/archive/accesscontrol/model/HttpRuleDao.java) =================================================================== --- trunk/archive-access/projects/access-control/access-control/src/main/java/org/archive/accesscontrol/HttpRuleDao.java (rev 0) +++ trunk/archive-access/projects/access-control/access-control/src/main/java/org/archive/accesscontrol/HttpRuleDao.java 2008-02-08 21:56:01 UTC (rev 2196) @@ -0,0 +1,68 @@ +package org.archive.accesscontrol; + +import java.io.IOException; + +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpMethod; +import org.apache.commons.httpclient.methods.GetMethod; +import org.archive.accesscontrol.model.Rule; +import org.archive.accesscontrol.model.RuleSet; + +import com.thoughtworks.xstream.XStream; + +/** + * The HTTP Rule Data Access Object enables a rule database to be queried via + * the REST interface\xCAan oracle. + * + * For details of the protocol, see: + * http://webteam.archive.org/confluence/display/wayback/Exclusions+API + * + * @author aosborne + * + */ +public class HttpRuleDao implements RuleDao { + protected HttpClient http = new HttpClient(); + protected XStream xstream = new XStream(); + private String oracleUrl; + + public HttpRuleDao(String oracleUrl) { + this.oracleUrl = oracleUrl; + xstream.alias("rule", Rule.class); + xstream.alias("ruleSet", RuleSet.class); + } + + /** + * @see RuleDao#getRuleTree(String) + */ + public RuleSet getRuleTree(String surt) { + HttpMethod method = new GetMethod(oracleUrl + "/rules/tree/" + surt); + RuleSet rules; + + try { + http.executeMethod(method); + String response = method.getResponseBodyAsString(); + System.out.println(response); + rules = (RuleSet) xstream.fromXML(method.getResponseBodyAsStream()); + } catch (IOException e) { + e.printStackTrace(); + return null; + } + method.releaseConnection(); + return rules; + } + + /** + * @return the oracleUrl + */ + public String getOracleUrl() { + return oracleUrl; + } + + /** + * @param oracleUrl the oracleUrl to set + */ + public void setOracleUrl(String oracleUrl) { + this.oracleUrl = oracleUrl; + } + +} Added: trunk/archive-access/projects/access-control/access-control/src/main/java/org/archive/accesscontrol/LruCache.java =================================================================== --- trunk/archive-access/projects/access-control/access-control/src/main/java/org/archive/accesscontrol/LruCache.java (rev 0) +++ trunk/archive-access/projects/access-control/access-control/src/main/java/org/archive/accesscontrol/LruCache.java 2008-02-08 21:56:01 UTC (rev 2196) @@ -0,0 +1,66 @@ +package org.archive.accesscontrol; + +import java.util.Date; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * A simple least recently used cache, with a discard policy based on maximum + * entry count and cache time. Access + * + * @author aosborne + * + * @param <K> + * @param <V> + */ +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); + } +} Copied: trunk/archive-access/projects/access-control/access-control/src/main/java/org/archive/accesscontrol/RuleDao.java (from rev 2186, trunk/archive-access/projects/access-control/access-control/src/main/java/org/archive/accesscontrol/model/RuleDao.java) =================================================================== --- trunk/archive-access/projects/access-control/access-control/src/main/java/org/archive/accesscontrol/RuleDao.java (rev 0) +++ trunk/archive-access/projects/access-control/access-control/src/main/java/org/archive/accesscontrol/RuleDao.java 2008-02-08 21:56:01 UTC (rev 2196) @@ -0,0 +1,30 @@ +package org.archive.accesscontrol; + +import org.apache.commons.httpclient.URIException; +import org.archive.accesscontrol.model.RuleSet; + +/** + * A RuleDao provides methods for retrieving rule information from a local database or + * remote oracle. + * + * @author aosborne + * + */ +public interface RuleDao { + + /** + * Returns the "rule tree" for a given SURT. This is a sorted set of all + * rules equal or lower in specificity than the given SURT plus all rules on + * the path from this SURT to the root SURT "(". + * + * The intention is to call this function with a domain or public suffix, + * then queries within that domain can be made very fast by searching the + * resulting list. + * + * @param surt + * @return + * @throws URIException + */ + public RuleSet getRuleTree(String surt); + +} Deleted: trunk/archive-access/projects/access-control/access-control/src/main/java/org/archive/accesscontrol/model/HttpRuleDao.java =================================================================== --- trunk/archive-access/projects/access-control/access-control/src/main/java/org/archive/accesscontrol/model/HttpRuleDao.java 2008-02-08 01:13:57 UTC (rev 2195) +++ trunk/archive-access/projects/access-control/access-control/src/main/java/org/archive/accesscontrol/model/HttpRuleDao.java 2008-02-08 21:56:01 UTC (rev 2196) @@ -1,66 +0,0 @@ -package org.archive.accesscontrol.model; - -import java.io.IOException; - -import org.apache.commons.httpclient.HttpClient; -import org.apache.commons.httpclient.HttpMethod; -import org.apache.commons.httpclient.methods.GetMethod; - -import com.thoughtworks.xstream.XStream; - -/** - * The HTTP Rule Data Access Object enables a rule database to be queried via - * the REST interface\xCAan oracle. - * - * For details of the protocol, see: - * http://webteam.archive.org/confluence/display/wayback/Exclusions+API - * - * @author aosborne - * - */ -public class HttpRuleDao implements RuleDao { - protected HttpClient http = new HttpClient(); - protected XStream xstream = new XStream(); - private String oracleUrl; - - public HttpRuleDao(String oracleUrl) { - this.oracleUrl = oracleUrl; - xstream.alias("rule", Rule.class); - xstream.alias("ruleSet", RuleSet.class); - } - - /** - * @see RuleDao#getRuleTree(String) - */ - public RuleSet getRuleTree(String surt) { - HttpMethod method = new GetMethod(oracleUrl + "/rules/tree/" + surt); - RuleSet rules; - - try { - http.executeMethod(method); - String response = method.getResponseBodyAsString(); - System.out.println(response); - rules = (RuleSet) xstream.fromXML(method.getResponseBodyAsStream()); - } catch (IOException e) { - e.printStackTrace(); - return null; - } - method.releaseConnection(); - return rules; - } - - /** - * @return the oracleUrl - */ - public String getOracleUrl() { - return oracleUrl; - } - - /** - * @param oracleUrl the oracleUrl to set - */ - public void setOracleUrl(String oracleUrl) { - this.oracleUrl = oracleUrl; - } - -} Deleted: trunk/archive-access/projects/access-control/access-control/src/main/java/org/archive/accesscontrol/model/RuleDao.java =================================================================== --- trunk/archive-access/projects/access-control/access-control/src/main/java/org/archive/accesscontrol/model/RuleDao.java 2008-02-08 01:13:57 UTC (rev 2195) +++ trunk/archive-access/projects/access-control/access-control/src/main/java/org/archive/accesscontrol/model/RuleDao.java 2008-02-08 21:56:01 UTC (rev 2196) @@ -1,29 +0,0 @@ -package org.archive.accesscontrol.model; - -import org.apache.commons.httpclient.URIException; - -/** - * A RuleDao provides methods for retrieving rule information from a local database or - * remote oracle. - * - * @author aosborne - * - */ -public interface RuleDao { - - /** - * Returns the "rule tree" for a given SURT. This is a sorted set of all - * rules equal or lower in specificity than the given SURT plus all rules on - * the path from this SURT to the root SURT "(". - * - * The intention is to call this function with a domain or public suffix, - * then queries within that domain can be made very fast by searching the - * resulting list. - * - * @param surt - * @return - * @throws URIException - */ - public RuleSet getRuleTree(String surt); - -} Modified: trunk/archive-access/projects/access-control/access-control/src/test/java/org/archive/accesscontrol/AccessControlClientTest.java =================================================================== --- trunk/archive-access/projects/access-control/access-control/src/test/java/org/archive/accesscontrol/AccessControlClientTest.java 2008-02-08 01:13:57 UTC (rev 2195) +++ trunk/archive-access/projects/access-control/access-control/src/test/java/org/archive/accesscontrol/AccessControlClientTest.java 2008-02-08 21:56:01 UTC (rev 2196) @@ -3,16 +3,16 @@ import java.util.Date; import org.archive.accesscontrol.AccessControlClient; -import org.archive.accesscontrol.model.HttpRuleDao; import junit.framework.TestCase; public class AccessControlClientTest extends TestCase { - public static final String ORACLE_URL = "http://localhost:8080/exclusions-oracle-0.0.1-SNAPSHOT/"; + public static final String ORACLE_URL = "http://localhost:8080/oracle-0.0.1-SNAPSHOT/"; private AccessControlClient client; protected void setUp() throws Exception { super.setUp(); + System.out.println("hello world"); client = new AccessControlClient(new HttpRuleDao(ORACLE_URL)); } @@ -22,7 +22,8 @@ } public void testBasicOkToShow() throws Exception { - //System.out.println(client.getPolicy("http://www.archive.org/secret/page.html", new Date(), new Date())); + //String policy = client.getPolicy("http://www.peagreenboat.com/", new Date(1987, 8, 30), new Date(), "blah"); + //System.out.println("Policy=" + policy); } } Added: trunk/archive-access/projects/access-control/access-control/src/test/java/org/archive/accesscontrol/LruCacheTest.java =================================================================== --- trunk/archive-access/projects/access-control/access-control/src/test/java/org/archive/accesscontrol/LruCacheTest.java (rev 0) +++ trunk/archive-access/projects/access-control/access-control/src/test/java/org/archive/accesscontrol/LruCacheTest.java 2008-02-08 21:56:01 UTC (rev 2196) @@ -0,0 +1,24 @@ +package org.archive.accesscontrol; + +import junit.framework.TestCase; + +public class LruCacheTest extends TestCase { + LruCache<String,Integer> cache; + + public void testMaxItems() { + cache = new LruCache<String,Integer>(); + + cache.setMaxEntries(3); + cache.put("one", 1); + cache.put("two", 2); + cache.put("three", 3); + + assertEquals(3, cache.size()); + + cache.put("four", 4); + + assertEquals("Maximum entry cap", 3, cache.size()); + assertNull("Ensure 'one' was the evicted object.", cache.get("one")); + + } +} Modified: trunk/archive-access/projects/access-control/oracle/src/main/java/org/archive/accesscontrol/model/HibernateRuleDao.java =================================================================== --- trunk/archive-access/projects/access-control/oracle/src/main/java/org/archive/accesscontrol/model/HibernateRuleDao.java 2008-02-08 01:13:57 UTC (rev 2195) +++ trunk/archive-access/projects/access-control/oracle/src/main/java/org/archive/accesscontrol/model/HibernateRuleDao.java 2008-02-08 21:56:01 UTC (rev 2196) @@ -3,6 +3,7 @@ import java.util.List; import org.apache.commons.httpclient.URIException; +import org.archive.accesscontrol.RuleDao; import org.archive.surt.SURTTokenizer2; import org.hibernate.Session; import org.hibernate.Transaction; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |