package org.jboss.windup.decompiler.fernflower; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.List; import java.util.jar.Manifest; import org.jboss.windup.decompiler.api.DecompilationListener; import org.jetbrains.java.decompiler.main.extern.IResultSaver; /** * This handles saving the resutls after fernflower completes the decompilation of one (or more) .class files. * * @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a> */ public class FernFlowerResultSaver implements IResultSaver { private final List<String> sourceClassFiles; private final File outputDirectory; private final DecompilationListener listener; private boolean fileSaved = false; /** * Creates a {@link IResultSaver} for this single classfile. Each instance should not be reused. */ public FernFlowerResultSaver(List<String> sourceClassFiles, File outputDir, DecompilationListener listener) { this.sourceClassFiles = sourceClassFiles; this.outputDirectory = outputDir; this.listener = listener; } /** * Indicates that this file */ public boolean isFileSaved() { return fileSaved; } @Override public void saveClassFile(String path, String qualifiedName, String entryName, String content, int[] mapping) { File outputFile = new File(outputDirectory, qualifiedName + ".java"); try { if (!outputFile.getParentFile().isDirectory()) outputFile.getParentFile().mkdirs(); try (FileWriter fw = new FileWriter(outputFile)) { fw.write(content); } if (listener != null) listener.fileDecompiled(sourceClassFiles, outputFile.toString()); fileSaved = true; } catch (IOException t) { if (listener != null) listener.decompilationFailed(sourceClassFiles, t.getMessage()); } } @Override public void saveFolder(String path) { // Not implemented as it is not needed for our Fernflower usage. } @Override public void copyFile(String source, String path, String entryName) { // Not implemented as it is not needed for our Fernflower usage. } @Override public void createArchive(String path, String archiveName, Manifest manifest) { // Not implemented as it is not needed for our Fernflower usage. } @Override public void saveDirEntry(String path, String archiveName, String entryName) { // Not implemented as it is not needed for our Fernflower usage. } @Override public void copyEntry(String source, String path, String archiveName, String entry) { // Not implemented as it is not needed for our Fernflower usage. } @Override public void saveClassEntry(String path, String archiveName, String qualifiedName, String entryName, String content) { // Not implemented as it is not needed for our Fernflower usage. } @Override public void closeArchive(String path, String archiveName) { // Not implemented as it is not needed for our Fernflower usage. } }