]> git.argeo.org Git - lgpl/argeo-commons.git/blob - server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/webdav/CachingSessionProvider.java
Work on JCR remoting
[lgpl/argeo-commons.git] / server / runtime / org.argeo.server.jackrabbit / src / main / java / org / argeo / server / jackrabbit / webdav / CachingSessionProvider.java
1 package org.argeo.server.jackrabbit.webdav;
2
3 import java.util.Collections;
4 import java.util.HashMap;
5 import java.util.Map;
6
7 import javax.jcr.LoginException;
8 import javax.jcr.Repository;
9 import javax.jcr.RepositoryException;
10 import javax.jcr.Session;
11 import javax.servlet.ServletException;
12 import javax.servlet.http.HttpServletRequest;
13 import javax.servlet.http.HttpSession;
14
15 import org.apache.commons.logging.Log;
16 import org.apache.commons.logging.LogFactory;
17 import org.apache.jackrabbit.server.SessionProvider;
18
19 public class CachingSessionProvider implements SessionProvider {
20 private static final String JCR_SESSIONS_ATTRIBUTE = "jcrSessions";
21
22 private final static Log log = LogFactory
23 .getLog(CachingSessionProvider.class);
24
25 @SuppressWarnings("unchecked")
26 public Session getSession(HttpServletRequest request, Repository rep,
27 String workspace) throws LoginException, ServletException,
28 RepositoryException {
29 HttpSession httpSession = request.getSession();
30
31 if (httpSession.getAttribute(JCR_SESSIONS_ATTRIBUTE) == null) {
32 httpSession
33 .setAttribute(JCR_SESSIONS_ATTRIBUTE, Collections
34 .synchronizedMap(new HashMap<String, Session>()));
35 }
36 Map<String, Session> sessions = (Map<String, Session>) httpSession
37 .getAttribute(JCR_SESSIONS_ATTRIBUTE);
38 if (!sessions.containsKey(workspace)) {
39 Session session = rep.login(workspace);
40 sessions.put(workspace, session);
41 return session;
42 } else {
43 Session session = sessions.get(workspace);
44 if (!session.isLive()) {
45 session = rep.login(workspace);
46 }
47 return session;
48 }
49 }
50
51 public void releaseSession(Session session) {
52 if (log.isDebugEnabled())
53 log.debug("Releasing JCR session " + session);
54 session.logout();
55 }
56
57 }