renamed module

This commit is contained in:
Sebastian Stenzel
2016-01-25 14:30:51 +01:00
parent 56b061206a
commit 8d7c3a8f7b
31 changed files with 98 additions and 54 deletions

View File

@@ -3,7 +3,7 @@
Copyright (c) 2015 Sebastian Stenzel
This file is licensed under the terms of the MIT license.
See the LICENSE.txt file for more info.
Contributors:
Sebastian Stenzel - initial API and implementation
-->
@@ -14,12 +14,13 @@
<artifactId>main</artifactId>
<version>0.11.0-SNAPSHOT</version>
</parent>
<artifactId>jackrabbit-filesystem-adapter</artifactId>
<name>Jackrabbit filesystem-WebDAV-adapter</name>
<description>WebDAV servlet based on Apache Jackrabbit serving files from a filesystem</description>
<artifactId>frontend-webdav</artifactId>
<name>Jackrabbit-based WebDAV filesystem frontend</name>
<description>Provides access via WebDAV to filesystems</description>
<properties>
<jackrabbit.version>2.11.0</jackrabbit.version>
<jetty.version>9.3.3.v20150827</jetty.version>
</properties>
<dependencies>
@@ -43,7 +44,19 @@
<artifactId>jackrabbit-webdav</artifactId>
<version>${jackrabbit.version}</version>
</dependency>
<!-- Jetty -->
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>${jetty.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-webapp</artifactId>
<version>${jetty.version}</version>
</dependency>
<!-- Commons -->
<dependency>
<groupId>org.apache.commons</groupId>
@@ -59,18 +72,6 @@
<groupId>org.cryptomator</groupId>
<artifactId>commons-test</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>9.3.3.v20150827</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-webapp</artifactId>
<version>9.3.3.v20150827</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
@@ -96,4 +97,4 @@
</plugin>
</plugins>
</build>
</project>
</project>

View File

@@ -16,10 +16,10 @@ import org.apache.jackrabbit.webdav.DavResourceFactory;
import org.apache.jackrabbit.webdav.DavSessionProvider;
import org.apache.jackrabbit.webdav.WebdavRequest;
import org.apache.jackrabbit.webdav.server.AbstractWebdavServlet;
import org.cryptomator.filesystem.FileSystem;
import org.cryptomator.filesystem.Folder;
import org.cryptomator.filesystem.jackrabbit.FileSystemResourceLocatorFactory;
public class WebDavServlet extends AbstractWebdavServlet {
class WebDavServlet extends AbstractWebdavServlet {
private static final long serialVersionUID = -6632687979352625020L;
@@ -27,9 +27,9 @@ public class WebDavServlet extends AbstractWebdavServlet {
private final DavLocatorFactory davLocatorFactory;
private final DavResourceFactory davResourceFactory;
public WebDavServlet(URI contextRootUri, FileSystem filesystem) {
public WebDavServlet(URI contextRootUri, Folder root) {
davSessionProvider = new DavSessionProviderImpl();
davLocatorFactory = new FileSystemResourceLocatorFactory(contextRootUri, filesystem);
davLocatorFactory = new FileSystemResourceLocatorFactory(contextRootUri, root);
davResourceFactory = new FilesystemResourceFactory();
}

View File

@@ -0,0 +1,66 @@
package org.cryptomator.webdav.jackrabbitservlet;
import java.net.URI;
import java.util.EnumSet;
import javax.servlet.DispatcherType;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.SystemUtils;
import org.cryptomator.filesystem.Folder;
import org.cryptomator.webdav.filters.AcceptRangeFilter;
import org.cryptomator.webdav.filters.LoggingHttpFilter;
import org.cryptomator.webdav.filters.MacChunkedPutCompatibilityFilter;
import org.cryptomator.webdav.filters.UriNormalizationFilter;
import org.cryptomator.webdav.filters.UriNormalizationFilter.ResourceTypeChecker;
import org.cryptomator.webdav.filters.UriNormalizationFilter.ResourceTypeChecker.ResourceType;
import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class WebDavServletContextFactory {
private static final Logger LOG = LoggerFactory.getLogger(WebDavServletContextFactory.class);
private static final String WILDCARD = "/*";
/**
* Creates a new Jetty ServletContextHandler, that can be be added to a servletCollection as follows:
*
* <pre>
* ServletContextHandler context = factory.create(...);
* servletCollection.addHandler(context);
* servletCollection.mapContexts();
* </pre>
*
* @param contextRoot The URI of the context root. Its path will be used as the servlet's context path.
* @param root The location within a filesystem that shall be served via WebDAV.
* @return A new Jetty servlet context handler.
*/
public ServletContextHandler create(URI contextRoot, Folder root) {
final ResourceTypeChecker resourceTypeChecker = (path) -> {
if (root.resolveFolder(path).exists()) {
return ResourceType.FOLDER;
} else if (root.resolveFile(path).exists()) {
return ResourceType.FILE;
} else {
return ResourceType.UNKNOWN;
}
};
final String contextPath = StringUtils.removeEnd(contextRoot.getPath(), "/");
final ServletContextHandler servletContext = new ServletContextHandler(null, contextPath, ServletContextHandler.SESSIONS);
final ServletHolder servletHolder = new ServletHolder(contextPath, new WebDavServlet(contextRoot, root));
servletContext.addServlet(servletHolder, WILDCARD);
servletContext.addFilter(AcceptRangeFilter.class, WILDCARD, EnumSet.of(DispatcherType.REQUEST));
servletContext.addFilter(new FilterHolder(new UriNormalizationFilter(resourceTypeChecker)), WILDCARD, EnumSet.of(DispatcherType.REQUEST));
if (SystemUtils.IS_OS_MAC_OSX) {
servletContext.addFilter(MacChunkedPutCompatibilityFilter.class, WILDCARD, EnumSet.of(DispatcherType.REQUEST));
}
if (LOG.isDebugEnabled()) {
servletContext.addFilter(LoggingHttpFilter.class, WILDCARD, EnumSet.of(DispatcherType.REQUEST));
}
return servletContext;
}
}

View File

@@ -10,26 +10,14 @@ package org.cryptomator.webdav.jackrabbitservlet;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.EnumSet;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import javax.servlet.DispatcherType;
import org.cryptomator.filesystem.FileSystem;
import org.cryptomator.webdav.filters.AcceptRangeFilter;
import org.cryptomator.webdav.filters.LoggingHttpFilter;
import org.cryptomator.webdav.filters.MacChunkedPutCompatibilityFilter;
import org.cryptomator.webdav.filters.UriNormalizationFilter;
import org.cryptomator.webdav.filters.UriNormalizationFilter.ResourceTypeChecker;
import org.cryptomator.webdav.filters.UriNormalizationFilter.ResourceTypeChecker.ResourceType;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.eclipse.jetty.util.thread.ThreadPool;
@@ -48,29 +36,18 @@ class FileSystemBasedWebDavServer {
localConnector.setPort(8080);
servletCollection = new ContextHandlerCollection();
final ResourceTypeChecker resourceTypeChecker = (path) -> {
if (fileSystem.resolveFolder(path).exists()) {
return ResourceType.FOLDER;
} else if (fileSystem.resolveFile(path).exists()) {
return ResourceType.FILE;
} else {
return ResourceType.UNKNOWN;
}
};
URI servletContextRootUri;
final URI servletContextRoot1;
final URI servletContextRoot2;
try {
servletContextRootUri = new URI("http", null, "localhost", 8080, "/", null, null);
servletContextRoot1 = new URI("http", null, "localhost", 8080, "/foo/", null, null);
servletContextRoot2 = new URI("http", null, "localhost", 8080, "/bar/", null, null);
} catch (URISyntaxException e) {
throw new IllegalStateException(e);
}
final ServletContextHandler servletContext = new ServletContextHandler(servletCollection, "/", ServletContextHandler.SESSIONS);
final ServletHolder servletHolder = new ServletHolder("FileSystem-WebDAV-Servlet", new WebDavServlet(servletContextRootUri, fileSystem));
servletContext.addServlet(servletHolder, "/*");
servletContext.addFilter(AcceptRangeFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));
servletContext.addFilter(new FilterHolder(new UriNormalizationFilter(resourceTypeChecker)), "/*", EnumSet.of(DispatcherType.REQUEST));
servletContext.addFilter(MacChunkedPutCompatibilityFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));
servletContext.addFilter(LoggingHttpFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));
final WebDavServletContextFactory servletContextFactory = new WebDavServletContextFactory();
servletCollection.addHandler(servletContextFactory.create(servletContextRoot1, fileSystem));
servletCollection.addHandler(servletContextFactory.create(servletContextRoot2, fileSystem));
servletCollection.mapContexts();
server.setConnectors(new Connector[] {localConnector});

View File

@@ -259,9 +259,9 @@
<module>filesystem-nameshortening</module>
<module>filesystem-crypto</module>
<module>filesystem-invariants-tests</module>
<module>frontend-webdav</module>
<module>crypto-api</module>
<module>crypto-aes</module>
<module>jackrabbit-filesystem-adapter</module>
<module>core</module>
<module>ui</module>
</modules>