7007596: (zipfs) FileSystems.newFileSystem(FileRef...) always employs zipfs regardless the real Path type
Updated newFileSystem() to throw UOE exception for non-zip/jar file Reviewed-by: alanb
This commit is contained in:
parent
2db18d0d1c
commit
0e63901156
@ -42,6 +42,7 @@ import java.net.URISyntaxException;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.zip.ZipError;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -78,39 +79,60 @@ public class ZipFileSystemProvider extends FileSystemProvider {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public FileSystem newFileSystem(URI uri, Map<String, ?> env)
|
public FileSystem newFileSystem(URI uri, Map<String, ?> env)
|
||||||
throws IOException
|
throws IOException
|
||||||
{
|
{
|
||||||
return newFileSystem(uriToPath(uri), env, true);
|
Path path = uriToPath(uri);
|
||||||
|
synchronized(filesystems) {
|
||||||
|
Path realPath = null;
|
||||||
|
if (ensureFile(path)) {
|
||||||
|
realPath = path.toRealPath(true);
|
||||||
|
if (filesystems.containsKey(realPath))
|
||||||
|
throw new FileSystemAlreadyExistsException();
|
||||||
|
}
|
||||||
|
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
|
@Override
|
||||||
public FileSystem newFileSystem(Path path, Map<String, ?> env)
|
public FileSystem newFileSystem(Path path, Map<String, ?> env)
|
||||||
throws IOException
|
throws IOException
|
||||||
{
|
{
|
||||||
if (!path.toUri().getScheme().equalsIgnoreCase("file")) {
|
if (path.getFileSystem() != FileSystems.getDefault()) {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
return newFileSystem(path, env, false);
|
ensureFile(path);
|
||||||
}
|
try {
|
||||||
|
return new ZipFileSystem(this, path, env);
|
||||||
private FileSystem newFileSystem(Path path, Map<String, ?> env, boolean checkIfFSExists)
|
} catch (ZipError ze) {
|
||||||
throws IOException
|
String pname = path.toString();
|
||||||
{
|
if (pname.endsWith(".zip") || pname.endsWith(".jar"))
|
||||||
synchronized(filesystems) {
|
throw ze;
|
||||||
Path realPath = null;
|
throw new UnsupportedOperationException();
|
||||||
if (checkIfFSExists && Files.exists(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);
|
|
||||||
return zipfs;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -105,6 +105,18 @@ public class ZipFSTester {
|
|||||||
os.write(bits);
|
os.write(bits);
|
||||||
os.close();
|
os.close();
|
||||||
|
|
||||||
|
try {
|
||||||
|
provider.newFileSystem(new File(System.getProperty("test.src", ".")).toPath(),
|
||||||
|
new HashMap<String, Object>());
|
||||||
|
throw new RuntimeException("newFileSystem() opens a directory as zipfs");
|
||||||
|
} catch (UnsupportedOperationException uoe) {}
|
||||||
|
|
||||||
|
try {
|
||||||
|
provider.newFileSystem(src, new HashMap<String, Object>());
|
||||||
|
throw new RuntimeException("newFileSystem() opens a non-zip file as zipfs");
|
||||||
|
} catch (UnsupportedOperationException uoe) {}
|
||||||
|
|
||||||
|
|
||||||
// copyin
|
// copyin
|
||||||
Path dst = getPathWithParents(fs, tmpName);
|
Path dst = getPathWithParents(fs, tmpName);
|
||||||
Files.copy(src, dst);
|
Files.copy(src, dst);
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
# questions.
|
# questions.
|
||||||
#
|
#
|
||||||
# @test
|
# @test
|
||||||
# @bug 6990846 7009092 7009085 7015391 7014948 7005986 7017840
|
# @bug 6990846 7009092 7009085 7015391 7014948 7005986 7017840 7007596
|
||||||
# @summary Test ZipFileSystem demo
|
# @summary Test ZipFileSystem demo
|
||||||
# @build Basic PathOps ZipFSTester
|
# @build Basic PathOps ZipFSTester
|
||||||
# @run shell basic.sh
|
# @run shell basic.sh
|
||||||
|
Loading…
x
Reference in New Issue
Block a user