package org.jboss.windup.rules.apps.java.decompiler; import java.io.File; import java.nio.file.Paths; import org.apache.commons.lang3.StringUtils; import org.jboss.windup.graph.GraphContext; import org.jboss.windup.graph.model.WindupConfigurationModel; import org.jboss.windup.graph.service.WindupConfigurationService; import org.jboss.windup.rules.apps.java.model.JavaClassFileModel; import org.jboss.windup.util.PathUtil; /** * @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a> */ public class DecompilerUtil { /** * Returns an appropriate output directory for the decompiled data based upon the provided {@link JavaClassFileModel}. * * This should be the top-level directory for the package (eg, /tmp/project/foo for the file /tmp/project/foo/com/example/Foo.class). * * This could be the same directory as the file itself, if the file is already in the output directory. If the .class file is referencing a file * in the input directory, then this will be a classes folder underneath the output directory. */ static File getOutputDirectoryForClass(GraphContext context, JavaClassFileModel fileModel) { final File result; WindupConfigurationModel configuration = WindupConfigurationService.getConfigurationModel(context); File inputPath = fileModel.getProjectModel().getRootProjectModel().getRootFileModel().asFile(); if (PathUtil.isInSubDirectory(inputPath, fileModel.asFile())) { String outputPath = configuration.getOutputPath().getFilePath(); result = Paths.get(outputPath).resolve("classes").toFile(); } else { String packageName = fileModel.getPackageName(); if (StringUtils.isBlank(packageName)) return fileModel.asFile().getParentFile(); String[] packageComponents = packageName.split("\\."); File rootFile = fileModel.asFile().getParentFile(); for (int i = 0; i < packageComponents.length; i++) { rootFile = rootFile.getParentFile(); } result = rootFile; } return result; } }