]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/ThreadBoundJcrSessionFactory.java
Introduce OSAuthentication
[lgpl/argeo-commons.git] / server / runtime / org.argeo.server.jcr / src / main / java / org / argeo / jcr / ThreadBoundJcrSessionFactory.java
index 1a37e3e855f5edb0cc5fc43570ec7921d21fa584..d548b6eddaa227a63be3449994e08ba6ad6da326 100644 (file)
@@ -35,13 +35,9 @@ import javax.jcr.SimpleCredentials;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.argeo.ArgeoException;
-import org.springframework.beans.factory.DisposableBean;
-import org.springframework.beans.factory.FactoryBean;
-import org.springframework.beans.factory.InitializingBean;
 
 /** Proxy JCR sessions and attach them to calling threads. */
-public class ThreadBoundJcrSessionFactory implements FactoryBean,
-               InitializingBean, DisposableBean {
+public class ThreadBoundJcrSessionFactory {
        private final static Log log = LogFactory
                        .getLog(ThreadBoundJcrSessionFactory.class);
 
@@ -74,7 +70,10 @@ public class ThreadBoundJcrSessionFactory implements FactoryBean,
 
        /** Logs in to the repository using various strategies. */
        protected Session login() {
-               // discard sesison previoussly attached to this thread
+               if (!isActive())
+                       throw new ArgeoException("Thread bound session factory inactive");
+
+               // discard session previously attached to this thread
                Thread thread = Thread.currentThread();
                if (activeSessions.containsKey(thread.getId())) {
                        Session oldSession = activeSessions.remove(thread.getId());
@@ -123,12 +122,15 @@ public class ThreadBoundJcrSessionFactory implements FactoryBean,
                return proxiedSession;
        }
 
-       public void afterPropertiesSet() throws Exception {
+       public void init() throws Exception {
                monitoringThread = new MonitoringThread();
                monitoringThread.start();
        }
 
-       public synchronized void destroy() throws Exception {
+       public synchronized void dispose() throws Exception {
+               if (activeSessions.size() == 0)
+                       return;
+
                if (log.isDebugEnabled())
                        log.debug("Cleaning up " + activeSessions.size()
                                        + " active JCR sessions...");
@@ -138,7 +140,6 @@ public class ThreadBoundJcrSessionFactory implements FactoryBean,
                        sess.logout();
                }
                activeSessions.clear();
-               monitoringThread.join(1000);
        }
 
        protected Boolean isActive() {
@@ -150,6 +151,39 @@ public class ThreadBoundJcrSessionFactory implements FactoryBean,
                notifyAll();
        }
 
+       protected synchronized void removeSession(Thread thread) {
+               if (!isActive())
+                       return;
+               activeSessions.remove(thread.getId());
+               threads.remove(thread);
+       }
+
+       protected synchronized void cleanDeadThreads() {
+               if (!isActive())
+                       return;
+               Iterator<Thread> it = threads.iterator();
+               while (it.hasNext()) {
+                       Thread thread = it.next();
+                       if (!thread.isAlive() && isActive()) {
+                               if (activeSessions.containsKey(thread.getId())) {
+                                       Session session = activeSessions.get(thread.getId());
+                                       activeSessions.remove(thread.getId());
+                                       session.logout();
+                                       if (log.isDebugEnabled())
+                                               log.debug("Cleaned up JCR session (userID="
+                                                               + session.getUserID() + ") from dead thread "
+                                                               + thread.getId());
+                               }
+                               it.remove();
+                       }
+               }
+               try {
+                       wait(1000);
+               } catch (InterruptedException e) {
+                       // silent
+               }
+       }
+
        public Class<? extends Session> getObjectType() {
                return Session.class;
        }
@@ -200,20 +234,16 @@ public class ThreadBoundJcrSessionFactory implements FactoryBean,
                                threadSession = login();
                        }
 
+                       preCall(threadSession);
                        Object ret = method.invoke(threadSession, args);
                        if ("logout".equals(method.getName())) {
-                               synchronized (ThreadBoundJcrSessionFactory.this) {
-                                       session.remove();
-                                       Thread thread = Thread.currentThread();
-                                       if (isActive()) {
-                                               activeSessions.remove(thread.getId());
-                                               threads.remove(thread);
-                                       }
-                                       if (log.isTraceEnabled())
-                                               log.trace("Logged out JCR session (userId="
-                                                               + threadSession.getUserID() + ") on thread "
-                                                               + thread.getId());
-                               }
+                               session.remove();
+                               Thread thread = Thread.currentThread();
+                               removeSession(thread);
+                               if (log.isTraceEnabled())
+                                       log.trace("Logged out JCR session (userId="
+                                                       + threadSession.getUserID() + ") on thread "
+                                                       + thread.getId());
                        }
                        return ret;
                }
@@ -225,32 +255,7 @@ public class ThreadBoundJcrSessionFactory implements FactoryBean,
                @Override
                public void run() {
                        while (isActive()) {
-                               Iterator<Thread> it = threads.iterator();
-                               while (it.hasNext()) {
-                                       Thread thread = it.next();
-                                       if (!thread.isAlive() && isActive()) {
-                                               if (activeSessions.containsKey(thread.getId())) {
-                                                       Session session = activeSessions
-                                                                       .get(thread.getId());
-                                                       activeSessions.remove(thread.getId());
-                                                       session.logout();
-                                                       if (log.isDebugEnabled())
-                                                               log.debug("Cleaned up JCR session (userID="
-                                                                               + session.getUserID()
-                                                                               + ") from dead thread "
-                                                                               + thread.getId());
-                                               }
-                                               it.remove();
-                                       }
-                               }
-
-                               synchronized (ThreadBoundJcrSessionFactory.this) {
-                                       try {
-                                               ThreadBoundJcrSessionFactory.this.wait(1000);
-                                       } catch (InterruptedException e) {
-                                               // silent
-                                       }
-                               }
+                               cleanDeadThreads();
                        }
                }