/* * Copyright 2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.gradle.api.reporting.dependencies.internal; import org.gradle.api.Project; import org.gradle.api.Transformer; import org.gradle.api.internal.artifacts.ivyservice.ivyresolve.strategy.VersionComparator; import org.gradle.api.internal.artifacts.ivyservice.ivyresolve.strategy.VersionSelectorScheme; import org.gradle.reporting.HtmlReportBuilder; import org.gradle.reporting.HtmlReportRenderer; import org.gradle.reporting.ReportRenderer; import org.gradle.util.GFileUtils; import java.io.File; import java.util.Set; /** * Class responsible for the generation of an HTML dependency report. * <p> * The strategy is the following. The reporter uses an HTML template file containing a * placeholder <code>@js@</code>. For every project, it generates a JSON structure containing * all the data that must be displayed by the report. A JS file declaring a single variable, containing * this JSON structure, is then generated for the project. An HTML file is then generated from the template, * by replacing a placeholder @js@ by the name of the generated JS file. * The HTML file uses a JavaScript script to generate an interactive page from the data contained in * the JSON structure. * <p> * * @see JsonProjectDependencyRenderer */ public class HtmlDependencyReporter extends ReportRenderer<Set<Project>, File> { private File outputDirectory; private final JsonProjectDependencyRenderer renderer; public HtmlDependencyReporter(VersionSelectorScheme versionSelectorScheme, VersionComparator versionComparator) { renderer = new JsonProjectDependencyRenderer(versionSelectorScheme, versionComparator); } @Override public void render(final Set<Project> projects, File outputDirectory) { this.outputDirectory = outputDirectory; HtmlReportRenderer renderer = new HtmlReportRenderer(); renderer.render(projects, new ReportRenderer<Set<Project>, HtmlReportBuilder>() { @Override public void render(Set<Project> model, HtmlReportBuilder builder) { Transformer<String, Project> htmlPageScheme = projectNamingScheme("html"); Transformer<String, Project> jsScheme = projectNamingScheme("js"); ProjectPageRenderer projectPageRenderer = new ProjectPageRenderer(jsScheme); builder.renderRawHtmlPage("index.html", projects, new ProjectsPageRenderer(htmlPageScheme)); for (Project project : projects) { String jsFileName = jsScheme.transform(project); generateJsFile(project, jsFileName); String htmlFileName = htmlPageScheme.transform(project); builder.renderRawHtmlPage(htmlFileName, project, projectPageRenderer); } } }, outputDirectory); } private void generateJsFile(Project project, String fileName) { String json = renderer.render(project); String content = "var projectDependencyReport = " + json + ";"; GFileUtils.writeFile(content, new File(outputDirectory, fileName), "utf-8"); } private Transformer<String, Project> projectNamingScheme(final String extension) { return new Transformer<String, Project>() { public String transform(Project project) { return toFileName(project, "." + extension); } }; } private String toFileName(Project project, String extension) { String name = project.getPath(); if (name.equals(":")) { return "root" + extension; } return "root" + name.replace(":", ".") + extension; } }