X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms.jcr%2Fsrc%2Forg%2Fargeo%2Fcms%2Fjcr%2Finternal%2FRepositoryContextsFactory.java;h=e05a0023e74acff795c7db5ff34e9d02e49e66bd;hb=633a8acd189cc22f06944d278879601189be1bc8;hp=1a1fda1f08756c47aba039545be7abaeadfc8576;hpb=0ffddd13968b41b26caddfcf17b3dc86a58eb776;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/RepositoryContextsFactory.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/RepositoryContextsFactory.java index 1a1fda1f0..e05a0023e 100644 --- a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/RepositoryContextsFactory.java +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/RepositoryContextsFactory.java @@ -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,25 +29,29 @@ public class RepositoryContextsFactory implements ManagedServiceFactory { private Map repositories = new HashMap(); private Map pidToCn = new HashMap(); - + public void init() { - + } public void destroy() { for (String pid : repositories.keySet()) { try { - repositories.get(pid).getRepository().shutdown(); - if (log.isDebugEnabled()) - log.debug("Shut down repository " + pid - + (pidToCn.containsKey(pid) ? " (" + pidToCn.get(pid) + ")" : "")); + RepositoryContext repositoryContext = repositories.get(pid); + // Must start in another thread otherwise shutdown is interrupted + // TODO use an executor? + new Thread(() -> { + repositoryContext.getRepository().shutdown(); + if (log.isDebugEnabled()) + log.debug("Shut down repository " + pid + + (pidToCn.containsKey(pid) ? " (" + pidToCn.get(pid) + ")" : "")); + }, "Shutdown JCR repository " + pid).start(); } catch (Exception e) { log.error("Error when shutting down Jackrabbit repository " + pid, e); } } } - @Override public String getName() { return "Jackrabbit repository service factory"; @@ -58,10 +65,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("Ignoring 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 +88,6 @@ public class RepositoryContextsFactory implements ManagedServiceFactory { Dictionary 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 +95,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 parameters = new HashMap(); - 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 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 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 parameters = new HashMap(); + 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 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 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 +140,4 @@ public class RepositoryContextsFactory implements ManagedServiceFactory { log.debug("Deleted repository " + pid); } - }