diff options
Diffstat (limited to 'src/share/demo/nio')
-rw-r--r-- | src/share/demo/nio/zipfs/src/com/sun/nio/zipfs/ZipFileSystemProvider.java | 64 |
1 files changed, 43 insertions, 21 deletions
diff --git a/src/share/demo/nio/zipfs/src/com/sun/nio/zipfs/ZipFileSystemProvider.java b/src/share/demo/nio/zipfs/src/com/sun/nio/zipfs/ZipFileSystemProvider.java index 60c8fed929..d8aa305d29 100644 --- a/src/share/demo/nio/zipfs/src/com/sun/nio/zipfs/ZipFileSystemProvider.java +++ b/src/share/demo/nio/zipfs/src/com/sun/nio/zipfs/ZipFileSystemProvider.java @@ -42,6 +42,7 @@ import java.net.URISyntaxException; import java.util.HashMap; import java.util.Map; import java.util.Set; +import java.util.zip.ZipError; import java.util.concurrent.ExecutorService; /* @@ -78,43 +79,64 @@ public class ZipFileSystemProvider extends FileSystemProvider { } } - @Override - public FileSystem newFileSystem(URI uri, Map<String, ?> env) - throws IOException - { - return newFileSystem(uriToPath(uri), env, true); - } - - @Override - public FileSystem newFileSystem(Path path, Map<String, ?> env) - throws IOException - { - if (!path.toUri().getScheme().equalsIgnoreCase("file")) { - throw new UnsupportedOperationException(); + private boolean ensureFile(Path path) { + try { + BasicFileAttributes attrs = + Files.readAttributes(path, BasicFileAttributes.class); + if (!attrs.isRegularFile()) + throw new UnsupportedOperationException(); + return true; + } catch (IOException ioe) { + return false; } - return newFileSystem(path, env, false); } - private FileSystem newFileSystem(Path path, Map<String, ?> env, boolean checkIfFSExists) + @Override + public FileSystem newFileSystem(URI uri, Map<String, ?> env) throws IOException { + Path path = uriToPath(uri); synchronized(filesystems) { Path realPath = null; - if (checkIfFSExists && Files.exists(path)) { + if (ensureFile(path)) { realPath = path.toRealPath(true); if (filesystems.containsKey(realPath)) throw new FileSystemAlreadyExistsException(); } - ZipFileSystem zipfs = new ZipFileSystem(this, path, env); - if (realPath == null) - realPath = path.toRealPath(true); - if (!filesystems.containsKey(realPath)) - filesystems.put(realPath, zipfs); + ZipFileSystem zipfs = null; + try { + zipfs = new ZipFileSystem(this, path, env); + } catch (ZipError ze) { + String pname = path.toString(); + if (pname.endsWith(".zip") || pname.endsWith(".jar")) + throw ze; + // assume NOT a zip/jar file + throw new UnsupportedOperationException(); + } + filesystems.put(realPath, zipfs); return zipfs; } } @Override + public FileSystem newFileSystem(Path path, Map<String, ?> env) + throws IOException + { + if (path.getFileSystem() != FileSystems.getDefault()) { + throw new UnsupportedOperationException(); + } + ensureFile(path); + try { + return new ZipFileSystem(this, path, env); + } catch (ZipError ze) { + String pname = path.toString(); + if (pname.endsWith(".zip") || pname.endsWith(".jar")) + throw ze; + throw new UnsupportedOperationException(); + } + } + + @Override public Path getPath(URI uri) { String spec = uri.getSchemeSpecificPart(); |