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=4c8ee90105155bc21393a755cbb73744c38c398c;hb=7f357d2250d433d6b44328d419c1e62d9655c2df;hp=003bcc69b552fd956e5db28b8efd27e72f81237b;hpb=13b5efc8ccec8b21fc049bbb5332a0713dbdfba1;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 003bcc69b..4c8ee9010 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 @@ -43,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 repositories; private ThreadLocal session = new ThreadLocal(); private final Session proxiedSession; @@ -88,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 @@ -102,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); } @@ -132,13 +134,13 @@ public abstract class ThreadBoundJcrSessionFactory { if (activeSessions.size() == 0) return; - if (log.isDebugEnabled()) - log.debug("Cleaning up " + activeSessions.size() + if (log.isTraceEnabled()) + log.trace("Cleaning up " + activeSessions.size() + " active JCR sessions..."); deactivate(); for (Session sess : activeSessions.values()) { - sess.logout(); + JcrUtils.logoutQuietly(sess); } activeSessions.clear(); } @@ -170,8 +172,8 @@ public abstract class ThreadBoundJcrSessionFactory { Session session = activeSessions.get(thread.getId()); activeSessions.remove(thread.getId()); session.logout(); - if (log.isDebugEnabled()) - log.debug("Cleaned up JCR session (userID=" + if (log.isTraceEnabled()) + log.trace("Cleaned up JCR session (userID=" + session.getUserID() + ") from dead thread " + thread.getId()); } @@ -202,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 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 repositories) { + this.repositories = repositories; + } + public void setDefaultUsername(String defaultUsername) { this.defaultUsername = defaultUsername; }