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;h=eab7451db741471555979486f55a974f3bf3333c;hb=10c220cf49f5b146bac50ed7fe2578135cd466f1;hp=ded491510f819b02da138761e28f7c38b1bc74bd;hpb=955f75aa71d14ca569c0207d7c176c2780a6880d;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 index ded491510..eab7451db 100644 --- 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 @@ -16,6 +16,7 @@ import javax.servlet.http.HttpServletRequest; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.jackrabbit.server.SessionProvider; +import org.argeo.ArgeoException; /** To be injected, typically of scope="session" */ public class SimpleSessionProvider implements SessionProvider, Serializable { @@ -24,8 +25,7 @@ public class SimpleSessionProvider implements SessionProvider, Serializable { private final static Log log = LogFactory .getLog(SimpleSessionProvider.class); - private transient Map sessions = Collections - .synchronizedMap(new HashMap()); + private transient Map sessions; private Credentials credentials = null; @@ -33,10 +33,22 @@ public class SimpleSessionProvider implements SessionProvider, Serializable { String workspace) throws LoginException, ServletException, RepositoryException { + // since sessions is transient it can be restored from the session + if (sessions == null) + sessions = Collections + .synchronizedMap(new HashMap()); + if (!sessions.containsKey(workspace)) { - Session session = rep.login(credentials, workspace); - sessions.put(workspace, session); - return session; + try { + Session session = rep.login(credentials, workspace); + if (log.isDebugEnabled()) + log.debug("User " + session.getUserID() + " logged into " + + request.getServletPath()); + sessions.put(workspace, session); + return session; + } catch (Exception e) { + throw new ArgeoException("Cannot open session", e); + } } else { Session session = sessions.get(workspace); if (!session.isLive()) { @@ -49,17 +61,19 @@ public class SimpleSessionProvider implements SessionProvider, Serializable { } 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 + if (log.isTraceEnabled()) + log.trace("Releasing JCR session " + session); + } + + public void init() { } public void dispose() { - for (String workspace : sessions.keySet()) { - Session session = sessions.get(workspace); - if (session.isLive()) - session.logout(); - } + if (sessions != null) + for (String workspace : sessions.keySet()) { + Session session = sessions.get(workspace); + if (session.isLive()) + session.logout(); + } } }