]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jackrabbit/remote/SimpleSessionProvider.java
Improve JCR remoting
[lgpl/argeo-commons.git] / server / runtime / org.argeo.server.jackrabbit / src / main / java / org / argeo / jackrabbit / remote / SimpleSessionProvider.java
index ded491510f819b02da138761e28f7c38b1bc74bd..aa9bfa5d6f16fd7e492bf9014d5301dcba426935 100644 (file)
@@ -5,7 +5,6 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
-import javax.jcr.Credentials;
 import javax.jcr.LoginException;
 import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
@@ -16,6 +15,7 @@ import javax.servlet.http.HttpServletRequest;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.jackrabbit.server.SessionProvider;
+import org.argeo.ArgeoException;
 
 /** To be injected, typically of scope="session" */
 public class SimpleSessionProvider implements SessionProvider, Serializable {
@@ -24,24 +24,32 @@ public class SimpleSessionProvider implements SessionProvider, Serializable {
        private final static Log log = LogFactory
                        .getLog(SimpleSessionProvider.class);
 
-       private transient Map<String, Session> sessions = Collections
-                       .synchronizedMap(new HashMap<String, Session>());
-
-       private Credentials credentials = null;
+       private transient Map<String, Session> sessions;
 
        public Session getSession(HttpServletRequest request, Repository rep,
                        String workspace) throws LoginException, ServletException,
                        RepositoryException {
+               // since sessions is transient it can't be restored from the session
+               if (sessions == null)
+                       sessions = Collections
+                                       .synchronizedMap(new HashMap<String, Session>());
 
                if (!sessions.containsKey(workspace)) {
-                       Session session = rep.login(credentials, workspace);
-                       sessions.put(workspace, session);
-                       return session;
+                       try {
+                               Session session = rep.login(null, workspace);
+                               if (log.isTraceEnabled())
+                                       log.trace("User " + session.getUserID() + " logged into "
+                                                       + request.getServletPath());
+                               sessions.put(workspace, session);
+                               return session;
+                       } catch (Exception e) {
+                               throw new ArgeoException("Cannot open session", e);
+                       }
                } else {
                        Session session = sessions.get(workspace);
                        if (!session.isLive()) {
                                sessions.remove(workspace);
-                               session = rep.login(credentials, workspace);
+                               session = rep.login(null, workspace);
                                sessions.put(workspace, session);
                        }
                        return session;
@@ -49,17 +57,22 @@ public class SimpleSessionProvider implements SessionProvider, Serializable {
        }
 
        public void releaseSession(Session session) {
-               if (log.isDebugEnabled())
-                       log.debug("Releasing JCR session " + session);
-               // session.logout();
-               // FIXME: find a way to log out when the HTTP session is expired
+               if (log.isTraceEnabled())
+                       log.trace("Releasing JCR session " + session);
+       }
+
+       public void init() {
        }
 
        public void dispose() {
-               for (String workspace : sessions.keySet()) {
-                       Session session = sessions.get(workspace);
-                       if (session.isLive())
-                               session.logout();
-               }
+               if (sessions != null)
+                       for (String workspace : sessions.keySet()) {
+                               Session session = sessions.get(workspace);
+                               if (session.isLive()) {
+                                       session.logout();
+                                       if (log.isDebugEnabled())
+                                               log.debug("Logged out JCR session " + session);
+                               }
+                       }
        }
 }