]> 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 and proxying
[lgpl/argeo-commons.git] / server / runtime / org.argeo.server.jackrabbit / src / main / java / org / argeo / jackrabbit / remote / SimpleSessionProvider.java
index eab7451db741471555979486f55a974f3bf3333c..6647eb94bf77f958a9f5aa27884976aada8afd93 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;
@@ -17,6 +16,7 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.jackrabbit.server.SessionProvider;
 import org.argeo.ArgeoException;
+import org.argeo.jcr.JcrUtils;
 
 /** To be injected, typically of scope="session" */
 public class SimpleSessionProvider implements SessionProvider, Serializable {
@@ -27,42 +27,48 @@ public class SimpleSessionProvider implements SessionProvider, Serializable {
 
        private transient Map<String, Session> sessions;
 
-       private Credentials credentials = null;
+       private Boolean openSessionInView = true;
 
        public Session getSession(HttpServletRequest request, Repository rep,
                        String workspace) throws LoginException, ServletException,
                        RepositoryException {
 
-               // since sessions is transient it can be restored from the session
-               if (sessions == null)
-                       sessions = Collections
-                                       .synchronizedMap(new HashMap<String, Session>());
+               if (openSessionInView) {
+                       return rep.login(workspace);
+               } else {
+                       // 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)) {
-                       try {
-                               Session session = rep.login(credentials, workspace);
-                               if (log.isDebugEnabled())
-                                       log.debug("User " + session.getUserID() + " logged into "
-                                                       + request.getServletPath());
-                               sessions.put(workspace, session);
+                       if (!sessions.containsKey(workspace)) {
+                               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(null, workspace);
+                                       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);
-                               sessions.put(workspace, session);
                        }
-                       return session;
                }
        }
 
        public void releaseSession(Session session) {
                if (log.isTraceEnabled())
                        log.trace("Releasing JCR session " + session);
+               if (openSessionInView)
+                       JcrUtils.logoutQuietly(session);
        }
 
        public void init() {
@@ -72,8 +78,11 @@ public class SimpleSessionProvider implements SessionProvider, Serializable {
                if (sessions != null)
                        for (String workspace : sessions.keySet()) {
                                Session session = sessions.get(workspace);
-                               if (session.isLive())
+                               if (session.isLive()) {
                                        session.logout();
+                                       if (log.isDebugEnabled())
+                                               log.debug("Logged out JCR session " + session);
+                               }
                        }
        }
 }