Add web dav support
authorMathieu Baudier <mbaudier@argeo.org>
Fri, 25 Feb 2011 11:56:09 +0000 (11:56 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Fri, 25 Feb 2011 11:56:09 +0000 (11:56 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@4206 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

eclipse/plugins/org.argeo.jcr.ui.explorer/pom.xml
server/modules/org.argeo.jackrabbit.webapp/WEB-INF/web.xml
server/modules/org.argeo.jackrabbit.webapp/WEB-INF/webdav-servlet.xml
server/runtime/org.argeo.server.jackrabbit/pom.xml
server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jackrabbit/remote/JcrRemotingHandlerMapping.java
server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jackrabbit/remote/MultipleRepositoryHandlerMapping.java [deleted file]
server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jackrabbit/remote/WebDavServlet.java
server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jackrabbit/remote/WebdavHandlerMapping.java [new file with mode: 0644]
server/runtime/org.argeo.server.jcr.mvc/pom.xml
server/runtime/org.argeo.server.jcr.mvc/src/main/java/org/argeo/jcr/mvc/MultipleRepositoryHandlerMapping.java [new file with mode: 0644]

index 89c51dd8e85cff13460a27b1f844e78c8c862c90..d63fd3c9f63436295c4d6d7d9475526581ab7951 100644 (file)
                        <type>pom</type>
                        <scope>test</scope>
                </dependency>
+               <dependency>
+                       <groupId>org.argeo.commons.security</groupId>
+                       <artifactId>org.argeo.security.ui.application</artifactId>
+                       <version>${version.argeo-commons}</version>
+                       <scope>test</scope>
+               </dependency>
                <!-- Tomcat -->
                <dependency>
                        <groupId>org.argeo.commons.server</groupId>
index f3901fe4c5ccb6d772a1f37e8d5713e910bba79c..c3ee9fb86ad27a9fa16d1af45dab9c612967d46b 100644 (file)
@@ -40,7 +40,7 @@
                <url-pattern>/remoting/*</url-pattern>
        </servlet-mapping>
 
-       <!-- XML rmeoting -->
+       <!-- XML remoting -->
        <servlet>
                <servlet-name>xmlremoting</servlet-name>
                <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
@@ -72,7 +72,7 @@
 
        <servlet-mapping>
                <servlet-name>webdav</servlet-name>
-               <url-pattern>/default/*</url-pattern>
+               <url-pattern>/webdav/*</url-pattern>
        </servlet-mapping>
 
        <!-- JCR-MANAGER servlet -->
index c3ede3fd43865a82be77b9b987c73eb25abda451..71874b5713e3e90cdaef4731b2d64f2a4a809e92 100644 (file)
@@ -7,11 +7,6 @@
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
 
-       <bean id="webdavServlet" class="org.argeo.jackrabbit.remote.WebDavServlet">
-<!--           <property name="repository" ref="jcrRepository" />-->
-               <property name="resourceConfiguration" value="osgibundle:/WEB-INF/webdav-config.xml" />
-       </bean>
-
        <bean
                class="org.springframework.web.servlet.handler.SimpleServletPostProcessor" />
 
                class="org.springframework.web.servlet.handler.SimpleServletHandlerAdapter" />
 
        <bean id="urlMapping"
-               class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
-               <property name="mappings">
-                       <props>
-                               <prop key="**">webdavServlet</prop>
-                       </props>
-               </property>
+               class="org.argeo.jackrabbit.remote.WebdavHandlerMapping">
+               <property name="repositoryRegister" ref="repositoryRegister" />
+               <property name="configuration" value="osgibundle:/WEB-INF/webdav-config.xml" />
        </bean>
 
 </beans>
\ No newline at end of file
index 346da2e086b9fe06b73142ac57f9ba7d86d02177..4beeb819ac3694d832e46175e2b89aa6498278b3 100644 (file)
@@ -33,6 +33,7 @@
                                                        org.argeo.jackrabbit.*,
                                                </Export-Package>
                                                <Import-Package>
+                                                       javax.servlet,
                                                        org.xml.sax;version="0.0.0",
                                                        org.apache.jackrabbit.webdav.jcr,
                                                        org.springframework.security.providers.jaas;resolution:="optional",
@@ -58,7 +59,7 @@
                </dependency>
                <dependency>
                        <groupId>org.argeo.commons.server</groupId>
-                       <artifactId>org.argeo.server.jcr</artifactId>
+                       <artifactId>org.argeo.server.jcr.mvc</artifactId>
                        <version>0.2.3-SNAPSHOT</version>
                </dependency>
 
index 195a41d5bac879e42373982e10fe564fc332ba76..e72a23073910cb6d7c1fb8913b6e12a08a95d5b5 100644 (file)
@@ -7,18 +7,18 @@ import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 
 import org.apache.jackrabbit.webdav.jcr.JCRWebdavServerServlet;
+import org.argeo.jcr.mvc.MultipleRepositoryHandlerMapping;
 
 public class JcrRemotingHandlerMapping extends MultipleRepositoryHandlerMapping {
        protected HttpServlet createServlet(Repository repository, String pathPrefix)
                        throws ServletException {
-               JcrRemotingServlet jcrRemotingServlet = new JcrRemotingServlet(
-                               repository);
+               JcrRemotingServlet servlet = new JcrRemotingServlet(repository);
                Properties initParameters = new Properties();
                initParameters.setProperty(
                                JCRWebdavServerServlet.INIT_PARAM_RESOURCE_PATH_PREFIX,
                                pathPrefix);
-               jcrRemotingServlet.init(new DelegatingServletConfig(pathPrefix.replace(
-                               '/', '_'), initParameters));
-               return jcrRemotingServlet;
+               servlet.init(new DelegatingServletConfig(pathPrefix.replace('/', '_'),
+                               initParameters));
+               return servlet;
        }
 }
diff --git a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jackrabbit/remote/MultipleRepositoryHandlerMapping.java b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jackrabbit/remote/MultipleRepositoryHandlerMapping.java
deleted file mode 100644 (file)
index 12cff99..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
-package org.argeo.jackrabbit.remote;
-
-import java.util.Enumeration;
-import java.util.Properties;
-
-import javax.jcr.Repository;
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.argeo.ArgeoException;
-import org.argeo.jcr.RepositoryRegister;
-import org.springframework.beans.BeansException;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.ApplicationContextAware;
-import org.springframework.context.ConfigurableApplicationContext;
-import org.springframework.web.context.ServletContextAware;
-import org.springframework.web.servlet.HandlerExecutionChain;
-import org.springframework.web.servlet.HandlerMapping;
-
-public abstract class MultipleRepositoryHandlerMapping implements
-               HandlerMapping, ApplicationContextAware, ServletContextAware {
-       private final static Log log = LogFactory
-                       .getLog(MultipleRepositoryHandlerMapping.class);
-
-       private ConfigurableApplicationContext applicationContext;
-       private ServletContext servletContext;
-
-       private RepositoryRegister repositoryRegister;
-
-       /** Actually creates the servlet to be registered. */
-       protected abstract HttpServlet createServlet(Repository repository,
-                       String pathPrefix) throws ServletException;
-
-       public HandlerExecutionChain getHandler(HttpServletRequest request)
-                       throws Exception {
-               if (log.isTraceEnabled()) {
-                       log.trace("getContextPath=" + request.getContextPath());
-                       log.trace("getServletPath=" + request.getServletPath());
-                       log.trace("getPathInfo=" + request.getPathInfo());
-               }
-
-               String repositoryName = extractRepositoryName(request);
-               String pathPrefix = request.getServletPath() + '/' + repositoryName;
-               String beanName = pathPrefix;
-
-               if (!applicationContext.containsBean(beanName)) {
-                       Repository repository = repositoryRegister.getRepositories().get(
-                                       repositoryName);
-                       HttpServlet servlet = createServlet(repository, pathPrefix);
-                       applicationContext.getBeanFactory().registerSingleton(beanName,
-                                       servlet);
-                       // TODO: unregister it as well
-               }
-               HttpServlet remotingServlet = (HttpServlet) applicationContext
-                               .getBean(beanName);
-               return new HandlerExecutionChain(remotingServlet);
-       }
-
-       /** The repository name is the first part of the path info */
-       protected String extractRepositoryName(HttpServletRequest request) {
-               String pathInfo = request.getPathInfo();
-               // TODO: optimize by checking character by character
-               String[] tokens = pathInfo.split("/");
-               StringBuffer currName = new StringBuffer("");
-               tokens: for (String token : tokens) {
-                       if (token.equals(""))
-                               continue tokens;
-                       currName.append(token);
-                       if (repositoryRegister.getRepositories().containsKey(
-                                       currName.toString()))
-                               return currName.toString();
-                       currName.append('/');
-               }
-               throw new ArgeoException("No repository can be found for request "
-                               + pathInfo);
-       }
-
-       public void setApplicationContext(ApplicationContext applicationContext)
-                       throws BeansException {
-               this.applicationContext = (ConfigurableApplicationContext) applicationContext;
-       }
-
-       public void setServletContext(ServletContext servletContext) {
-               this.servletContext = servletContext;
-       }
-
-       public void setRepositoryRegister(RepositoryRegister repositoryRegister) {
-               this.repositoryRegister = repositoryRegister;
-       }
-
-       protected class DelegatingServletConfig implements ServletConfig {
-               private String name;
-               private Properties initParameters;
-
-               public DelegatingServletConfig(String name, Properties initParameters) {
-                       super();
-                       this.name = name;
-                       this.initParameters = initParameters;
-               }
-
-               public String getServletName() {
-                       return name;
-               }
-
-               public ServletContext getServletContext() {
-                       return servletContext;
-               }
-
-               public String getInitParameter(String paramName) {
-                       return initParameters.getProperty(paramName);
-               }
-
-               @SuppressWarnings("rawtypes")
-               public Enumeration getInitParameterNames() {
-                       return initParameters.keys();
-               }
-       }
-
-}
index 02fdcde731adf317f2e673a4cc093a70c10e27b2..ec140f892d43d7004a37ff7ee7f412278badad82 100644 (file)
@@ -19,12 +19,14 @@ package org.argeo.jackrabbit.remote;
 import java.io.IOException;
 
 import javax.jcr.Repository;
+import javax.jcr.SimpleCredentials;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.jackrabbit.server.SessionProvider;
 import org.apache.jackrabbit.webdav.simple.ResourceConfig;
 import org.apache.jackrabbit.webdav.simple.SimpleWebdavServlet;
 import org.argeo.ArgeoException;
@@ -35,11 +37,12 @@ public class WebDavServlet extends SimpleWebdavServlet {
        private static final long serialVersionUID = 1L;
        private final static Log log = LogFactory.getLog(WebDavServlet.class);
 
-       private Repository repository;
-       private Resource resourceConfiguration;
-
-       public WebDavServlet() {
+       private final Repository repository;
+       private final Resource resourceConfiguration;
 
+       public WebDavServlet(Repository repository, Resource configuration) {
+               this.repository = repository;
+               this.resourceConfiguration = configuration;
        }
 
        @Override
@@ -75,12 +78,10 @@ public class WebDavServlet extends SimpleWebdavServlet {
                return repository;
        }
 
-       public void setRepository(Repository repository) {
-               this.repository = repository;
-       }
-
-       public void setResourceConfiguration(Resource resourceConfig) {
-               this.resourceConfiguration = resourceConfig;
+       @Override
+       public SessionProvider getSessionProvider() {
+               return new CachingSessionProvider(new SimpleCredentials("demo",
+                               "demo".toCharArray()));
        }
 
 }
diff --git a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jackrabbit/remote/WebdavHandlerMapping.java b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jackrabbit/remote/WebdavHandlerMapping.java
new file mode 100644 (file)
index 0000000..02132ec
--- /dev/null
@@ -0,0 +1,33 @@
+package org.argeo.jackrabbit.remote;
+
+import java.util.Properties;
+
+import javax.jcr.Repository;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+
+import org.apache.jackrabbit.webdav.jcr.JCRWebdavServerServlet;
+import org.argeo.jcr.mvc.MultipleRepositoryHandlerMapping;
+import org.springframework.core.io.Resource;
+
+public class WebdavHandlerMapping extends MultipleRepositoryHandlerMapping {
+       private Resource configuration;
+
+       protected HttpServlet createServlet(Repository repository, String pathPrefix)
+                       throws ServletException {
+
+               WebDavServlet servlet = new WebDavServlet(repository, configuration);
+               Properties initParameters = new Properties();
+               initParameters.setProperty(
+                               JCRWebdavServerServlet.INIT_PARAM_RESOURCE_PATH_PREFIX,
+                               pathPrefix);
+               servlet.init(new DelegatingServletConfig(pathPrefix.replace('/', '_'),
+                               initParameters));
+               return servlet;
+       }
+
+       public void setConfiguration(Resource configuration) {
+               this.configuration = configuration;
+       }
+
+}
index 82c74af04b9d3d9569daf37f2190167be10577ac..847b933f772048e51327d79af1ea8fdc52464009 100644 (file)
@@ -1,4 +1,5 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
                <groupId>org.argeo.commons.server</groupId>
                                                <Export-Package>
                                                        org.argeo.jcr.mvc.*
                                                </Export-Package>
+                                               <Import-Package>
+                                                       org.springframework.beans.factory,
+                                                       *
+                                               </Import-Package>
                                        </instructions>
                                </configuration>
                        </plugin>
@@ -64,7 +69,7 @@
                        <groupId>org.springframework.ws</groupId>
                        <artifactId>org.springframework.xml</artifactId>
                </dependency>
-               
+
                <!-- Logging -->
                <dependency>
                        <groupId>org.slf4j</groupId>
diff --git a/server/runtime/org.argeo.server.jcr.mvc/src/main/java/org/argeo/jcr/mvc/MultipleRepositoryHandlerMapping.java b/server/runtime/org.argeo.server.jcr.mvc/src/main/java/org/argeo/jcr/mvc/MultipleRepositoryHandlerMapping.java
new file mode 100644 (file)
index 0000000..10bb8b5
--- /dev/null
@@ -0,0 +1,124 @@
+package org.argeo.jcr.mvc;
+
+import java.util.Enumeration;
+import java.util.Properties;
+
+import javax.jcr.Repository;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.argeo.ArgeoException;
+import org.argeo.jcr.RepositoryRegister;
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.web.context.ServletContextAware;
+import org.springframework.web.servlet.HandlerExecutionChain;
+import org.springframework.web.servlet.HandlerMapping;
+
+public abstract class MultipleRepositoryHandlerMapping implements
+               HandlerMapping, ApplicationContextAware, ServletContextAware {
+       private final static Log log = LogFactory
+                       .getLog(MultipleRepositoryHandlerMapping.class);
+
+       private ConfigurableApplicationContext applicationContext;
+       private ServletContext servletContext;
+
+       private RepositoryRegister repositoryRegister;
+
+       /** Actually creates the servlet to be registered. */
+       protected abstract HttpServlet createServlet(Repository repository,
+                       String pathPrefix) throws ServletException;
+
+       public HandlerExecutionChain getHandler(HttpServletRequest request)
+                       throws Exception {
+               if (log.isTraceEnabled()) {
+                       log.trace("getContextPath=" + request.getContextPath());
+                       log.trace("getServletPath=" + request.getServletPath());
+                       log.trace("getPathInfo=" + request.getPathInfo());
+               }
+
+               String repositoryName = extractRepositoryName(request);
+               String pathPrefix = request.getServletPath() + '/' + repositoryName;
+               String beanName = pathPrefix;
+
+               if (!applicationContext.containsBean(beanName)) {
+                       Repository repository = repositoryRegister.getRepositories().get(
+                                       repositoryName);
+                       HttpServlet servlet = createServlet(repository, pathPrefix);
+                       applicationContext.getBeanFactory().registerSingleton(beanName,
+                                       servlet);
+                       // TODO: unregister it as well
+               }
+               HttpServlet remotingServlet = (HttpServlet) applicationContext
+                               .getBean(beanName);
+               return new HandlerExecutionChain(remotingServlet);
+       }
+
+       /** The repository name is the first part of the path info */
+       protected String extractRepositoryName(HttpServletRequest request) {
+               String pathInfo = request.getPathInfo();
+               // TODO: optimize by checking character by character
+               String[] tokens = pathInfo.split("/");
+               StringBuffer currName = new StringBuffer("");
+               tokens: for (String token : tokens) {
+                       if (token.equals(""))
+                               continue tokens;
+                       currName.append(token);
+                       if (repositoryRegister.getRepositories().containsKey(
+                                       currName.toString()))
+                               return currName.toString();
+                       currName.append('/');
+               }
+               throw new ArgeoException("No repository can be found for request "
+                               + pathInfo);
+       }
+
+       public void setApplicationContext(ApplicationContext applicationContext)
+                       throws BeansException {
+               this.applicationContext = (ConfigurableApplicationContext) applicationContext;
+       }
+
+       public void setServletContext(ServletContext servletContext) {
+               this.servletContext = servletContext;
+       }
+
+       public void setRepositoryRegister(RepositoryRegister repositoryRegister) {
+               this.repositoryRegister = repositoryRegister;
+       }
+
+       protected class DelegatingServletConfig implements ServletConfig {
+               private String name;
+               private Properties initParameters;
+
+               public DelegatingServletConfig(String name, Properties initParameters) {
+                       super();
+                       this.name = name;
+                       this.initParameters = initParameters;
+               }
+
+               public String getServletName() {
+                       return name;
+               }
+
+               public ServletContext getServletContext() {
+                       return servletContext;
+               }
+
+               public String getInitParameter(String paramName) {
+                       return initParameters.getProperty(paramName);
+               }
+
+               @SuppressWarnings("rawtypes")
+               public Enumeration getInitParameterNames() {
+                       return initParameters.keys();
+               }
+       }
+
+}