]> git.argeo.org Git - lgpl/argeo-commons.git/blob - SimpleSessionProvider.java
ded491510f819b02da138761e28f7c38b1bc74bd
[lgpl/argeo-commons.git] / SimpleSessionProvider.java
1 package org.argeo.jackrabbit.remote;
2
3 import java.io.Serializable;
4 import java.util.Collections;
5 import java.util.HashMap;
6 import java.util.Map;
7
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;
15
16 import org.apache.commons.logging.Log;
17 import org.apache.commons.logging.LogFactory;
18 import org.apache.jackrabbit.server.SessionProvider;
19
20 /** To be injected, typically of scope="session" */
21 public class SimpleSessionProvider implements SessionProvider, Serializable {
22 private static final long serialVersionUID = 2270957712453841368L;
23
24 private final static Log log = LogFactory
25 .getLog(SimpleSessionProvider.class);
26
27 private transient Map<String, Session> sessions = Collections
28 .synchronizedMap(new HashMap<String, Session>());
29
30 private Credentials credentials = null;
31
32 public Session getSession(HttpServletRequest request, Repository rep,
33 String workspace) throws LoginException, ServletException,
34 RepositoryException {
35
36 if (!sessions.containsKey(workspace)) {
37 Session session = rep.login(credentials, workspace);
38 sessions.put(workspace, session);
39 return session;
40 } else {
41 Session session = sessions.get(workspace);
42 if (!session.isLive()) {
43 sessions.remove(workspace);
44 session = rep.login(credentials, workspace);
45 sessions.put(workspace, session);
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 // FIXME: find a way to log out when the HTTP session is expired
56 }
57
58 public void dispose() {
59 for (String workspace : sessions.keySet()) {
60 Session session = sessions.get(workspace);
61 if (session.isLive())
62 session.logout();
63 }
64 }
65 }