X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=server%2Fruntime%2Forg.argeo.server.jackrabbit%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fjackrabbit%2Fremote%2FSimpleSessionProvider.java;fp=server%2Fruntime%2Forg.argeo.server.jackrabbit%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fjackrabbit%2Fremote%2FSimpleSessionProvider.java;h=ded491510f819b02da138761e28f7c38b1bc74bd;hb=5cbd14f6688e8710bff2f853e9fce3fae68c175e;hp=0000000000000000000000000000000000000000;hpb=a69d9c12043132bd39c53e40e43fad822b242dcf;p=lgpl%2Fargeo-commons.git diff --git a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jackrabbit/remote/SimpleSessionProvider.java b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jackrabbit/remote/SimpleSessionProvider.java new file mode 100644 index 000000000..ded491510 --- /dev/null +++ b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jackrabbit/remote/SimpleSessionProvider.java @@ -0,0 +1,65 @@ +package org.argeo.jackrabbit.remote; + +import java.io.Serializable; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import javax.jcr.Credentials; +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 org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.jackrabbit.server.SessionProvider; + +/** To be injected, typically of scope="session" */ +public class SimpleSessionProvider implements SessionProvider, Serializable { + private static final long serialVersionUID = 2270957712453841368L; + + private final static Log log = LogFactory + .getLog(SimpleSessionProvider.class); + + private transient Map sessions = Collections + .synchronizedMap(new HashMap()); + + private Credentials credentials = null; + + public Session getSession(HttpServletRequest request, Repository rep, + String workspace) throws LoginException, ServletException, + RepositoryException { + + if (!sessions.containsKey(workspace)) { + Session session = rep.login(credentials, workspace); + sessions.put(workspace, session); + return session; + } else { + Session session = sessions.get(workspace); + if (!session.isLive()) { + sessions.remove(workspace); + session = rep.login(credentials, workspace); + sessions.put(workspace, session); + } + return session; + } + } + + public void releaseSession(Session session) { + if (log.isDebugEnabled()) + log.debug("Releasing JCR session " + session); + // session.logout(); + // FIXME: find a way to log out when the HTTP session is expired + } + + public void dispose() { + for (String workspace : sessions.keySet()) { + Session session = sessions.get(workspace); + if (session.isLive()) + session.logout(); + } + } +}