]> git.argeo.org Git - lgpl/argeo-commons.git/blob - server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jackrabbit/remote/SimpleSessionProvider.java
Jackrabbit security improved
[lgpl/argeo-commons.git] / server / runtime / org.argeo.server.jackrabbit / src / main / java / org / argeo / jackrabbit / remote / 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 import org.argeo.ArgeoException;
20
21 /** To be injected, typically of scope="session" */
22 public class SimpleSessionProvider implements SessionProvider, Serializable {
23 private static final long serialVersionUID = 2270957712453841368L;
24
25 private final static Log log = LogFactory
26 .getLog(SimpleSessionProvider.class);
27
28 private transient Map<String, Session> sessions;
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 // since sessions is transient it can be restored from the session
37 if (sessions == null)
38 sessions = Collections
39 .synchronizedMap(new HashMap<String, Session>());
40
41 if (!sessions.containsKey(workspace)) {
42 try {
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);
48 return session;
49 } catch (Exception e) {
50 throw new ArgeoException("Cannot open session", e);
51 }
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.isTraceEnabled())
65 log.trace("Releasing JCR session " + session);
66 }
67
68 public void init() {
69 }
70
71 public void dispose() {
72 if (sessions != null)
73 for (String workspace : sessions.keySet()) {
74 Session session = sessions.get(workspace);
75 if (session.isLive())
76 session.logout();
77 }
78 }
79 }