package org.jboss.windup.decompiler.fernflower; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import org.jboss.windup.decompiler.DecompilerTestBase; import org.jboss.windup.decompiler.api.ClassDecompileRequest; import org.jboss.windup.decompiler.api.DecompilationException; import org.jboss.windup.decompiler.api.DecompilationListener; import org.jboss.windup.decompiler.api.DecompilationResult; import org.jboss.windup.decompiler.api.Decompiler; import org.jboss.windup.decompiler.util.ZipUtil; import org.junit.Assert; import org.junit.Test; /** * * @author <a href="mailto:ozizka@redhat.com">Ondrej Zizka</a> * @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a> */ public class FernflowerDecompilerTest extends DecompilerTestBase { @Override protected Decompiler getDecompiler() { return new FernflowerDecompiler(); } @Override protected boolean isResultValid(DecompilationResult res) { return (res.getFailures().size() == 1); } /** * Tests the {@link FernflowerDecompiler#decompileClassFiles(Collection, DecompilationListener)} method. */ @Test public void testDecompileClassFiles() throws DecompilationException, IOException { final Decompiler dec = this.getDecompiler(); Path archive = Paths.get("target/TestJars/wicket-core-6.11.0.jar"); Path decompDir = testTempDir.resolve("decompiled"); Path unzipDir = testTempDir.resolve("unzipped"); ZipUtil.unzip(archive.toFile(), unzipDir.toFile()); // DECOMPILE Path classFile1 = unzipDir.resolve("org/apache/wicket/ajax/AbstractAjaxResponse.class"); Path classFile2 = unzipDir.resolve("org/apache/wicket/ajax/AbstractAjaxResponse$1.class"); Path classFile3 = unzipDir.resolve("org/apache/wicket/ajax/AbstractAjaxResponse$AjaxResponse.class"); Path classFile4 = unzipDir.resolve("org/apache/wicket/ajax/AbstractAjaxResponse$AjaxHeaderResponse.class"); Path classFile5 = unzipDir.resolve("org/apache/wicket/ajax/AbstractAjaxResponse$AjaxHtmlHeaderContainer.class"); List<ClassDecompileRequest> requests = new ArrayList<>(); requests.add(new ClassDecompileRequest(unzipDir, classFile1, decompDir)); requests.add(new ClassDecompileRequest(unzipDir, classFile2, decompDir)); requests.add(new ClassDecompileRequest(unzipDir, classFile3, decompDir)); requests.add(new ClassDecompileRequest(unzipDir, classFile4, decompDir)); requests.add(new ClassDecompileRequest(unzipDir, classFile5, decompDir)); final AtomicInteger numberDecompiled = new AtomicInteger(0); DecompilationListener listener = new DecompilationListener() { @Override public void fileDecompiled(List<String> inputPath, String outputPath) { Assert.assertNotNull("Results object was returned.", outputPath); numberDecompiled.incrementAndGet(); } @Override public void decompilationFailed(List<String> inputPath, String message) { System.out.println("Failed for input: " + inputPath + " due to: " + message); } @Override public void decompilationProcessComplete() { System.out.println("Decompilation complete!"); } }; dec.decompileClassFiles(requests, listener); dec.close(); Assert.assertTrue(numberDecompiled.get() > 0); } }