package uk.org.taverna.fswrap;
import java.io.IOException;
import java.net.URI;
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.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
public class WrappedFileSystem extends FileSystem {
private final FileSystem originalFilesystem;
private final WrappedFileSystemProvider provider;
private WrappedFileStore wrappedFileStore;
private URI uri;
private boolean closeOriginalOnClose;
public WrappedFileSystem(WrappedFileSystemProvider provider, URI uri,
FileSystem originalFs, boolean closeOriginalOnClose) {
this.provider = provider;
this.originalFilesystem = originalFs;
this.uri = uri;
this.closeOriginalOnClose = closeOriginalOnClose;
}
@Override
public void close() throws IOException {
if (closeOriginalOnClose) {
originalFilesystem.close();
}
provider().closeFilesystem(this);
}
@Override
public Iterable<FileStore> getFileStores() {
if (wrappedFileStore == null) {
wrappedFileStore = new WrappedFileStore(getOriginalFilesystem()
.getFileStores().iterator().next());
}
return Collections.singleton((FileStore) wrappedFileStore);
}
public FileSystem getOriginalFilesystem() {
return originalFilesystem;
}
@Override
public Path getPath(String first, String... more) {
Path origPath = getOriginalFilesystem().getPath(first, more);
return toWrappedPath(origPath);
}
@Override
public PathMatcher getPathMatcher(final String syntaxAndPattern) {
return new PathMatcher() {
PathMatcher zipPathMatcher = getOriginalFilesystem()
.getPathMatcher(syntaxAndPattern);
@Override
public boolean matches(Path path) {
return zipPathMatcher.matches(provider.toOriginalPath(path));
}
};
}
@Override
public Iterable<Path> getRootDirectories() {
return toWrappedPaths(getOriginalFilesystem().getRootDirectories());
}
@Override
public String getSeparator() {
return getOriginalFilesystem().getSeparator();
}
@Override
public UserPrincipalLookupService getUserPrincipalLookupService() {
return getOriginalFilesystem().getUserPrincipalLookupService();
}
@Override
public boolean isOpen() {
return getOriginalFilesystem().isOpen();
}
@Override
public boolean isReadOnly() {
return getOriginalFilesystem().isReadOnly();
}
@Override
public WatchService newWatchService() throws IOException {
return getOriginalFilesystem().newWatchService();
}
@Override
public WrappedFileSystemProvider provider() {
return provider;
}
@Override
public Set<String> supportedFileAttributeViews() {
return getOriginalFilesystem().supportedFileAttributeViews();
}
protected WrappedPath toWrappedPath(Path origPath) {
if (origPath == null) {
return null;
}
return new WrappedPath(this, origPath);
}
protected Iterable<Path> toWrappedPaths(Iterable<Path> origPaths) {
List<Path> wrapped = new ArrayList<Path>();
for (Path orig : origPaths) {
// where's my yield !!??
wrapped.add(toWrappedPath(orig));
}
return wrapped;
}
public URI getUri() {
return uri;
}
}