package org.jboss.windup.reporting.freemarker.problemsummary;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.UUID;
import org.jboss.windup.graph.GraphContext;
import org.jboss.windup.graph.model.LinkModel;
import org.jboss.windup.graph.model.ProjectModel;
import org.jboss.windup.graph.model.resource.FileModel;
import org.jboss.windup.reporting.TagUtil;
import org.jboss.windup.reporting.model.ClassificationModel;
import org.jboss.windup.reporting.model.InlineHintModel;
import org.jboss.windup.reporting.service.ClassificationService;
import org.jboss.windup.reporting.service.InlineHintService;
import org.jboss.windup.reporting.category.IssueCategoryModel;
/**
* Gets information about incidents found during the analysis and provides methods for summarizing and analyzing
* this data.
*
* @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a>
* @author <a href="mailto:zizka@seznam.cz">Ondrej Zizka</a>
*/
public class ProblemSummaryService
{
/**
* Gets lists of {@link ProblemSummary} objects organized by {@link IssueCategoryModel}.
*/
public static Map<IssueCategoryModel, List<ProblemSummary>> getProblemSummaries(
GraphContext graphContext,
Set<ProjectModel> projectModels,
Set<String> includeTags,
Set<String> excludeTags)
{
return getProblemSummaries(graphContext, projectModels, includeTags, excludeTags, false, false);
}
/**
* Gets lists of {@link ProblemSummary} objects organized by {@link IssueCategoryModel}.
*/
public static Map<IssueCategoryModel, List<ProblemSummary>> getProblemSummaries(GraphContext graphContext, Set<ProjectModel> projectModels, Set<String> includeTags,
Set<String> excludeTags,
boolean strictComparison,
boolean strictExclude)
{
// The key is the severity as a String
Map<IssueCategoryModel, List<ProblemSummary>> results = new TreeMap<>(new IssueCategoryModel.IssueSummaryPriorityComparator());
Map<RuleSummaryKey, ProblemSummary> ruleToSummary = new HashMap<>();
InlineHintService hintService = new InlineHintService(graphContext);
final Iterable<InlineHintModel> hints = projectModels == null ? hintService.findAll() : hintService.getHintsForProjects(projectModels);
for (InlineHintModel hint : hints)
{
Set<String> tags = hint.getTags();
boolean hasTagMatch;
if (strictComparison)
{
hasTagMatch = TagUtil.strictCheckMatchingTags(tags, includeTags, excludeTags);
}
else
{
hasTagMatch = TagUtil.checkMatchingTags(tags, includeTags, excludeTags, strictExclude);
}
if (!hasTagMatch)
{
continue;
}
RuleSummaryKey key = new RuleSummaryKey(hint.getEffort(), hint.getRuleID(), hint.getTitle());
ProblemSummary summary = ruleToSummary.get(key);
if (summary == null)
{
summary = new ProblemSummary(UUID.randomUUID().toString(), hint.getIssueCategory(), hint.getRuleID(), hint.getTitle(), 1, hint.getEffort());
for (LinkModel link : hint.getLinks())
{
summary.addLink(link.getDescription(), link.getLink());
}
ruleToSummary.put(key, summary);
addToResults(results, summary);
}
else
{
summary.setNumberFound(summary.getNumberFound() + 1);
}
summary.addFile(hint.getHint(), hint.getFile());
}
ClassificationService classificationService = new ClassificationService(graphContext);
for (ClassificationModel classification : classificationService.findAll())
{
Set<String> tags = classification.getTags();
if (!TagUtil.checkMatchingTags(tags, includeTags, excludeTags, false))
continue;
List<FileModel> newFileModels = new ArrayList<>();
for (FileModel file : classification.getFileModels())
{
if (projectModels != null)
{
// make sure this one is in the project
if (!projectModels.contains(file.getProjectModel()))
continue;
}
newFileModels.add(file);
}
if (newFileModels.isEmpty())
continue;
RuleSummaryKey key = new RuleSummaryKey(classification.getEffort(), classification.getRuleID(), classification.getClassification());
ProblemSummary summary = ruleToSummary.get(key);
if (summary == null)
{
summary = new ProblemSummary(UUID.randomUUID().toString(), classification.getIssueCategory(), classification.getRuleID(),
classification.getClassification(),
0, classification.getEffort());
for (LinkModel link : classification.getLinks())
{
summary.addLink(link.getDescription(), link.getLink());
}
ruleToSummary.put(key, summary);
addToResults(results, summary);
}
for (FileModel file : newFileModels)
summary.addFile(classification.getDescription(), file);
summary.setNumberFound(summary.getNumberFound() + newFileModels.size());
}
return results;
}
private static void addToResults(Map<IssueCategoryModel, List<ProblemSummary>> results, ProblemSummary summary)
{
List<ProblemSummary> list = results.get(summary.getIssueCategoryModel());
if (list == null)
{
list = new ArrayList<>();
results.put(summary.getIssueCategoryModel(), list);
}
list.add(summary);
}
}