package org.jboss.windup.rules.apps.java.decompiler;
import org.jboss.windup.config.operation.GraphOperation;
import org.jboss.windup.graph.GraphContext;
import org.jboss.windup.graph.model.resource.FileModel;
import org.jboss.windup.graph.service.FileService;
import org.jboss.windup.graph.service.GraphService;
import org.jboss.windup.rules.apps.java.model.JavaClassFileModel;
import org.jboss.windup.rules.apps.java.model.JavaSourceFileModel;
import java.nio.file.Paths;
import java.util.List;
/**
* An abstract operation providing some default methods useful for the DecompilerOperations.
*
* @author <a href="mailto:mbriskar@gmail.com">Matej Briskar</a>
*/
abstract public class AbstractDecompilerOperation extends GraphOperation
{
private Iterable<JavaClassFileModel> filesToDecompile;
Iterable<JavaClassFileModel> getFilesToDecompile(GraphContext context)
{
if (this.filesToDecompile == null)
{
filesToDecompile= getDefaultFilesToDecompile(context);
}
return filesToDecompile;
}
/**
* Method that will set files that should be decompiled when the operation will operate. In case any are specified, the operation will take
* all .class files that were not marked to be skipped.
* @param filesToDecompile
*/
public void setFilesToDecompile(Iterable<JavaClassFileModel> filesToDecompile)
{
this.filesToDecompile = filesToDecompile;
}
private Iterable<JavaClassFileModel> getDefaultFilesToDecompile(GraphContext context) {
GraphService<JavaClassFileModel> classFileService = new GraphService<>(context, JavaClassFileModel.class);
return classFileService.findAllWithoutProperty(JavaClassFileModel.SKIP_DECOMPILATION, true);
}
protected void setupClassToJavaConnections(GraphContext context,List<String> classFilesPaths, JavaSourceFileModel decompiledJavaFile)
{
FileService fileService = new FileService(context);
for(String classFilePath : classFilesPaths) {
FileModel classFileModel = fileService.getUniqueByProperty(
FileModel.FILE_PATH, Paths.get(classFilePath).toAbsolutePath().toString());
if(classFileModel instanceof JavaClassFileModel) {
JavaClassFileModel javaClassFileModel = (JavaClassFileModel) classFileModel;
javaClassFileModel.getJavaClass().setDecompiledSource(decompiledJavaFile);
}
}
}
}