1 package org
.argeo
.jackrabbit
.remote
;
3 import java
.io
.Serializable
;
4 import java
.util
.Collections
;
5 import java
.util
.HashMap
;
8 import javax
.jcr
.Credentials
;
9 import javax
.jcr
.LoginException
;
10 import javax
.jcr
.Repository
;
11 import javax
.jcr
.RepositoryException
;
12 import javax
.jcr
.Session
;
13 import javax
.servlet
.ServletException
;
14 import javax
.servlet
.http
.HttpServletRequest
;
16 import org
.apache
.commons
.logging
.Log
;
17 import org
.apache
.commons
.logging
.LogFactory
;
18 import org
.apache
.jackrabbit
.server
.SessionProvider
;
19 import org
.argeo
.ArgeoException
;
21 /** To be injected, typically of scope="session" */
22 public class SimpleSessionProvider
implements SessionProvider
, Serializable
{
23 private static final long serialVersionUID
= 2270957712453841368L;
25 private final static Log log
= LogFactory
26 .getLog(SimpleSessionProvider
.class);
28 private transient Map
<String
, Session
> sessions
;
30 private Credentials credentials
= null;
32 public Session
getSession(HttpServletRequest request
, Repository rep
,
33 String workspace
) throws LoginException
, ServletException
,
36 // since sessions is transient it can be restored from the session
38 sessions
= Collections
39 .synchronizedMap(new HashMap
<String
, Session
>());
41 if (!sessions
.containsKey(workspace
)) {
43 Session session
= rep
.login(credentials
, workspace
);
44 if (log
.isDebugEnabled())
45 log
.debug("User " + session
.getUserID() + " logged into "
46 + request
.getServletPath());
47 sessions
.put(workspace
, session
);
49 } catch (Exception e
) {
50 throw new ArgeoException("Cannot open session", e
);
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
.isTraceEnabled())
65 log
.trace("Releasing JCR session " + session
);
71 public void dispose() {
73 for (String workspace
: sessions
.keySet()) {
74 Session session
= sessions
.get(workspace
);