X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=server%2Fruntime%2Forg.argeo.server.jcr%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fjcr%2FThreadBoundJcrSessionFactory.java;h=aaafdc26a704f2781c11164c07aec708a3a00769;hb=7fe4a16dad045373bb014724733c1bbb175d44b5;hp=ef044ce8b872e4ddbbc2bfa29a64bdab4ed9ec40;hpb=7807780029af8d1f2f32d7513e0769f128b729d1;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 ef044ce8b..aaafdc26a 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 @@ -42,67 +42,49 @@ public class ThreadBoundJcrSessionFactory implements FactoryBean, .getLog(ThreadBoundJcrSessionFactory.class); private Repository repository; - private List activeSessions = Collections + private final List activeSessions = Collections .synchronizedList(new ArrayList()); private ThreadLocal session = new ThreadLocal(); private boolean destroying = false; private final Session proxiedSession; + /** If workspace is null, default will be used. */ + private String workspace = null; private String defaultUsername = "demo"; private String defaultPassword = "demo"; + private Boolean forceDefaultCredentials = false; public ThreadBoundJcrSessionFactory() { Class[] interfaces = { Session.class }; proxiedSession = (Session) Proxy.newProxyInstance(getClass() - .getClassLoader(), interfaces, new InvocationHandler() { - - public Object invoke(Object proxy, Method method, Object[] args) - throws Throwable { - Session threadSession = session.get(); - if (threadSession == null) { - if ("logout".equals(method.getName()))// no need to login - return Void.TYPE; - threadSession = login(); - session.set(threadSession); - } - - Object ret = method.invoke(threadSession, args); - if ("logout".equals(method.getName())) { - session.remove(); - if (!destroying) - activeSessions.remove(threadSession); - if (log.isTraceEnabled()) - log.trace("Logged out from JCR session " - + threadSession + "; userId=" - + threadSession.getUserID()); - } - return ret; - } - }); + .getClassLoader(), interfaces, + new JcrSessionInvocationHandler()); } + /** Logs in to the repository using various strategies. */ protected Session login() { Session newSession = null; // first try to login without credentials, assuming the underlying login // module will have dealt with authentication (typically using Spring // Security) - try { - newSession = repository.login(); - } catch (LoginException e1) { - log.warn("Cannot login without credentials: " + e1.getMessage()); - // invalid credentials, go to the next step - } catch (RepositoryException e1) { - // other kind of exception, fail - throw new ArgeoException("Cannot log in to repository", e1); - } + if (!forceDefaultCredentials) + try { + newSession = repository.login(workspace); + } catch (LoginException e1) { + log.warn("Cannot login without credentials: " + e1.getMessage()); + // invalid credentials, go to the next step + } catch (RepositoryException e1) { + // other kind of exception, fail + throw new ArgeoException("Cannot log in to repository", e1); + } // log using default username / password (useful for testing purposes) if (newSession == null) try { SimpleCredentials sc = new SimpleCredentials(defaultUsername, defaultPassword.toCharArray()); - newSession = repository.login(sc); + newSession = repository.login(sc, workspace); } catch (RepositoryException e) { throw new ArgeoException("Cannot log in to repository", e); } @@ -151,4 +133,38 @@ public class ThreadBoundJcrSessionFactory implements FactoryBean, this.defaultPassword = defaultPassword; } + public void setForceDefaultCredentials(Boolean forceDefaultCredentials) { + this.forceDefaultCredentials = forceDefaultCredentials; + } + + public void setWorkspace(String workspace) { + this.workspace = workspace; + } + + protected class JcrSessionInvocationHandler implements InvocationHandler { + + public Object invoke(Object proxy, Method method, Object[] args) + throws Throwable { + Session threadSession = session.get(); + if (threadSession == null) { + if ("logout".equals(method.getName()))// no need to login + return Void.TYPE; + else if ("toString".equals(method.getName()))// maybe logging + return "Uninitialized Argeo thread bound JCR session"; + threadSession = login(); + session.set(threadSession); + } + + Object ret = method.invoke(threadSession, args); + if ("logout".equals(method.getName())) { + session.remove(); + if (!destroying) + activeSessions.remove(threadSession); + if (log.isTraceEnabled()) + log.trace("Logged out from JCR session " + threadSession + + "; userId=" + threadSession.getUserID()); + } + return ret; + } + } }