]> git.argeo.org Git - lgpl/argeo-commons.git/blob - server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jackrabbit/webdav/CachingSessionProvider.java
Update Jackrabbit container package name
[lgpl/argeo-commons.git] / server / runtime / org.argeo.server.jackrabbit / src / main / java / org / argeo / jackrabbit / webdav / CachingSessionProvider.java
1 package org.argeo.jackrabbit.webdav;
2
3 import java.util.Collections;
4 import java.util.HashMap;
5 import java.util.Map;
6
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;
15
16 import org.apache.commons.logging.Log;
17 import org.apache.commons.logging.LogFactory;
18 import org.apache.jackrabbit.server.SessionProvider;
19
20 public class CachingSessionProvider implements SessionProvider {
21 private static final String JCR_SESSIONS_ATTRIBUTE = "jcrSessions";
22
23 private final static Log log = LogFactory
24 .getLog(CachingSessionProvider.class);
25
26 private Credentials credentials = null;
27
28 public CachingSessionProvider() {
29 }
30
31 public CachingSessionProvider(Credentials credentials) {
32 this.credentials = credentials;
33 }
34
35 @SuppressWarnings("unchecked")
36 public Session getSession(HttpServletRequest request, Repository rep,
37 String workspace) throws LoginException, ServletException,
38 RepositoryException {
39 HttpSession httpSession = request.getSession();
40
41 if (httpSession.getAttribute(JCR_SESSIONS_ATTRIBUTE) == null) {
42 httpSession
43 .setAttribute(JCR_SESSIONS_ATTRIBUTE, Collections
44 .synchronizedMap(new HashMap<String, Session>()));
45 }
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);
51 return session;
52 } else {
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);
58 }
59 return session;
60 }
61 }
62
63 public void releaseSession(Session session) {
64 if (log.isDebugEnabled())
65 log.debug("Releasing JCR session " + session);
66 // session.logout();
67 // FIXME: find a way to log out when the HTTP session is expired
68 }
69
70 }