X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Finternal%2Fkernel%2FRepositoryServiceFactory.java;h=27e5199221212136428238f1adc5f444448f64d8;hb=fb22feb37b0c2340d3d846dce4b6f47d0f728efb;hp=1355f852cf67a532b0f2ad4276965dedbc5fa795;hpb=3a0d866fbeea3f78c293212f4b4fbaeba7dfe2bd;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/RepositoryServiceFactory.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/RepositoryServiceFactory.java index 1355f852c..27e519922 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/RepositoryServiceFactory.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/RepositoryServiceFactory.java @@ -1,22 +1,41 @@ package org.argeo.cms.internal.kernel; +import static org.osgi.service.http.whiteboard.HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_INIT_PARAM_PREFIX; + +import java.io.IOException; +import java.net.URI; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.Dictionary; import java.util.HashMap; +import java.util.Hashtable; import java.util.Map; +import javax.jcr.Repository; +import javax.jcr.RepositoryFactory; +import javax.servlet.Servlet; +import javax.servlet.ServletException; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.jackrabbit.core.RepositoryContext; +import org.apache.jackrabbit.server.remoting.davex.JcrRemotingServlet; +import org.argeo.api.NodeConstants; import org.argeo.cms.CmsException; -import org.argeo.jcr.ArgeoJcrConstants; -import org.argeo.node.NodeConstants; +import org.argeo.cms.internal.http.CmsRemotingServlet; +import org.argeo.cms.internal.http.HttpUtils; +import org.argeo.cms.internal.jcr.RepoConf; +import org.argeo.cms.internal.jcr.RepositoryBuilder; import org.argeo.util.LangUtils; import org.osgi.framework.BundleContext; import org.osgi.framework.Constants; import org.osgi.framework.FrameworkUtil; import org.osgi.service.cm.ConfigurationException; import org.osgi.service.cm.ManagedServiceFactory; +import org.osgi.service.http.NamespaceException; +import org.osgi.service.http.whiteboard.HttpWhiteboardConstants; +/** A {@link ManagedServiceFactory} creating or referencing JCR repositories. */ class RepositoryServiceFactory implements ManagedServiceFactory { private final static Log log = LogFactory.getLog(RepositoryServiceFactory.class); private final BundleContext bc = FrameworkUtil.getBundle(RepositoryServiceFactory.class).getBundleContext(); @@ -43,19 +62,59 @@ class RepositoryServiceFactory implements ManagedServiceFactory { } try { - RepositoryBuilder repositoryBuilder = new RepositoryBuilder(); - RepositoryContext repositoryContext = repositoryBuilder.createRepositoryContext(properties); - repositories.put(pid, repositoryContext); - Dictionary props = LangUtils.init(Constants.SERVICE_PID, pid); - // props.put(ArgeoJcrConstants.JCR_REPOSITORY_URI, - // properties.get(RepoConf.labeledUri.name())); - Object cn = properties.get(NodeConstants.CN); - if (cn != null) { - props.put(NodeConstants.CN, cn); - props.put(ArgeoJcrConstants.JCR_REPOSITORY_ALIAS, cn); - pidToCn.put(pid, cn); + Object labeledUri = properties.get(RepoConf.labeledUri.name()); + if (labeledUri == null) { + RepositoryBuilder repositoryBuilder = new RepositoryBuilder(); + RepositoryContext repositoryContext = repositoryBuilder.createRepositoryContext(properties); + repositories.put(pid, repositoryContext); + Dictionary props = LangUtils.dico(Constants.SERVICE_PID, pid); + // props.put(ArgeoJcrConstants.JCR_REPOSITORY_URI, + // properties.get(RepoConf.labeledUri.name())); + Object cn = properties.get(NodeConstants.CN); + if (cn != null) { + props.put(NodeConstants.CN, cn); + // props.put(NodeConstants.JCR_REPOSITORY_ALIAS, cn); + pidToCn.put(pid, cn); + } + bc.registerService(RepositoryContext.class, repositoryContext, props); + } else { + try { + Object cn = properties.get(NodeConstants.CN); + 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)); + 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.dico(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(NodeConstants.CN, cn); + // props.put(NodeConstants.JCR_REPOSITORY_ALIAS, cn); + pidToCn.put(pid, cn); + } + bc.registerService(Repository.class, repository, props); + + // home + if (cn.equals(NodeConstants.NODE_REPOSITORY)) { + Dictionary homeProps = LangUtils.dico(NodeConstants.CN, + NodeConstants.EGO_REPOSITORY); + EgoRepository homeRepository = new EgoRepository(repository, true); + bc.registerService(Repository.class, homeRepository, homeProps); + } + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } } - bc.registerService(RepositoryContext.class, repositoryContext, props); } catch (Exception e) { throw new CmsException("Cannot create Jackrabbit repository " + pid, e); } @@ -82,4 +141,5 @@ class RepositoryServiceFactory implements ManagedServiceFactory { } } } + }