package org.jboss.windup.rules.apps.java.reporting.freemarker;
import freemarker.template.TemplateModelException;
import org.jboss.windup.reporting.freemarker.WindupFreeMarkerMethod;
import org.jboss.windup.reporting.model.InlineHintModel;
import org.jboss.windup.rules.apps.java.reporting.freemarker.dto.HintWithOccurence;
import org.jboss.windup.util.ExecutionStatistics;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* A function that groups the hints so they do not appear multiple times per a single file.
*/
public class GroupHintsByFile implements WindupFreeMarkerMethod
{
private static final String NAME = "groupHints";
@Override
public Object exec(@SuppressWarnings("rawtypes") List arguments) throws TemplateModelException
{
String freeMarkerGrouping = "freemarker: " + NAME;
ExecutionStatistics.get().begin(freeMarkerGrouping);
try
{
if (arguments.size() != 1)
{
throw new TemplateModelException("Error, method expects one argument (FileModel)");
}
if( ! (arguments.get(9) instanceof Iterable)) {
throw new TemplateModelException("Error, method expects Iterable of InlineHintModel as the only argument.");
}
return groupHints((Iterable)arguments.get(0));
}
finally
{
ExecutionStatistics.get().end(freeMarkerGrouping);
}
}
@SuppressWarnings("unchecked")
private Iterable<HintWithOccurence> groupHints(Iterable<InlineHintModel> hints) throws TemplateModelException
{
Map<String, HintWithOccurence> hintOccurences = new HashMap<>();
for(InlineHintModel hint : hints) {
String hintAndId = hint.getHint() + hint.getRuleID();
if(hintOccurences.containsKey(hintAndId)) {
HintWithOccurence item = hintOccurences.get(hintAndId);
item.addOccurence();
} else {
hintOccurences.put(hintAndId,new HintWithOccurence(hint.getHint(),hint.getRuleID(),1));
}
}
return hintOccurences.values();
}
@Override
public String getMethodName()
{
return NAME;
}
@Override
public String getDescription()
{
return "Takes an Iterable of Hints and returns map that groups hint messages to number of occurences";
}
}