Improve JCR repository lifecycle
[lgpl/argeo-commons.git] / org.argeo.cms.jcr / src / org / argeo / cms / jcr / internal / RepositoryContextsFactory.java
index 1a1fda1f08756c47aba039545be7abaeadfc8576..2b9ad0043f1b5731c42d11b498a4859167971564 100644 (file)
@@ -1,11 +1,14 @@
 package org.argeo.cms.jcr.internal;
 
+import java.io.IOException;
 import java.net.URI;
+import java.net.URISyntaxException;
 import java.util.Dictionary;
 import java.util.HashMap;
 import java.util.Map;
 
 import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
 import javax.jcr.RepositoryFactory;
 
 import org.apache.jackrabbit.core.RepositoryContext;
@@ -26,15 +29,16 @@ public class RepositoryContextsFactory implements ManagedServiceFactory {
 
        private Map<String, RepositoryContext> repositories = new HashMap<String, RepositoryContext>();
        private Map<String, Object> pidToCn = new HashMap<String, Object>();
-       
+
        public void init() {
-               
+
        }
 
        public void destroy() {
                for (String pid : repositories.keySet()) {
                        try {
-                               repositories.get(pid).getRepository().shutdown();
+                               RepositoryContext repositoryContext = repositories.get(pid);
+                               repositoryContext.getRepository().shutdown();
                                if (log.isDebugEnabled())
                                        log.debug("Shut down repository " + pid
                                                        + (pidToCn.containsKey(pid) ? " (" + pidToCn.get(pid) + ")" : ""));
@@ -44,7 +48,6 @@ public class RepositoryContextsFactory implements ManagedServiceFactory {
                }
        }
 
-
        @Override
        public String getName() {
                return "Jackrabbit repository service factory";
@@ -58,10 +61,19 @@ public class RepositoryContextsFactory implements ManagedServiceFactory {
                if (properties == null)
                        return;
 
-               if (repositories.containsKey(pid)) {
-                       log.warn("Ignore update of Jackrabbit repository " + pid);
-                       return;
-               }
+               Object cn = properties.get(CmsConstants.CN);
+               if (cn != null)
+                       for (String otherPid : pidToCn.keySet()) {
+                               Object o = pidToCn.get(otherPid);
+                               if (cn.equals(o)) {
+                                       RepositoryContext repositoryContext = repositories.remove(otherPid);
+                                       repositories.put(pid, repositoryContext);
+                                       if (log.isDebugEnabled())
+                                               log.debug("Ignore update of Jackrabbit repository " + cn);
+                                       // FIXME perform a proper update (also of the OSGi service)
+                                       return;
+                               }
+                       }
 
                try {
                        Object labeledUri = properties.get(RepoConf.labeledUri.name());
@@ -72,7 +84,6 @@ public class RepositoryContextsFactory implements ManagedServiceFactory {
                                Dictionary<String, Object> props = LangUtils.dict(Constants.SERVICE_PID, pid);
                                // props.put(ArgeoJcrConstants.JCR_REPOSITORY_URI,
                                // properties.get(RepoConf.labeledUri.name()));
-                               Object cn = properties.get(CmsConstants.CN);
                                if (cn != null) {
                                        props.put(CmsConstants.CN, cn);
                                        // props.put(NodeConstants.JCR_REPOSITORY_ALIAS, cn);
@@ -80,45 +91,38 @@ public class RepositoryContextsFactory implements ManagedServiceFactory {
                                }
                                CmsJcrActivator.registerService(RepositoryContext.class, repositoryContext, props);
                        } else {
-                               try {
-                                       Object cn = properties.get(CmsConstants.CN);
-                                       Object defaultWorkspace = properties.get(RepoConf.defaultWorkspace.name());
-                                       if (defaultWorkspace == null)
-                                               defaultWorkspace = RepoConf.defaultWorkspace.getDefault();
-                                       URI uri = new URI(labeledUri.toString());
+                               Object defaultWorkspace = properties.get(RepoConf.defaultWorkspace.name());
+                               if (defaultWorkspace == null)
+                                       defaultWorkspace = RepoConf.defaultWorkspace.getDefault();
+                               URI uri = new URI(labeledUri.toString());
 //                                     RepositoryFactory repositoryFactory = bc
 //                                                     .getService(bc.getServiceReference(RepositoryFactory.class));
-                                       RepositoryFactory repositoryFactory = CmsJcrActivator.getService(RepositoryFactory.class);
-                                       Map<String, String> parameters = new HashMap<String, String>();
-                                       parameters.put(RepoConf.labeledUri.name(), uri.toString());
-                                       parameters.put(RepoConf.defaultWorkspace.name(), defaultWorkspace.toString());
-                                       Repository repository = repositoryFactory.getRepository(parameters);
-                                       // Repository repository = NodeUtils.getRepositoryByUri(repositoryFactory,
-                                       // uri.toString());
-                                       Dictionary<String, Object> props = LangUtils.dict(Constants.SERVICE_PID, pid);
-                                       props.put(RepoConf.labeledUri.name(),
-                                                       new URI(uri.getScheme(), null, uri.getHost(), uri.getPort(), uri.getPath(), null, null)
-                                                                       .toString());
-                                       if (cn != null) {
-                                               props.put(CmsConstants.CN, cn);
-                                               // props.put(NodeConstants.JCR_REPOSITORY_ALIAS, cn);
-                                               pidToCn.put(pid, cn);
-                                       }
-                                       CmsJcrActivator.registerService(Repository.class, repository, props);
-
-                                       // home
-                                       if (cn.equals(CmsConstants.NODE_REPOSITORY)) {
-                                               Dictionary<String, Object> homeProps = LangUtils.dict(CmsConstants.CN,
-                                                               CmsConstants.EGO_REPOSITORY);
-                                               EgoRepository homeRepository = new EgoRepository(repository, true);
-                                               CmsJcrActivator.registerService(Repository.class, homeRepository, homeProps);
-                                       }
-                               } catch (Exception e) {
-                                       // TODO Auto-generated catch block
-                                       e.printStackTrace();
+                               RepositoryFactory repositoryFactory = CmsJcrActivator.getService(RepositoryFactory.class);
+                               Map<String, String> parameters = new HashMap<String, String>();
+                               parameters.put(RepoConf.labeledUri.name(), uri.toString());
+                               parameters.put(RepoConf.defaultWorkspace.name(), defaultWorkspace.toString());
+                               Repository repository = repositoryFactory.getRepository(parameters);
+                               // Repository repository = NodeUtils.getRepositoryByUri(repositoryFactory,
+                               // uri.toString());
+                               Dictionary<String, Object> props = LangUtils.dict(Constants.SERVICE_PID, pid);
+                               props.put(RepoConf.labeledUri.name(),
+                                               new URI(uri.getScheme(), null, uri.getHost(), uri.getPort(), uri.getPath(), null, null)
+                                                               .toString());
+                               if (cn != null) {
+                                       props.put(CmsConstants.CN, cn);
+                                       // props.put(NodeConstants.JCR_REPOSITORY_ALIAS, cn);
+                                       pidToCn.put(pid, cn);
+                               }
+                               CmsJcrActivator.registerService(Repository.class, repository, props);
+
+                               // home
+                               if (cn.equals(CmsConstants.NODE_REPOSITORY)) {
+                                       Dictionary<String, Object> homeProps = LangUtils.dict(CmsConstants.CN, CmsConstants.EGO_REPOSITORY);
+                                       EgoRepository homeRepository = new EgoRepository(repository, true);
+                                       CmsJcrActivator.registerService(Repository.class, homeRepository, homeProps);
                                }
                        }
-               } catch (Exception e) {
+               } catch (RepositoryException | URISyntaxException | IOException e) {
                        throw new IllegalStateException("Cannot create Jackrabbit repository " + pid, e);
                }
 
@@ -132,5 +136,4 @@ public class RepositoryContextsFactory implements ManagedServiceFactory {
                        log.debug("Deleted repository " + pid);
        }
 
-
 }