From 98f98fbf68022465f909d88420d718b501432d87 Mon Sep 17 00:00:00 2001 From: Technici4n <13494793+technici4n@users.noreply.github.com> Date: Sat, 18 Nov 2023 10:30:19 +0100 Subject: [PATCH] SJH 3.0: Replace BiPredicate by UnionPathFilter in UnionFS and hide SecureJar impl details --- .../mods/jarhandling/JarContentsBuilder.java | 2 +- .../java/cpw/mods/jarhandling/SecureJar.java | 2 +- .../cpw/mods/niofs/union/UnionFileSystem.java | 12 +++++-- .../niofs/union/UnionFileSystemProvider.java | 36 ++++++++----------- src/main/java/module-info.java | 1 - 5 files changed, 27 insertions(+), 26 deletions(-) diff --git a/src/main/java/cpw/mods/jarhandling/JarContentsBuilder.java b/src/main/java/cpw/mods/jarhandling/JarContentsBuilder.java index 3090066..cacd26e 100644 --- a/src/main/java/cpw/mods/jarhandling/JarContentsBuilder.java +++ b/src/main/java/cpw/mods/jarhandling/JarContentsBuilder.java @@ -53,6 +53,6 @@ public JarContentsBuilder pathFilter(@Nullable UnionPathFilter pathFilter) { * Builds the jar. */ public JarContents build() { - return new JarContentsImpl(paths, defaultManifest, pathFilter == null ? null : pathFilter::test); + return new JarContentsImpl(paths, defaultManifest, pathFilter); } } diff --git a/src/main/java/cpw/mods/jarhandling/SecureJar.java b/src/main/java/cpw/mods/jarhandling/SecureJar.java index 40cfcad..5437164 100644 --- a/src/main/java/cpw/mods/jarhandling/SecureJar.java +++ b/src/main/java/cpw/mods/jarhandling/SecureJar.java @@ -138,7 +138,7 @@ record Provider(String serviceName, List providers) { /** * Helper method to parse service provider implementations from a {@link Path}. */ - public static Provider fromPath(final Path path, final UnionPathFilter pkgFilter) { + public static Provider fromPath(Path path, @Nullable UnionPathFilter pkgFilter) { final var sname = path.getFileName().toString(); try { var entries = Files.readAllLines(path).stream() diff --git a/src/main/java/cpw/mods/niofs/union/UnionFileSystem.java b/src/main/java/cpw/mods/niofs/union/UnionFileSystem.java index 4db42d7..8245c6a 100644 --- a/src/main/java/cpw/mods/niofs/union/UnionFileSystem.java +++ b/src/main/java/cpw/mods/niofs/union/UnionFileSystem.java @@ -31,12 +31,17 @@ import java.util.Map; import java.util.Optional; import java.util.Set; +import java.util.Spliterator; +import java.util.Spliterators; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; import java.util.stream.StreamSupport; +/** + * Can be instantiated using the public methods in {@link UnionFileSystemProvider}. + */ public class UnionFileSystem extends FileSystem { private static final MethodHandle ZIPFS_CH; private static final MethodHandle FCI_UNINTERUPTIBLE; @@ -83,7 +88,7 @@ private static class UncheckedIOException extends java.io.UncheckedIOException { public UncheckedIOException(final IOException cause) { super(cause); } - + public UncheckedIOException(final String message, final IOException cause) { super(message, cause); } @@ -107,6 +112,9 @@ public Path getPrimaryPath() { return basepaths.get(basepaths.size() - 1); } + /** + * {@return the filter for this file system, or null if there is none} + */ @Nullable public UnionPathFilter getFilesystemFilter() { return pathFilter; @@ -119,7 +127,7 @@ String getKey() { private record EmbeddedFileSystemMetadata(Path path, FileSystem fs, SeekableByteChannel fsCh) { } - public UnionFileSystem(final UnionFileSystemProvider provider, @Nullable UnionPathFilter pathFilter, final String key, final Path... basepaths) { + UnionFileSystem(UnionFileSystemProvider provider, @Nullable UnionPathFilter pathFilter, String key, Path... basepaths) { this.pathFilter = pathFilter; this.provider = provider; this.key = key; diff --git a/src/main/java/cpw/mods/niofs/union/UnionFileSystemProvider.java b/src/main/java/cpw/mods/niofs/union/UnionFileSystemProvider.java index a78b923..949056a 100644 --- a/src/main/java/cpw/mods/niofs/union/UnionFileSystemProvider.java +++ b/src/main/java/cpw/mods/niofs/union/UnionFileSystemProvider.java @@ -29,7 +29,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -import java.util.function.BiPredicate; import java.util.stream.Stream; public class UnionFileSystemProvider extends FileSystemProvider { @@ -73,24 +72,7 @@ protected Path uriToPath(URI uri) { */ @Override public FileSystem newFileSystem(final URI uri, final Map env) throws IOException { - @SuppressWarnings("unchecked") - var additional = ((Map>)env).getOrDefault("additional", List.of()); - @SuppressWarnings("unchecked") - var filter = ((Map)env).getOrDefault("filter", null); - - if (filter == null && additional.isEmpty()) - throw new IllegalArgumentException("Missing additional and/or filter"); - - if (filter == null) - filter = (p, b) -> true; - - var path = uriToPath(uri); - var key = makeKey(path); - try { - return newFileSystemInternal(key, filter, Stream.concat(Stream.of(path), additional.stream()).toArray(Path[]::new)); - } catch (UncheckedIOException e) { - throw e.getCause(); - } + return newFileSystem(uriToPath(uri), env); } /** @@ -105,8 +87,7 @@ public FileSystem newFileSystem(final URI uri, final Map env) throws public FileSystem newFileSystem(final Path path, final Map env) throws IOException { @SuppressWarnings("unchecked") var additional = ((Map>)env).getOrDefault("additional", List.of()); - @SuppressWarnings("unchecked") - var filter = ((Map)env).getOrDefault("filter", null); + var filter = readFilterFromEnv(env); if (filter == null && additional.isEmpty()) throw new UnsupportedOperationException("Missing additional and/or filter"); @@ -119,6 +100,19 @@ public FileSystem newFileSystem(final Path path, final Map env) throw } } + @Nullable + private static UnionPathFilter readFilterFromEnv(Map env) { + Object filter = env.get("filter"); + + if (filter == null) { + return null; + } else if (filter instanceof UnionPathFilter unionPathFilter) { + return unionPathFilter; + } else { + throw new IllegalArgumentException("Unknown type for \"filter\" UnionFileSystem env var: " + filter.getClass().getName()); + } + } + public UnionFileSystem newFileSystem(@Nullable UnionPathFilter pathfilter, final Path... paths) { if (paths.length == 0) throw new IllegalArgumentException("Need at least one path"); var key = makeKey(paths[0]); diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index 0c1bb31..6b07d8c 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -3,7 +3,6 @@ module cpw.mods.securejarhandler { exports cpw.mods.jarhandling; - exports cpw.mods.jarhandling.impl; // TODO - Bump version, and remove this export, you don't need our implementation exports cpw.mods.cl; exports cpw.mods.niofs.union; requires jdk.unsupported;