private static ArtifactResults generateArtifactReport()

in dashboard/src/main/java/com/google/cloud/tools/opensource/dashboard/DashboardMain.java [353:419]


  private static ArtifactResults generateArtifactReport(
      Configuration configuration,
      Path output,
      Artifact artifact,
      ArtifactInfo artifactInfo,
      List<DependencyGraph> globalDependencies,
      ImmutableMap<ClassPathEntry, ImmutableSet<LinkageProblem>> linkageProblemTable,
      ClassPathResult classPathResult,
      Bom bom)
      throws IOException, TemplateException {

    String coordinates = Artifacts.toCoordinates(artifact);
    File outputFile = output.resolve(coordinates.replace(':', '_') + ".html").toFile();

    try (Writer out = new OutputStreamWriter(
        new FileOutputStream(outputFile), StandardCharsets.UTF_8)) {

      // includes all versions
      DependencyGraph graph = artifactInfo.getCompleteDependencies();
      List<Update> convergenceIssues = graph.findUpdates();

      // picks versions according to Maven rules
      DependencyGraph transitiveDependencies = artifactInfo.getTransitiveDependencies();

      Map<Artifact, Artifact> upperBoundFailures =
          findUpperBoundsFailures(graph.getHighestVersionMap(), transitiveDependencies);

      Map<Artifact, Artifact> globalUpperBoundFailures = findUpperBoundsFailures(
          collectLatestVersions(globalDependencies), transitiveDependencies);

      long totalLinkageErrorCount =
          linkageProblemTable.values().stream()
              .flatMap(problemToClasses -> problemToClasses.stream().map(LinkageProblem::getSymbol))
              .distinct() // The dashboard counts linkage errors by the symbols
              .count();

      Template report = configuration.getTemplate("/templates/component.ftl");

      Map<String, Object> templateData = new HashMap<>();

      DefaultObjectWrapper wrapper =
          new DefaultObjectWrapperBuilder(Configuration.VERSION_2_3_28).build();
      TemplateHashModel staticModels = wrapper.getStaticModels();
      templateData.put("linkageProblem", staticModels.get(LinkageProblem.class.getName()));

      templateData.put("artifact", artifact);
      templateData.put("updates", convergenceIssues);
      templateData.put("upperBoundFailures", upperBoundFailures);
      templateData.put("globalUpperBoundFailures", globalUpperBoundFailures);
      templateData.put("lastUpdated", LocalDateTime.now());
      templateData.put("dependencyGraph", graph);
      templateData.put("linkageProblems", linkageProblemTable);
      templateData.put("classPathResult", classPathResult);
      templateData.put("totalLinkageErrorCount", totalLinkageErrorCount);
      templateData.put("coordinates", bom.getCoordinates());

      report.process(templateData, out);

      ArtifactResults results = new ArtifactResults(artifact);
      results.addResult(TEST_NAME_UPPER_BOUND, upperBoundFailures.size());
      results.addResult(TEST_NAME_GLOBAL_UPPER_BOUND, globalUpperBoundFailures.size());
      results.addResult(TEST_NAME_DEPENDENCY_CONVERGENCE, convergenceIssues.size());
      results.addResult(TEST_NAME_LINKAGE_CHECK, (int) totalLinkageErrorCount);

      return results;
    }
  }