Improve ZipUtils
Change-Id: I9464a8cca3bc93d85c481cd9f1d0f5b0f06b8796
diff --git a/src/main/java/com/android/tools/r8/utils/ZipUtils.java b/src/main/java/com/android/tools/r8/utils/ZipUtils.java
index 34714e4..fc9157d 100644
--- a/src/main/java/com/android/tools/r8/utils/ZipUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/ZipUtils.java
@@ -35,6 +35,7 @@
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.function.BiFunction;
+import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
@@ -162,35 +163,39 @@
}
public static List<Path> unzip(Path zipFile, Path outDirectory) throws IOException {
- return unzip(zipFile.toString(), outDirectory.toFile(), (entry) -> true).stream()
- .map(File::toPath)
- .collect(Collectors.toList());
+ return unzip(zipFile, outDirectory, (entry) -> true, Function.identity());
}
public static List<File> unzip(String zipFile, File outDirectory) throws IOException {
- return unzip(zipFile, outDirectory, (entry) -> true);
+ return unzip(Paths.get(zipFile), outDirectory.toPath(), (entry) -> true, Path::toFile);
}
- public static List<File> unzip(String zipFile, File outDirectory, Predicate<ZipEntry> filter)
+ public static List<Path> unzip(Path zipFile, Path outDirectory, Predicate<ZipEntry> filter)
throws IOException {
- final Path outDirectoryPath = outDirectory.toPath();
- final List<File> outFiles = new ArrayList<>();
- iter(zipFile, (entry, input) -> {
- String name = entry.getName();
- if (!entry.isDirectory() && filter.test(entry)) {
- if (name.contains("..")) {
- // Protect against malicious archives.
- throw new CompilationError("Invalid entry name \"" + name + "\"");
+ return unzip(zipFile, outDirectory, filter, Function.identity());
+ }
+
+ public static <T> List<T> unzip(
+ Path zipFile, Path outDirectory, Predicate<ZipEntry> filter, Function<Path, T> map)
+ throws IOException {
+ final List<T> outFiles = new ArrayList<>();
+ iter(
+ zipFile,
+ (entry, input) -> {
+ String name = entry.getName();
+ if (!entry.isDirectory() && filter.test(entry)) {
+ if (name.contains("..")) {
+ // Protect against malicious archives.
+ throw new CompilationError("Invalid entry name \"" + name + "\"");
+ }
+ Path outPath = outDirectory.resolve(name);
+ outPath.toFile().getParentFile().mkdirs();
+ try (OutputStream output = new FileOutputStream(outPath.toFile())) {
+ ByteStreams.copy(input, output);
+ }
+ outFiles.add(map.apply(outPath));
}
- Path outPath = outDirectoryPath.resolve(name);
- File outFile = outPath.toFile();
- outFile.getParentFile().mkdirs();
- try (OutputStream output = new FileOutputStream(outFile)) {
- ByteStreams.copy(input, output);
- }
- outFiles.add(outFile);
- }
- });
+ });
return outFiles;
}
diff --git a/src/test/java/com/android/tools/r8/SoftVerificationErrorJarRunner.java b/src/test/java/com/android/tools/r8/SoftVerificationErrorJarRunner.java
index 80a2879..b345c16 100644
--- a/src/test/java/com/android/tools/r8/SoftVerificationErrorJarRunner.java
+++ b/src/test/java/com/android/tools/r8/SoftVerificationErrorJarRunner.java
@@ -64,8 +64,8 @@
File filteredProgramFolder = temp.newFolder();
BooleanBox seenTestRunner = new BooleanBox();
ZipUtils.unzip(
- tempFolder.resolve("program.jar").toFile().toString(),
- filteredProgramFolder,
+ tempFolder.resolve("program.jar"),
+ filteredProgramFolder.toPath(),
zipEntry -> {
if (zipEntry.getName().equals("com/example/softverificationsample/TestRunner.class")) {
seenTestRunner.set();