X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=server%2Fruntime%2Forg.argeo.server.jcr%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fjcr%2FThreadBoundJcrSessionFactory.java;h=003bcc69b552fd956e5db28b8efd27e72f81237b;hb=79af724fe2acf4c5df0da2a6a72e123195d66eb8;hp=88c9cf8fe8a508ffc28dfac38a0e54f1ac0c3cea;hpb=da55282938aaebf9fa148454dbc8add9c558501f;p=lgpl%2Fargeo-commons.git diff --git a/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/ThreadBoundJcrSessionFactory.java b/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/ThreadBoundJcrSessionFactory.java index 88c9cf8fe..003bcc69b 100644 --- a/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/ThreadBoundJcrSessionFactory.java +++ b/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/ThreadBoundJcrSessionFactory.java @@ -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; @@ -69,7 +70,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"); @@ -224,7 +225,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 +236,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(); @@ -252,6 +262,10 @@ public abstract class ThreadBoundJcrSessionFactory { /** Monitors registered thread in order to clean up dead ones. */ private class MonitoringThread extends Thread { + public MonitoringThread() { + super("ThreadBound JCR Session Monitor"); + } + @Override public void run() { while (isActive()) {