Move all JCR servlets to OSGi WhiteBoard.
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / internal / kernel / RepositoryServiceFactory.java
index e6efa1e79bbe29fb08b009dfcff6924249b8e760..27e5199221212136428238f1adc5f444448f64d8 100644 (file)
@@ -1,21 +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.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();
@@ -42,19 +62,59 @@ class RepositoryServiceFactory implements ManagedServiceFactory {
                }
 
                try {
-                       RepositoryBuilder repositoryBuilder = new RepositoryBuilder();
-                       RepositoryContext repositoryContext = repositoryBuilder.createRepositoryContext(properties);
-                       repositories.put(pid, repositoryContext);
-                       Dictionary<String, Object> 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);
+                       Object labeledUri = properties.get(RepoConf.labeledUri.name());
+                       if (labeledUri == null) {
+                               RepositoryBuilder repositoryBuilder = new RepositoryBuilder();
+                               RepositoryContext repositoryContext = repositoryBuilder.createRepositoryContext(properties);
+                               repositories.put(pid, repositoryContext);
+                               Dictionary<String, Object> 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<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.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<String, Object> 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);
                }
@@ -81,4 +141,5 @@ class RepositoryServiceFactory implements ManagedServiceFactory {
                        }
                }
        }
+
 }