package org.jboss.windup.reporting.freemarker;
import java.util.Collections;
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.traversal.ProjectModelTraversal;
import org.jboss.windup.reporting.service.ClassificationService;
import org.jboss.windup.reporting.service.InlineHintService;
import org.jboss.windup.reporting.category.IssueCategoryModel;
import org.jboss.windup.util.ExecutionStatistics;
import freemarker.ext.beans.StringModel;
import freemarker.template.SimpleSequence;
import freemarker.template.TemplateBooleanModel;
import freemarker.template.TemplateModelException;
/**
* Gets the number of incidents involved in migrating this application
*
* Called from a freemarker template as follows:
*
* <pre>
* getEffortCountForProjectByIssueCategory(GraphRewrite, ProjectModelTraversal, recursive) : Map<String, int>
* </pre>
*
* If recursive is true, the effort total includes child projects.
*
* @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a>
*
*/
public class GetEffortCountForProjectByIssueCategoryMethod implements WindupFreeMarkerMethod
{
private static final String NAME = "getEffortCountForProjectByIssueCategory";
private ClassificationService classificationService;
private InlineHintService inlineHintService;
@Override
public void setContext(GraphRewrite event)
{
this.classificationService = new ClassificationService(event.getGraphContext());
this.inlineHintService = new InlineHintService(event.getGraphContext());
}
@Override
public String getMethodName()
{
return NAME;
}
@Override
public String getDescription()
{
return "Parameters are (GraphRewrite, ProjectModelTraversal, [recursive]) and returns Map<String, int> where the key is the Severity and the value is the number of incidents of that severity.";
}
@Override
public Object exec(@SuppressWarnings("rawtypes") List arguments) throws TemplateModelException
{
ExecutionStatistics.get().begin(NAME);
if (arguments.size() < 3)
{
throw new TemplateModelException(
"Error, method expects at least three arguments (event:GraphRewrite, projectModelTraversal:ProjectModelTraversal, recursive:Boolean, [includeTags:Set<String>]. [excludeTags:Set<String>])");
}
GraphRewrite event = (GraphRewrite)((StringModel)arguments.get(0)).getWrappedObject();
StringModel projectModelTraversalArg = (StringModel) arguments.get(1);
ProjectModelTraversal traversal = (ProjectModelTraversal) projectModelTraversalArg.getWrappedObject();
TemplateBooleanModel recursiveBooleanModel = (TemplateBooleanModel) arguments.get(2);
boolean recursive = recursiveBooleanModel.getAsBoolean();
Set<String> includeTags = Collections.emptySet();
if (arguments.size() >= 4)
{
includeTags = FreeMarkerUtil.simpleSequenceToSet((SimpleSequence) arguments.get(3));
}
Set<String> excludeTags = Collections.emptySet();
if (arguments.size() >= 5)
{
excludeTags = FreeMarkerUtil.simpleSequenceToSet((SimpleSequence) arguments.get(4));
}
Map<IssueCategoryModel, Integer> classificationEffortDetails = classificationService.getMigrationEffortBySeverity(event, traversal, includeTags,
excludeTags, recursive);
Map<IssueCategoryModel, Integer> hintEffortDetails = inlineHintService.getMigrationEffortBySeverity(event, traversal, includeTags, excludeTags,
recursive);
Map<IssueCategoryModel, Integer> results = new TreeMap<>(new IssueCategoryModel.IssueSummaryPriorityComparator());
addAllIncidents(results, classificationEffortDetails);
addAllIncidents(results, hintEffortDetails);
ExecutionStatistics.get().end(NAME);
return results;
}
private void addAllIncidents(Map<IssueCategoryModel, Integer> results, Map<IssueCategoryModel, Integer> effortDetails)
{
for (Map.Entry<IssueCategoryModel, Integer> entry : effortDetails.entrySet())
{
if (!results.containsKey(entry.getKey()))
results.put(entry.getKey(), entry.getValue());
else
results.put(entry.getKey(), results.get(entry.getKey()) + entry.getValue());
}
}
}