]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jackrabbit/JackrabbitRepositoryFactory.java
Improve user admin
[lgpl/argeo-commons.git] / server / runtime / org.argeo.server.jackrabbit / src / main / java / org / argeo / jackrabbit / JackrabbitRepositoryFactory.java
index ac3cce9fdaf2d5fd065bea8636906b04cbe4c110..5be370fe12a0c4c981e2fa0d4387cc01177a17c9 100644 (file)
@@ -1,24 +1,68 @@
 package org.argeo.jackrabbit;
 
+import java.util.HashMap;
 import java.util.Map;
+import java.util.Properties;
 
 import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
 import javax.jcr.RepositoryFactory;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.jackrabbit.commons.JcrUtils;
+import org.apache.jackrabbit.jcr2dav.Jcr2davRepositoryFactory;
+import org.argeo.ArgeoException;
 import org.argeo.jcr.ArgeoJcrConstants;
-import org.argeo.jcr.DefaultRepositoryRegister;
+import org.argeo.jcr.DefaultRepositoryFactory;
+import org.osgi.framework.BundleContext;
 
-public class JackrabbitRepositoryFactory extends DefaultRepositoryRegister
+/** Repository factory which can access remote Jackrabbit repositories */
+public class JackrabbitRepositoryFactory extends DefaultRepositoryFactory
                implements RepositoryFactory, ArgeoJcrConstants {
+       private final static Log log = LogFactory
+                       .getLog(JackrabbitRepositoryFactory.class);
 
-       @SuppressWarnings("rawtypes")
+       private BundleContext bundleContext;
+
+       @SuppressWarnings({ "rawtypes", "unchecked" })
        public Repository getRepository(Map parameters) throws RepositoryException {
-               String alias;
-               if (parameters.containsKey(JCR_REPOSITORY_ALIAS)) {
-                       alias = parameters.get(JCR_REPOSITORY_ALIAS).toString();
+               Repository repository = super.getRepository(parameters);
+               if (repository != null)
+                       return repository;
+
+               String uri;
+               if (parameters.containsKey(JCR_REPOSITORY_URI))
+                       uri = parameters.get(JCR_REPOSITORY_URI).toString();
+               else if (parameters.containsKey(JcrUtils.REPOSITORY_URI))
+                       uri = parameters.get(JcrUtils.REPOSITORY_URI).toString();
+               else
+                       return null;
+
+               Map<String, String> params = new HashMap<String, String>();
+               params.put(JcrUtils.REPOSITORY_URI, uri);
+               repository = new Jcr2davRepositoryFactory().getRepository(params);
+               if (repository == null)
+                       throw new ArgeoException("Remote Davex repository " + uri
+                                       + " not found");
+               log.info("Initialized remote Jackrabbit repository from uri " + uri);
+
+               if (parameters.containsKey(JCR_REPOSITORY_ALIAS)
+                               && bundleContext != null) {
+                       Properties properties = new Properties();
+                       properties.putAll(parameters);
+                       bundleContext.registerService(Repository.class.getName(),
+                                       repository, properties);
+                       log.info("Registered under alias '"
+                                       + parameters.get(JCR_REPOSITORY_ALIAS)
+                                       + "' the remote JCR repository from uri " + uri);
                }
-               return null;
+
+               return repository;
+       }
+
+       public void setBundleContext(BundleContext bundleContext) {
+               this.bundleContext = bundleContext;
        }
 
 }