refactor: allow to change temp dir using system property JADX_TMP_DIR
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user