jdk-24/test/langtools/jdk/javadoc/doclet/checkLibraryVersions/CheckLibraryVersions.java
Hannes Wallnöfer d0a265039a 8324774: Add DejaVu web fonts
8327385: Add JavaDoc option to exclude web fonts from generated documentation

Reviewed-by: ihse, jjg
2024-03-27 12:20:55 +00:00

155 lines
6.1 KiB
Java

/*
* Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 8293177 8324774
* @summary Verify version numbers in legal files
* @library /test/lib
* @build jtreg.SkippedException
* @run main CheckLibraryVersions
*/
import java.io.IOException;
import java.io.PrintStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
import jtreg.SkippedException;
/**
* Checks the names and version strings of 3rd party libraries in legal files
* against the actual names and versions in library files.
*/
public class CheckLibraryVersions {
static class SourceDirNotFound extends Error {}
// Regex pattern for library name and version in legal Markdown file
static final Pattern versionPattern = Pattern.compile("## ([\\w\\s]+) v(\\d+(\\.\\d+){1,2})");
// Map of 3rd party libraries. The keys are the names of files in the legal directory,
// the values are lists of templates for library files with the following placeholders:
// %V is replaced with the version string
// %M is replaced twice, once with an empty string and once with ".min"
static final Map<String, List<String>> libraries = Map.of(
"jquery.md", List.of("jquery/jquery-%V%M.js"),
"jqueryUI.md", List.of("jquery/jquery-ui%M.js", "jquery/jquery-ui%M.css"),
"dejavufonts.md", List.of("fonts/dejavu.css")
);
public static void main(String... args) throws Exception {
try {
new CheckLibraryVersions().run(args);
} catch (SourceDirNotFound e) {
throw new SkippedException("NOTE: Cannot find src directory; test skipped");
}
}
static final PrintStream out = System.err;
void run(String... args) throws Exception {
var rootDir = args.length == 0 ? findRootDir() : Path.of(args[0]);
var legalDir = rootDir.resolve("src/jdk.javadoc/share/legal");
var scriptDir = rootDir.resolve("src/jdk.javadoc/share/classes")
.resolve("jdk/javadoc/internal/doclets/formats/html")
.resolve("resources");
for (var legalFileName : libraries.keySet()) {
var legalFile = legalDir.resolve(legalFileName);
out.println();
if (!Files.exists(legalFile)) {
error("Legal file not found: " + legalFile);
continue;
}
out.println("Checking legal file: " + legalFile);
var contents = Files.readString(legalFile);
var matcher = versionPattern.matcher(contents);
if (!matcher.find()) {
error("Library name and version not found in " + legalFile);
continue;
}
var libraryName = matcher.group(1);
var versionString = matcher.group(2);
out.println("Found name and version: " + matcher.group(1) + " " + matcher.group(2));
var templates = libraries.get(legalFileName);
for (var template : templates) {
checkLibraryFile(scriptDir, template, libraryName, versionString, "");
if (template.contains("%M")) {
checkLibraryFile(scriptDir, template, libraryName, versionString, ".min");
}
}
}
if (errors > 0) {
out.println(errors + " errors found");
throw new Exception(errors + " errors found");
}
}
void checkLibraryFile(Path scriptDir, String template, String libraryName,
String versionString, String minified) throws IOException {
out.println();
var libraryFileName = template
.replaceAll("%V", versionString)
.replaceAll("%M", minified);
var libraryFile = scriptDir.resolve(libraryFileName);
if (!Files.exists(libraryFile)) {
error("Library file not found: " + libraryFile);
return;
}
out.println("Checking library file: " + libraryFile);
var libraryContents = Files.readString(libraryFile);
var pattern = Pattern.compile("\\b" + libraryName + "[^\\n]* v" + versionString + "\\b");
var matcher = pattern.matcher(libraryContents);
if (!matcher.find()) {
error("Matching library name and version not found in " + libraryFileName);
return;
}
out.println("Found matching name and version: " + matcher.group());
}
int errors = 0;
void error(String message) {
("Error: " + message).lines().forEach(out::println);
errors++;
}
Path findRootDir() {
Path dir = Path.of(System.getProperty("test.src", ".")).toAbsolutePath();
while (dir != null) {
if (Files.exists(dir.resolve("src").resolve("jdk.javadoc"))) {
return dir;
} else {
Path openDir = dir.resolve("open");
if (Files.exists(openDir.resolve("src").resolve("jdk.javadoc"))) {
return openDir;
}
}
dir = dir.getParent();
}
throw new SourceDirNotFound();
}
}