diff --git a/main/jackrabbit-filesystem-adapter/pom.xml b/main/jackrabbit-filesystem-adapter/pom.xml index 1b3c0ca08..d54f2073a 100644 --- a/main/jackrabbit-filesystem-adapter/pom.xml +++ b/main/jackrabbit-filesystem-adapter/pom.xml @@ -70,6 +70,11 @@ filesystem-inmemory test + + org.cryptomator + filesystem-nio + test + diff --git a/main/jackrabbit-filesystem-adapter/src/test/java/org/cryptomator/webdav/jackrabbitservlet/FileSystemBasedWebDavServer.java b/main/jackrabbit-filesystem-adapter/src/test/java/org/cryptomator/webdav/jackrabbitservlet/FileSystemBasedWebDavServer.java new file mode 100644 index 000000000..54dae472e --- /dev/null +++ b/main/jackrabbit-filesystem-adapter/src/test/java/org/cryptomator/webdav/jackrabbitservlet/FileSystemBasedWebDavServer.java @@ -0,0 +1,71 @@ +/******************************************************************************* + * Copyright (c) 2015 Sebastian Stenzel and others. + * 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 + *******************************************************************************/ +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.UriNormalizationFilter; +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.ServletContextHandler; +import org.eclipse.jetty.servlet.ServletHolder; +import org.eclipse.jetty.util.thread.QueuedThreadPool; +import org.eclipse.jetty.util.thread.ThreadPool; + +class FileSystemBasedWebDavServer { + + private final Server server; + private final ServerConnector localConnector; + private final ContextHandlerCollection servletCollection; + + public FileSystemBasedWebDavServer(FileSystem fileSystem) { + final BlockingQueue queue = new LinkedBlockingQueue<>(10); + final ThreadPool tp = new QueuedThreadPool(4, 1, 1, queue); + server = new Server(tp); + localConnector = new ServerConnector(server); + localConnector.setHost("localhost"); + localConnector.setPort(8080); + servletCollection = new ContextHandlerCollection(); + + URI servletContextRootUri; + try { + servletContextRootUri = new URI("http", null, "localhost", 8080, "/", 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(UriNormalizationFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST)); + servletCollection.mapContexts(); + + server.setConnectors(new Connector[] { localConnector }); + server.setHandler(servletCollection); + } + + public void start() throws Exception { + server.start(); + } + + public void stop() throws Exception { + server.stop(); + } + +} diff --git a/main/jackrabbit-filesystem-adapter/src/test/java/org/cryptomator/webdav/jackrabbitservlet/InMemoryWebDavServer.java b/main/jackrabbit-filesystem-adapter/src/test/java/org/cryptomator/webdav/jackrabbitservlet/InMemoryWebDavServer.java index ccf50c333..1b2ef4efa 100644 --- a/main/jackrabbit-filesystem-adapter/src/test/java/org/cryptomator/webdav/jackrabbitservlet/InMemoryWebDavServer.java +++ b/main/jackrabbit-filesystem-adapter/src/test/java/org/cryptomator/webdav/jackrabbitservlet/InMemoryWebDavServer.java @@ -8,78 +8,17 @@ *******************************************************************************/ package org.cryptomator.webdav.jackrabbitservlet; -import java.net.URI; -import java.net.URISyntaxException; import java.nio.ByteBuffer; -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.filesystem.WritableFile; import org.cryptomator.filesystem.inmem.InMemoryFileSystem; -import org.cryptomator.webdav.filters.AcceptRangeFilter; -import org.cryptomator.webdav.filters.UriNormalizationFilter; -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.ServletContextHandler; -import org.eclipse.jetty.servlet.ServletHolder; -import org.eclipse.jetty.util.thread.QueuedThreadPool; -import org.eclipse.jetty.util.thread.ThreadPool; public class InMemoryWebDavServer { - private final Server server; - private final ServerConnector localConnector; - private final ContextHandlerCollection servletCollection; - private final FileSystem inMemoryFileSystem = new InMemoryFileSystem(); - - private InMemoryWebDavServer() { - final BlockingQueue queue = new LinkedBlockingQueue<>(10); - final ThreadPool tp = new QueuedThreadPool(4, 1, 1, queue); - server = new Server(tp); - localConnector = new ServerConnector(server); - localConnector.setHost("localhost"); - localConnector.setPort(8080); - servletCollection = new ContextHandlerCollection(); - - URI servletContextRootUri; - try { - servletContextRootUri = new URI("http", null, "localhost", 8080, "/", null, null); - } catch (URISyntaxException e) { - throw new IllegalStateException(e); - } - final ServletContextHandler servletContext = new ServletContextHandler(servletCollection, "/", ServletContextHandler.SESSIONS); - final ServletHolder servletHolder = new ServletHolder("InMemory-WebDAV-Servlet", new WebDavServlet(servletContextRootUri, inMemoryFileSystem)); - servletContext.addServlet(servletHolder, "/*"); - servletContext.addFilter(AcceptRangeFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST)); - servletContext.addFilter(UriNormalizationFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST)); - servletCollection.mapContexts(); - - server.setConnectors(new Connector[] { localConnector }); - server.setHandler(servletCollection); - } - - private void start() throws Exception { - server.start(); - } - - private void stop() throws Exception { - server.stop(); - } - public static void main(String[] args) throws Exception { - final InMemoryWebDavServer server = new InMemoryWebDavServer(); - - server.inMemoryFileSystem.folder("mamals").folder("cats").create(); - server.inMemoryFileSystem.folder("mamals").folder("dogs").create(); - try (WritableFile writable = server.inMemoryFileSystem.folder("mamals").folder("cats").file("Garfield.txt").openWritable()) { - writable.write(ByteBuffer.wrap("meow".getBytes())); - } + FileSystem fileSystem = setupFilesystem(); + FileSystemBasedWebDavServer server = new FileSystemBasedWebDavServer(fileSystem); server.start(); System.out.println("Server started. Press any key to stop it..."); @@ -87,4 +26,14 @@ public class InMemoryWebDavServer { server.stop(); } + private static FileSystem setupFilesystem() { + FileSystem fileSystem = new InMemoryFileSystem(); + fileSystem.folder("mamals").folder("cats").create(); + fileSystem.folder("mamals").folder("dogs").create(); + try (WritableFile writable = fileSystem.folder("mamals").folder("cats").file("Garfield.txt").openWritable()) { + writable.write(ByteBuffer.wrap("meow".getBytes())); + } + return fileSystem; + } + } diff --git a/main/jackrabbit-filesystem-adapter/src/test/java/org/cryptomator/webdav/jackrabbitservlet/NioWebDavServer.java b/main/jackrabbit-filesystem-adapter/src/test/java/org/cryptomator/webdav/jackrabbitservlet/NioWebDavServer.java new file mode 100644 index 000000000..378cea382 --- /dev/null +++ b/main/jackrabbit-filesystem-adapter/src/test/java/org/cryptomator/webdav/jackrabbitservlet/NioWebDavServer.java @@ -0,0 +1,44 @@ +/******************************************************************************* + * Copyright (c) 2015 Sebastian Stenzel and others. + * 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 + *******************************************************************************/ +package org.cryptomator.webdav.jackrabbitservlet; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +import org.cryptomator.filesystem.FileSystem; +import org.cryptomator.filesystem.nio.NioFileSystem; + +public class NioWebDavServer { + + public static void main(String[] args) throws Exception { + FileSystem fileSystem = setupFilesystem(); + FileSystemBasedWebDavServer server = new FileSystemBasedWebDavServer(fileSystem); + + server.start(); + System.out.println("Server started. Press any key to stop it..."); + System.in.read(); + server.stop(); + } + + private static FileSystem setupFilesystem() throws IOException { + BufferedReader in = new BufferedReader(new InputStreamReader(System.in, Charset.defaultCharset())); + System.out.print("Enter absolute path to serve (must be an existing directory): "); + Path path = Paths.get(in.readLine()); + if (!Files.isDirectory(path)) { + throw new RuntimeException("Path is not a directory"); + } + return NioFileSystem.rootedAt(path); + } + +} diff --git a/main/pom.xml b/main/pom.xml index 6b8ad2b48..e32a4e283 100644 --- a/main/pom.xml +++ b/main/pom.xml @@ -70,6 +70,11 @@ filesystem-api ${project.version} + + org.cryptomator + filesystem-nio + ${project.version} + org.cryptomator filesystem-inmemory