From 8d5ba8c7e163a9f3b1fb96c0efefc7d44f0fe88d Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Mon, 11 Jun 2018 17:07:39 +0300 Subject: [PATCH] [platform] fixes entry filtering after merging .zip and .tar extracting utilities --- .../com/intellij/util/io/Decompressor.java | 12 +++++---- .../src/com/intellij/util/io/ZipUtil.java | 26 +++++++++++-------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/platform/util/src/com/intellij/util/io/Decompressor.java b/platform/util/src/com/intellij/util/io/Decompressor.java index fd7f334b4267..83a8f52b7aa9 100644 --- a/platform/util/src/com/intellij/util/io/Decompressor.java +++ b/platform/util/src/com/intellij/util/io/Decompressor.java @@ -1,6 +1,7 @@ // Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.util.io; +import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.io.FileUtil; import com.intellij.util.Consumer; import org.apache.commons.compress.archivers.tar.TarArchiveEntry; @@ -90,11 +91,11 @@ public abstract class Decompressor { // } - private FileFilter myFilter = null; + private Condition myFilter = null; private boolean myOverwrite = true; private Consumer myConsumer; - public Decompressor filter(@Nullable FileFilter filter) { + public Decompressor filter(@Nullable Condition filter) { myFilter = filter; return this; } @@ -114,12 +115,13 @@ public abstract class Decompressor { try { Entry entry; while ((entry = nextEntry(stream)) != null) { - File outputFile = ZipUtil.newFileForEntry(outputDir, entry.name); - - if (myFilter != null && !myFilter.accept(outputFile)) { + String name = entry.name; + if (myFilter != null && !myFilter.value(name)) { continue; } + File outputFile = ZipUtil.newFileForEntry(outputDir, name); + if (entry.isDirectory) { FileUtil.createDirectory(outputFile); } diff --git a/platform/util/src/com/intellij/util/io/ZipUtil.java b/platform/util/src/com/intellij/util/io/ZipUtil.java index e6b7ff540a00..7cd3c7b62ee3 100644 --- a/platform/util/src/com/intellij/util/io/ZipUtil.java +++ b/platform/util/src/com/intellij/util/io/ZipUtil.java @@ -2,6 +2,7 @@ package com.intellij.util.io; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.io.FileUtilRt; import com.intellij.openapi.util.text.StringUtil; @@ -125,28 +126,31 @@ public class ZipUtil { /** @see Decompressor.Zip */ public static void extract(@NotNull File file, @NotNull File outputDir, @Nullable FilenameFilter filter) throws IOException { - new Decompressor.Zip(file).filter(FileFilterAdapter.wrap(filter)).extract(outputDir); + new Decompressor.Zip(file).filter(FileFilterAdapter.wrap(outputDir, filter)).extract(outputDir); } /** @see Decompressor.Zip */ public static void extract(@NotNull File file, @NotNull File outputDir, @Nullable FilenameFilter filter, boolean overwrite) throws IOException { - new Decompressor.Zip(file).filter(FileFilterAdapter.wrap(filter)).overwrite(overwrite).extract(outputDir); + new Decompressor.Zip(file).filter(FileFilterAdapter.wrap(outputDir, filter)).overwrite(overwrite).extract(outputDir); } - private static class FileFilterAdapter implements FileFilter { - private static FileFilterAdapter wrap(FilenameFilter original) { - return original == null ? null : new FileFilterAdapter(original); + private static class FileFilterAdapter implements Condition { + private static FileFilterAdapter wrap(File outputDir, FilenameFilter filter) { + return filter == null ? null : new FileFilterAdapter(outputDir, filter); } - private final FilenameFilter myOriginal; + private final File myOutputDir; + private final FilenameFilter myFilter; - private FileFilterAdapter(FilenameFilter original) { - myOriginal = original; + private FileFilterAdapter(File outputDir, FilenameFilter filter) { + myOutputDir = outputDir; + myFilter = filter; } @Override - public boolean accept(File pathname) { - return myOriginal.accept(pathname.getParentFile(), pathname.getName()); + public boolean value(String entryName) { + File outputFile = new File(myOutputDir, entryName); + return myFilter.accept(outputFile.getParentFile(), outputFile.getName()); } } @@ -203,7 +207,7 @@ public class ZipUtil { /** @deprecated use {@link Decompressor.Zip} */ @ApiStatus.ScheduledForRemoval(inVersion = "2020") public static void extract(@NotNull ZipFile zip, @NotNull File outputDir, @Nullable FilenameFilter filter) throws IOException { - new Decompressor.Zip(new File(zip.getName())).filter(FileFilterAdapter.wrap(filter)).extract(outputDir); + new Decompressor.Zip(new File(zip.getName())).filter(FileFilterAdapter.wrap(outputDir, filter)).extract(outputDir); } /** @deprecated use {@link Decompressor.Zip} */