package org.jboss.windup.reporting.freemarker.problemsummary;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import org.jboss.windup.config.GraphRewrite;
import org.jboss.windup.graph.GraphContext;
import org.jboss.windup.graph.model.ProjectModel;
import org.jboss.windup.graph.traversal.OnlyOnceTraversalStrategy;
import org.jboss.windup.graph.traversal.ProjectModelTraversal;
import org.jboss.windup.reporting.freemarker.FreeMarkerUtil;
import org.jboss.windup.reporting.freemarker.WindupFreeMarkerMethod;
import freemarker.ext.beans.StringModel;
import freemarker.template.SimpleSequence;
import freemarker.template.TemplateModelException;
import org.jboss.windup.reporting.category.IssueCategoryModel;
/**
* Returns a summary of all classification and hints found during analysis in the form of a List<ProblemSummary>.
*
* @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a>
*/
public class GetProblemSummariesMethod implements WindupFreeMarkerMethod
{
private GraphContext context;
@Override
public String getDescription()
{
return "Returns a summary of all classification and hints found during analysis in the form of a List<"
+ ProblemSummary.class.getSimpleName() + ">.";
}
@Override
public Object exec(List arguments) throws TemplateModelException
{
if (arguments.isEmpty())
throw new TemplateModelException("Method " + getMethodName() + " requires the following parameters (GraphRewrite event, ProjectModel project, Set<String> includeTags, Set<String> excludeTags)");
// Gets the graph rewrite event
final GraphRewrite event = (GraphRewrite)((StringModel)arguments.get(0)).getWrappedObject();
// Get the project if one was passed in
final ProjectModel projectModel;
StringModel projectModelArg = (StringModel) arguments.get(1);
if (projectModelArg == null)
projectModel = null;
else
projectModel = (ProjectModel) projectModelArg.getWrappedObject();
Set<String> includeTags = FreeMarkerUtil.simpleSequenceToSet((SimpleSequence) arguments.get(2));
Set<String> excludeTags = FreeMarkerUtil.simpleSequenceToSet((SimpleSequence) arguments.get(3));
Set<ProjectModel> projectModels = getProjects(projectModel);
Map<IssueCategoryModel, List<ProblemSummary>> problemSummariesOriginal = ProblemSummaryService.getProblemSummaries(event.getGraphContext(), projectModels, includeTags,
excludeTags);
// Convert the keys to String to make Freemarker happy
Comparator<IssueCategoryModel> severityComparator = new IssueCategoryModel.IssueSummaryPriorityComparator();
Map<IssueCategoryModel, List<ProblemSummary>> problemSummaries = new TreeMap<>(severityComparator);
problemSummaries.putAll(problemSummariesOriginal);
Map<String, List<ProblemSummary>> primarySummariesByString = new LinkedHashMap<>(problemSummariesOriginal.size());
for (Map.Entry<IssueCategoryModel, List<ProblemSummary>> entry : problemSummaries.entrySet())
{
String severityString = entry.getKey() == null ? null : entry.getKey().getName();
primarySummariesByString.put(severityString, entry.getValue());
}
return primarySummariesByString;
}
private Set<ProjectModel> getProjects(ProjectModel projectModel)
{
if (projectModel == null)
return null;
ProjectModelTraversal traversal = new ProjectModelTraversal(projectModel, new OnlyOnceTraversalStrategy());
return traversal.getAllProjects(true);
}
@Override
public void setContext(GraphRewrite event)
{
this.context = event.getGraphContext();
}
}