8299627: Fix/improve handling of "missing" element-list file
Reviewed-by: hannesw
This commit is contained in:
parent
1007618f6f
commit
b533272ecb
@ -252,6 +252,7 @@ doclet.linkMismatch_PackagedLinkedtoModule=The code being documented uses packag
|
|||||||
doclet.linkMismatch_ModuleLinkedtoPackage=The code being documented uses modules but the packages defined \
|
doclet.linkMismatch_ModuleLinkedtoPackage=The code being documented uses modules but the packages defined \
|
||||||
in {0} are in the unnamed module.
|
in {0} are in the unnamed module.
|
||||||
doclet.urlRedirected=URL {0} was redirected to {1} -- Update the command-line options to suppress this warning.
|
doclet.urlRedirected=URL {0} was redirected to {1} -- Update the command-line options to suppress this warning.
|
||||||
|
doclet.unexpectedRedirect=Unexpected redirection for URL {0} to {1}
|
||||||
doclet.duplicate.comment.for.property=Duplicate comment for property.\n\
|
doclet.duplicate.comment.for.property=Duplicate comment for property.\n\
|
||||||
Remove the comment on the property field or on this method to suppress this warning.
|
Remove the comment on the property field or on this method to suppress this warning.
|
||||||
|
|
||||||
|
@ -668,13 +668,24 @@ public class Extern {
|
|||||||
} while (redir);
|
} while (redir);
|
||||||
|
|
||||||
if (!url.equals(conn.getURL())) {
|
if (!url.equals(conn.getURL())) {
|
||||||
configuration.getReporter().print(Kind.WARNING,
|
if (!getLastPathComponent(conn.getURL()).equals(getLastPathComponent(url))) {
|
||||||
resources.getText("doclet.urlRedirected", url, conn.getURL()));
|
configuration.getReporter().print(Kind.ERROR,
|
||||||
|
resources.getText("doclet.unexpectedRedirect", url, conn.getURL()));
|
||||||
|
} else {
|
||||||
|
configuration.getReporter().print(Kind.WARNING,
|
||||||
|
resources.getText("doclet.urlRedirected", url, conn.getURL()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return in;
|
return in;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String getLastPathComponent(URL u) {
|
||||||
|
var path = u.getPath();
|
||||||
|
var sep = path.lastIndexOf('/');
|
||||||
|
return sep == -1 ? path : path.substring(sep + 1);
|
||||||
|
}
|
||||||
|
|
||||||
private void printModularityMismatchDiagnostic(String key, Object arg) {
|
private void printModularityMismatchDiagnostic(String key, Object arg) {
|
||||||
switch (configuration.getOptions().linkModularityMismatch()) {
|
switch (configuration.getOptions().linkModularityMismatch()) {
|
||||||
case INFO -> configuration.getMessages().notice(key, arg);
|
case INFO -> configuration.getMessages().notice(key, arg);
|
||||||
|
@ -0,0 +1,179 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2023, 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 8299627
|
||||||
|
* @summary Fix/improve handling of "missing" element-list file
|
||||||
|
* @library /tools/lib ../../lib
|
||||||
|
* @modules jdk.javadoc/jdk.javadoc.internal.tool
|
||||||
|
* @build toolbox.ToolBox javadoc.tester.*
|
||||||
|
* @run main TestExternRedirects
|
||||||
|
*/
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
import java.net.InetSocketAddress;
|
||||||
|
import java.net.MalformedURLException;
|
||||||
|
import java.net.URI;
|
||||||
|
import java.net.URISyntaxException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import com.sun.net.httpserver.HttpExchange;
|
||||||
|
import com.sun.net.httpserver.HttpHandler;
|
||||||
|
import com.sun.net.httpserver.HttpServer;
|
||||||
|
import javadoc.tester.JavadocTester;
|
||||||
|
import toolbox.ToolBox;
|
||||||
|
|
||||||
|
public class TestExternRedirects extends JavadocTester {
|
||||||
|
public static void main(String... args) throws Exception {
|
||||||
|
var tester = new TestExternRedirects();
|
||||||
|
tester.runTests();
|
||||||
|
}
|
||||||
|
|
||||||
|
private final ToolBox tb = new ToolBox();
|
||||||
|
private HttpServer httpServer;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void runTests() throws Exception {
|
||||||
|
httpServer = startServer();
|
||||||
|
var address = httpServer.getAddress();
|
||||||
|
out.println("server running at " + address);
|
||||||
|
try {
|
||||||
|
super.runTests();
|
||||||
|
} finally {
|
||||||
|
httpServer.stop(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private HttpServer startServer() throws IOException {
|
||||||
|
HttpServer server = HttpServer.create(new InetSocketAddress("localhost", 0), 0);
|
||||||
|
server.createContext("/docs", new MyHandler());
|
||||||
|
server.setExecutor(null); // creates a default executor
|
||||||
|
server.start();
|
||||||
|
return server;
|
||||||
|
}
|
||||||
|
|
||||||
|
private class MyHandler implements HttpHandler {
|
||||||
|
@Override
|
||||||
|
public void handle(HttpExchange t) throws IOException {
|
||||||
|
out.println("MyHandler: " + t.getRequestMethod() + " " + t.getRequestURI());
|
||||||
|
assert t.getRequestMethod().equals("GET");
|
||||||
|
var uriPath = t.getRequestURI().getPath();
|
||||||
|
if (uriPath.contains("no-redirect")) {
|
||||||
|
respond(t, HttpURLConnection.HTTP_OK, "");
|
||||||
|
} else if (uriPath.matches(".*/redirect-[1-9]/.*")) {
|
||||||
|
Matcher m = Pattern.compile("redirect-([1-9])").matcher(uriPath);
|
||||||
|
if (m.find()) {
|
||||||
|
var count = Integer.parseInt(m.group(1));
|
||||||
|
var u = t.getRequestURI().toString();
|
||||||
|
var u2 = u.replace("redirect-" + count,
|
||||||
|
(count == 1) ? "no-redirect" : "redirect-" + (count - 1));
|
||||||
|
t.getResponseHeaders().add("Location", u2);
|
||||||
|
respond(t, HttpURLConnection.HTTP_MOVED_PERM, "");
|
||||||
|
} else {
|
||||||
|
throw new IOException("internal error");
|
||||||
|
}
|
||||||
|
} else if (uriPath.contains("bad-redirect")){
|
||||||
|
var u = t.getRequestURI().toString();
|
||||||
|
var u2 = u.replace("bad-redirect", "no-redirect")
|
||||||
|
.replaceAll("[^/]+-list$", "not-found.html");
|
||||||
|
t.getResponseHeaders().add("Location", u2);
|
||||||
|
respond(t, HttpURLConnection.HTTP_MOVED_PERM, "");
|
||||||
|
} else {
|
||||||
|
respond(t, HttpURLConnection.HTTP_NOT_FOUND, "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void respond(HttpExchange t, int code, String body) throws IOException {
|
||||||
|
out.println(" respond: " + code);
|
||||||
|
t.getResponseHeaders().forEach((k, v) -> out.println(" header: " + k + ": " + v));
|
||||||
|
body.lines().map(l -> " body " + l).forEach(out::println);
|
||||||
|
|
||||||
|
t.sendResponseHeaders(code, body.length());
|
||||||
|
try (var os = t.getResponseBody()) {
|
||||||
|
os.write(body.getBytes());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testNoRedirect(Path base) throws Exception {
|
||||||
|
Path src = base.resolve("src");
|
||||||
|
tb.writeJavaFiles(src, "package p; public class C { }");
|
||||||
|
|
||||||
|
javadoc("-d", base.resolve("api").toString(),
|
||||||
|
"-sourcepath", src.toString(),
|
||||||
|
"-Xdoclint:none",
|
||||||
|
"-link", getURL("no-redirect").toString(),
|
||||||
|
"p");
|
||||||
|
checkExit(Exit.OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSomeRedirect(Path base) throws Exception {
|
||||||
|
Path src = base.resolve("src");
|
||||||
|
tb.writeJavaFiles(src, "package p; public class C { }");
|
||||||
|
|
||||||
|
javadoc("-d", base.resolve("api").toString(),
|
||||||
|
"-sourcepath", src.toString(),
|
||||||
|
"-Xdoclint:none",
|
||||||
|
"-link", getURL("redirect-3").toString(),
|
||||||
|
"p");
|
||||||
|
checkExit(Exit.OK);
|
||||||
|
|
||||||
|
new OutputChecker(Output.OUT)
|
||||||
|
.check(Pattern.compile("warning: URL .*/docs/redirect-3/element-list" +
|
||||||
|
" was redirected to .*/docs/no-redirect/element-list"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testBadRedirect(Path base) throws Exception {
|
||||||
|
Path src = base.resolve("src");
|
||||||
|
tb.writeJavaFiles(src, "package p; public class C { }");
|
||||||
|
|
||||||
|
javadoc("-d", base.resolve("api").toString(),
|
||||||
|
"-sourcepath", src.toString(),
|
||||||
|
"-Xdoclint:none",
|
||||||
|
"-link", getURL("bad-redirect").toString(),
|
||||||
|
"p");
|
||||||
|
checkExit(Exit.ERROR);
|
||||||
|
|
||||||
|
checkOutput(Output.OUT, true,
|
||||||
|
"error: Unexpected redirection for URL");
|
||||||
|
}
|
||||||
|
|
||||||
|
private URL getURL(String key) throws URISyntaxException, MalformedURLException {
|
||||||
|
return new URI("http",
|
||||||
|
null, // user-info
|
||||||
|
httpServer.getAddress().getHostName(),
|
||||||
|
httpServer.getAddress().getPort(),
|
||||||
|
"/docs/" + key,
|
||||||
|
null, // query
|
||||||
|
null // fragment
|
||||||
|
).toURL();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user