package org.jboss.windup.rules.apps.java.reporting.freemarker;
import java.util.ArrayList;
import java.util.List;
import org.jboss.windup.config.GraphRewrite;
import org.jboss.windup.reporting.freemarker.WindupFreeMarkerMethod;
import org.jboss.windup.rules.apps.java.model.AbstractJavaSourceModel;
import org.jboss.windup.rules.apps.java.model.AmbiguousJavaClassModel;
import org.jboss.windup.rules.apps.java.model.JavaClassModel;
import org.jboss.windup.rules.apps.java.model.JavaSourceFileModel;
import org.jboss.windup.rules.apps.java.service.JavaClassService;
import freemarker.template.SimpleScalar;
import freemarker.template.TemplateModelException;
/**
* A Freemarker method for finding a source for a class by it's name.
*/
public class FindSourceFilesByClassNameMethod implements WindupFreeMarkerMethod
{
private JavaClassService javaClassService;
@Override
public Object exec(@SuppressWarnings("rawtypes") List arguments) throws TemplateModelException
{
if (arguments.size() != 1)
{
throw new TemplateModelException("Error, method expects one argument (String)");
}
SimpleScalar arg = (SimpleScalar) arguments.get(0);
String qualifedClassName = arg.getAsString();
JavaClassModel classModel = javaClassService.getByName(qualifedClassName);
List<AbstractJavaSourceModel> results = new ArrayList<>();
if (classModel instanceof AmbiguousJavaClassModel)
{
AmbiguousJavaClassModel ambiguousJavaClassModel = (AmbiguousJavaClassModel) classModel;
for (JavaClassModel referencedClass : ambiguousJavaClassModel.getReferences())
{
addSourceFilesToResult(results, referencedClass);
}
}
else
{
addSourceFilesToResult(results, classModel);
}
return results;
}
private void addSourceFilesToResult(List<AbstractJavaSourceModel> results, JavaClassModel referencedClass)
{
AbstractJavaSourceModel decompiledSource = referencedClass.getDecompiledSource();
AbstractJavaSourceModel originalSource = referencedClass.getOriginalSource();
if (decompiledSource != null)
{
results.add(decompiledSource);
}
if (originalSource != null)
{
results.add(originalSource);
}
}
@Override
public String getDescription()
{
return "Finds all " + JavaSourceFileModel.class.getSimpleName() + "s for the given fully qualified class name";
}
@Override
public void setContext(GraphRewrite event)
{
this.javaClassService = new JavaClassService(event.getGraphContext());
}
}