refactor: allow to change temp dir using system property JADX_TMP_DIR

This commit is contained in:
Skylot
2020-01-02 22:26:33 +03:00
parent f3098741c3
commit 531650c9f2
4 changed files with 59 additions and 4 deletions
@@ -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);
}
}
@@ -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) {
@@ -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();
@@ -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);
}