package org.archive.accesscontrol; import java.util.ArrayList; import java.util.Collection; import java.util.List; 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 implements RuleDao { private static final long serialVersionUID = 1L; private static final int PREPARE_THREAD_COUNT = 5; protected RuleDao ruleDao; protected LruCache<String, RuleSet> cache = new LruCache<String, RuleSet>(); 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) throws RuleOracleUnavailableException { RuleSet rules; synchronized (cache) { rules = cache.get(surt); } if (rules == null) { rules = ruleDao.getRuleTree(surt); synchronized (cache) { cache.put(surt, rules); } } return rules; } class FetchThread extends Thread { private List<String> surts; public FetchThread(List<String> surts) { this.surts = surts; } public void run() { while (true) { String surt; synchronized (surts) { if (surts.isEmpty()) break; surt = surts.remove(0); } try { getRuleTree(surt); } catch (RuleOracleUnavailableException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } /** * Prepare the cache to lookup info for a given set of surts. The fetches * happen in parallel so this also makes a good option for speeding up bulk lookups. * * @param surts */ public void prepare(Collection<String> surts) { List<String> safeSurts = new ArrayList<String>(surts); FetchThread threads[] = new FetchThread[PREPARE_THREAD_COUNT ]; for (int i = 0; i < PREPARE_THREAD_COUNT ; i++) { threads[i] = new FetchThread(safeSurts); threads[i].start(); } for (int i = 0; i < PREPARE_THREAD_COUNT ; i++) { try { threads[i].join(); } catch (InterruptedException e) { } } } }