From 531650c9f2f7dfc9021906f89a8eb22f582400a1 Mon Sep 17 00:00:00 2001 From: Skylot Date: Thu, 2 Jan 2020 22:26:33 +0300 Subject: [PATCH] refactor: allow to change temp dir using system property JADX_TMP_DIR --- jadx-cli/src/main/java/jadx/cli/JadxCLI.java | 2 + .../java/jadx/core/utils/files/FileUtils.java | 49 ++++++++++++++++++- .../java/jadx/tests/api/IntegrationTest.java | 9 +++- .../src/main/java/jadx/gui/ui/MainWindow.java | 3 ++ 4 files changed, 59 insertions(+), 4 deletions(-) diff --git a/jadx-cli/src/main/java/jadx/cli/JadxCLI.java b/jadx-cli/src/main/java/jadx/cli/JadxCLI.java index dd7c3031a..4691991a7 100644 --- a/jadx-cli/src/main/java/jadx/cli/JadxCLI.java +++ b/jadx-cli/src/main/java/jadx/cli/JadxCLI.java @@ -7,6 +7,7 @@ import jadx.api.JadxArgs; import jadx.api.JadxDecompiler; import jadx.api.impl.NoOpCodeCache; import jadx.core.utils.exceptions.JadxArgsValidateException; +import jadx.core.utils.files.FileUtils; public class JadxCLI { private static final Logger LOG = LoggerFactory.getLogger(JadxCLI.class); @@ -22,6 +23,7 @@ public class JadxCLI { LOG.error("jadx error: {}", e.getMessage(), e); result = 1; } finally { + FileUtils.deleteTempRootDir(); System.exit(result); } } diff --git a/jadx-core/src/main/java/jadx/core/utils/files/FileUtils.java b/jadx-core/src/main/java/jadx/core/utils/files/FileUtils.java index 5b03934cb..6e4045779 100644 --- a/jadx-core/src/main/java/jadx/core/utils/files/FileUtils.java +++ b/jadx-core/src/main/java/jadx/core/utils/files/FileUtils.java @@ -10,7 +10,9 @@ import java.io.InputStream; import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import java.util.ArrayList; +import java.util.Comparator; import java.util.Enumeration; import java.util.List; import java.util.Objects; @@ -32,6 +34,9 @@ public class FileUtils { public static final int READ_BUFFER_SIZE = 8 * 1024; private static final int MAX_FILENAME_LENGTH = 128; + public static final String JADX_TMP_INSTANCE_PREFIX = "jadx-instance-"; + public static final String JADX_TMP_PREFIX = "jadx-tmp-"; + private FileUtils() { } @@ -70,6 +75,12 @@ public class FileUtils { } } + public static void makeDirs(@Nullable Path dir) { + if (dir != null) { + makeDirs(dir.toFile()); + } + } + public static boolean deleteDir(File dir) { File[] content = dir.listFiles(); if (content != null) { @@ -80,11 +91,28 @@ public class FileUtils { return dir.delete(); } + public static void deleteDir(Path dir) { + try { + Files.walk(dir) + .sorted(Comparator.reverseOrder()) + .map(Path::toFile) + .forEach(File::delete); + } catch (Exception e) { + throw new JadxRuntimeException("Failed to delete directory " + dir, e); + } + } + private static final Path TEMP_ROOT_DIR = createTempRootDir(); private static Path createTempRootDir() { try { - Path dir = Files.createTempDirectory("jadx-instance-"); + String jadxTmpDir = System.getenv("JADX_TMP_DIR"); + Path dir; + if (jadxTmpDir != null) { + dir = Files.createTempDirectory(Paths.get(jadxTmpDir), "jadx-instance-"); + } else { + dir = Files.createTempDirectory(JADX_TMP_INSTANCE_PREFIX); + } dir.toFile().deleteOnExit(); return dir; } catch (Exception e) { @@ -92,6 +120,15 @@ public class FileUtils { } } + public static void deleteTempRootDir() { + deleteDir(TEMP_ROOT_DIR); + } + + public static void clearTempRootDir() { + deleteDir(TEMP_ROOT_DIR); + makeDirs(TEMP_ROOT_DIR); + } + public static Path createTempDir(String prefix) { try { Path dir = Files.createTempDirectory(TEMP_ROOT_DIR, prefix); @@ -104,7 +141,7 @@ public class FileUtils { public static Path createTempFile(String suffix) { try { - Path path = Files.createTempFile(TEMP_ROOT_DIR, "jadx-tmp-", suffix); + Path path = Files.createTempFile(TEMP_ROOT_DIR, JADX_TMP_PREFIX, suffix); path.toFile().deleteOnExit(); return path; } catch (Exception e) { @@ -112,6 +149,14 @@ public class FileUtils { } } + public static Path createTempFileNoDelete(String suffix) { + try { + return Files.createTempFile(TEMP_ROOT_DIR, JADX_TMP_PREFIX, suffix); + } catch (Exception e) { + throw new JadxRuntimeException("Failed to create temp file with suffix: " + suffix, e); + } + } + public static void copyStream(InputStream input, OutputStream output) throws IOException { byte[] buffer = new byte[READ_BUFFER_SIZE]; while (true) { diff --git a/jadx-core/src/test/java/jadx/tests/api/IntegrationTest.java b/jadx-core/src/test/java/jadx/tests/api/IntegrationTest.java index 288108f55..ada2ea51c 100644 --- a/jadx-core/src/test/java/jadx/tests/api/IntegrationTest.java +++ b/jadx-core/src/test/java/jadx/tests/api/IntegrationTest.java @@ -6,7 +6,6 @@ import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; -import java.nio.file.Files; import java.nio.file.Path; import java.util.Arrays; import java.util.Collections; @@ -21,6 +20,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.jar.JarOutputStream; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import jadx.api.ICodeInfo; @@ -119,6 +119,11 @@ public abstract class IntegrationTest extends TestUtils { args.setFsCaseSensitive(false); // use same value on all systems } + @AfterEach + public void after() { + FileUtils.clearTempRootDir(); + } + public String getTestName() { return this.getClass().getSimpleName(); } @@ -414,7 +419,7 @@ public abstract class IntegrationTest extends TestUtils { temp = FileUtils.createTempFile(suffix); } else { // don't delete on exit - temp = Files.createTempFile("jadx", suffix); + temp = FileUtils.createTempFileNoDelete(suffix); System.out.println("Temporary file saved: " + temp.toAbsolutePath()); } return temp.toFile(); diff --git a/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java b/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java index 503185d87..396aa408e 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java @@ -77,6 +77,7 @@ import jadx.api.JadxArgs; import jadx.api.JavaClass; import jadx.api.JavaNode; import jadx.api.ResourceFile; +import jadx.core.utils.files.FileUtils; import jadx.gui.JadxWrapper; import jadx.gui.jobs.BackgroundExecutor; import jadx.gui.jobs.BackgroundWorker; @@ -1098,6 +1099,8 @@ public class MainWindow extends JFrame { settings.setMainWindowExtendedState(getExtendedState()); cancelBackgroundJobs(); dispose(); + + FileUtils.deleteTempRootDir(); System.exit(0); }