1 package org
.argeo
.server
.jackrabbit
.webdav
;
3 import java
.util
.Collections
;
4 import java
.util
.HashMap
;
7 import javax
.jcr
.Credentials
;
8 import javax
.jcr
.LoginException
;
9 import javax
.jcr
.Repository
;
10 import javax
.jcr
.RepositoryException
;
11 import javax
.jcr
.Session
;
12 import javax
.servlet
.ServletException
;
13 import javax
.servlet
.http
.HttpServletRequest
;
14 import javax
.servlet
.http
.HttpSession
;
16 import org
.apache
.commons
.logging
.Log
;
17 import org
.apache
.commons
.logging
.LogFactory
;
18 import org
.apache
.jackrabbit
.server
.SessionProvider
;
20 public class CachingSessionProvider
implements SessionProvider
{
21 private static final String JCR_SESSIONS_ATTRIBUTE
= "jcrSessions";
23 private final static Log log
= LogFactory
24 .getLog(CachingSessionProvider
.class);
26 private Credentials credentials
= null;
28 public CachingSessionProvider() {
31 public CachingSessionProvider(Credentials credentials
) {
32 this.credentials
= credentials
;
35 @SuppressWarnings("unchecked")
36 public Session
getSession(HttpServletRequest request
, Repository rep
,
37 String workspace
) throws LoginException
, ServletException
,
39 HttpSession httpSession
= request
.getSession();
41 if (httpSession
.getAttribute(JCR_SESSIONS_ATTRIBUTE
) == null) {
43 .setAttribute(JCR_SESSIONS_ATTRIBUTE
, Collections
44 .synchronizedMap(new HashMap
<String
, Session
>()));
46 Map
<String
, Session
> sessions
= (Map
<String
, Session
>) httpSession
47 .getAttribute(JCR_SESSIONS_ATTRIBUTE
);
48 if (!sessions
.containsKey(workspace
)) {
49 Session session
= rep
.login(credentials
, workspace
);
50 sessions
.put(workspace
, session
);
53 Session session
= sessions
.get(workspace
);
54 if (!session
.isLive()) {
55 sessions
.remove(workspace
);
56 session
= rep
.login(credentials
, workspace
);
57 sessions
.put(workspace
, session
);
63 public void releaseSession(Session session
) {
64 if (log
.isDebugEnabled())
65 log
.debug("Releasing JCR session " + session
);
67 // FIXME: find a way to log out when the HTTP session is expired