package org.argeo.server.jackrabbit.webdav; import java.util.Collections; import java.util.HashMap; import java.util.Map; import javax.jcr.LoginException; import javax.jcr.Repository; import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.jackrabbit.server.SessionProvider; public class CachingSessionProvider implements SessionProvider { private static final String JCR_SESSIONS_ATTRIBUTE = "jcrSessions"; private final static Log log = LogFactory .getLog(CachingSessionProvider.class); @SuppressWarnings("unchecked") public Session getSession(HttpServletRequest request, Repository rep, String workspace) throws LoginException, ServletException, RepositoryException { HttpSession httpSession = request.getSession(); if (httpSession.getAttribute(JCR_SESSIONS_ATTRIBUTE) == null) { httpSession .setAttribute(JCR_SESSIONS_ATTRIBUTE, Collections .synchronizedMap(new HashMap())); } Map sessions = (Map) httpSession .getAttribute(JCR_SESSIONS_ATTRIBUTE); if (!sessions.containsKey(workspace)) { Session session = rep.login(workspace); sessions.put(workspace, session); return session; } else { Session session = sessions.get(workspace); if (!session.isLive()) { session = rep.login(workspace); } return session; } } public void releaseSession(Session session) { if (log.isDebugEnabled()) log.debug("Releasing JCR session " + session); session.logout(); } }