Register JCR repositories with the repository factory
authorMathieu Baudier <mbaudier@argeo.org>
Wed, 25 Feb 2015 18:55:20 +0000 (18:55 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Wed, 25 Feb 2015 18:55:20 +0000 (18:55 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@7959 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

org.argeo.cms/src/org/argeo/cms/internal/kernel/Activator.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/JackrabbitNode.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/Kernel.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeHttp.java

index 9a31d089b39c45b6f3d25720571617698165c84d..6bad825ddda3a629b324c4d15b73936a369c5f8f 100644 (file)
@@ -24,9 +24,8 @@ public class Activator implements BundleActivator {
        public void start(BundleContext context) throws Exception {
                assert bundleContext == null;
                assert kernel == null;
-
                bundleContext = context;
-               kernel = new Kernel(bundleContext);
+               kernel = new Kernel();
                kernel.init();
        }
 
index e31e8af7d043b86be05630747f753c5b261b154c..918d06f96a48a9904cc3efb29ce3d5918afe8506 100644 (file)
@@ -24,6 +24,7 @@ import org.argeo.ArgeoException;
 import org.argeo.cms.CmsException;
 import org.argeo.jackrabbit.JackrabbitWrapper;
 import org.argeo.jcr.ArgeoJcrConstants;
+import org.argeo.jcr.DefaultRepositoryRegister;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceRegistration;
 import org.xml.sax.InputSource;
@@ -52,11 +53,12 @@ class JackrabbitNode extends JackrabbitWrapper implements KernelConstants,
                }
        }
 
-       public void publish() {
+       void publish(DefaultRepositoryRegister repositoryRegister) {
                Hashtable<String, String> regProps = new Hashtable<String, String>();
                regProps.put(JCR_REPOSITORY_ALIAS, ALIAS_NODE);
                repositoryReg = getBundleContext().registerService(Repository.class,
                                this, regProps);
+               repositoryRegister.register(this, regProps);
        }
 
        public void destroy() {
index ffba91a3e1a9346e4cd43154cdefba72b23738a5..c63184a2435d189f314ebc57319dfabb4469b11b 100644 (file)
@@ -1,6 +1,8 @@
 package org.argeo.cms.internal.kernel;
 
 import java.lang.management.ManagementFactory;
+import java.util.HashMap;
+import java.util.Map;
 
 import javax.jcr.Repository;
 import javax.jcr.RepositoryFactory;
@@ -35,32 +37,14 @@ import org.springframework.security.core.context.SecurityContextHolder;
 final class Kernel implements ServiceListener {
        private final static Log log = LogFactory.getLog(Kernel.class);
 
-       private final BundleContext bundleContext;
-       // private final ThreadGroup threadGroup = new
-       // ThreadGroup("Argeo CMS Kernel");
+       private final BundleContext bundleContext = Activator.getBundleContext();
 
        private JackrabbitNode node;
-       private RepositoryFactory repositoryFactory;
+       private OsgiJackrabbitRepositoryFactory repositoryFactory;
        private NodeSecurity nodeSecurity;
        private NodeHttp nodeHttp;
 
-       Kernel(BundleContext bundleContext) {
-               this.bundleContext = bundleContext;
-       }
-
        void init() {
-               // new Thread(threadGroup, "init") {
-               // @Override
-               // public void run() {
-               // // CMS bundle classloader used during initialisation
-               // Thread.currentThread().setContextClassLoader(
-               // Kernel.class.getClassLoader());
-               doInit();
-               // }
-               // }.start();
-       }
-
-       protected void doInit() {
                ClassLoader currentContextCl = Thread.currentThread()
                                .getContextClassLoader();
                Thread.currentThread().setContextClassLoader(
@@ -71,8 +55,13 @@ final class Kernel implements ServiceListener {
                SecurityContextHolder.getContext().setAuthentication(initAuth);
 
                try {
+                       // Jackrabbit node
                        node = new JackrabbitNode(bundleContext);
+
+                       // JCR repository factory
                        repositoryFactory = new OsgiJackrabbitRepositoryFactory();
+
+                       // Authentication
                        nodeSecurity = new NodeSecurity(bundleContext, node);
 
                        // Equinox dependency
@@ -81,7 +70,7 @@ final class Kernel implements ServiceListener {
 
                        // Publish services to OSGi
                        nodeSecurity.publish();
-                       node.publish();
+                       node.publish(repositoryFactory);
                        bundleContext.registerService(RepositoryFactory.class,
                                        repositoryFactory, null);
 
@@ -130,42 +119,25 @@ final class Kernel implements ServiceListener {
                if (jcrRepoAlias != null) {// JCR repository
                        String alias = jcrRepoAlias.toString();
                        Repository repository = (Repository) bundleContext.getService(sr);
+                       Map<String, Object> props = new HashMap<String, Object>();
+                       for (String key : sr.getPropertyKeys())
+                               props.put(key, sr.getProperty(key));
                        if (ServiceEvent.REGISTERED == event.getType()) {
                                try {
-                                       nodeHttp.registerWebdavServlet(alias, repository, true);
-                                       nodeHttp.registerWebdavServlet(alias, repository, false);
-                                       nodeHttp.registerRemotingServlet(alias, repository, true);
-                                       nodeHttp.registerRemotingServlet(alias, repository, false);
+                                       repositoryFactory.register(repository, props);
+                                       nodeHttp.registerRepositoryServlets(alias, repository);
                                } catch (Exception e) {
                                        throw new CmsException("Could not publish JCR repository "
                                                        + alias, e);
                                }
                        } else if (ServiceEvent.UNREGISTERING == event.getType()) {
+                               repositoryFactory.unregister(repository, props);
+                               nodeHttp.unregisterRepositoryServlets(alias);
                        }
                }
 
        }
 
-       final private static void directorsCut(long initDuration) {
-               // final long ms = 128l + (long) (Math.random() * 128d);
-               long ms = initDuration / 10;
-               log.info("Spend " + ms + "ms"
-                               + " reflecting on the progress brought to mankind"
-                               + " by Free Software...");
-               long beginNano = System.nanoTime();
-               try {
-                       Thread.sleep(ms, 0);
-               } catch (InterruptedException e) {
-                       // silent
-               }
-               long durationNano = System.nanoTime() - beginNano;
-               final double M = 1000d * 1000d;
-               double sleepAccuracy = ((double) durationNano) / (ms * M);
-               if (log.isTraceEnabled())
-                       log.trace("Sleep accuracy: "
-                                       + String.format("%.2f", sleepAccuracy * 100) + " %");
-       }
-
        private ExtendedHttpService waitForHttpService() {
                final ServiceTracker<ExtendedHttpService, ExtendedHttpService> st = new ServiceTracker<ExtendedHttpService, ExtendedHttpService>(
                                bundleContext, ExtendedHttpService.class, null);
@@ -182,4 +154,25 @@ final class Kernel implements ServiceListener {
                                        + ExtendedHttpService.class + " service.");
                return httpService;
        }
-}
+
+       final private static void directorsCut(long initDuration) {
+               // final long ms = 128l + (long) (Math.random() * 128d);
+               long ms = initDuration / 100;
+               log.info("Spend " + ms + "ms"
+                               + " reflecting on the progress brought to mankind"
+                               + " by Free Software...");
+               long beginNano = System.nanoTime();
+               try {
+                       Thread.sleep(ms, 0);
+               } catch (InterruptedException e) {
+                       // silent
+               }
+               long durationNano = System.nanoTime() - beginNano;
+               final double M = 1000d * 1000d;
+               double sleepAccuracy = ((double) durationNano) / (ms * M);
+               if (log.isDebugEnabled())
+                       log.debug("Sleep accuracy: "
+                                       + String.format("%.2f", 100 - (sleepAccuracy * 100 - 100))
+                                       + " %");
+       }
+}
\ No newline at end of file
index 418771d981669295308a51958aa6b979e0a38385..28c569bfdf6ff4908f9a28e10eeb736fe0581a8b 100644 (file)
@@ -73,20 +73,34 @@ class NodeHttp implements KernelConstants, ArgeoJcrConstants {
                // DAV
                sessionProvider = new OpenInViewSessionProvider();
 
+               registerRepositoryServlets(ALIAS_NODE, node);
                try {
-                       registerWebdavServlet(ALIAS_NODE, node, true);
-                       registerWebdavServlet(ALIAS_NODE, node, false);
-                       registerRemotingServlet(ALIAS_NODE, node, true);
-                       registerRemotingServlet(ALIAS_NODE, node, false);
-
                        httpService.registerFilter("/", rootFilter, null, null);
                } catch (Exception e) {
-                       throw new CmsException("Could not initialise http", e);
+                       throw new CmsException(
+                                       "Could not register root filter", e);
                }
        }
 
        public void destroy() {
                sessionProvider.destroy();
+               unregisterRepositoryServlets(ALIAS_NODE);
+       }
+
+       void registerRepositoryServlets(String alias, Repository repository) {
+               try {
+                       registerWebdavServlet(alias, repository, true);
+                       registerWebdavServlet(alias, repository, false);
+                       registerRemotingServlet(alias, repository, true);
+                       registerRemotingServlet(alias, repository, false);
+               } catch (Exception e) {
+                       throw new CmsException(
+                                       "Could not register servlets for repository " + alias, e);
+               }
+       }
+
+       void unregisterRepositoryServlets(String alias) {
+               // FIXME unregister servlets
        }
 
        void registerWebdavServlet(String alias, Repository repository,