Male LDAP security DAO initialization more robust
authorMathieu Baudier <mbaudier@argeo.org>
Sun, 2 Oct 2011 17:52:34 +0000 (17:52 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Sun, 2 Oct 2011 17:52:34 +0000 (17:52 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@4773 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

security/modules/org.argeo.security.dao.ldap/META-INF/spring/ldap-jcr.xml
security/modules/org.argeo.security.dao.ldap/META-INF/spring/ldap-osgi.xml
server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/JcrCallback.java
server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/ThreadBoundJcrSessionFactory.java

index 8e0ebc0526c989c62d47a7b7bf549c8c1df5864a..d8a78c1b5715fb168613c91546fe3788abded782 100644 (file)
@@ -58,7 +58,7 @@
        </bean>
 
        <bean id="nodeSession" class="org.argeo.security.jcr.SecureThreadBoundSession">
-               <property name="repository" ref="nodeRepository" />
+               <property name="repositories" ref="repositories" />
        </bean>
 
 </beans>
index 69931f5748295e2104d66bc2cdfaadf5a885717e..f67cfb49267f71d18dc06934a07e71dfb0aecb46 100644 (file)
@@ -7,8 +7,11 @@
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">\r
 \r
        <!-- REFERENCES -->\r
-       <reference id="nodeRepository" interface="javax.jcr.Repository"\r
-               filter="(argeo.jcr.repository.alias=${argeo.node.repo.alias})" />\r
+       <list id="repositories" interface="javax.jcr.Repository"\r
+               filter="(argeo.jcr.repository.alias=${argeo.node.repo.alias})"\r
+               cardinality="0..N">\r
+       </list>\r
+\r
        <reference id="systemExecutionService" interface="org.argeo.security.SystemExecutionService" />\r
 \r
        <!-- SERVICES -->\r
index 5901497a37774b42fdb5573a133bdec73b90bdc3..f8195a46df0dad23258557a7f70f2bf71ca39c54 100644 (file)
@@ -1,6 +1,5 @@
 package org.argeo.jcr;
 
-import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 
 /** An arbitrary execution on a JCR session, optionally returning a result. */
index 003bcc69b552fd956e5db28b8efd27e72f81237b..8adbae78486d2e158382f21c370c9c7d11c47879 100644 (file)
@@ -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<Repository> repositories;
 
        private ThreadLocal<Session> session = new ThreadLocal<Session>();
        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);
                        }
@@ -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<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;
        }