experimenting with maverick synergy
This commit is contained in:
parent
1f52dedf13
commit
5c18f0704f
19 changed files with 125 additions and 144 deletions
|
@ -1,5 +1,4 @@
|
||||||
dependencies {
|
dependencies {
|
||||||
api project(':files-api')
|
api project(':files-api')
|
||||||
api libs.maverick.synergy.client
|
api libs.maverick.synergy.client
|
||||||
testImplementation libs.net.security
|
|
||||||
}
|
}
|
12
files-jadaptive-sftp/src/main/java/module-info.java
Normal file
12
files-jadaptive-sftp/src/main/java/module-info.java
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
import org.xbib.files.jadaptive.sftp.SftpFileSystemProvider;
|
||||||
|
|
||||||
|
import java.nio.file.spi.FileSystemProvider;
|
||||||
|
|
||||||
|
module org.xbib.files.jadaptive.sftp {
|
||||||
|
requires java.logging;
|
||||||
|
requires org.xbib.files;
|
||||||
|
requires com.sshtools.maverick.base;
|
||||||
|
requires com.sshtools.synergy.common;
|
||||||
|
requires com.sshtools.synergy.client;
|
||||||
|
provides FileSystemProvider with SftpFileSystemProvider;
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
package org.xbib.files.jadaptive.sftp;
|
||||||
|
|
||||||
|
import java.io.Closeable;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URI;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class SftpContext implements Closeable {
|
||||||
|
|
||||||
|
SftpFileSystemProvider provider;
|
||||||
|
|
||||||
|
SftpFileSystem fileSystem;
|
||||||
|
|
||||||
|
public SftpContext(URI uri, Map<String, ?> env) throws IOException {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws IOException {
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package org.xbib.files.sftp.jadaptive.fs.spi;
|
package org.xbib.files.jadaptive.sftp;
|
||||||
|
|
||||||
import org.xbib.files.FileService;
|
import org.xbib.files.FileService;
|
||||||
import org.xbib.files.FileWalker;
|
import org.xbib.files.FileWalker;
|
||||||
|
@ -33,7 +33,7 @@ import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
public class SFTPFileService implements FileService {
|
public class SftpFileService implements FileService {
|
||||||
|
|
||||||
private static final int BUFFER_SIZE = 128 * 1024;
|
private static final int BUFFER_SIZE = 128 * 1024;
|
||||||
|
|
||||||
|
@ -47,7 +47,7 @@ public class SFTPFileService implements FileService {
|
||||||
|
|
||||||
private final Map<String, ?> env;
|
private final Map<String, ?> env;
|
||||||
|
|
||||||
public SFTPFileService(URI uri, Map<String, ?> env) {
|
public SftpFileService(URI uri, Map<String, ?> env) {
|
||||||
this.uri = uri;
|
this.uri = uri;
|
||||||
this.env = env;
|
this.env = env;
|
||||||
}
|
}
|
||||||
|
@ -303,31 +303,31 @@ public class SFTPFileService implements FileService {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DirectoryStream<Path> stream(String path, String glob) throws IOException {
|
public DirectoryStream<Path> stream(String path, String glob) throws IOException {
|
||||||
SFTPContext ctx = new SFTPContext(uri, env);
|
SftpContext ctx = new SftpContext(uri, env);
|
||||||
return new WrappedDirectoryStream<>(ctx, Files.newDirectoryStream(ctx.fileSystem.getPath(path), glob));
|
return new WrappedDirectoryStream<>(ctx, Files.newDirectoryStream(ctx.fileSystem.getPath(path), glob));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DirectoryStream<Path> stream(String path, DirectoryStream.Filter<Path> filter) throws IOException {
|
public DirectoryStream<Path> stream(String path, DirectoryStream.Filter<Path> filter) throws IOException {
|
||||||
SFTPContext ctx = new SFTPContext(uri, env);
|
SftpContext ctx = new SftpContext(uri, env);
|
||||||
return new WrappedDirectoryStream<>(ctx, Files.newDirectoryStream(ctx.fileSystem.getPath(path), filter));
|
return new WrappedDirectoryStream<>(ctx, Files.newDirectoryStream(ctx.fileSystem.getPath(path), filter));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Stream<Path> list(String path) throws IOException {
|
public Stream<Path> list(String path) throws IOException {
|
||||||
SFTPContext ctx = new SFTPContext(uri, env);
|
SftpContext ctx = new SftpContext(uri, env);
|
||||||
return FileWalker.list(new WrappedDirectoryStream<>(ctx, Files.newDirectoryStream(ctx.fileSystem.getPath(path))));
|
return FileWalker.list(new WrappedDirectoryStream<>(ctx, Files.newDirectoryStream(ctx.fileSystem.getPath(path))));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Stream<Path> walk(String path, FileVisitOption... options) throws IOException {
|
public Stream<Path> walk(String path, FileVisitOption... options) throws IOException {
|
||||||
SFTPContext ctx = new SFTPContext(uri, env);
|
SftpContext ctx = new SftpContext(uri, env);
|
||||||
return FileWalker.walk(ctx, ctx.fileSystem.getPath(path), Integer.MAX_VALUE, options);
|
return FileWalker.walk(ctx, ctx.fileSystem.getPath(path), Integer.MAX_VALUE, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Stream<Path> walk(String path, int maxdepth, FileVisitOption... options) throws IOException {
|
public Stream<Path> walk(String path, int maxdepth, FileVisitOption... options) throws IOException {
|
||||||
SFTPContext ctx = new SFTPContext(uri, env);
|
SftpContext ctx = new SftpContext(uri, env);
|
||||||
return FileWalker.walk(ctx, ctx.fileSystem.getPath(path), maxdepth, options);
|
return FileWalker.walk(ctx, ctx.fileSystem.getPath(path), maxdepth, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -357,7 +357,7 @@ public class SFTPFileService implements FileService {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void doUpload(SFTPContext ctx,
|
private void doUpload(SftpContext ctx,
|
||||||
ReadableByteChannel source,
|
ReadableByteChannel source,
|
||||||
Path target,
|
Path target,
|
||||||
Set<PosixFilePermission> dirPerms,
|
Set<PosixFilePermission> dirPerms,
|
||||||
|
@ -367,19 +367,19 @@ public class SFTPFileService implements FileService {
|
||||||
transfer(source, ctx.provider.newByteChannel(target, prepareWriteOptions(copyOptions)));
|
transfer(source, ctx.provider.newByteChannel(target, prepareWriteOptions(copyOptions)));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void download(SFTPContext ctx,
|
private void download(SftpContext ctx,
|
||||||
Path source,
|
Path source,
|
||||||
OutputStream outputStream) throws IOException {
|
OutputStream outputStream) throws IOException {
|
||||||
download(ctx, source, Channels.newChannel(outputStream));
|
download(ctx, source, Channels.newChannel(outputStream));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void download(SFTPContext ctx,
|
private void download(SftpContext ctx,
|
||||||
Path source,
|
Path source,
|
||||||
WritableByteChannel writableByteChannel) throws IOException {
|
WritableByteChannel writableByteChannel) throws IOException {
|
||||||
transfer(ctx.provider.newByteChannel(source, prepareReadOptions()), writableByteChannel);
|
transfer(ctx.provider.newByteChannel(source, prepareReadOptions()), writableByteChannel);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void download(SFTPContext ctx,
|
private void download(SftpContext ctx,
|
||||||
Path source,
|
Path source,
|
||||||
Path target,
|
Path target,
|
||||||
CopyOption... copyOptions) throws IOException {
|
CopyOption... copyOptions) throws IOException {
|
||||||
|
@ -459,10 +459,10 @@ public class SFTPFileService implements FileService {
|
||||||
}
|
}
|
||||||
|
|
||||||
private <T> T performWithContext(WithContext<T> action) throws IOException {
|
private <T> T performWithContext(WithContext<T> action) throws IOException {
|
||||||
SFTPContext ctx = null;
|
SftpContext ctx = null;
|
||||||
try {
|
try {
|
||||||
if (uri != null) {
|
if (uri != null) {
|
||||||
ctx = new SFTPContext(uri, env);
|
ctx = new SftpContext(uri, env);
|
||||||
return action.perform(ctx);
|
return action.perform(ctx);
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
|
@ -1,4 +1,4 @@
|
||||||
package org.xbib.files.sftp.jadaptive.fs.spi;
|
package org.xbib.files.jadaptive.sftp;
|
||||||
|
|
||||||
import org.xbib.files.FileService;
|
import org.xbib.files.FileService;
|
||||||
import org.xbib.files.FileServiceProvider;
|
import org.xbib.files.FileServiceProvider;
|
||||||
|
@ -6,10 +6,10 @@ import org.xbib.files.FileServiceProvider;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public class SFTPFileServiceProvider implements FileServiceProvider {
|
public class SftpFileServiceProvider implements FileServiceProvider {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public FileService provide(URI uri, Map<String, ?> env) {
|
public FileService provide(URI uri, Map<String, ?> env) {
|
||||||
return uri.isAbsolute() && uri.getScheme().equals("sftp") ? new SFTPFileService(uri, env) : null;
|
return uri.isAbsolute() && uri.getScheme().equals("sftp") ? new SftpFileService(uri, env) : null;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
package org.xbib.files.jadaptive.sftp;
|
||||||
|
|
||||||
|
import com.sshtools.common.files.nio.AbstractFileNIOFileSystem;
|
||||||
|
import com.sshtools.common.files.nio.AbstractFileNIOProvider;
|
||||||
|
import com.sshtools.common.ssh.SshConnection;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
|
||||||
|
public class SftpFileSystem extends AbstractFileNIOFileSystem {
|
||||||
|
|
||||||
|
public SftpFileSystem(SshConnection con,
|
||||||
|
URI uri,
|
||||||
|
AbstractFileNIOProvider provider) {
|
||||||
|
super(con, uri, provider);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
package org.xbib.files.jadaptive.sftp;
|
||||||
|
|
||||||
|
import com.sshtools.common.files.nio.AbstractFileNIOProvider;
|
||||||
|
|
||||||
|
public class SftpFileSystemProvider extends AbstractFileNIOProvider {
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
package org.xbib.files.jadaptive.sftp;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@FunctionalInterface
|
||||||
|
interface WithContext<T> {
|
||||||
|
T perform(SftpContext ctx) throws IOException;
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
org.xbib.files.jadaptive.sftp.SftpFileSystemProvider
|
8
files-jadaptive-sftp/src/test/java/module-info.java
Normal file
8
files-jadaptive-sftp/src/test/java/module-info.java
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
module org.xbib.files.jadaptive.sftp.test {
|
||||||
|
requires java.logging;
|
||||||
|
requires transitive org.junit.jupiter.api;
|
||||||
|
requires org.xbib.files;
|
||||||
|
requires org.xbib.files.jadaptive.sftp;
|
||||||
|
exports org.xbib.files.jadaptive.sftp.test;
|
||||||
|
opens org.xbib.files.jadaptive.sftp.test to org.junit.platform.commons;
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
package org.xbib.files.jadaptive.sftp.test;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URI;
|
||||||
|
import java.nio.file.FileSystem;
|
||||||
|
import java.nio.file.FileSystems;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
public class SftpFileSystemTest {
|
||||||
|
|
||||||
|
private static final Logger logger = Logger.getLogger(SftpFileSystemTest.class.getName());
|
||||||
|
|
||||||
|
public SftpFileSystemTest() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFileSystem() throws IOException {
|
||||||
|
Map<String, ?> env = Map.of("username", "joerg");
|
||||||
|
try (FileSystem fileSystem = FileSystems.newFileSystem(URI.create("abfs://alkmene:22"), env)) {
|
||||||
|
for (Path path : fileSystem.getRootDirectories()) {
|
||||||
|
logger.log(Level.INFO, "root dir = " + path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
handlers=java.util.logging.ConsoleHandler
|
||||||
|
.level=ALL
|
||||||
|
java.util.logging.SimpleFormatter.format=%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS.%1$tL %4$-7s [%3$s] %5$s %6$s%n
|
||||||
|
java.util.logging.ConsoleHandler.level=ALL
|
||||||
|
java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter
|
|
@ -1,8 +1,5 @@
|
||||||
handlers=java.util.logging.ConsoleHandler,java.util.logging.FileHandler
|
handlers=java.util.logging.ConsoleHandler
|
||||||
.level=ALL
|
.level=ALL
|
||||||
java.util.logging.SimpleFormatter.format=%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS.%1$tL %4$-7s [%3$s] %5$s %6$s%n
|
java.util.logging.SimpleFormatter.format=%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS.%1$tL %4$-7s [%3$s] %5$s %6$s%n
|
||||||
java.util.logging.ConsoleHandler.level=ALL
|
java.util.logging.ConsoleHandler.level=ALL
|
||||||
java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter
|
java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter
|
||||||
java.util.logging.FileHandler.level=INFO
|
|
||||||
java.util.logging.FileHandler.pattern=build/test.log
|
|
||||||
java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter
|
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
module org.xbib.files.sftp.jadaptive.fs {
|
|
||||||
requires org.xbib.files;
|
|
||||||
}
|
|
|
@ -1,74 +0,0 @@
|
||||||
package org.xbib.files.sftp.jadaptive.fs;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.nio.file.FileStore;
|
|
||||||
import java.nio.file.FileSystem;
|
|
||||||
import java.nio.file.Path;
|
|
||||||
import java.nio.file.PathMatcher;
|
|
||||||
import java.nio.file.WatchService;
|
|
||||||
import java.nio.file.attribute.UserPrincipalLookupService;
|
|
||||||
import java.nio.file.spi.FileSystemProvider;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
public class SftpFileSystem extends FileSystem {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public FileSystemProvider provider() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void close() throws IOException {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isOpen() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isReadOnly() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSeparator() {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Iterable<Path> getRootDirectories() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Iterable<FileStore> getFileStores() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Set<String> supportedFileAttributeViews() {
|
|
||||||
return Set.of();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Path getPath(String s, String... strings) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PathMatcher getPathMatcher(String s) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public UserPrincipalLookupService getUserPrincipalLookupService() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public WatchService newWatchService() throws IOException {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,14 +0,0 @@
|
||||||
package org.xbib.files.sftp.jadaptive.fs;
|
|
||||||
|
|
||||||
import java.nio.channels.ByteChannel;
|
|
||||||
import java.nio.file.OpenOption;
|
|
||||||
import java.nio.file.Path;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
public class SftpFileSystemProvider {
|
|
||||||
|
|
||||||
public ByteChannel newByteChannel(Path path, Set<? extends OpenOption> options) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,23 +0,0 @@
|
||||||
package org.xbib.files.sftp.jadaptive.fs.spi;
|
|
||||||
|
|
||||||
import org.xbib.files.sftp.jadaptive.fs.SftpFileSystem;
|
|
||||||
import org.xbib.files.sftp.jadaptive.fs.SftpFileSystemProvider;
|
|
||||||
|
|
||||||
import java.io.Closeable;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.net.URI;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
public class SFTPContext implements Closeable {
|
|
||||||
|
|
||||||
SftpFileSystemProvider provider;
|
|
||||||
|
|
||||||
SftpFileSystem fileSystem;
|
|
||||||
|
|
||||||
public SFTPContext(URI uri, Map<String, ?> env) throws IOException {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void close() throws IOException {
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,7 +0,0 @@
|
||||||
package org.xbib.files.sftp.jadaptive.fs.spi;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
interface WithContext<T> {
|
|
||||||
T perform(SFTPContext ctx) throws IOException;
|
|
||||||
}
|
|
|
@ -42,6 +42,6 @@ include 'files-ftp-fs'
|
||||||
include 'files-ftp-mock'
|
include 'files-ftp-mock'
|
||||||
include 'files-sftp'
|
include 'files-sftp'
|
||||||
include 'files-sftp-fs'
|
include 'files-sftp-fs'
|
||||||
include 'files-sftp-jadaptive-fs'
|
include 'files-jadaptive-sftp'
|
||||||
include 'files-webdav'
|
include 'files-webdav'
|
||||||
include 'files-webdav-fs'
|
include 'files-webdav-fs'
|
||||||
|
|
Loading…
Reference in a new issue