docs: 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(new ArrayList<>(projectModels));
          for (InlineHintModel hint : hints)
          {
              if (hint.getIssueDisplayMode() == IssueDisplayMode.DETAIL_ONLY)
                  continue;
  
              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())
          {
              if (classification.getIssueDisplayMode() == IssueDisplayMode.DETAIL_ONLY)
                  continue;
  
              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;
      }