package jadx.gui;
import jadx.api.IJadxArgs;
import jadx.api.JadxDecompiler;
import jadx.api.JavaClass;
import jadx.api.JavaPackage;
import jadx.core.utils.exceptions.DecodeException;
import jadx.core.utils.exceptions.JadxException;
import javax.swing.ProgressMonitor;
import java.io.File;
import java.util.List;
import java.util.concurrent.ThreadPoolExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class JadxWrapper {
private static final Logger LOG = LoggerFactory.getLogger(JadxWrapper.class);
private final JadxDecompiler decompiler;
private File openFile;
public JadxWrapper(IJadxArgs jadxArgs) {
this.decompiler = new JadxDecompiler(jadxArgs);
}
public void openFile(File file) {
this.openFile = file;
try {
this.decompiler.loadFile(file);
} catch (DecodeException e) {
LOG.error("Error decode file: " + file, e);
} catch (JadxException e) {
LOG.error("Error open file: " + file, e);
}
}
public void saveAll(final File dir, final ProgressMonitor progressMonitor) {
Runnable save = new Runnable() {
@Override
public void run() {
try {
decompiler.setOutputDir(dir);
ThreadPoolExecutor ex = (ThreadPoolExecutor) decompiler.getSaveExecutor();
ex.shutdown();
while (ex.isTerminating()) {
long total = ex.getTaskCount();
long done = ex.getCompletedTaskCount();
progressMonitor.setProgress((int) (done * 100.0 / (double) total));
Thread.sleep(500);
}
progressMonitor.close();
LOG.info("done");
} catch (InterruptedException e) {
LOG.error("Save interrupted", e);
}
}
};
new Thread(save).start();
}
public List<JavaClass> getClasses() {
return decompiler.getClasses();
}
public List<JavaPackage> getPackages() {
return decompiler.getPackages();
}
public File getOpenFile() {
return openFile;
}
}