package org.jboss.windup.reporting.freemarker.problemsummary; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.jboss.windup.graph.model.resource.FileModel; import org.jboss.windup.reporting.config.Link; import org.jboss.windup.reporting.category.IssueCategoryModel; /** * @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a> * @author <a href="mailto:zizka@seznam.cz">Ondrej Zizka</a> */ public class ProblemSummary { private final Object id; private final IssueCategoryModel issueCategoryModel; private final String ruleID; private final String issueName; private int numberFound; private final int effortPerIncident; private final Map<String, Map<FileModel, ProblemFileSummary>> descriptionToFiles = new LinkedHashMap<>(); private final List<Link> links = new ArrayList<>(); /** * Creates a new instance with the given information. */ public ProblemSummary(Object id, IssueCategoryModel issueCategoryModel, String ruleID, String issueName, int numberFound, int effortPerIncident) { this.id = id; this.issueCategoryModel = issueCategoryModel; this.ruleID = ruleID; this.issueName = issueName; this.numberFound = numberFound; this.effortPerIncident = effortPerIncident; } /** * Returns the unique identifier for this summary. */ public Object getId() { return id; } /** * Returns the {@link IssueCategoryModel} for this summary. This generally represents the severity of the issue. */ public IssueCategoryModel getIssueCategoryModel() { return issueCategoryModel; } /** * Contains the original rule id. */ public String getRuleID() { return ruleID; } /** * Contains the issue name. */ public String getIssueName() { return issueName; } /** * Contains the number of incidents found for this issue. */ public int getNumberFound() { return numberFound; } /** * Sets the number found for this issue. */ void setNumberFound(int numberFound) { this.numberFound = numberFound; } /** * Returns the effort points per incident. */ public int getEffortPerIncident() { return effortPerIncident; } /** * Gets the descriptions found for this rule. */ public Iterable<String> getDescriptions() { return descriptionToFiles.keySet(); } /** * Gets the files associated with a particular description. */ public Iterable<ProblemFileSummary> getFilesForDescription(String description) { return descriptionToFiles.get(description).values(); } private Map<FileModel, ProblemFileSummary> addDescription(String description) { Map<FileModel, ProblemFileSummary> files = descriptionToFiles.get(description); if (files == null) { files = new LinkedHashMap<>(); descriptionToFiles.put(description, files); } return files; } public void addLink(Link link) { this.links.add(link); } public void addLink(String label, String url) { this.links.add(Link.to(label, url)); } public List<Link> getLinks() { return links; } /** * Adds a file with the provided description. */ public void addFile(String description, FileModel fileModel) { Map<FileModel, ProblemFileSummary> files = addDescription(description); if (files.containsKey(fileModel)) { files.get(fileModel).addOccurrence(); } else { files.put(fileModel, new ProblemFileSummary(fileModel, 1)); } } }