]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/ThreadBoundJcrSessionFactory.java
First working remote node
[lgpl/argeo-commons.git] / server / runtime / org.argeo.server.jcr / src / main / java / org / argeo / jcr / ThreadBoundJcrSessionFactory.java
index 352ab51a7db887a061a7e70c7d810b0798d66383..fc9bcaa86356525813fb604eeb65e3e1e561021e 100644 (file)
@@ -17,6 +17,7 @@
 package org.argeo.jcr;
 
 import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
 import java.util.ArrayList;
@@ -42,6 +43,8 @@ public abstract class ThreadBoundJcrSessionFactory {
                        .getLog(ThreadBoundJcrSessionFactory.class);
 
        private Repository repository;
+       /** can be injected as list, only used if repository is null */
+       private List<Repository> repositories;
 
        private ThreadLocal<Session> session = new ThreadLocal<Session>();
        private final Session proxiedSession;
@@ -69,7 +72,7 @@ public abstract class ThreadBoundJcrSessionFactory {
        }
 
        /** Logs in to the repository using various strategies. */
-       protected Session login() {
+       protected synchronized Session login() {
                if (!isActive())
                        throw new ArgeoException("Thread bound session factory inactive");
 
@@ -87,7 +90,7 @@ public abstract class ThreadBoundJcrSessionFactory {
                // Security)
                if (!forceDefaultCredentials)
                        try {
-                               newSession = repository.login(workspace);
+                               newSession = repository().login(workspace);
                        } catch (LoginException e1) {
                                log.warn("Cannot login without credentials: " + e1.getMessage());
                                // invalid credentials, go to the next step
@@ -101,7 +104,7 @@ public abstract class ThreadBoundJcrSessionFactory {
                        try {
                                SimpleCredentials sc = new SimpleCredentials(defaultUsername,
                                                defaultPassword.toCharArray());
-                               newSession = repository.login(sc, workspace);
+                               newSession = repository().login(sc, workspace);
                        } catch (RepositoryException e) {
                                throw new ArgeoException("Cannot log in to repository", e);
                        }
@@ -137,7 +140,7 @@ public abstract class ThreadBoundJcrSessionFactory {
 
                deactivate();
                for (Session sess : activeSessions.values()) {
-                       sess.logout();
+                       JcrUtils.logoutQuietly(sess);
                }
                activeSessions.clear();
        }
@@ -201,10 +204,36 @@ public abstract class ThreadBoundJcrSessionFactory {
                return session;
        }
 
+       protected Repository repository() {
+               if (repository != null)
+                       return repository;
+               if (repositories != null) {
+                       // hardened for OSGi dynamic services
+                       Iterator<Repository> it = repositories.iterator();
+                       if (it.hasNext())
+                               return it.next();
+               }
+               throw new ArgeoException("No repository injected");
+       }
+
+       // /** Useful for declarative registration of OSGi services (blueprint) */
+       // public void register(Repository repository, Map<?, ?> params) {
+       // this.repository = repository;
+       // }
+       //
+       // /** Useful for declarative registration of OSGi services (blueprint) */
+       // public void unregister(Repository repository, Map<?, ?> params) {
+       // this.repository = null;
+       // }
+
        public void setRepository(Repository repository) {
                this.repository = repository;
        }
 
+       public void setRepositories(List<Repository> repositories) {
+               this.repositories = repositories;
+       }
+
        public void setDefaultUsername(String defaultUsername) {
                this.defaultUsername = defaultUsername;
        }
@@ -224,7 +253,7 @@ public abstract class ThreadBoundJcrSessionFactory {
        protected class JcrSessionInvocationHandler implements InvocationHandler {
 
                public Object invoke(Object proxy, Method method, Object[] args)
-                               throws Throwable {
+                               throws Throwable, RepositoryException {
                        Session threadSession = session.get();
                        if (threadSession == null) {
                                if ("logout".equals(method.getName()))// no need to login
@@ -235,7 +264,16 @@ public abstract class ThreadBoundJcrSessionFactory {
                        }
 
                        preCall(threadSession);
-                       Object ret = method.invoke(threadSession, args);
+                       Object ret;
+                       try {
+                               ret = method.invoke(threadSession, args);
+                       } catch (InvocationTargetException e) {
+                               Throwable cause = e.getCause();
+                               if (cause instanceof RepositoryException)
+                                       throw (RepositoryException) cause;
+                               else
+                                       throw cause;
+                       }
                        if ("logout".equals(method.getName())) {
                                session.remove();
                                Thread thread = Thread.currentThread();