# HG changeset patch # User prr # Date 1521481591 25200 # Node ID 79f6a4dc221e6290723e773813969de422733545 # Parent 719064f540f3b7cee4aa84c022d71cef255b7fa0# Parent 78af880eec6145b6de82dcfe52e0b8484f4bee79 Merge diff -r 719064f540f3 -r 79f6a4dc221e make/common/NativeCompilation.gmk --- a/make/common/NativeCompilation.gmk Mon Mar 19 12:29:23 2018 +0530 +++ b/make/common/NativeCompilation.gmk Mon Mar 19 10:46:31 2018 -0700 @@ -798,10 +798,6 @@ "-map:$$($1_OUTPUT_DIR)/$$($1_NOSUFFIX).map" $1_DEBUGINFO_FILES := $$($1_OUTPUT_DIR)/$$($1_NOSUFFIX).pdb \ $$($1_OUTPUT_DIR)/$$($1_NOSUFFIX).map - # No separate command is needed for debuginfo on windows, instead - # touch target to make sure it has a later time stamp than the debug - # symbol files to avoid unnecessary relinking on rebuild. - $1_CREATE_DEBUGINFO_CMDS := $(TOUCH) $$($1_TARGET) else ifneq ($(findstring $(OPENJDK_TARGET_OS), linux solaris), ) $1_DEBUGINFO_FILES := $$($1_OUTPUT_DIR)/$$($1_NOSUFFIX).debuginfo @@ -816,15 +812,23 @@ $1_DEBUGINFO_FILES := \ $$($1_OUTPUT_DIR)/$$($1_BASENAME).dSYM/Contents/Info.plist \ $$($1_OUTPUT_DIR)/$$($1_BASENAME).dSYM/Contents/Resources/DWARF/$$($1_BASENAME) - # On Macosx, the debuginfo generation doesn't touch the linked binary, but - # to avoid always relinking, touch it anyway to force a later timestamp than - # the dSYM files. $1_CREATE_DEBUGINFO_CMDS := \ - $(DSYMUTIL) --out $$($1_OUTPUT_DIR)/$$($1_BASENAME).dSYM $$($1_TARGET) $$(NEWLINE) \ - $(TOUCH) $$($1_TARGET) + $(DSYMUTIL) --out $$($1_OUTPUT_DIR)/$$($1_BASENAME).dSYM $$($1_TARGET) endif # OPENJDK_TARGET_OS + # Since the link rule creates more than one file that we want to track, + # we have to use some tricks to get make to cooperate. To properly + # trigger downstream dependants of $$($1_DEBUGINFO_FILES), we must have + # a recipe in the rule below. To avoid rerunning the recipe every time + # have it touch the target. If a debuginfo file is deleted by something + # external, explicitly delete the TARGET to trigger a rebuild of both. + ifneq ($$(wildcard $$($1_DEBUGINFO_FILES)), $$($1_DEBUGINFO_FILES)) + $$(call LogDebug, Deleting $$($1_BASENAME) because debuginfo files are missing) + $$(shell $(RM) $$($1_TARGET)) + endif $$($1_DEBUGINFO_FILES): $$($1_TARGET) + $$(if $$(wildcard $$@), , $$(error $$@ was not created for $$<)) + $(TOUCH) $$@ $1 += $$($1_DEBUGINFO_FILES) @@ -859,9 +863,20 @@ # Generating a dynamic library. $1_EXTRA_LDFLAGS += $$(call SET_SHARED_LIBRARY_NAME,$$($1_BASENAME)) ifeq ($(OPENJDK_TARGET_OS), windows) - $1_EXTRA_LDFLAGS += "-implib:$$($1_OBJECT_DIR)/$$($1_NAME).lib" - # Create a rule for the import lib so that other rules may depend on it - $$($1_OBJECT_DIR)/$$($1_NAME).lib: $$($1_TARGET) + $1_IMPORT_LIBRARY := $$($1_OBJECT_DIR)/$$($1_NAME).lib + $1_EXTRA_LDFLAGS += "-implib:$$($1_IMPORT_LIBRARY)" + # To properly trigger downstream dependants of the import library, just as + # for debug files, we must have a recipe in the rule. To avoid rerunning + # the recipe every time have it touch the target. If an import library + # file is deleted by something external, explicitly delete the target to + # trigger a rebuild of both. + ifneq ($$(wildcard $$($1_IMPORT_LIBRARY)), $$($1_IMPORT_LIBRARY)) + $$(call LogDebug, Deleting $$($1_BASENAME) because import library is missing) + $$(shell $(RM) $$($1_TARGET)) + endif + $$($1_IMPORT_LIBRARY): $$($1_TARGET) + $$(if $$(wildcard $$@), , $$(error $$@ was not created for $$<)) + $(TOUCH) $$@ endif # Create loadmap on AIX. Helps in diagnosing some problems. diff -r 719064f540f3 -r 79f6a4dc221e make/hotspot/lib/CompileJvm.gmk --- a/make/hotspot/lib/CompileJvm.gmk Mon Mar 19 12:29:23 2018 +0530 +++ b/make/hotspot/lib/CompileJvm.gmk Mon Mar 19 10:46:31 2018 -0700 @@ -243,10 +243,10 @@ ifeq ($(OPENJDK_TARGET_OS), windows) # It doesn't matter which jvm.lib file gets exported, but we need # to pick just one. - ifeq ($(JVM_VARIANT), $(firstword $(JVM_VARIANTS))) + ifeq ($(JVM_VARIANT), $(JVM_VARIANT_MAIN)) $(eval $(call SetupCopyFiles, COPY_JVM_LIB, \ DEST := $(LIB_OUTPUTDIR), \ - FILES :=$(JVM_VARIANT_OUTPUTDIR)/libjvm/objs/jvm.lib, \ + FILES :=$(BUILD_LIBJVM_IMPORT_LIBRARY), \ )) TARGETS += $(COPY_JVM_LIB) endif diff -r 719064f540f3 -r 79f6a4dc221e make/lib/Awt2dLibraries.gmk --- a/make/lib/Awt2dLibraries.gmk Mon Mar 19 12:29:23 2018 +0530 +++ b/make/lib/Awt2dLibraries.gmk Mon Mar 19 10:46:31 2018 -0700 @@ -739,7 +739,7 @@ $(BUILD_LIBJAWT): $(BUILD_LIBAWT) $(eval $(call SetupCopyFiles, COPY_JAWT_LIB, \ - FILES := $(SUPPORT_OUTPUTDIR)/native/$(MODULE)/libjawt/$(LIBRARY_PREFIX)jawt$(STATIC_LIBRARY_SUFFIX), \ + FILES := $(BUILD_LIBJAWT_IMPORT_LIBRARY), \ DEST := $(SUPPORT_OUTPUTDIR)/modules_libs/$(MODULE), \ )) @@ -931,7 +931,7 @@ TARGETS += $(BUILD_LIBSPLASHSCREEN) ifeq ($(OPENJDK_TARGET_OS), macosx) - $(BUILD_LIBSPLASHSCREEN): $(INSTALL_LIBRARIES_HERE)/$(LIBRARY_PREFIX)osxapp$(SHARED_LIBRARY_SUFFIX) + $(BUILD_LIBSPLASHSCREEN): $(call FindLib, java.desktop, osxapp) endif endif @@ -1009,7 +1009,7 @@ $(BUILD_LIBAWT_LWAWT): $(BUILD_LIBMLIB_IMAGE) - $(BUILD_LIBAWT_LWAWT): $(BUILD_LIBOSXAPP) + $(BUILD_LIBAWT_LWAWT): $(call FindLib, java.desktop, osxapp) $(BUILD_LIBAWT_LWAWT): $(call FindLib, java.base, java) @@ -1047,12 +1047,10 @@ $(BUILD_LIBOSXUI): $(BUILD_LIBAWT) - $(BUILD_LIBOSXUI): $(BUILD_LIBOSXAPP) + $(BUILD_LIBOSXUI): $(call FindLib, java.desktop, osxapp) $(BUILD_LIBOSXUI): $(BUILD_LIBAWT_LWAWT) - #$(BUILD_LIBOSXUI): $(call FindLib, java.base, java) - endif ################################################################################ diff -r 719064f540f3 -r 79f6a4dc221e make/lib/Lib-java.instrument.gmk --- a/make/lib/Lib-java.instrument.gmk Mon Mar 19 12:29:23 2018 +0530 +++ b/make/lib/Lib-java.instrument.gmk Mon Mar 19 10:46:31 2018 -0700 @@ -73,17 +73,17 @@ LIBS_aix := -liconv -ljli_static $(LIBDL), \ LIBS_macosx := -liconv -framework Cocoa -framework Security \ -framework ApplicationServices \ - $(SUPPORT_OUTPUTDIR)/native/java.base/libjli_static.a, \ + $(call FindStaticLib, java.base, jli_static), \ LIBS_windows := jvm.lib $(WIN_JAVA_LIB) advapi32.lib \ - $(SUPPORT_OUTPUTDIR)/native/java.base/jli_static.lib, \ + $(call FindStaticLib, java.base, jli_static), \ )) -ifneq (, $(findstring $(OPENJDK_TARGET_OS), macosx windows aix)) - $(BUILD_LIBINSTRUMENT): $(SUPPORT_OUTPUTDIR)/native/java.base/$(LIBRARY_PREFIX)jli_static$(STATIC_LIBRARY_SUFFIX) +ifneq ($(filter $(OPENJDK_TARGET_OS), macosx windows aix), ) + $(BUILD_LIBINSTRUMENT): $(call FindStaticLib, java.base, jli_static) else $(BUILD_LIBINSTRUMENT): $(call FindLib, java.base, jli, /jli) endif -$(BUILD_LIBINSTRUMENT): $(BUILD_LIBJAVA) +$(BUILD_LIBINSTRUMENT): $(call FindLib, java.base, java) TARGETS += $(BUILD_LIBINSTRUMENT) diff -r 719064f540f3 -r 79f6a4dc221e make/lib/Lib-jdk.crypto.ucrypto.gmk --- a/make/lib/Lib-jdk.crypto.ucrypto.gmk Mon Mar 19 12:29:23 2018 +0530 +++ b/make/lib/Lib-jdk.crypto.ucrypto.gmk Mon Mar 19 10:46:31 2018 -0700 @@ -42,7 +42,7 @@ LIBS := $(LIBDL), \ )) - $(BUILD_LIBJ2UCRYPTO): $(BUILD_LIBJAVA) + $(BUILD_LIBJ2UCRYPTO): $(call FindLib, java.base, java) TARGETS += $(BUILD_LIBJ2UCRYPTO) diff -r 719064f540f3 -r 79f6a4dc221e make/lib/LibCommon.gmk --- a/make/lib/LibCommon.gmk Mon Mar 19 12:29:23 2018 +0530 +++ b/make/lib/LibCommon.gmk Mon Mar 19 10:46:31 2018 -0700 @@ -54,11 +54,19 @@ # Find a library # Param 1 - module name # Param 2 - library name -# Param 3 - subdir for library +# Param 3 - optional subdir for library FindLib = \ $(call FindLibDirForModule, \ $(strip $1))$(strip $3)/$(LIBRARY_PREFIX)$(strip $2)$(SHARED_LIBRARY_SUFFIX) +################################################################################ +# Find a static library +# Param 1 - module name +# Param 2 - library name +# Param 3 - optional subdir for library +FindStaticLib = \ + $(addprefix $(SUPPORT_OUTPUTDIR)/native/, \ + $(strip $1)$(strip $3)/$(LIBRARY_PREFIX)$(strip $2)$(STATIC_LIBRARY_SUFFIX)) ################################################################################ # Define the header include flags needed to compile against it. diff -r 719064f540f3 -r 79f6a4dc221e make/lib/SoundLibraries.gmk --- a/make/lib/SoundLibraries.gmk Mon Mar 19 12:29:23 2018 +0530 +++ b/make/lib/SoundLibraries.gmk Mon Mar 19 10:46:31 2018 -0700 @@ -133,7 +133,7 @@ LIBS_windows := $(WIN_JAVA_LIB) advapi32.lib winmm.lib, \ )) -$(BUILD_LIBJSOUND): $(BUILD_LIBJAVA) +$(BUILD_LIBJSOUND): $(call FindLib, java.base, java) TARGETS += $(BUILD_LIBJSOUND) @@ -166,7 +166,7 @@ LIBS := $(ALSA_LIBS) -ljava -ljvm, \ )) - $(BUILD_LIBJSOUNDALSA): $(BUILD_LIBJAVA) + $(BUILD_LIBJSOUNDALSA): $(call FindLib, java.base, java) TARGETS += $(BUILD_LIBJSOUNDALSA) @@ -191,7 +191,7 @@ LIBS := $(JDKLIB_LIBS) dsound.lib winmm.lib user32.lib ole32.lib, \ )) - $(BUILD_LIBJSOUNDDS): $(BUILD_LIBJAVA) + $(BUILD_LIBJSOUNDDS): $(call FindLib, java.base, java) TARGETS += $(BUILD_LIBJSOUNDDS) diff -r 719064f540f3 -r 79f6a4dc221e make/mapfiles/libjava/reorder-sparc --- a/make/mapfiles/libjava/reorder-sparc Mon Mar 19 12:29:23 2018 +0530 +++ b/make/mapfiles/libjava/reorder-sparc Mon Mar 19 10:46:31 2018 -0700 @@ -26,7 +26,6 @@ text: .text%Java_java_io_FileDescriptor_initIDs; text: .text%Java_java_io_FileOutputStream_initIDs; text: .text%Java_java_lang_System_setIn0; -text: .text%Java_sun_reflect_Reflection_getCallerClass__; text: .text%Java_java_lang_Class_forName0; text: .text%Java_java_lang_Object_getClass; text: .text%Java_sun_reflect_Reflection_getClassAccessFlags; diff -r 719064f540f3 -r 79f6a4dc221e make/mapfiles/libjava/reorder-sparcv9 --- a/make/mapfiles/libjava/reorder-sparcv9 Mon Mar 19 12:29:23 2018 +0530 +++ b/make/mapfiles/libjava/reorder-sparcv9 Mon Mar 19 10:46:31 2018 -0700 @@ -25,7 +25,6 @@ text: .text%Java_java_io_FileDescriptor_initIDs; text: .text%Java_java_io_FileOutputStream_initIDs; text: .text%Java_java_lang_System_setIn0; -text: .text%Java_sun_reflect_Reflection_getCallerClass__; text: .text%Java_java_lang_Class_forName0; text: .text%Java_java_lang_String_intern; text: .text%Java_java_lang_StringUTF16_isBigEndian; diff -r 719064f540f3 -r 79f6a4dc221e make/mapfiles/libjava/reorder-x86 --- a/make/mapfiles/libjava/reorder-x86 Mon Mar 19 12:29:23 2018 +0530 +++ b/make/mapfiles/libjava/reorder-x86 Mon Mar 19 10:46:31 2018 -0700 @@ -26,7 +26,6 @@ text: .text%Java_java_io_FileDescriptor_initIDs; text: .text%Java_java_io_FileOutputStream_initIDs; text: .text%Java_java_lang_System_setIn0; -text: .text%Java_sun_reflect_Reflection_getCallerClass__; text: .text%Java_java_lang_Class_forName0; text: .text%Java_java_lang_String_intern; text: .text%Java_java_lang_StringUTF16_isBigEndian; diff -r 719064f540f3 -r 79f6a4dc221e src/java.base/share/classes/java/io/FileReader.java --- a/src/java.base/share/classes/java/io/FileReader.java Mon Mar 19 12:29:23 2018 +0530 +++ b/src/java.base/share/classes/java/io/FileReader.java Mon Mar 19 10:46:31 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2001, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2018, 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 @@ -25,16 +25,17 @@ package java.io; +import java.nio.charset.Charset; /** - * Convenience class for reading character files. The constructors of this - * class assume that the default character encoding and the default byte-buffer - * size are appropriate. To specify these values yourself, construct an - * InputStreamReader on a FileInputStream. + * Reads text from character files using a default buffer size. Decoding from bytes + * to characters uses either a specified {@linkplain java.nio.charset.Charset charset} + * or the platform's + * {@linkplain java.nio.charset.Charset#defaultCharset() default charset}. * - *
{@code FileReader} is meant for reading streams of characters. - * For reading streams of raw bytes, consider using a - * {@code FileInputStream}. + *
+ * The {@code FileReader} is meant for reading streams of characters. For reading + * streams of raw bytes, consider using a {@code FileInputStream}. * * @see InputStreamReader * @see FileInputStream @@ -45,10 +46,11 @@ public class FileReader extends InputStreamReader { /** - * Creates a new {@code FileReader}, given the name of the - * file to read from. + * Creates a new {@code FileReader}, given the name of the file to read, + * using the platform's + * {@linkplain java.nio.charset.Charset#defaultCharset() default charset}. * - * @param fileName the name of the file to read from + * @param fileName the name of the file to read * @exception FileNotFoundException if the named file does not exist, * is a directory rather than a regular file, * or for some other reason cannot be opened for @@ -59,10 +61,11 @@ } /** - * Creates a new {@code FileReader}, given the {@code File} - * to read from. + * Creates a new {@code FileReader}, given the {@code File} to read, + * using the platform's + * {@linkplain java.nio.charset.Charset#defaultCharset() default charset}. * - * @param file the {@code File} to read from + * @param file the {@code File} to read * @exception FileNotFoundException if the file does not exist, * is a directory rather than a regular file, * or for some other reason cannot be opened for @@ -73,13 +76,47 @@ } /** - * Creates a new {@code FileReader}, given the - * {@code FileDescriptor} to read from. + * Creates a new {@code FileReader}, given the {@code FileDescriptor} to read, + * using the platform's + * {@linkplain java.nio.charset.Charset#defaultCharset() default charset}. * - * @param fd the FileDescriptor to read from + * @param fd the {@code FileDescriptor} to read */ public FileReader(FileDescriptor fd) { super(new FileInputStream(fd)); } + /** + * Creates a new {@code FileReader}, given the name of the file to read + * and the {@linkplain java.nio.charset.Charset charset}. + * + * @param fileName the name of the file to read + * @param charset the {@linkplain java.nio.charset.Charset charset} + * @exception IOException if the named file does not exist, + * is a directory rather than a regular file, + * or for some other reason cannot be opened for + * reading. + * + * @since 11 + */ + public FileReader(String fileName, Charset charset) throws IOException { + super(new FileInputStream(fileName), charset); + } + + /** + * Creates a new {@code FileReader}, given the {@code File} to read and + * the {@linkplain java.nio.charset.Charset charset}. + * + * @param file the {@code File} to read + * @param charset the {@linkplain java.nio.charset.Charset charset} + * @exception IOException if the file does not exist, + * is a directory rather than a regular file, + * or for some other reason cannot be opened for + * reading. + * + * @since 11 + */ + public FileReader(File file, Charset charset) throws IOException { + super(new FileInputStream(file), charset); + } } diff -r 719064f540f3 -r 79f6a4dc221e src/java.base/share/classes/java/io/FileWriter.java --- a/src/java.base/share/classes/java/io/FileWriter.java Mon Mar 19 12:29:23 2018 +0530 +++ b/src/java.base/share/classes/java/io/FileWriter.java Mon Mar 19 10:46:31 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2001, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2018, 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 @@ -25,22 +25,24 @@ package java.io; +import java.nio.charset.Charset; /** - * Convenience class for writing character files. The constructors of this - * class assume that the default character encoding and the default byte-buffer - * size are acceptable. To specify these values yourself, construct an - * OutputStreamWriter on a FileOutputStream. + * Writes text to character files using a default buffer size. Encoding from characters + * to bytes uses either a specified {@linkplain java.nio.charset.Charset charset} + * or the platform's + * {@linkplain java.nio.charset.Charset#defaultCharset() default charset}. * - *
Whether or not a file is available or may be created depends upon the + *
+ * Whether or not a file is available or may be created depends upon the * underlying platform. Some platforms, in particular, allow a file to be * opened for writing by only one {@code FileWriter} (or other file-writing * object) at a time. In such situations the constructors in this class * will fail if the file involved is already open. * - *
{@code FileWriter} is meant for writing streams of characters. - * For writing streams of raw bytes, consider using a - * {@code FileOutputStream}. + *
+ * The {@code FileWriter} is meant for writing streams of characters. For writing + * streams of raw bytes, consider using a {@code FileOutputStream}. * * @see OutputStreamWriter * @see FileOutputStream @@ -52,7 +54,8 @@ public class FileWriter extends OutputStreamWriter { /** - * Constructs a FileWriter object given a file name. + * Constructs a {@code FileWriter} given a file name, using the platform's + * {@linkplain java.nio.charset.Charset#defaultCharset() default charset} * * @param fileName String The system-dependent filename. * @throws IOException if the named file exists but is a directory rather @@ -64,8 +67,9 @@ } /** - * Constructs a FileWriter object given a file name with a boolean - * indicating whether or not to append the data written. + * Constructs a {@code FileWriter} given a file name and a boolean indicating + * whether to append the data written, using the platform's + * {@linkplain java.nio.charset.Charset#defaultCharset() default charset}. * * @param fileName String The system-dependent filename. * @param append boolean if {@code true}, then data will be written @@ -79,9 +83,11 @@ } /** - * Constructs a FileWriter object given a File object. + * Constructs a {@code FileWriter} given the {@code File} to write, + * using the platform's + * {@linkplain java.nio.charset.Charset#defaultCharset() default charset} * - * @param file a File object to write to. + * @param file the {@code File} to write. * @throws IOException if the file exists but is a directory rather than * a regular file, does not exist but cannot be created, * or cannot be opened for any other reason @@ -91,11 +97,11 @@ } /** - * Constructs a FileWriter object given a File object. If the second - * argument is {@code true}, then bytes will be written to the end - * of the file rather than the beginning. + * Constructs a {@code FileWriter} given the {@code File} to write and + * a boolean indicating whether to append the data written, using the platform's + * {@linkplain java.nio.charset.Charset#defaultCharset() default charset}. * - * @param file a File object to write to + * @param file the {@code File} to write * @param append if {@code true}, then bytes will be written * to the end of the file rather than the beginning * @throws IOException if the file exists but is a directory rather than @@ -108,12 +114,83 @@ } /** - * Constructs a FileWriter object associated with a file descriptor. + * Constructs a {@code FileWriter} given a file descriptor, + * using the platform's + * {@linkplain java.nio.charset.Charset#defaultCharset() default charset}. * - * @param fd FileDescriptor object to write to. + * @param fd the {@code FileDescriptor} to write. */ public FileWriter(FileDescriptor fd) { super(new FileOutputStream(fd)); } + + /** + * Constructs a {@code FileWriter} given a file name and + * {@linkplain java.nio.charset.Charset charset}. + * + * @param fileName the name of the file to write + * @param charset the {@linkplain java.nio.charset.Charset charset} + * @throws IOException if the named file exists but is a directory rather + * than a regular file, does not exist but cannot be + * created, or cannot be opened for any other reason + * + * @since 11 + */ + public FileWriter(String fileName, Charset charset) throws IOException { + super(new FileOutputStream(fileName), charset); + } + + /** + * Constructs a {@code FileWriter} given a file name, + * {@linkplain java.nio.charset.Charset charset} and a boolean indicating + * whether to append the data written. + * + * @param fileName the name of the file to write + * @param charset the {@linkplain java.nio.charset.Charset charset} + * @param append a boolean. If {@code true}, the writer will write the data + * to the end of the file rather than the beginning. + * @throws IOException if the named file exists but is a directory rather + * than a regular file, does not exist but cannot be + * created, or cannot be opened for any other reason + * + * @since 11 + */ + public FileWriter(String fileName, Charset charset, boolean append) throws IOException { + super(new FileOutputStream(fileName, append), charset); + } + + /** + * Constructs a {@code FileWriter} given the {@code File} to write and + * {@linkplain java.nio.charset.Charset charset}. + * + * @param file the {@code File} to write + * @param charset the {@linkplain java.nio.charset.Charset charset} + * @throws IOException if the file exists but is a directory rather than + * a regular file, does not exist but cannot be created, + * or cannot be opened for any other reason + * + * @since 11 + */ + public FileWriter(File file, Charset charset) throws IOException { + super(new FileOutputStream(file), charset); + } + + /** + * Constructs a {@code FileWriter} given the {@code File} to write, + * {@linkplain java.nio.charset.Charset charset} and a boolean indicating + * whether to append the data written. + * + * @param file the {@code File} to write + * @param charset the {@linkplain java.nio.charset.Charset charset} + * @param append a boolean. If {@code true}, the writer will write the data + * to the end of the file rather than the beginning. + * @throws IOException if the file exists but is a directory rather than + * a regular file, does not exist but cannot be created, + * or cannot be opened for any other reason + * @since 11 + */ + public FileWriter(File file, Charset charset, boolean append) throws IOException { + super(new FileOutputStream(file, append), charset); + } } diff -r 719064f540f3 -r 79f6a4dc221e src/java.base/share/classes/java/io/Reader.java --- a/src/java.base/share/classes/java/io/Reader.java Mon Mar 19 12:29:23 2018 +0530 +++ b/src/java.base/share/classes/java/io/Reader.java Mon Mar 19 10:46:31 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2018, 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 @@ -26,6 +26,7 @@ package java.io; +import java.nio.CharBuffer; import java.util.Objects; /** @@ -55,6 +56,85 @@ private static final int TRANSFER_BUFFER_SIZE = 8192; /** + * Returns a new {@code Reader} that reads no characters. The returned + * stream is initially open. The stream is closed by calling the + * {@code close()} method. Subsequent calls to {@code close()} have no + * effect. + * + *
While the stream is open, the {@code read()}, {@code read(char[])}, + * {@code read(char[], int, int)}, {@code read(Charbuffer)}, {@code + * ready())}, {@code skip(long)}, and {@code transferTo()} methods all + * behave as if end of stream has been reached. After the stream has been + * closed, these methods all throw {@code IOException}. + * + *
The {@code markSupported()} method returns {@code false}. The + * {@code mark()} method does nothing, and the {@code reset()} method + * throws {@code IOException}. + * + *
The {@link #lock object} used to synchronize operations on the + * returned {@code Reader} is not specified. + * + * @return a {@code Reader} which reads no characters + * + * @since 11 + */ + public static Reader nullReader() { + return new Reader() { + private volatile boolean closed; + + private void ensureOpen() throws IOException { + if (closed) { + throw new IOException("Stream closed"); + } + } + + @Override + public int read() throws IOException { + ensureOpen(); + return -1; + } + + @Override + public int read(char[] cbuf, int off, int len) throws IOException { + Objects.checkFromIndexSize(off, len, cbuf.length); + ensureOpen(); + if (len == 0) { + return 0; + } + return -1; + } + + @Override + public int read(CharBuffer target) throws IOException { + Objects.requireNonNull(target); + ensureOpen(); + if (target.hasRemaining()) { + return -1; + } + return 0; + } + + @Override + public long skip(long n) throws IOException { + ensureOpen(); + return 0L; + } + + @Override + public long transferTo(Writer out) throws IOException { + Objects.requireNonNull(out); + ensureOpen(); + return 0L; + } + + @Override + public void close() { + closed = true; + } + }; + } + + /** * The object used to synchronize operations on this stream. For * efficiency, a character-stream object may use an object other than * itself to protect critical sections. A subclass should therefore use diff -r 719064f540f3 -r 79f6a4dc221e src/java.base/share/classes/java/io/Writer.java --- a/src/java.base/share/classes/java/io/Writer.java Mon Mar 19 12:29:23 2018 +0530 +++ b/src/java.base/share/classes/java/io/Writer.java Mon Mar 19 10:46:31 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2018, 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 @@ -26,6 +26,8 @@ package java.io; +import java.util.Objects; + /** * Abstract class for writing to character streams. The only methods that a * subclass must implement are write(char[], int, int), flush(), and close(). @@ -59,6 +61,91 @@ private static final int WRITE_BUFFER_SIZE = 1024; /** + * Returns a new {@code Writer} which discards all characters. The + * returned stream is initially open. The stream is closed by calling + * the {@code close()} method. Subsequent calls to {@code close()} have + * no effect. + * + *
While the stream is open, the {@code append(char)}, {@code + * append(CharSequence)}, {@code append(CharSequence, int, int)}, + * {@code flush()}, {@code write(int)}, {@code write(char[])}, and + * {@code write(char[], int, int)} methods do nothing. After the stream + * has been closed, these methods all throw {@code IOException}. + * + *
The {@link #lock object} used to synchronize operations on the
+ * returned {@code Writer} is not specified.
+ *
+ * @return a {@code Writer} which discards all characters
+ *
+ * @since 11
+ */
+ public static Writer nullWriter() {
+ return new Writer() {
+ private volatile boolean closed;
+
+ private void ensureOpen() throws IOException {
+ if (closed) {
+ throw new IOException("Stream closed");
+ }
+ }
+
+ @Override
+ public Writer append(char c) throws IOException {
+ ensureOpen();
+ return this;
+ }
+
+ @Override
+ public Writer append(CharSequence csq) throws IOException {
+ ensureOpen();
+ return this;
+ }
+
+ @Override
+ public Writer append(CharSequence csq, int start, int end) throws IOException {
+ ensureOpen();
+ if (csq != null) {
+ Objects.checkFromToIndex(start, end, csq.length());
+ }
+ return this;
+ }
+
+ @Override
+ public void write(int c) throws IOException {
+ ensureOpen();
+ }
+
+ @Override
+ public void write(char[] cbuf, int off, int len) throws IOException {
+ Objects.checkFromIndexSize(off, len, cbuf.length);
+ ensureOpen();
+ }
+
+ @Override
+ public void write(String str) throws IOException {
+ Objects.requireNonNull(str);
+ ensureOpen();
+ }
+
+ @Override
+ public void write(String str, int off, int len) throws IOException {
+ Objects.checkFromIndexSize(off, len, str.length());
+ ensureOpen();
+ }
+
+ @Override
+ public void flush() throws IOException {
+ ensureOpen();
+ }
+
+ @Override
+ public void close() throws IOException {
+ closed = true;
+ }
+ };
+ }
+
+ /**
* The object used to synchronize operations on this stream. For
* efficiency, a character-stream object may use an object other than
* itself to protect critical sections. A subclass should therefore use
diff -r 719064f540f3 -r 79f6a4dc221e src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/lookup/Lookup.java
--- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/lookup/Lookup.java Mon Mar 19 12:29:23 2018 +0530
+++ b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/lookup/Lookup.java Mon Mar 19 10:46:31 2018 -0700
@@ -56,11 +56,8 @@
/** Method handle to the empty setter */
public static final MethodHandle EMPTY_SETTER = findOwnMH("emptySetter", void.class, Object.class, Object.class);
- /** Method handle to a getter that only throws type error */
- public static final MethodHandle TYPE_ERROR_THROWER_GETTER = findOwnMH("typeErrorThrowerGetter", Object.class, Object.class);
-
- /** Method handle to a setter that only throws type error */
- public static final MethodHandle TYPE_ERROR_THROWER_SETTER = findOwnMH("typeErrorThrowerSetter", void.class, Object.class, Object.class);
+ /** Method handle to a getter or setter that only throws type error */
+ public static final MethodHandle TYPE_ERROR_THROWER = findOwnMH("typeErrorThrower", Object.class, Object.class);
/** Method handle to the most generic of getters, the one that returns an Object */
public static final MethodType GET_OBJECT_TYPE = MH.type(Object.class, Object.class);
@@ -114,17 +111,7 @@
* @param self self reference
* @return undefined (but throws error before return point)
*/
- public static Object typeErrorThrowerGetter(final Object self) {
- throw typeError("strict.getter.setter.poison", ScriptRuntime.safeToString(self));
- }
-
- /**
- * Getter function that always throws type error
- *
- * @param self self reference
- * @param value (ignored)
- */
- public static void typeErrorThrowerSetter(final Object self, final Object value) {
+ public static Object typeErrorThrower(final Object self) {
throw typeError("strict.getter.setter.poison", ScriptRuntime.safeToString(self));
}
diff -r 719064f540f3 -r 79f6a4dc221e src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/Global.java
--- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/Global.java Mon Mar 19 12:29:23 2018 +0530
+++ b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/Global.java Mon Mar 19 10:46:31 2018 -0700
@@ -2978,7 +2978,7 @@
anon.deleteOwnProperty(anon.getMap().findProperty("prototype"));
// use "getter" so that [[ThrowTypeError]] function's arity is 0 - as specified in step 10 of section 13.2.3
- this.typeErrorThrower = ScriptFunction.createBuiltin("TypeErrorThrower", Lookup.TYPE_ERROR_THROWER_GETTER);
+ this.typeErrorThrower = ScriptFunction.createBuiltin("TypeErrorThrower", Lookup.TYPE_ERROR_THROWER);
typeErrorThrower.preventExtensions();
// now initialize Object
diff -r 719064f540f3 -r 79f6a4dc221e src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeStrictArguments.java
--- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeStrictArguments.java Mon Mar 19 12:29:23 2018 +0530
+++ b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeStrictArguments.java Mon Mar 19 10:46:31 2018 -0700
@@ -79,9 +79,8 @@
final ScriptFunction func = Global.instance().getTypeErrorThrower();
// We have to fill user accessor functions late as these are stored
// in this object rather than in the PropertyMap of this object.
- final int flags = Property.NOT_ENUMERABLE | Property.NOT_CONFIGURABLE;
- initUserAccessors("caller", flags, func, func);
- initUserAccessors("callee", flags, func, func);
+ initUserAccessors("caller", func, func);
+ initUserAccessors("callee", func, func);
setArray(ArrayData.allocate(values));
this.length = values.length;
diff -r 719064f540f3 -r 79f6a4dc221e src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptFunction.java
--- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptFunction.java Mon Mar 19 12:29:23 2018 +0530
+++ b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptFunction.java Mon Mar 19 10:46:31 2018 -0700
@@ -137,8 +137,8 @@
final int flags = Property.NOT_ENUMERABLE | Property.NOT_CONFIGURABLE;
PropertyMap newMap = map;
// Need to add properties directly to map since slots are assigned speculatively by newUserAccessors.
- newMap = newMap.addPropertyNoHistory(map.newUserAccessors("arguments", flags));
- newMap = newMap.addPropertyNoHistory(map.newUserAccessors("caller", flags));
+ newMap = newMap.addPropertyNoHistory(newMap.newUserAccessors("arguments", flags));
+ newMap = newMap.addPropertyNoHistory(newMap.newUserAccessors("caller", flags));
return newMap;
}
@@ -215,8 +215,8 @@
assert objectSpill == null;
if (isStrict() || isBoundFunction()) {
final ScriptFunction typeErrorThrower = global.getTypeErrorThrower();
- initUserAccessors("arguments", Property.NOT_CONFIGURABLE | Property.NOT_ENUMERABLE, typeErrorThrower, typeErrorThrower);
- initUserAccessors("caller", Property.NOT_CONFIGURABLE | Property.NOT_ENUMERABLE, typeErrorThrower, typeErrorThrower);
+ initUserAccessors("arguments", typeErrorThrower, typeErrorThrower);
+ initUserAccessors("caller", typeErrorThrower, typeErrorThrower);
}
}
diff -r 719064f540f3 -r 79f6a4dc221e src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptObject.java
--- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptObject.java Mon Mar 19 12:29:23 2018 +0530
+++ b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptObject.java Mon Mar 19 10:46:31 2018 -0700
@@ -962,24 +962,19 @@
/**
* Fast initialization functions for ScriptFunctions that are strict, to avoid
* creating setters that probably aren't used. Inject directly into the spill pool
- * the defaults for "arguments" and "caller"
+ * the defaults for "arguments" and "caller", asserting the property is already
+ * defined in the map.
*
- * @param key property key
- * @param propertyFlags flags
- * @param getter getter for {@link UserAccessorProperty}, null if not present or N/A
- * @param setter setter for {@link UserAccessorProperty}, null if not present or N/A
+ * @param key property key
+ * @param getter getter for {@link UserAccessorProperty}
+ * @param setter setter for {@link UserAccessorProperty}
*/
- protected final void initUserAccessors(final String key, final int propertyFlags, final ScriptFunction getter, final ScriptFunction setter) {
- final PropertyMap oldMap = getMap();
- final int slot = oldMap.getFreeSpillSlot();
- ensureSpillSize(slot);
- objectSpill[slot] = new UserAccessorProperty.Accessors(getter, setter);
- Property newProperty;
- PropertyMap newMap;
- do {
- newProperty = new UserAccessorProperty(key, propertyFlags, slot);
- newMap = oldMap.addProperty(newProperty);
- } while (!compareAndSetMap(oldMap, newMap));
+ protected final void initUserAccessors(final String key, final ScriptFunction getter, final ScriptFunction setter) {
+ final PropertyMap map = getMap();
+ final Property property = map.findProperty(key);
+ assert property instanceof UserAccessorProperty;
+ ensureSpillSize(property.getSlot());
+ objectSpill[property.getSlot()] = new UserAccessorProperty.Accessors(getter, setter);
}
/**
diff -r 719064f540f3 -r 79f6a4dc221e test/jdk/java/io/FileReader/ConstructorTest.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/java/io/FileReader/ConstructorTest.java Mon Mar 19 10:46:31 2018 -0700
@@ -0,0 +1,127 @@
+/*
+ * Copyright (c) 2018, 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.
+ */
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import org.testng.Assert;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+/**
+ * @test
+ * @bug 8183554
+ * @summary Test to verify the new Constructors that take a Charset.
+ * @run testng ConstructorTest
+ */
+public class ConstructorTest {
+ static String USER_DIR = System.getProperty("user.dir", ".");
+
+ public static enum ConstructorType {
+ STRING,
+ FILE
+ }
+
+ static final String TEST_STRING = "abc \u0100 \u0101 \u0555 \u07FD \u07FF";
+ static final int BUFFER_SIZE = 8192;
+
+ @DataProvider(name = "parameters")
+ public Object[][] getParameters() throws IOException {
+ File file1 = new File(USER_DIR, "FileReaderTest1.txt");
+ File file2 = new File(USER_DIR, "FileReaderTest2.txt");
+
+ return new Object[][]{
+ {ConstructorType.STRING, file1, file2, StandardCharsets.UTF_8},
+ {ConstructorType.FILE, file1, file2, StandardCharsets.UTF_8},
+ {ConstructorType.STRING, file1, file2, StandardCharsets.ISO_8859_1},
+ {ConstructorType.FILE, file1, file2, StandardCharsets.ISO_8859_1},
+ };
+ }
+
+ /**
+ * Verifies that the new constructors that take a Charset function the same
+ * as an InputStreamReader on a FileInputStream as was recommended before
+ * this change.
+ *
+ * @param type the type of the constructor
+ * @param file1 file1 to be read with a FileReader
+ * @param file2 file2 to be read with an InputStreamReader
+ * @param charset the charset
+ * @throws IOException
+ */
+ @Test(dataProvider = "parameters")
+ void test(ConstructorType type, File file1, File file2, Charset charset)
+ throws Exception {
+ prepareFile(file1, TEST_STRING, charset);
+ prepareFile(file2, TEST_STRING, charset);
+
+ try (FileReader fr = getFileReader(type, file1, charset);
+ FileInputStream is = new FileInputStream(file2);
+ InputStreamReader isr = new InputStreamReader(is, charset);) {
+ String result1 = readAll(fr, BUFFER_SIZE);
+ String result2 = readAll(isr, BUFFER_SIZE);
+ Assert.assertEquals(result1, result2);
+ }
+ }
+
+ public String readAll(Reader reader, int bufferSize) throws IOException {
+ StringBuilder sb = new StringBuilder();
+ char[] buf = new char[bufferSize];
+ int numRead;
+ while ((numRead = reader.read(buf)) != -1) {
+ if (numRead == buf.length) {
+ sb.append(buf);
+ } else {
+ sb.append(String.valueOf(buf, 0, numRead));
+ }
+ }
+ return sb.toString();
+ }
+
+ /*
+ * Creates a FileReader over the given input file.
+ */
+ FileReader getFileReader(ConstructorType type, File file, Charset charset)
+ throws IOException {
+ switch (type) {
+ case STRING:
+ return new FileReader(file.getPath(), charset);
+ case FILE:
+ return new FileReader(file, charset);
+ }
+
+ return null;
+ }
+
+ void prepareFile(File file, String content, Charset charset) throws IOException {
+ try (FileWriter writer = new FileWriter(file, charset);) {
+ writer.write(content);
+ }
+ }
+}
diff -r 719064f540f3 -r 79f6a4dc221e test/jdk/java/io/FileWriter/ConstructorTest.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/java/io/FileWriter/ConstructorTest.java Mon Mar 19 10:46:31 2018 -0700
@@ -0,0 +1,172 @@
+/*
+ * Copyright (c) 2018, 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.
+ */
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Reader;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import org.testng.Assert;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+/**
+ * @test
+ * @bug 8183554
+ * @summary Test to verify the new Constructors that take a Charset.
+ * @run testng ConstructorTest
+ */
+public class ConstructorTest {
+ static String USER_DIR = System.getProperty("user.dir", ".");
+
+ public static enum ConstructorType {
+ STRING,
+ FILE,
+ STRING_APPEND,
+ FILE_APPEND
+ }
+
+ static final String TEST_STRING = "abc \u0100 \u0101 \u0555 \u07FD \u07FF";
+ static final int BUFFER_SIZE = 8192;
+
+ @DataProvider(name = "parameters")
+ public Object[][] getParameters() throws IOException {
+ File file1 = new File(USER_DIR, "FileWriterTest1.txt");
+ File file2 = new File(USER_DIR, "FileWriterTest2.txt");
+
+ return new Object[][]{
+ {ConstructorType.STRING, file1, file2, StandardCharsets.UTF_8},
+ {ConstructorType.FILE, file1, file2, StandardCharsets.UTF_8},
+ {ConstructorType.STRING_APPEND, file1, file2, StandardCharsets.UTF_8},
+ {ConstructorType.FILE_APPEND, file1, file2, StandardCharsets.UTF_8},
+ {ConstructorType.STRING, file1, file2, StandardCharsets.ISO_8859_1},
+ {ConstructorType.FILE, file1, file2, StandardCharsets.ISO_8859_1},
+ {ConstructorType.STRING_APPEND, file1, file2, StandardCharsets.ISO_8859_1},
+ {ConstructorType.FILE_APPEND, file1, file2, StandardCharsets.ISO_8859_1},
+ };
+ }
+
+ /**
+ * Verifies that the new constructors that take a Charset function the same
+ * as an OutputStreamWriter on a FileOutputStream as was recommended before
+ * this change.
+ *
+ * @param type the type of the constructor
+ * @param file1 file1 to be written with a FileWriter
+ * @param file2 file2 to be written with an OutputStreamWriter
+ * @param charset the charset
+ * @throws IOException
+ */
+ @Test(dataProvider = "parameters")
+ void test(ConstructorType type, File file1, File file2, Charset charset)
+ throws Exception {
+ writeWithFileWriter(type, file1, TEST_STRING, charset);
+ writeWithOutputStreamWriter(type, file2, TEST_STRING, charset);
+
+ try (
+ FileReader r1 = getFileReader(type, file1, charset);
+ FileReader r2 = getFileReader(type, file2, charset);
+ ) {
+ String result1 = readAll(r1, BUFFER_SIZE);
+ String result2 = readAll(r2, BUFFER_SIZE);
+ Assert.assertEquals(result1, result2);
+ }
+ }
+
+ public String readAll(Reader reader, int bufferSize) throws IOException {
+ StringBuilder sb = new StringBuilder();
+ char[] buf = new char[bufferSize];
+ int numRead;
+ while ((numRead = reader.read(buf)) != -1) {
+ if (numRead == buf.length) {
+ sb.append(buf);
+ } else {
+ sb.append(String.valueOf(buf, 0, numRead));
+ }
+ }
+ return sb.toString();
+ }
+
+ /*
+ * Creates a FileReader over the given input file.
+ */
+ FileReader getFileReader(ConstructorType type, File file, Charset charset)
+ throws IOException {
+ switch (type) {
+ case STRING:
+ case STRING_APPEND:
+ return new FileReader(file.getPath(), charset);
+ case FILE:
+ case FILE_APPEND:
+ return new FileReader(file, charset);
+ }
+
+ return null;
+ }
+
+ /*
+ * Creates a FileWriter using the constructor as specified.
+ */
+ FileWriter getFileWriter(ConstructorType type, File file, Charset charset)
+ throws IOException {
+ switch (type) {
+ case STRING:
+ return new FileWriter(file.getPath(), charset);
+ case FILE:
+ return new FileWriter(file, charset);
+ case STRING_APPEND:
+ return new FileWriter(file.getPath(), charset, true);
+ case FILE_APPEND:
+ return new FileWriter(file, charset, true);
+ }
+
+ return null;
+ }
+
+ void writeWithFileWriter(ConstructorType type, File file, String content, Charset charset)
+ throws IOException {
+ if (type == ConstructorType.STRING_APPEND || type == ConstructorType.FILE_APPEND) {
+ try (FileWriter writer = getFileWriter(ConstructorType.FILE, file, charset);) {
+ writer.write(content);
+ }
+ }
+ try (FileWriter writer = getFileWriter(type, file, charset);) {
+ writer.write(content);
+ }
+ }
+
+ void writeWithOutputStreamWriter(ConstructorType type, File file, String content, Charset charset)
+ throws IOException {
+ try (OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(file), charset)) {
+ writer.write(content);
+ if (type == ConstructorType.STRING_APPEND || type == ConstructorType.FILE_APPEND) {
+ writer.write(content);
+ }
+ }
+ }
+}
diff -r 719064f540f3 -r 79f6a4dc221e test/jdk/java/io/Reader/NullReader.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/java/io/Reader/NullReader.java Mon Mar 19 10:46:31 2018 -0700
@@ -0,0 +1,140 @@
+/*
+ * Copyright (c) 2018, 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.
+ */
+
+import java.io.Reader;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.nio.CharBuffer;
+import java.nio.ReadOnlyBufferException;
+
+import org.testng.annotations.AfterGroups;
+import org.testng.annotations.BeforeGroups;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.*;
+
+/*
+ * @test
+ * @bug 8196298
+ * @run testng NullReader
+ * @summary Check for expected behavior of Reader.nullReader().
+ */
+public class NullReader {
+ private static Reader openReader;
+ private static Reader closedReader;
+
+ @BeforeGroups(groups = "open")
+ public static void openStream() {
+ openReader = Reader.nullReader();
+ }
+
+ @BeforeGroups(groups = "closed")
+ public static void openAndCloseStream() throws IOException {
+ closedReader = Reader.nullReader();
+ closedReader.close();
+ }
+
+ @AfterGroups(groups = "open")
+ public static void closeStream() throws IOException {
+ openReader.close();
+ }
+
+ @Test(groups = "open")
+ public static void testOpen() {
+ assertNotNull(openReader, "Reader.nullReader() returned null");
+ }
+
+ @Test(groups = "open")
+ public static void testRead() throws IOException {
+ assertEquals(-1, openReader.read(), "read() != -1");
+ }
+
+ @Test(groups = "open")
+ public static void testReadBII() throws IOException {
+ assertEquals(-1, openReader.read(new char[1], 0, 1),
+ "read(char[],int,int) != -1");
+ }
+
+ @Test(groups = "open")
+ public static void testReadBIILenZero() throws IOException {
+ assertEquals(0, openReader.read(new char[1], 0, 0),
+ "read(char[],int,int) != 0");
+ }
+
+ @Test(groups = "open")
+ public static void testReadCharBuffer() throws IOException {
+ CharBuffer charBuffer = CharBuffer.allocate(1);
+ assertEquals(-1, openReader.read(charBuffer),
+ "read(CharBuffer) != -1");
+ }
+
+ @Test(groups = "open")
+ public static void testReadCharBufferZeroRemaining() throws IOException {
+ CharBuffer charBuffer = CharBuffer.allocate(0);
+ assertEquals(0, openReader.read(charBuffer),
+ "read(CharBuffer) != 0");
+ }
+
+ @Test(groups = "open")
+ public static void testSkip() throws IOException {
+ assertEquals(0, openReader.skip(1), "skip() != 0");
+ }
+
+ @Test(groups = "open")
+ public static void testTransferTo() throws IOException {
+ assertEquals(0, openReader.transferTo(new StringWriter(7)),
+ "transferTo() != 0");
+ }
+
+ @Test(groups = "closed", expectedExceptions = IOException.class)
+ public static void testReadClosed() throws IOException {
+ closedReader.read();
+ }
+
+ @Test(groups = "closed", expectedExceptions = IOException.class)
+ public static void testReadBIIClosed() throws IOException {
+ closedReader.read(new char[1], 0, 1);
+ }
+
+ @Test(groups = "closed", expectedExceptions = IOException.class)
+ public static void testReadCharBufferClosed() throws IOException {
+ CharBuffer charBuffer = CharBuffer.allocate(0);
+ closedReader.read(charBuffer);
+ }
+
+ @Test(groups = "closed", expectedExceptions = IOException.class)
+ public static void testReadCharBufferZeroRemainingClosed() throws IOException {
+ CharBuffer charBuffer = CharBuffer.allocate(0);
+ closedReader.read(charBuffer);
+ }
+
+ @Test(groups = "closed", expectedExceptions = IOException.class)
+ public static void testSkipClosed() throws IOException {
+ closedReader.skip(1);
+ }
+
+ @Test(groups = "closed", expectedExceptions = IOException.class)
+ public static void testTransferToClosed() throws IOException {
+ closedReader.transferTo(new StringWriter(7));
+ }
+}
diff -r 719064f540f3 -r 79f6a4dc221e test/jdk/java/io/Writer/NullWriter.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/java/io/Writer/NullWriter.java Mon Mar 19 10:46:31 2018 -0700
@@ -0,0 +1,167 @@
+/*
+ * Copyright (c) 2018, 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.
+ */
+
+import java.io.IOException;
+import java.io.Writer;
+
+import org.testng.annotations.AfterGroups;
+import org.testng.annotations.BeforeGroups;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.*;
+
+/*
+ * @test
+ * @bug 8196298
+ * @run testng NullWriter
+ * @summary Check for expected behavior of Writer.nullWriter().
+ */
+public class NullWriter {
+ private static Writer openWriter;
+ private static Writer closedWriter;
+
+ @BeforeGroups(groups = "open")
+ public static void openStream() {
+ openWriter = Writer.nullWriter();
+ }
+
+ @BeforeGroups(groups = "closed")
+ public static void openAndCloseStream() throws IOException {
+ closedWriter = Writer.nullWriter();
+ closedWriter.close();
+ }
+
+ @AfterGroups(groups = "open")
+ public static void closeStream() throws IOException {
+ openWriter.close();
+ }
+
+ @Test(groups = "open")
+ public static void testOpen() {
+ assertNotNull(openWriter, "Writer.nullWriter() returned null");
+ }
+
+ @Test(groups = "open")
+ public static void testAppendChar() throws IOException {
+ assertSame(openWriter, openWriter.append('x'));
+ }
+
+ @Test(groups = "open")
+ public static void testAppendCharSequence() throws IOException {
+ CharSequence cs = "abc";
+ assertSame(openWriter, openWriter.append(cs));
+ }
+
+ @Test(groups = "open")
+ public static void testAppendCharSequenceNull() throws IOException {
+ assertSame(openWriter, openWriter.append(null));
+ }
+
+ @Test(groups = "open")
+ public static void testAppendCharSequenceII() throws IOException {
+ CharSequence cs = "abc";
+ assertSame(openWriter, openWriter.append(cs, 0, 1));
+ }
+
+ @Test(groups = "open")
+ public static void testAppendCharSequenceIINull() throws IOException {
+ assertSame(openWriter, openWriter.append(null, 2, 1));
+ }
+
+ @Test(groups = "open")
+ public static void testFlush() throws IOException {
+ openWriter.flush();
+ }
+
+ @Test(groups = "open")
+ public static void testWrite() throws IOException {
+ openWriter.write(62832);
+ }
+
+ @Test(groups = "open")
+ public static void testWriteString() throws IOException {
+ openWriter.write("");
+ }
+
+ @Test(groups = "open")
+ public static void testWriteStringII() throws IOException {
+ openWriter.write("", 0, 0);
+ }
+
+ @Test(groups = "open")
+ public static void testWriteBII() throws IOException, Exception {
+ openWriter.write(new char[]{(char) 6}, 0, 1);
+ }
+
+ @Test(groups = "closed", expectedExceptions = IOException.class)
+ public static void testAppendCharClosed() throws IOException {
+ closedWriter.append('x');
+ }
+
+ @Test(groups = "closed", expectedExceptions = IOException.class)
+ public static void testAppendCharSequenceClosed() throws IOException {
+ CharSequence cs = "abc";
+ closedWriter.append(cs);
+ }
+
+ @Test(groups = "closed", expectedExceptions = IOException.class)
+ public static void testAppendCharSequenceNullClosed() throws IOException {
+ closedWriter.append(null);
+ }
+
+ @Test(groups = "closed", expectedExceptions = IOException.class)
+ public static void testAppendCharSequenceIIClosed() throws IOException {
+ CharSequence cs = "abc";
+ closedWriter.append(cs, 0, 1);
+ }
+
+ @Test(groups = "closed", expectedExceptions = IOException.class)
+ public static void testAppendCharSequenceIINullClosed() throws IOException {
+ closedWriter.append(null, 2, 1);
+ }
+
+ @Test(groups = "closed", expectedExceptions = IOException.class)
+ public static void testFlushClosed() throws IOException {
+ closedWriter.flush();
+ }
+
+ @Test(groups = "closed", expectedExceptions = IOException.class)
+ public static void testWriteClosed() throws IOException {
+ closedWriter.write(62832);
+ }
+
+ @Test(groups = "closed", expectedExceptions = IOException.class)
+ public static void testWriteStringClosed() throws IOException {
+ closedWriter.write("");
+ }
+
+ @Test(groups = "closed", expectedExceptions = IOException.class)
+ public static void testWriteStringIIClosed() throws IOException {
+ closedWriter.write("", 0, 0);
+ }
+
+ @Test(groups = "closed", expectedExceptions = IOException.class)
+ public static void testWriteBIIClosed() throws IOException {
+ closedWriter.write(new char[]{(char) 6}, 0, 1);
+ }
+}
diff -r 719064f540f3 -r 79f6a4dc221e test/jdk/java/lang/ProcessHandle/OnExitTest.java
--- a/test/jdk/java/lang/ProcessHandle/OnExitTest.java Mon Mar 19 12:29:23 2018 +0530
+++ b/test/jdk/java/lang/ProcessHandle/OnExitTest.java Mon Mar 19 10:46:31 2018 -0700
@@ -41,6 +41,7 @@
/*
* @test
* @library /test/lib
+ * @modules jdk.management
* @build jdk.test.lib.Utils
* @run testng OnExitTest
* @summary Functions of Process.onExit and ProcessHandle.onExit
diff -r 719064f540f3 -r 79f6a4dc221e test/jdk/java/lang/module/ModuleReader/ModuleReaderTest.java
--- a/test/jdk/java/lang/module/ModuleReader/ModuleReaderTest.java Mon Mar 19 12:29:23 2018 +0530
+++ b/test/jdk/java/lang/module/ModuleReader/ModuleReaderTest.java Mon Mar 19 10:46:31 2018 -0700
@@ -26,6 +26,7 @@
* @library /lib/testlibrary /test/lib
* @modules java.base/jdk.internal.module
* jdk.compiler
+ * jdk.jlink
* @build ModuleReaderTest jdk.test.lib.compiler.CompilerUtils JarUtils
* @run testng ModuleReaderTest
* @summary Basic tests for java.lang.module.ModuleReader
diff -r 719064f540f3 -r 79f6a4dc221e test/jdk/java/nio/channels/DatagramChannel/AdaptDatagramSocket.java
--- a/test/jdk/java/nio/channels/DatagramChannel/AdaptDatagramSocket.java Mon Mar 19 12:29:23 2018 +0530
+++ b/test/jdk/java/nio/channels/DatagramChannel/AdaptDatagramSocket.java Mon Mar 19 10:46:31 2018 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2018, 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
@@ -24,7 +24,9 @@
/* @test
* @bug 4313882 4981129 8143610
* @summary Unit test for datagram-socket-channel adaptors
- * @library ..
+ * @library .. /test/lib
+ * @build jdk.test.lib.Utils TestServers
+ * @run main AdaptDatagramSocket
* @key randomness
*/
diff -r 719064f540f3 -r 79f6a4dc221e test/jdk/java/nio/channels/DatagramChannel/IsBound.java
--- a/test/jdk/java/nio/channels/DatagramChannel/IsBound.java Mon Mar 19 12:29:23 2018 +0530
+++ b/test/jdk/java/nio/channels/DatagramChannel/IsBound.java Mon Mar 19 10:46:31 2018 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2018, 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
@@ -24,7 +24,9 @@
/* @test
* @bug 4468875
* @summary Simple test of DatagramChannel isBound
- * @library ..
+ * @library .. /test/lib
+ * @build jdk.test.lib.Utils TestServers
+ * @run main IsBound
*/
import java.net.*;
diff -r 719064f540f3 -r 79f6a4dc221e test/jdk/java/nio/channels/DatagramChannel/IsConnected.java
--- a/test/jdk/java/nio/channels/DatagramChannel/IsConnected.java Mon Mar 19 12:29:23 2018 +0530
+++ b/test/jdk/java/nio/channels/DatagramChannel/IsConnected.java Mon Mar 19 10:46:31 2018 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2018, 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
@@ -24,7 +24,9 @@
/* @test
* @bug 4446035
* @summary Simple test of DatagramSocket connection consistency
- * @library ..
+ * @library .. /test/lib
+ * @build jdk.test.lib.Utils TestServers
+ * @run main IsConnected
*/
import java.net.*;
diff -r 719064f540f3 -r 79f6a4dc221e test/jdk/java/nio/channels/Selector/Alias.java
--- a/test/jdk/java/nio/channels/Selector/Alias.java Mon Mar 19 12:29:23 2018 +0530
+++ b/test/jdk/java/nio/channels/Selector/Alias.java Mon Mar 19 10:46:31 2018 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2018, 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
@@ -24,7 +24,9 @@
/* @test
* @bug 4513011
* @summary Registering and cancelling same fd many times
- * @library ..
+ * @library .. /test/lib
+ * @build jdk.test.lib.Utils TestServers
+ * @run main Alias
*/
import java.net.*;
diff -r 719064f540f3 -r 79f6a4dc221e test/jdk/java/nio/channels/Selector/BasicConnect.java
--- a/test/jdk/java/nio/channels/Selector/BasicConnect.java Mon Mar 19 12:29:23 2018 +0530
+++ b/test/jdk/java/nio/channels/Selector/BasicConnect.java Mon Mar 19 10:46:31 2018 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2018, 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
@@ -24,7 +24,9 @@
/* @test
* @summary Test nonblocking connect and finishConnect
* @bug 4457776
- * @library ..
+ * @library .. /test/lib
+ * @build jdk.test.lib.Utils TestServers
+ * @run main BasicConnect
*/
import java.net.*;
diff -r 719064f540f3 -r 79f6a4dc221e test/jdk/java/nio/channels/Selector/Connect.java
--- a/test/jdk/java/nio/channels/Selector/Connect.java Mon Mar 19 12:29:23 2018 +0530
+++ b/test/jdk/java/nio/channels/Selector/Connect.java Mon Mar 19 10:46:31 2018 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2018, 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
@@ -24,7 +24,9 @@
/* @test
* @bug 4511624
* @summary Test Making lots of Selectors
- * @library ..
+ * @library .. /test/lib
+ * @build jdk.test.lib.Utils TestServers
+ * @run main Connect
*/
import java.net.*;
diff -r 719064f540f3 -r 79f6a4dc221e test/jdk/java/nio/channels/Selector/ConnectWrite.java
--- a/test/jdk/java/nio/channels/Selector/ConnectWrite.java Mon Mar 19 12:29:23 2018 +0530
+++ b/test/jdk/java/nio/channels/Selector/ConnectWrite.java Mon Mar 19 10:46:31 2018 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2018, 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
@@ -24,7 +24,9 @@
/* @test
* @bug 4505829
* @summary Test ready for connect followed by ready for write
- * @library ..
+ * @library .. /test/lib
+ * @build jdk.test.lib.Utils TestServers
+ * @run main ConnectWrite
*/
import java.net.*;
diff -r 719064f540f3 -r 79f6a4dc221e test/jdk/java/nio/channels/Selector/KeysReady.java
--- a/test/jdk/java/nio/channels/Selector/KeysReady.java Mon Mar 19 12:29:23 2018 +0530
+++ b/test/jdk/java/nio/channels/Selector/KeysReady.java Mon Mar 19 10:46:31 2018 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2018, 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
@@ -24,7 +24,9 @@
/* @test
* @bug 4530007
* @summary Test if keys reported ready multiple times
- * @library ..
+ * @library .. /test/lib
+ * @build jdk.test.lib.Utils TestServers
+ * @run main KeysReady
*/
import java.net.*;
diff -r 719064f540f3 -r 79f6a4dc221e test/jdk/java/nio/channels/SocketChannel/AdaptSocket.java
--- a/test/jdk/java/nio/channels/SocketChannel/AdaptSocket.java Mon Mar 19 12:29:23 2018 +0530
+++ b/test/jdk/java/nio/channels/SocketChannel/AdaptSocket.java Mon Mar 19 10:46:31 2018 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2018, 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
@@ -24,7 +24,9 @@
/* @test
* @bug 8156002
* @summary Unit test for socket-channel adaptors
- * @library ..
+ * @library .. /test/lib
+ * @build jdk.test.lib.Utils TestServers
+ * @run main AdaptSocket
*/
import java.io.*;
diff -r 719064f540f3 -r 79f6a4dc221e test/jdk/java/nio/channels/SocketChannel/Basic.java
--- a/test/jdk/java/nio/channels/SocketChannel/Basic.java Mon Mar 19 12:29:23 2018 +0530
+++ b/test/jdk/java/nio/channels/SocketChannel/Basic.java Mon Mar 19 10:46:31 2018 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2018, 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
@@ -23,7 +23,9 @@
/* @test
* @summary Unit test for socket channels
- * @library ..
+ * @library .. /test/lib
+ * @build jdk.test.lib.Utils TestServers
+ * @run main Basic
*/
import java.net.*;
diff -r 719064f540f3 -r 79f6a4dc221e test/jdk/java/nio/channels/SocketChannel/CloseDuringConnect.java
--- a/test/jdk/java/nio/channels/SocketChannel/CloseDuringConnect.java Mon Mar 19 12:29:23 2018 +0530
+++ b/test/jdk/java/nio/channels/SocketChannel/CloseDuringConnect.java Mon Mar 19 10:46:31 2018 -0700
@@ -23,6 +23,8 @@
/* @test
* @bug 8198928
+ * @library /test/lib
+ * @build jdk.test.lib.Utils
* @run main CloseDuringConnect
* @summary Attempt to cause a deadlock by closing a SocketChannel in one thread
* where another thread is closing the channel after a connect fail
@@ -40,6 +42,8 @@
import java.util.stream.IntStream;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import jdk.test.lib.Utils;
+
public class CloseDuringConnect {
// number of test iterations, needs to be 5-10 at least
@@ -49,26 +53,6 @@
static final int MAX_DELAY_BEFORE_CLOSE = 20;
/**
- * Returns the socket address of an endpoint that refuses connections. The
- * endpoint is an InetSocketAddress where the address is the loopback address
- * and the port is a system port (1-1023 range).
- */
- static SocketAddress refusingEndpoint() {
- InetAddress lb = InetAddress.getLoopbackAddress();
- int port = 1;
- while (port < 1024) {
- SocketAddress sa = new InetSocketAddress(lb, port);
- try {
- SocketChannel.open(sa).close();
- } catch (IOException ioe) {
- return sa;
- }
- port++;
- }
- throw new RuntimeException("Unable to find system port that is refusing connections");
- }
-
- /**
* Invoked by a task in the thread pool to connect to a remote address.
* The connection should never be established.
*/
@@ -123,7 +107,7 @@
}
public static void main(String[] args) throws Exception {
- SocketAddress refusing = refusingEndpoint();
+ SocketAddress refusing = Utils.refusingEndpoint();
ScheduledExecutorService pool = Executors.newScheduledThreadPool(2);
try {
IntStream.range(0, ITERATIONS).forEach(i -> {
diff -r 719064f540f3 -r 79f6a4dc221e test/jdk/java/nio/channels/SocketChannel/Connect.java
--- a/test/jdk/java/nio/channels/SocketChannel/Connect.java Mon Mar 19 12:29:23 2018 +0530
+++ b/test/jdk/java/nio/channels/SocketChannel/Connect.java Mon Mar 19 10:46:31 2018 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2018, 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
@@ -24,7 +24,9 @@
/* @test
* @bug 4650679 8037360
* @summary Unit test for socket channels
- * @library ..
+ * @library .. /test/lib
+ * @build jdk.test.lib.Utils TestServers
+ * @run main Connect
*/
import java.net.*;
diff -r 719064f540f3 -r 79f6a4dc221e test/jdk/java/nio/channels/SocketChannel/ConnectState.java
--- a/test/jdk/java/nio/channels/SocketChannel/ConnectState.java Mon Mar 19 12:29:23 2018 +0530
+++ b/test/jdk/java/nio/channels/SocketChannel/ConnectState.java Mon Mar 19 10:46:31 2018 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2018, 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
@@ -23,7 +23,9 @@
/* @test
* @summary Test socket-channel connection-state transitions
- * @library ..
+ * @library .. /test/lib
+ * @build jdk.test.lib.Utils TestServers
+ * @run main ConnectState
*/
import java.io.*;
diff -r 719064f540f3 -r 79f6a4dc221e test/jdk/java/nio/channels/SocketChannel/FinishConnect.java
--- a/test/jdk/java/nio/channels/SocketChannel/FinishConnect.java Mon Mar 19 12:29:23 2018 +0530
+++ b/test/jdk/java/nio/channels/SocketChannel/FinishConnect.java Mon Mar 19 10:46:31 2018 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2018, 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
@@ -23,7 +23,9 @@
/* @test
* @summary Test SocketChannel.finishConnect
- * @library ..
+ * @library .. /test/lib
+ * @build jdk.test.lib.Utils TestServers
+ * @run main FinishConnect
*/
import java.net.*;
diff -r 719064f540f3 -r 79f6a4dc221e test/jdk/java/nio/channels/SocketChannel/IsConnectable.java
--- a/test/jdk/java/nio/channels/SocketChannel/IsConnectable.java Mon Mar 19 12:29:23 2018 +0530
+++ b/test/jdk/java/nio/channels/SocketChannel/IsConnectable.java Mon Mar 19 10:46:31 2018 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2018, 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
@@ -24,7 +24,9 @@
/* @test
* @bug 4737146 4750573
* @summary Test if isConnectable returns true after connected
- * @library ..
+ * @library .. /test/lib
+ * @build jdk.test.lib.Utils TestServers
+ * @run main IsConnectable
*/
import java.net.*;
diff -r 719064f540f3 -r 79f6a4dc221e test/jdk/java/nio/channels/SocketChannel/LocalAddress.java
--- a/test/jdk/java/nio/channels/SocketChannel/LocalAddress.java Mon Mar 19 12:29:23 2018 +0530
+++ b/test/jdk/java/nio/channels/SocketChannel/LocalAddress.java Mon Mar 19 10:46:31 2018 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2018, 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
@@ -24,7 +24,9 @@
/* @test
* @bug 4672609 5076965 4739238
* @summary Test getLocalAddress getLocalPort
- * @library ..
+ * @library .. /test/lib
+ * @build jdk.test.lib.Utils TestServers
+ * @run main LocalAddress
*/
import java.net.*;
diff -r 719064f540f3 -r 79f6a4dc221e test/jdk/java/nio/channels/SocketChannel/Stream.java
--- a/test/jdk/java/nio/channels/SocketChannel/Stream.java Mon Mar 19 12:29:23 2018 +0530
+++ b/test/jdk/java/nio/channels/SocketChannel/Stream.java Mon Mar 19 10:46:31 2018 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2018, 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
@@ -24,7 +24,9 @@
/* @test
* @bug 4430139
* @summary Test result of read on stream from nonblocking channel
- * @library ..
+ * @library .. /test/lib
+ * @build jdk.test.lib.Utils TestServers
+ * @run main Stream
*/
import java.io.*;
diff -r 719064f540f3 -r 79f6a4dc221e test/jdk/java/nio/channels/SocketChannel/VectorParams.java
--- a/test/jdk/java/nio/channels/SocketChannel/VectorParams.java Mon Mar 19 12:29:23 2018 +0530
+++ b/test/jdk/java/nio/channels/SocketChannel/VectorParams.java Mon Mar 19 10:46:31 2018 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2018, 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
@@ -24,7 +24,9 @@
/* @test
* @bug 4865031
* @summary Test ScatteringByteChannel/GatheringByteChannel read/write
- * @library ..
+ * @library .. /test/lib
+ * @build jdk.test.lib.Utils TestServers
+ * @run main VectorParams
*/
import java.io.*;
diff -r 719064f540f3 -r 79f6a4dc221e test/jdk/java/nio/channels/TestServers.java
--- a/test/jdk/java/nio/channels/TestServers.java Mon Mar 19 12:29:23 2018 +0530
+++ b/test/jdk/java/nio/channels/TestServers.java Mon Mar 19 10:46:31 2018 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2018, 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
@@ -31,6 +31,8 @@
import java.util.Date;
import java.util.List;
+import jdk.test.lib.Utils;
+
public class TestServers {
@@ -81,11 +83,8 @@
}
public static RefusingServer newRefusingServer() throws IOException {
- // The port 1 is reserved for TCPMUX(RFC 1078), which is seldom used,
- // and it's not used on all the test platform through JPRT.
- // So we choose to use it as a refusing "server"'s "listen" port,
- // it's much more stable than "open->close a server socket".
- return new RefusingServer(InetAddress.getLocalHost(), 1);
+ return new RefusingServer(InetAddress.getLocalHost(),
+ Utils.refusingEndpoint().getPort());
}
}
diff -r 719064f540f3 -r 79f6a4dc221e test/jdk/java/rmi/testlibrary/TestSocketFactory.java
--- a/test/jdk/java/rmi/testlibrary/TestSocketFactory.java Mon Mar 19 12:29:23 2018 +0530
+++ b/test/jdk/java/rmi/testlibrary/TestSocketFactory.java Mon Mar 19 10:46:31 2018 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2018, 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
@@ -135,7 +135,7 @@
* @param matchBytes bytes to match after the trigger has been seen
* @param replaceBytes bytes to replace the matched bytes
*/
- public void setMatchReplaceBytes(byte[] triggerBytes, byte[] matchBytes,
+ public synchronized void setMatchReplaceBytes(byte[] triggerBytes, byte[] matchBytes,
byte[] replaceBytes) {
this.triggerBytes = Objects.requireNonNull(triggerBytes, "triggerBytes");
this.matchBytes = Objects.requireNonNull(matchBytes, "matchBytes");
@@ -147,7 +147,7 @@
}
@Override
- public Socket createSocket(String host, int port) throws IOException {
+ public synchronized Socket createSocket(String host, int port) throws IOException {
Socket socket = RMISocketFactory.getDefaultSocketFactory()
.createSocket(host, port);
InterposeSocket s = new InterposeSocket(socket,
@@ -160,13 +160,13 @@
* Return the current list of sockets.
* @return Return a snapshot of the current list of sockets
*/
- public List