Created NioWebDavServer

* Extracted Server-logic from InMemoryWebDavServer to
FileSystemBasedWebdavServer
* Made InMemoryWebdavServer and NioWebdavvServer use
FileSystemBasedWebdavServer
This commit is contained in:
Markus Kreusch
2015-12-31 17:46:24 +01:00
parent 39535d08e7
commit 64dec64e95
5 changed files with 137 additions and 63 deletions

View File

@@ -70,6 +70,11 @@
<artifactId>filesystem-inmemory</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.cryptomator</groupId>
<artifactId>filesystem-nio</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>

View File

@@ -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<Runnable> 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();
}
}

View File

@@ -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<Runnable> 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;
}
}

View File

@@ -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);
}
}

View File

@@ -70,6 +70,11 @@
<artifactId>filesystem-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.cryptomator</groupId>
<artifactId>filesystem-nio</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.cryptomator</groupId>
<artifactId>filesystem-inmemory</artifactId>