Extends Jackrabbit factory capabilities
[lgpl/argeo-commons.git] / server / runtime / org.argeo.server.jackrabbit / src / main / java / org / argeo / jackrabbit / JackrabbitRepositoryFactory.java
index 5be370fe12a0c4c981e2fa0d4387cc01177a17c9..65bdf29393478ae0b1b99371ed441e54288e9762 100644 (file)
@@ -15,54 +15,65 @@ import org.apache.jackrabbit.jcr2dav.Jcr2davRepositoryFactory;
 import org.argeo.ArgeoException;
 import org.argeo.jcr.ArgeoJcrConstants;
 import org.argeo.jcr.DefaultRepositoryFactory;
-import org.osgi.framework.BundleContext;
 
-/** Repository factory which can access remote Jackrabbit repositories */
+/**
+ * Repository factory which can create new repositories and access remote
+ * Jackrabbit repositories
+ */
 public class JackrabbitRepositoryFactory extends DefaultRepositoryFactory
                implements RepositoryFactory, ArgeoJcrConstants {
        private final static Log log = LogFactory
                        .getLog(JackrabbitRepositoryFactory.class);
 
-       private BundleContext bundleContext;
-
        @SuppressWarnings({ "rawtypes", "unchecked" })
        public Repository getRepository(Map parameters) throws RepositoryException {
+               // check if can be found by alias
                Repository repository = super.getRepository(parameters);
                if (repository != null)
                        return repository;
 
-               String uri;
+               // check if remote
+               String uri = null;
                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;
 
+               if (uri == null)
+                       repository = createRemoteRepository(uri);
+
+               if (parameters.containsKey(JCR_REPOSITORY_ALIAS)) {
+                       Properties properties = new Properties();
+                       properties.putAll(parameters);
+                       String alias = parameters.get(JCR_REPOSITORY_ALIAS).toString();
+                       publish(alias, repository, properties);
+                       log.info("Registered JCR repository under alias '" + alias
+                                       + "' with properties " + properties);
+               }
+
+               return repository;
+       }
+
+       protected Repository createRemoteRepository(String uri)
+                       throws RepositoryException {
                Map<String, String> params = new HashMap<String, String>();
                params.put(JcrUtils.REPOSITORY_URI, uri);
-               repository = new Jcr2davRepositoryFactory().getRepository(params);
+               Repository 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 repository;
        }
 
-       public void setBundleContext(BundleContext bundleContext) {
-               this.bundleContext = bundleContext;
+       /**
+        * Called after the repository has been initialized. Does nothing by
+        * default.
+        */
+       @SuppressWarnings("rawtypes")
+       protected void postInitialization(Repository repository, Map parameters) {
+
        }
 
 }