From 3080f4509d598789685f4d3d670ef9761293d32b Mon Sep 17 00:00:00 2001 From: Brian Burkhalter Date: Tue, 16 May 2017 14:11:48 -0700 Subject: [PATCH 01/12] 8180431: Remove intermittent keyword from some no longer failing NIO tests Remove "intermittent" keyword from @key tag, Reviewed-by: alanb --- jdk/test/java/nio/channels/Selector/SelectAndClose.java | 1 - jdk/test/java/nio/channels/Selector/WakeupAfterClose.java | 1 - 2 files changed, 2 deletions(-) diff --git a/jdk/test/java/nio/channels/Selector/SelectAndClose.java b/jdk/test/java/nio/channels/Selector/SelectAndClose.java index 9c1673b7f40..747afbedbae 100644 --- a/jdk/test/java/nio/channels/Selector/SelectAndClose.java +++ b/jdk/test/java/nio/channels/Selector/SelectAndClose.java @@ -23,7 +23,6 @@ /* @test * @bug 5004077 - * @key intermittent * @summary Check blocking of select and close */ diff --git a/jdk/test/java/nio/channels/Selector/WakeupAfterClose.java b/jdk/test/java/nio/channels/Selector/WakeupAfterClose.java index da4c806460e..92b1aef5c6d 100644 --- a/jdk/test/java/nio/channels/Selector/WakeupAfterClose.java +++ b/jdk/test/java/nio/channels/Selector/WakeupAfterClose.java @@ -24,7 +24,6 @@ /* @test * @bug 6524172 * @summary Invoking wakeup on closed Selector can throw NPE if close resets interrupt status - * @key intermittent */ import java.io.IOException; From 4dbd43322dd2544b2cd9740fe432e628a8b92c9a Mon Sep 17 00:00:00 2001 From: Joe Darcy Date: Tue, 16 May 2017 18:23:21 -0700 Subject: [PATCH 02/12] 8180452: Mark ClipCloseLoss.java as failing intermittently Reviewed-by: serb --- jdk/test/javax/sound/sampled/Clip/ClipCloseLoss.java | 1 + 1 file changed, 1 insertion(+) diff --git a/jdk/test/javax/sound/sampled/Clip/ClipCloseLoss.java b/jdk/test/javax/sound/sampled/Clip/ClipCloseLoss.java index 24226ddd125..56b046163b0 100644 --- a/jdk/test/javax/sound/sampled/Clip/ClipCloseLoss.java +++ b/jdk/test/javax/sound/sampled/Clip/ClipCloseLoss.java @@ -36,6 +36,7 @@ import javax.sound.sampled.Mixer; * @bug 4946913 * @summary DirectClip doesn't kill the thread correctly, sometimes * @run main/othervm ClipCloseLoss + * @key intermittent */ public class ClipCloseLoss { static int frameCount = 441000; // lets say 10 seconds From a99fc645d64cf4f16db2fd690c6d78504e2cd38f Mon Sep 17 00:00:00 2001 From: Sean Mullan Date: Wed, 17 May 2017 08:51:46 -0400 Subject: [PATCH 03/12] 8180307: Update JDK 9 Required Cipher Algorithms Reviewed-by: valeriep --- jdk/src/java.base/share/classes/javax/crypto/Cipher.java | 1 + 1 file changed, 1 insertion(+) diff --git a/jdk/src/java.base/share/classes/javax/crypto/Cipher.java b/jdk/src/java.base/share/classes/javax/crypto/Cipher.java index cf288f5f1da..4068483470c 100644 --- a/jdk/src/java.base/share/classes/javax/crypto/Cipher.java +++ b/jdk/src/java.base/share/classes/javax/crypto/Cipher.java @@ -137,6 +137,7 @@ import sun.security.jca.*; *
  • {@code AES/CBC/PKCS5Padding} (128)
  • *
  • {@code AES/ECB/NoPadding} (128)
  • *
  • {@code AES/ECB/PKCS5Padding} (128)
  • + *
  • {@code AES/GCM/NoPadding} (128)
  • *
  • {@code DES/CBC/NoPadding} (56)
  • *
  • {@code DES/CBC/PKCS5Padding} (56)
  • *
  • {@code DES/ECB/NoPadding} (56)
  • From 374e7bae7a7f22b04e0e093e355ac685be849bef Mon Sep 17 00:00:00 2001 From: Brian Burkhalter Date: Wed, 17 May 2017 14:29:26 -0700 Subject: [PATCH 04/12] 7086489: File.lastModified should accuracy as well as resolution Add an @apiNote indicating that the last-modified time might be of coarser than millisecond granularity. Reviewed-by: smarks --- jdk/src/java.base/share/classes/java/io/File.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/jdk/src/java.base/share/classes/java/io/File.java b/jdk/src/java.base/share/classes/java/io/File.java index 6e77026c6c1..e9959b59acd 100644 --- a/jdk/src/java.base/share/classes/java/io/File.java +++ b/jdk/src/java.base/share/classes/java/io/File.java @@ -923,6 +923,12 @@ public class File * java.nio.file.Files#readAttributes(Path,Class,LinkOption[]) * Files.readAttributes} method may be used. * + * @apiNote + * While the unit of time of the return value is milliseconds, + * the granularity of the value depends on the underlying + * file system and may be larger. For example, some + * file systems use time stamps in units of seconds. + * * @return A long value representing the time the file was * last modified, measured in milliseconds since the epoch * (00:00:00 GMT, January 1, 1970), or 0L if the From ca94b73222f5eac7f29ab32923cf19a248d7a727 Mon Sep 17 00:00:00 2001 From: Henry Jen Date: Wed, 17 May 2017 16:26:23 -0700 Subject: [PATCH 05/12] 8180447: Trailing space in JDK_JAVA_OPTIONS causes an application fail to launch Reviewed-by: alanb, mchung, ksrini --- jdk/src/java.base/share/native/libjli/args.c | 5 +++++ .../java.base/share/native/libjli/emessages.h | 2 +- jdk/test/tools/launcher/ArgsEnvVar.java | 18 ++++++++++++++++-- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/jdk/src/java.base/share/native/libjli/args.c b/jdk/src/java.base/share/native/libjli/args.c index adbff674bf9..9eb2317de6c 100644 --- a/jdk/src/java.base/share/native/libjli/args.c +++ b/jdk/src/java.base/share/native/libjli/args.c @@ -456,6 +456,11 @@ jboolean JLI_AddArgsFromEnvVar(JLI_List args, const char *var_name) { env++; } + // Trailing space + if (*env == '\0') { + break; + } + arg = p; while (*env != '\0' && !isspace(*env)) { if (*env == '"' || *env == '\'') { diff --git a/jdk/src/java.base/share/native/libjli/emessages.h b/jdk/src/java.base/share/native/libjli/emessages.h index c5ae8d74b5e..2f94a60bce8 100644 --- a/jdk/src/java.base/share/native/libjli/emessages.h +++ b/jdk/src/java.base/share/native/libjli/emessages.h @@ -36,7 +36,7 @@ #define JNI_ERROR "Error: A JNI error has occurred, please check your installation and try again" #define JNI_ERROR1 "Error: can't find JNI interfaces in: %s" -#define ARG_INFO_ENVVAR "NOTE: Picked up the following options via %s:\n %s" +#define ARG_INFO_ENVVAR "NOTE: Picked up %s: %s" #define ARG_WARN "Warning: %s option is no longer supported." #define ARG_ERROR1 "Error: %s requires class path specification" diff --git a/jdk/test/tools/launcher/ArgsEnvVar.java b/jdk/test/tools/launcher/ArgsEnvVar.java index fe18e1d256c..5dd63c84cb4 100644 --- a/jdk/test/tools/launcher/ArgsEnvVar.java +++ b/jdk/test/tools/launcher/ArgsEnvVar.java @@ -23,7 +23,7 @@ /** * @test - * @bug 8170832 + * @bug 8170832 8180447 * @summary Arguments passed in environment variable * @build TestHelper * @run main ArgsEnvVar @@ -224,6 +224,21 @@ public class ArgsEnvVar extends TestHelper { verifyOptions(List.of("-p", "?", "-jar", "test.jar", "one", "two"), tr); } + @Test + public void testTrailingSpaces() { + env.put(JDK_JAVA_OPTIONS, "--add-exports java.base/jdk.internal.misc=ALL-UNNAMED "); + TestResult tr = doExec(env, javaCmd, "-jar", "test.jar"); + verifyOptions(List.of("--add-exports", "java.base/jdk.internal.misc=ALL-UNNAMED", "-jar", "test.jar"), tr); + + env.put(JDK_JAVA_OPTIONS, "--class-path ' '"); + tr = doExec(env, javaCmd, "-jar", "test.jar"); + verifyOptions(List.of("--class-path", " ", "-jar", "test.jar"), tr); + + env.put(JDK_JAVA_OPTIONS, " --add-exports java.base/jdk.internal.misc=ALL-UNNAMED "); + tr = doExec(env, javaCmd, "-jar", "test.jar"); + verifyOptions(List.of("--add-exports", "java.base/jdk.internal.misc=ALL-UNNAMED", "-jar", "test.jar"), tr); + } + public static void main(String... args) throws Exception { init(); ArgsEnvVar a = new ArgsEnvVar(); @@ -236,4 +251,3 @@ public class ArgsEnvVar extends TestHelper { } } } - From c46c14c39b68d6b0bb019443f2802f5d57d6ea66 Mon Sep 17 00:00:00 2001 From: Magnus Ihse Bursie Date: Thu, 18 May 2017 09:23:44 +0200 Subject: [PATCH 06/12] 8180426: Use standard css file for new docs bundle index.html page Reviewed-by: mchung, erikj --- .../{specs => }/resources/jdk-default.css | 4 +- .../build/tools/docs/docs-bundle-page.html | 48 ++++--------------- 2 files changed, 11 insertions(+), 41 deletions(-) rename jdk/make/data/docs-resources/{specs => }/resources/jdk-default.css (95%) diff --git a/jdk/make/data/docs-resources/specs/resources/jdk-default.css b/jdk/make/data/docs-resources/resources/jdk-default.css similarity index 95% rename from jdk/make/data/docs-resources/specs/resources/jdk-default.css rename to jdk/make/data/docs-resources/resources/jdk-default.css index eea78ea539d..ee742adeb22 100644 --- a/jdk/make/data/docs-resources/specs/resources/jdk-default.css +++ b/jdk/make/data/docs-resources/resources/jdk-default.css @@ -116,11 +116,11 @@ caption { margin-bottom:10px; } -tr:nth-child(even) { +tr:nth-child(even), tr:nth-child(even) th[scope=row] { background: #DDD; } -tr:nth-child(odd) { +tr:nth-child(odd), tr:nth-child(odd) th[scope=row] { background: #FFF; } diff --git a/jdk/make/src/classes/build/tools/docs/docs-bundle-page.html b/jdk/make/src/classes/build/tools/docs/docs-bundle-page.html index 374716bcfde..e309840951d 100644 --- a/jdk/make/src/classes/build/tools/docs/docs-bundle-page.html +++ b/jdk/make/src/classes/build/tools/docs/docs-bundle-page.html @@ -27,42 +27,12 @@ questions. + + caption { + text-align: center; + } + @HEADER_TITLE@ @@ -127,10 +97,10 @@ caption { @JAVA_EE_MODULES@ - - Outside Java SE - JDK - JavaFX + + Outside Java SE + JDK + JavaFX Others From e9c673ae1c084beb2643fd034c7526c77f02045a Mon Sep 17 00:00:00 2001 From: Magnus Ihse Bursie Date: Thu, 18 May 2017 12:00:46 +0200 Subject: [PATCH 07/12] 8180486: extLink taglet needs escaped "&" Reviewed-by: dholmes --- jdk/make/src/classes/build/tools/taglet/ExtLink.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jdk/make/src/classes/build/tools/taglet/ExtLink.java b/jdk/make/src/classes/build/tools/taglet/ExtLink.java index ad042160756..34eaed59f28 100644 --- a/jdk/make/src/classes/build/tools/taglet/ExtLink.java +++ b/jdk/make/src/classes/build/tools/taglet/ExtLink.java @@ -56,7 +56,7 @@ public class ExtLink implements Taglet { static final String TAG_NAME = "extLink"; - static final String URL = "https://www.oracle.com/pls/topic/lookup?ctx=javase9&id="; + static final String URL = "https://www.oracle.com/pls/topic/lookup?ctx=javase9&id="; static final Pattern TAG_PATTERN = Pattern.compile("(\\s*)(?\\w+)(\\s+)(?.*)"); From 3e4d9a51329609523027880f235003b3d9cf268a Mon Sep 17 00:00:00 2001 From: Brent Christian Date: Fri, 19 May 2017 09:41:28 -0700 Subject: [PATCH 08/12] 8180633: Remove intermittent key from java/lang/ClassLoader/Assert.java Reviewed-by: darcy, mchung --- jdk/test/java/lang/ClassLoader/Assert.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jdk/test/java/lang/ClassLoader/Assert.java b/jdk/test/java/lang/ClassLoader/Assert.java index 57b6febedb2..fb2376d45d4 100644 --- a/jdk/test/java/lang/ClassLoader/Assert.java +++ b/jdk/test/java/lang/ClassLoader/Assert.java @@ -28,7 +28,7 @@ * @run main/othervm Assert * @summary Test the assertion facility * @author Mike McCloskey - * @key randomness intermittent + * @key randomness */ import package1.*; From 448c3c6d9abcb4d65f586822adc940536f545ca2 Mon Sep 17 00:00:00 2001 From: Thomas Stuefe Date: Sun, 21 May 2017 10:52:36 +0200 Subject: [PATCH 09/12] 8180424: Another build issue on AIX after 8034174 Reviewed-by: clanger, vtewari --- jdk/src/java.base/aix/native/libnet/aix_close.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/jdk/src/java.base/aix/native/libnet/aix_close.c b/jdk/src/java.base/aix/native/libnet/aix_close.c index 1588d485640..51bf81f1d21 100644 --- a/jdk/src/java.base/aix/native/libnet/aix_close.c +++ b/jdk/src/java.base/aix/native/libnet/aix_close.c @@ -419,10 +419,8 @@ int NET_ReadV(int s, const struct iovec * vector, int count) { } int NET_RecvFrom(int s, void *buf, int len, unsigned int flags, - struct sockaddr *from, int *fromlen) { - socklen_t socklen = *fromlen; - BLOCKING_IO_RETURN_INT( s, recvfrom(s, buf, len, flags, from, &socklen) ); - *fromlen = socklen; + struct sockaddr *from, socklen_t *fromlen) { + BLOCKING_IO_RETURN_INT( s, recvfrom(s, buf, len, flags, from, fromlen) ); } int NET_Send(int s, void *msg, int len, unsigned int flags) { @@ -438,10 +436,8 @@ int NET_SendTo(int s, const void *msg, int len, unsigned int BLOCKING_IO_RETURN_INT( s, sendto(s, msg, len, flags, to, tolen) ); } -int NET_Accept(int s, struct sockaddr *addr, int *addrlen) { - socklen_t socklen = *addrlen; - BLOCKING_IO_RETURN_INT( s, accept(s, addr, &socklen) ); - *addrlen = socklen; +int NET_Accept(int s, struct sockaddr *addr, socklen_t *addrlen) { + BLOCKING_IO_RETURN_INT( s, accept(s, addr, addrlen) ); } int NET_Connect(int s, struct sockaddr *addr, int addrlen) { From 92ce20762887f4b55fed33f38773315c07e0d84b Mon Sep 17 00:00:00 2001 From: Michael McMahon Date: Mon, 22 May 2017 17:31:07 +0100 Subject: [PATCH 10/12] 8180498: Remove httpclient internal APIs which supply ByteBuffers to read calls Reviewed-by: chegar, dfuchs --- .../incubator/http/AsyncSSLConnection.java | 7 +---- .../classes/jdk/incubator/http/Exchange.java | 15 ---------- .../jdk/incubator/http/Http1Exchange.java | 12 +++++--- .../jdk/incubator/http/Http1Response.java | 30 +++++++++++-------- .../jdk/incubator/http/HttpConnection.java | 12 ++------ .../incubator/http/PlainHttpConnection.java | 3 +- .../http/PlainTunnelingConnection.java | 5 ---- .../jdk/incubator/http/ResponseContent.java | 21 +++---------- .../jdk/incubator/http/ResponseHeaders.java | 20 +++++++++---- .../jdk/incubator/http/SSLConnection.java | 22 ++++---------- .../jdk/incubator/http/SSLDelegate.java | 6 ++-- .../incubator/http/SSLTunnelConnection.java | 15 ++-------- .../incubator/http/ResponseHeadersTest.java | 6 +--- 13 files changed, 60 insertions(+), 114 deletions(-) diff --git a/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/AsyncSSLConnection.java b/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/AsyncSSLConnection.java index 03defd78868..9b7b3875f69 100644 --- a/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/AsyncSSLConnection.java +++ b/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/AsyncSSLConnection.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, 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 @@ -189,11 +189,6 @@ class AsyncSSLConnection extends HttpConnection throw new UnsupportedOperationException("Not supported."); } - @Override - protected int readImpl(ByteBuffer buffer) throws IOException { - throw new UnsupportedOperationException("Not supported."); - } - @Override CompletableFuture whenReceivingResponse() { throw new UnsupportedOperationException("Not supported."); diff --git a/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/Exchange.java b/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/Exchange.java index dc1eece9534..f998c3a4127 100644 --- a/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/Exchange.java +++ b/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/Exchange.java @@ -33,7 +33,6 @@ import java.net.SocketPermission; import java.net.URI; import java.net.URISyntaxException; import java.net.URLPermission; -import java.nio.ByteBuffer; import java.security.AccessControlContext; import java.security.AccessController; import java.security.PrivilegedAction; @@ -76,9 +75,6 @@ final class Exchange { boolean upgrading; // to HTTP/2 final PushGroup pushGroup; - // buffer for receiving response headers - private volatile ByteBuffer rxBuffer; - Exchange(HttpRequestImpl request, MultiExchange multi) { this.request = request; this.upgrading = false; @@ -121,17 +117,6 @@ final class Exchange { return client; } - ByteBuffer getBuffer() { - if(rxBuffer == null) { - synchronized (this) { - if(rxBuffer == null) { - rxBuffer = Utils.getExchangeBuffer(); - } - } - } - return rxBuffer; - } - public Response response() throws IOException, InterruptedException { return responseImpl(null); } diff --git a/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/Http1Exchange.java b/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/Http1Exchange.java index a1c20b35399..8057596bed3 100644 --- a/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/Http1Exchange.java +++ b/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/Http1Exchange.java @@ -55,7 +55,7 @@ class Http1Exchange extends ExchangeImpl { final HttpConnection connection; final HttpClientImpl client; final Executor executor; - final ByteBuffer buffer; // used for receiving + volatile ByteBuffer buffer; // used for receiving @Override public String toString() { @@ -74,7 +74,7 @@ class Http1Exchange extends ExchangeImpl { this.client = exchange.client(); this.executor = exchange.executor(); this.operations = new LinkedList<>(); - this.buffer = exchange.getBuffer(); + this.buffer = Utils.EMPTY_BYTEBUFFER; if (connection != null) { this.connection = connection; } else { @@ -157,7 +157,9 @@ class Http1Exchange extends ExchangeImpl { try { response = new Http1Response<>(connection, this); response.readHeaders(); - return response.response(); + Response r = response.response(); + buffer = response.getBuffer(); + return r; } catch (Throwable t) { connection.close(); throw t; @@ -213,7 +215,9 @@ class Http1Exchange extends ExchangeImpl { return MinimalFuture.supply( () -> { response = new Http1Response<>(connection, Http1Exchange.this); response.readHeaders(); - return response.response(); + Response r = response.response(); + buffer = response.getBuffer(); + return r; }, executor); } diff --git a/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/Http1Response.java b/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/Http1Response.java index ea36bb7a723..92ce50c28bf 100644 --- a/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/Http1Response.java +++ b/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/Http1Response.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, 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 @@ -44,7 +44,7 @@ class Http1Response { private final HttpConnection connection; private ResponseHeaders headers; private int responseCode; - private final ByteBuffer buffer; // same buffer used for reading status line and headers + private ByteBuffer buffer; private final Http1Exchange exchange; private final boolean redirecting; // redirecting private boolean return2Cache; // return connection to cache when finished @@ -96,6 +96,10 @@ class Http1Response { return finished; } + ByteBuffer getBuffer() { + return buffer; + } + int fixupContentLen(int clen) { if (request.method().equalsIgnoreCase("HEAD")) { return 0; @@ -194,12 +198,15 @@ class Http1Response { static final char CR = '\r'; static final char LF = '\n'; - private int getBuffer() throws IOException { + private int obtainBuffer() throws IOException { int n = buffer.remaining(); if (n == 0) { - buffer.clear(); - return connection.read(buffer); + buffer = connection.read(); + if (buffer == null) { + return -1; + } + n = buffer.remaining(); } return n; } @@ -207,18 +214,17 @@ class Http1Response { String readStatusLine() throws IOException { boolean cr = false; StringBuilder statusLine = new StringBuilder(128); - ByteBuffer b = buffer; - while (getBuffer() != -1) { - byte[] buf = b.array(); - int offset = b.position(); - int len = b.limit() - offset; + while ((obtainBuffer()) != -1) { + byte[] buf = buffer.array(); + int offset = buffer.position(); + int len = buffer.limit() - offset; for (int i = 0; i < len; i++) { char c = (char) buf[i+offset]; if (cr) { if (c == LF) { - b.position(i + 1 + offset); + buffer.position(i + 1 + offset); return statusLine.toString(); } else { throw new IOException("invalid status line"); @@ -231,7 +237,7 @@ class Http1Response { } } // unlikely, but possible, that multiple reads required - b.position(b.limit()); + buffer.position(buffer.limit()); } return null; } diff --git a/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/HttpConnection.java b/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/HttpConnection.java index 2e9b3d9c34e..96bd67f969e 100644 --- a/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/HttpConnection.java +++ b/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/HttpConnection.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, 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 @@ -323,12 +323,9 @@ abstract class HttpConnection implements Closeable { } } - final int read(ByteBuffer buffer) throws IOException { - return readImpl(buffer); - } - final ByteBuffer read() throws IOException { - return readImpl(); + ByteBuffer b = readImpl(); + return b; } /* @@ -337,9 +334,6 @@ abstract class HttpConnection implements Closeable { */ protected abstract ByteBuffer readImpl() throws IOException; - /** Reads as much as possible into given buffer and returns amount read. */ - protected abstract int readImpl(ByteBuffer buffer) throws IOException; - @Override public String toString() { return "HttpConnection: " + channel().toString(); diff --git a/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/PlainHttpConnection.java b/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/PlainHttpConnection.java index 3527d993970..7bb69850c83 100644 --- a/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/PlainHttpConnection.java +++ b/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/PlainHttpConnection.java @@ -311,8 +311,7 @@ class PlainHttpConnection extends HttpConnection implements AsyncConnection { } } - @Override - protected int readImpl(ByteBuffer buf) throws IOException { + private int readImpl(ByteBuffer buf) throws IOException { int mark = buf.position(); int n; // FIXME: this hack works in conjunction with the corresponding change diff --git a/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/PlainTunnelingConnection.java b/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/PlainTunnelingConnection.java index 10549315a3d..d133df1e250 100644 --- a/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/PlainTunnelingConnection.java +++ b/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/PlainTunnelingConnection.java @@ -156,11 +156,6 @@ class PlainTunnelingConnection extends HttpConnection { return delegate.readImpl(); } - @Override - protected int readImpl(ByteBuffer buffer) throws IOException { - return delegate.readImpl(buffer); - } - @Override boolean isSecure() { return false; diff --git a/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/ResponseContent.java b/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/ResponseContent.java index e6a364add48..7641dcc3134 100644 --- a/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/ResponseContent.java +++ b/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/ResponseContent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, 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 @@ -148,11 +148,7 @@ class ResponseContent { // make sure we have at least 1 byte to look at private void getHunk() throws IOException { if (chunkbuf == null || !chunkbuf.hasRemaining()) { - if (chunkbuf == null) { - chunkbuf = Utils.getBuffer(); - } - chunkbuf.clear(); - connection.read(chunkbuf); + chunkbuf = connection.read(); } } @@ -256,7 +252,6 @@ class ResponseContent { private void pushBodyFixed(ByteBuffer b) throws IOException { int remaining = contentLength; - //lastBufferUsed = b; while (b.hasRemaining() && remaining > 0) { ByteBuffer buffer = Utils.getBuffer(); int amount = Math.min(b.remaining(), remaining); @@ -265,22 +260,14 @@ class ResponseContent { buffer.flip(); dataConsumer.accept(Optional.of(buffer)); } - //client.returnBuffer(b); while (remaining > 0) { - ByteBuffer buffer = Utils.getBuffer(); - int xx = connection.read(buffer); - if (xx == -1) + ByteBuffer buffer = connection.read(); + if (buffer == null) throw new IOException("connection closed"); int bytesread = buffer.remaining(); // assume for now that pipelining not implemented if (bytesread > remaining) { - System.err.println("xx = " + xx); - System.err.println("bytesread = " + bytesread); - System.err.println("remaining = " + remaining); - for (int i=0; i> map) { + map.forEach((k,v) -> { + System.out.print (k + ": "); + for (String val : v) { + System.out.print(val + ", "); + } + System.out.println(""); + }); + } + private Map> parse(InputStreamWrapper input) throws IOException { @@ -114,7 +123,6 @@ final class ResponseHeaders implements HttpHeaders { // finds is CR. This only happens if there are no headers, and // only one byte will be consumed from the buffer. In this case // the next byte MUST be LF - //System.err.println("Last character read is: " + (byte)lastRead); if (input.read() != LF) { throw new IOException("Unexpected byte sequence when no headers: " + ((int)CR) + " " + input.lastRead diff --git a/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/SSLConnection.java b/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/SSLConnection.java index 2a5be4f2b85..3af29097cdd 100644 --- a/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/SSLConnection.java +++ b/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/SSLConnection.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, 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 @@ -162,10 +162,11 @@ class SSLConnection extends HttpConnection { @Override protected ByteBuffer readImpl() throws IOException { - ByteBuffer dst = ByteBuffer.allocate(8192); - int n = readImpl(dst); + WrapperResult r = sslDelegate.recvData(ByteBuffer.allocate(8192)); + // TODO: check for closure + int n = r.result.bytesProduced(); if (n > 0) { - return dst; + return r.buf; } else if (n == 0) { return Utils.EMPTY_BYTEBUFFER; } else { @@ -173,19 +174,6 @@ class SSLConnection extends HttpConnection { } } - @Override - protected int readImpl(ByteBuffer buf) throws IOException { - // TODO: need to ensure that buf is big enough for application data - WrapperResult r = sslDelegate.recvData(buf); - // TODO: check for closure - String s = "Receive) "; - //debugPrint(s, r.buf); - if (r.result.bytesProduced() > 0) { - assert buf == r.buf; - } - return r.result.bytesProduced(); - } - @Override boolean connected() { return delegate.connected(); diff --git a/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/SSLDelegate.java b/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/SSLDelegate.java index 019e80deab2..ec0f4d0e00f 100644 --- a/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/SSLDelegate.java +++ b/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/SSLDelegate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, 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 @@ -104,9 +104,7 @@ class SSLDelegate { } SSLEngineResult result; - /* if passed in buffer was not big enough then the a reallocated buffer - * is returned here */ - ByteBuffer buf; + ByteBuffer buf; // buffer containing result data } int app_buf_size; diff --git a/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/SSLTunnelConnection.java b/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/SSLTunnelConnection.java index 456cf7a2acb..511aa2aa12f 100644 --- a/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/SSLTunnelConnection.java +++ b/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/SSLTunnelConnection.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, 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 @@ -164,19 +164,10 @@ class SSLTunnelConnection extends HttpConnection { @Override protected ByteBuffer readImpl() throws IOException { - return sslDelegate.recvData(Utils.EMPTY_BYTEBUFFER).buf; // fix this, make the read normal - } + ByteBuffer buf = Utils.getBuffer(); - @Override - protected int readImpl(ByteBuffer buf) throws IOException { WrapperResult r = sslDelegate.recvData(buf); - // TODO: check for closure - String s = "Receive) "; - //debugPrint(s, r.buf); - if (r.result.bytesProduced() > 0) { - assert buf == r.buf; - } - return r.result.bytesProduced(); + return r.buf; } @Override diff --git a/jdk/test/java/net/httpclient/whitebox/jdk.incubator.httpclient/jdk/incubator/http/ResponseHeadersTest.java b/jdk/test/java/net/httpclient/whitebox/jdk.incubator.httpclient/jdk/incubator/http/ResponseHeadersTest.java index 91a05f91d73..bf2c6d751e6 100644 --- a/jdk/test/java/net/httpclient/whitebox/jdk.incubator.httpclient/jdk/incubator/http/ResponseHeadersTest.java +++ b/jdk/test/java/net/httpclient/whitebox/jdk.incubator.httpclient/jdk/incubator/http/ResponseHeadersTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 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 @@ -214,10 +214,6 @@ public class ResponseHeadersTest { protected ByteBuffer readImpl() throws IOException { throw new AssertionError("Bad test assumption: should not have reached here!"); } - @Override - protected int readImpl(ByteBuffer buffer) throws IOException { - throw new AssertionError("Bad test assumption: should not have reached here!"); - } } public static HttpHeaders createResponseHeaders(ByteBuffer buffer) From 20eec3c5a86934dba30318befcbfdcb96b1c22c2 Mon Sep 17 00:00:00 2001 From: Mandy Chung Date: Mon, 22 May 2017 11:08:26 -0700 Subject: [PATCH 11/12] 8180717: Upgrade the docs bundle index page Reviewed-by: jjg, ihse --- .../build/tools/docs/GenDocsBundlePage.java | 149 ++++++++++++------ .../build/tools/docs/docs-bundle-page.html | 139 +++++++++++----- .../tools/docs/docs-module-groups.properties | 83 +++++----- 3 files changed, 249 insertions(+), 122 deletions(-) diff --git a/jdk/make/src/classes/build/tools/docs/GenDocsBundlePage.java b/jdk/make/src/classes/build/tools/docs/GenDocsBundlePage.java index 3b73067568f..ef1eb433279 100644 --- a/jdk/make/src/classes/build/tools/docs/GenDocsBundlePage.java +++ b/jdk/make/src/classes/build/tools/docs/GenDocsBundlePage.java @@ -31,18 +31,23 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; +import java.lang.module.ModuleDescriptor; import java.lang.module.ModuleFinder; +import java.lang.module.ModuleReference; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.Arrays; +import java.util.Comparator; import java.util.HashMap; import java.util.Locale; import java.util.Map; import java.util.Properties; import java.util.Set; -import java.util.stream.Collectors; +import java.util.function.Predicate; import java.util.stream.Stream; +import static java.util.stream.Collectors.*; /** * Build tool to generate the docs bundle index page. @@ -104,59 +109,33 @@ public class GenDocsBundlePage { } private static final String HEADER_TITLE = "@HEADER_TITLE@"; + + final Path outputfile; final String title; - final Map moduleGroups; - + final Map> moduleGroups = new HashMap<>(); GenDocsBundlePage(String title, Path outputfile) throws IOException { this.outputfile = outputfile; this.title = title; - this.moduleGroups = moduleGroups(); - } - static Map moduleGroups() throws IOException { + // read module groups ModuleFinder finder = ModuleFinder.ofSystem(); - Map groups = new HashMap<>(); try (InputStream in = GenDocsBundlePage.class.getResourceAsStream(MODULE_GROUPS_PROPS)) { Properties props = new Properties(); props.load(in); for (String key: props.stringPropertyNames()) { - Set mods = Stream.of(props.getProperty(key).split("\\s+")) - .filter(mn -> finder.find(mn).isPresent()) - .map(String::trim) - .collect(Collectors.toSet()); + Set mods = + Stream.of(props.getProperty(key).split("\\s+")) + .map(String::trim) + .flatMap(mn -> finder.find(mn).stream()) + .map(ModuleReference::descriptor) + .collect(toSet()); - // divide into 3 columns: Java SE, JDK, JavaFX - StringBuilder sb = new StringBuilder(); - sb.append(mods.stream() - .filter(mn -> mn.startsWith("java.")) - .sorted() - .map(GenDocsBundlePage::toHRef) - .collect(Collectors.joining("\n"))); - sb.append("\n") - .append(mods.stream() - .filter(mn -> mn.startsWith("jdk.")) - .sorted() - .map(GenDocsBundlePage::toHRef) - .collect(Collectors.joining("\n"))); - sb.append("\n"); - if (mods.stream().anyMatch(mn -> mn.startsWith("javafx."))) { - sb.append(mods.stream() - .filter(mn -> mn.startsWith("javafx.")) - .sorted() - .map(GenDocsBundlePage::toHRef) - .collect(Collectors.joining("\n"))); - } String name = "@" + key.toUpperCase(Locale.ENGLISH) + "@"; - groups.put(name, sb.toString()); - } + moduleGroups.put(name, mods); + }; } - return groups; - } - - static String toHRef(String mn) { - return String.format("%s
    ", mn, mn); } void run(BufferedReader reader) throws IOException { @@ -174,13 +153,95 @@ public class GenDocsBundlePage { if (line.contains(HEADER_TITLE)) { line = line.replace(HEADER_TITLE, title); } - if (line.contains("@")) { - for (Map.Entry e: moduleGroups.entrySet()) { - if (line.contains(e.getKey())) { - line = line.replace(e.getKey(), e.getValue()); - } + int i = line.indexOf('@'); + int j = line.indexOf('@', i+1); + if (i >= 0 && i < j) { + String name = line.substring(i, j+1); + if (moduleGroups.containsKey(name)) { + line = line.replace(name, formatModuleGroup(name)); } } return line; } + + String toHRef(ModuleDescriptor md) { + String mn = md.name(); + String formattedName; + if (hasExportedAPIs(md)) { + // has exported APIs + formattedName = mn; + } else if (!md.provides().isEmpty()) { + // a provider + formattedName = "" + mn + ""; + } else { + // a tool + formattedName = "" + mn + ""; + } + return String.format("%s", + mn, formattedName); + } + + String formatModuleGroup(String groupName) { + StringBuilder sb = new StringBuilder(); + // organize in Java SE, JDK, JavaFX, JCP groups + Set modules = moduleGroups.get(groupName); + Arrays.stream(ModuleGroup.values()) + .forEach(g -> { + Set mods = modules.stream() + .filter(md -> g.predicate.test(md.name())) + .collect(toSet()); + if (!mods.isEmpty()) { + sb.append("
    \n"); + // modules with exported API + mods.stream() + .filter(this::hasExportedAPIs) + .sorted(Comparator.comparing(ModuleDescriptor::name)) + .map(this::toHRef) + .forEach(m -> sb.append(m).append("\n")); + + // tools and providers + mods.stream() + .filter(md -> !hasExportedAPIs(md)) + .sorted(Comparator.comparing(ModuleDescriptor::name)) + .map(this::toHRef) + .forEach(m -> sb.append(m).append("\n")); + sb.append("
    "); + } + }); + return sb.toString(); + } + + private boolean hasExportedAPIs(ModuleDescriptor md) { + if (md.exports().stream().anyMatch(e -> !e.isQualified())) { + return true; + } + // this should check if any indirect exports + // checking requires transitive would be sufficient for JDK modules + if (md.requires().stream() + .map(ModuleDescriptor.Requires::modifiers) + .anyMatch(mods -> mods.contains(ModuleDescriptor.Requires.Modifier.TRANSITIVE))) { + return true; + } + return false; + } + + private static final Set NON_JAVA_SE_MODULES = + Set.of("java.jnlp", "java.smartcardio"); + + /** + * CSS class names are defined in docs-bundle-page.html + */ + enum ModuleGroup { + JAVA_SE("javase", mn -> mn.startsWith("java.") && !NON_JAVA_SE_MODULES.contains(mn)), + JDK("jdk", mn -> mn.startsWith("jdk.")), + JAVAFX("javafx", mn -> mn.startsWith("javafx.")), + NON_JAVA_SE("jcp", NON_JAVA_SE_MODULES::contains); + + final String cssClass; + final Predicate predicate; + ModuleGroup(String cssClass, Predicate predicate) { + this.cssClass = cssClass; + this.predicate = predicate; + } + } } diff --git a/jdk/make/src/classes/build/tools/docs/docs-bundle-page.html b/jdk/make/src/classes/build/tools/docs/docs-bundle-page.html index e309840951d..9a4f5cf0fc4 100644 --- a/jdk/make/src/classes/build/tools/docs/docs-bundle-page.html +++ b/jdk/make/src/classes/build/tools/docs/docs-bundle-page.html @@ -26,91 +26,146 @@ questions. - - - @HEADER_TITLE@ + + + + -

    @HEADER_TITLE@

    + - + - - - + - + - - - - - - - - - + - + - - + + - - + + - - + + - + + + + + + + + + + + + + + + + + + + + + - - - - - - - - + +
    ModulesJDK Modules
    GroupJava SEJDKJavaFXModules
    Foundation@CORE_MODULES@@JAVA_BASE@
    Security@SECURITY_MODULES@
    Instrumentation and
    Management
    @INSTRUMENT_MGMT_MODULES@
    IntegrationIntegration @INTEGRATION_MODULES@
    User Interface@UI_TOOLKITS_MODULES@@UI_MODULES@
    Compiler and Scripting@COMPILER_SCRIPTING_MODULES@Compilation@COMPILER_MODULES@
    Debugging@DEBUG_MODULES@Scripting@SCRIPTING_MODULES@
    Tools and Tool APIs@TOOL_MODULES@Security@SECURITY_MODULES@
    Incubating FeaturesManagement@MANAGEMENT_MODULES@
    Instrumentation@INSTRUMENT_MODULES@
    Serviceability@SVC_MODULES@
    Packaging@PACKAGING_MODULES@
    Incubator @INCUBATOR_MODULES@
    Non-Java SE@OTHER_MODULES@
    Java EE @JAVA_EE_MODULES@
    Outside Java SEJDKJavaFX
    Others@OTHER_MODULES@Aggregator@AGGREGATOR_MODULES@
    +

    Key: +

      +
    •    Java SE +
    •    JDK +
    •    JavaFX +
    •    Non-Java SE +
    • italic No Exported API (e.g. a tool or provider)
    • +
    +

    -


    -Copyright© 1993, 2017, Oracle and/or its affiliates. All rights reserved.

    +
    +Copyright © 1993, 2017, Oracle and/or its affiliates. All rights reserved.

    + + + diff --git a/jdk/make/src/classes/build/tools/docs/docs-module-groups.properties b/jdk/make/src/classes/build/tools/docs/docs-module-groups.properties index 0e7d0c8aed1..98a34b91e2e 100644 --- a/jdk/make/src/classes/build/tools/docs/docs-module-groups.properties +++ b/jdk/make/src/classes/build/tools/docs/docs-module-groups.properties @@ -1,13 +1,8 @@ # Module Grouping for the docs bundle page # -core_modules=\ -java.base \ -jdk.charsets \ -jdk.localedata \ -jdk.net \ -jdk.sctp \ -jdk.zipfs +java_base=\ +java.base java_ee_modules=\ java.activation \ @@ -17,6 +12,10 @@ java.xml.bind \ java.xml.ws \ java.xml.ws.annotation +aggregator_modules=\ +java.se \ +java.se.ee + security_modules=\ java.security.jgss \ java.security.sasl \ @@ -26,18 +25,22 @@ jdk.security.jgss \ jdk.crypto.cryptoki \ jdk.crypto.ec \ jdk.crypto.mscapi \ -jdk.crypto.ucrypto +jdk.crypto.ucrypto \ +jdk.policytool -instrument_mgmt_modules=\ -java.instrument \ +instrument_modules=\ +java.instrument + +management_modules=\ java.management \ java.management.rmi \ -jdk.jfr \ jdk.management \ jdk.management.agent \ jdk.management.cmm \ jdk.management.jfr \ jdk.management.resource \ +jdk.snmp \ +jdk.jconsole integration_modules=\ java.logging \ @@ -47,11 +50,18 @@ java.rmi \ java.sql \ java.sql.rowset \ java.xml \ +jdk.charsets \ +jdk.localedata \ +jdk.net \ +jdk.sctp \ +jdk.jsobject \ jdk.httpserver \ jdk.naming.dns \ -jdk.naming.rmi +jdk.naming.rmi \ +jdk.xml.dom \ +jdk.zipfs -ui_toolkits_modules=\ +ui_modules=\ java.datatransfer \ java.desktop \ javafx.base \ @@ -63,39 +73,40 @@ javafx.swing \ javafx.web \ jdk.accessibility -other_modules=\ -java.jnlp \ -java.smartcardio \ -jdk.jsobject \ -jdk.xml.dom - -debug_modules=\ -jdk.jdi \ -jdk.jdwp.agent - -tool_modules=\ +svc_modules=\ +jdk.jfr \ jdk.attach \ -jdk.editpad \ -jdk.jartool \ -jdk.javadoc \ jdk.jcmd \ -jdk.jconsole \ -jdk.jdeps \ -jdk.jlink \ -jdk.jshell \ +jdk.jdi \ +jdk.jdwp.agent \ jdk.jstatd \ +jdk.hotspot.agent + +packaging_modules=\ +jdk.jartool \ +jdk.jlink \ jdk.pack \ -jdk.policytool \ -jdk.packager.services \ +jdk.packager.services + +compiler_modules=\ +java.compiler \ +jdk.compiler \ +jdk.javadoc \ +jdk.jdeps \ +jdk.editpad \ +jdk.jshell \ jdk.rmic -compiler_scripting_modules=\ -java.compiler \ +scripting_modules=\ java.scripting \ -jdk.compiler \ jdk.dynalink \ jdk.scripting.nashorn \ jdk.scripting.nashorn.shell +other_modules=\ +java.jnlp \ +java.smartcardio + incubator_modules=\ jdk.incubator.httpclient + From aa6e6a104ab5924e9bd9c374d22320a44a81e8fa Mon Sep 17 00:00:00 2001 From: Lana Steuck Date: Fri, 26 May 2017 00:29:13 +0000 Subject: [PATCH 12/12] Added tag jdk-9+171 for changeset e09145bcfcc5 --- jdk/.hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/jdk/.hgtags b/jdk/.hgtags index 94fd9c26006..4cede3d5e81 100644 --- a/jdk/.hgtags +++ b/jdk/.hgtags @@ -413,3 +413,4 @@ a7942c3b1e59495dbf51dc7c41aab355fcd253d7 jdk-9+165 e78da9db6299b3fcba49300d52e2359e82fdd218 jdk-9+168 177436a54ca13730ffc725a6e5dbfcd9486f3da3 jdk-9+169 ef9954f6896bb0b95ac62bf769f68b59a7a56ccd jdk-9+170 +29bbedd4cce8e14742bdb22118c057b877c02f0f jdk-9+171