package org.beanfuse.security.access; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.servlet.http.HttpServletRequest; import org.beanfuse.security.access.config.ConfigLoader; import org.beanfuse.security.access.log.AccessLogFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class CachedResourceAccessor implements ResourceAccessor { private static final Logger logger = LoggerFactory.getLogger(CachedResourceAccessor.class); private List accessLogs = new ArrayList(); private int cacheSize = ConfigLoader.getInstance().getConfig().getCachedLogSize().intValue(); public AccessLog beginAccess(HttpServletRequest request, long time) { AccessLog accessLog = AccessLogFactory.getLog(request); accessLog.setBeginAt(time); synchronized (accessLogs) { accessLogs.add(accessLog); if (accessLogs.size() >= cacheSize) { shrink(accessLogs); if (accessLogs.size() >= cacheSize) { flush(accessLogs); } } } return accessLog; } public void endAccess(AccessLog log, long time) { log.setEndAt(time); } public void finish() { if (!accessLogs.isEmpty()) { flush(accessLogs); } } public void start() { } public List getAccessLogs() { return accessLogs; } protected void shrink(List accessLogs) { long minDuration = ConfigLoader.getInstance().getConfig().getMinDuration().longValue(); for (Iterator iterator = accessLogs.iterator(); iterator.hasNext();) { AccessLog accessLog = (AccessLog) iterator.next(); if (accessLog.getDuration() < minDuration) { iterator.remove(); } } } protected void flush(List accessLogs) { for (Iterator iterator = accessLogs.iterator(); iterator.hasNext();) { AccessLog accessLog = (AccessLog) iterator.next(); logger.info(accessLog.toString()); } accessLogs.clear(); } }