From c6274c7aa28e470cdce74fb14b2c737e534bab76 Mon Sep 17 00:00:00 2001
From: Sergey Bylokhov
* A container is a component that can contain components and other containers.
- * A con tainer can also have a layout manager that controls the visual
- * placement of components in the container. The AWT package contains several
- * layout manager classes and an interface for building your own layout manager.
- * See Container and LayoutManager for more information.
+ * A container can also have a layout manager that controls the visual placement
+ * of components in the container. The AWT package contains several layout
+ * manager classes and an interface for building your own layout manager. See
+ * Container and LayoutManager for more information.
*
* Each {@code Component} object is limited in its maximum size and its location
* because the values are stored as an integer. Also, a platform may further
diff --git a/jdk/src/java.desktop/share/classes/javax/sound/midi/MetaMessage.java b/jdk/src/java.desktop/share/classes/javax/sound/midi/MetaMessage.java
index 8c6a5904378..0fe40e84342 100644
--- a/jdk/src/java.desktop/share/classes/javax/sound/midi/MetaMessage.java
+++ b/jdk/src/java.desktop/share/classes/javax/sound/midi/MetaMessage.java
@@ -59,7 +59,7 @@ public class MetaMessage extends MidiMessage {
*
* @see MidiMessage#getStatus
*/
- public static final int META = 0xFF; // 255
+ public static final int META = 0xFF; // 255
/**
* The length of the actual message in the data array. This is used to
diff --git a/jdk/src/java.desktop/share/classes/javax/sound/midi/Sequence.java b/jdk/src/java.desktop/share/classes/javax/sound/midi/Sequence.java
index b8cfba0adcb..f8b8aaac27d 100644
--- a/jdk/src/java.desktop/share/classes/javax/sound/midi/Sequence.java
+++ b/jdk/src/java.desktop/share/classes/javax/sound/midi/Sequence.java
@@ -58,7 +58,7 @@ public class Sequence {
*
* @see #Sequence(float, int)
*/
- public static final float PPQ = 0.0f;
+ public static final float PPQ = 0.0f;
/**
* The SMPTE-based timing type with 24 frames per second (resolution is
@@ -66,7 +66,7 @@ public class Sequence {
*
* @see #Sequence(float, int)
*/
- public static final float SMPTE_24 = 24.0f;
+ public static final float SMPTE_24 = 24.0f;
/**
* The SMPTE-based timing type with 25 frames per second (resolution is
@@ -74,7 +74,7 @@ public class Sequence {
*
* @see #Sequence(float, int)
*/
- public static final float SMPTE_25 = 25.0f;
+ public static final float SMPTE_25 = 25.0f;
/**
* The SMPTE-based timing type with 29.97 frames per second (resolution is
@@ -82,7 +82,7 @@ public class Sequence {
*
* @see #Sequence(float, int)
*/
- public static final float SMPTE_30DROP = 29.97f;
+ public static final float SMPTE_30DROP = 29.97f;
/**
* The SMPTE-based timing type with 30 frames per second (resolution is
@@ -90,7 +90,7 @@ public class Sequence {
*
* @see #Sequence(float, int)
*/
- public static final float SMPTE_30 = 30.0f;
+ public static final float SMPTE_30 = 30.0f;
// Variables
diff --git a/jdk/src/java.desktop/share/classes/javax/sound/midi/Sequencer.java b/jdk/src/java.desktop/share/classes/javax/sound/midi/Sequencer.java
index 4050f385cc8..c1e94908602 100644
--- a/jdk/src/java.desktop/share/classes/javax/sound/midi/Sequencer.java
+++ b/jdk/src/java.desktop/share/classes/javax/sound/midi/Sequencer.java
@@ -733,7 +733,7 @@ public interface Sequencer extends MidiDevice {
* information from its internal clock. This is not a legal slave sync
* mode.
*/
- public static final SyncMode INTERNAL_CLOCK = new SyncMode("Internal Clock");
+ public static final SyncMode INTERNAL_CLOCK = new SyncMode("Internal Clock");
/**
* A master or slave synchronization mode that specifies the use of MIDI
@@ -745,7 +745,7 @@ public interface Sequencer extends MidiDevice {
* receiver. MIDI clock messages are sent at a rate of 24 per quarter
* note.
*/
- public static final SyncMode MIDI_SYNC = new SyncMode("MIDI Sync");
+ public static final SyncMode MIDI_SYNC = new SyncMode("MIDI Sync");
/**
* A master or slave synchronization mode that specifies the use of MIDI
@@ -756,13 +756,13 @@ public interface Sequencer extends MidiDevice {
* sequencer sends MIDI Time Code messages to its receiver. (See the
* MIDI 1.0 Detailed Specification for a description of MIDI Time Code.)
*/
- public static final SyncMode MIDI_TIME_CODE = new SyncMode("MIDI Time Code");
+ public static final SyncMode MIDI_TIME_CODE = new SyncMode("MIDI Time Code");
/**
* A slave synchronization mode indicating that no timing information
* should be sent to the receiver. This is not a legal master sync mode.
*/
- public static final SyncMode NO_SYNC = new SyncMode("No Timing");
+ public static final SyncMode NO_SYNC = new SyncMode("No Timing");
}
}
diff --git a/jdk/src/java.desktop/share/classes/javax/sound/midi/ShortMessage.java b/jdk/src/java.desktop/share/classes/javax/sound/midi/ShortMessage.java
index 8d0a9a22253..c02deda21bf 100644
--- a/jdk/src/java.desktop/share/classes/javax/sound/midi/ShortMessage.java
+++ b/jdk/src/java.desktop/share/classes/javax/sound/midi/ShortMessage.java
@@ -61,35 +61,35 @@ public class ShortMessage extends MidiMessage {
*
* @see MidiMessage#getStatus
*/
- public static final int MIDI_TIME_CODE = 0xF1; // 241
+ public static final int MIDI_TIME_CODE = 0xF1; // 241
/**
* Status byte for Song Position Pointer message (0xF2, or 242).
*
* @see MidiMessage#getStatus
*/
- public static final int SONG_POSITION_POINTER = 0xF2; // 242
+ public static final int SONG_POSITION_POINTER = 0xF2; // 242
/**
* Status byte for MIDI Song Select message (0xF3, or 243).
*
* @see MidiMessage#getStatus
*/
- public static final int SONG_SELECT = 0xF3; // 243
+ public static final int SONG_SELECT = 0xF3; // 243
/**
* Status byte for Tune Request message (0xF6, or 246).
*
* @see MidiMessage#getStatus
*/
- public static final int TUNE_REQUEST = 0xF6; // 246
+ public static final int TUNE_REQUEST = 0xF6; // 246
/**
* Status byte for End of System Exclusive message (0xF7, or 247).
*
* @see MidiMessage#getStatus
*/
- public static final int END_OF_EXCLUSIVE = 0xF7; // 247
+ public static final int END_OF_EXCLUSIVE = 0xF7; // 247
// System real-time messages
@@ -98,80 +98,80 @@ public class ShortMessage extends MidiMessage {
*
* @see MidiMessage#getStatus
*/
- public static final int TIMING_CLOCK = 0xF8; // 248
+ public static final int TIMING_CLOCK = 0xF8; // 248
/**
* Status byte for Start message (0xFA, or 250).
*
* @see MidiMessage#getStatus
*/
- public static final int START = 0xFA; // 250
+ public static final int START = 0xFA; // 250
/**
* Status byte for Continue message (0xFB, or 251).
*
* @see MidiMessage#getStatus
*/
- public static final int CONTINUE = 0xFB; // 251
+ public static final int CONTINUE = 0xFB; // 251
/**
* Status byte for Stop message (0xFC, or 252).
*
* @see MidiMessage#getStatus
*/
- public static final int STOP = 0xFC; //252
+ public static final int STOP = 0xFC; //252
/**
* Status byte for Active Sensing message (0xFE, or 254).
*
* @see MidiMessage#getStatus
*/
- public static final int ACTIVE_SENSING = 0xFE; // 254
+ public static final int ACTIVE_SENSING = 0xFE; // 254
/**
* Status byte for System Reset message (0xFF, or 255).
*
* @see MidiMessage#getStatus
*/
- public static final int SYSTEM_RESET = 0xFF; // 255
+ public static final int SYSTEM_RESET = 0xFF; // 255
// Channel voice message upper nibble defines
/**
* Command value for Note Off message (0x80, or 128).
*/
- public static final int NOTE_OFF = 0x80; // 128
+ public static final int NOTE_OFF = 0x80; // 128
/**
* Command value for Note On message (0x90, or 144).
*/
- public static final int NOTE_ON = 0x90; // 144
+ public static final int NOTE_ON = 0x90; // 144
/**
* Command value for Polyphonic Key Pressure (Aftertouch) message (0xA0, or
* 160).
*/
- public static final int POLY_PRESSURE = 0xA0; // 160
+ public static final int POLY_PRESSURE = 0xA0; // 160
/**
* Command value for Control Change message (0xB0, or 176).
*/
- public static final int CONTROL_CHANGE = 0xB0; // 176
+ public static final int CONTROL_CHANGE = 0xB0; // 176
/**
* Command value for Program Change message (0xC0, or 192).
*/
- public static final int PROGRAM_CHANGE = 0xC0; // 192
+ public static final int PROGRAM_CHANGE = 0xC0; // 192
/**
* Command value for Channel Pressure (Aftertouch) message (0xD0, or 208).
*/
- public static final int CHANNEL_PRESSURE = 0xD0; // 208
+ public static final int CHANNEL_PRESSURE = 0xD0; // 208
/**
* Command value for Pitch Bend message (0xE0, or 224).
*/
- public static final int PITCH_BEND = 0xE0; // 224
+ public static final int PITCH_BEND = 0xE0; // 224
/**
* Constructs a new {@code ShortMessage}. The contents of the new message
diff --git a/jdk/src/java.desktop/share/classes/javax/sound/midi/SysexMessage.java b/jdk/src/java.desktop/share/classes/javax/sound/midi/SysexMessage.java
index de478c3be31..b561faad898 100644
--- a/jdk/src/java.desktop/share/classes/javax/sound/midi/SysexMessage.java
+++ b/jdk/src/java.desktop/share/classes/javax/sound/midi/SysexMessage.java
@@ -81,7 +81,7 @@ public class SysexMessage extends MidiMessage {
*
* @see MidiMessage#getStatus
*/
- public static final int SYSTEM_EXCLUSIVE = 0xF0; // 240
+ public static final int SYSTEM_EXCLUSIVE = 0xF0; // 240
/**
* Status byte for Special System Exclusive message (0xF7, or 247), which is
@@ -90,7 +90,7 @@ public class SysexMessage extends MidiMessage {
*
* @see MidiMessage#getStatus
*/
- public static final int SPECIAL_SYSTEM_EXCLUSIVE = 0xF7; // 247
+ public static final int SPECIAL_SYSTEM_EXCLUSIVE = 0xF7; // 247
/**
* The data bytes for this system exclusive message. These are initialized
diff --git a/jdk/src/java.desktop/share/classes/javax/sound/sampled/BooleanControl.java b/jdk/src/java.desktop/share/classes/javax/sound/sampled/BooleanControl.java
index 4f81d7c6514..a1abf92cef6 100644
--- a/jdk/src/java.desktop/share/classes/javax/sound/sampled/BooleanControl.java
+++ b/jdk/src/java.desktop/share/classes/javax/sound/sampled/BooleanControl.java
@@ -141,14 +141,14 @@ public abstract class BooleanControl extends Control {
* Represents a control for the mute status of a line. Note that mute
* status does not affect gain.
*/
- public static final Type MUTE = new Type("Mute");
+ public static final Type MUTE = new Type("Mute");
/**
* Represents a control for whether reverberation is applied to a line.
* Note that the status of this control not affect the reverberation
* settings for a line, but does affect whether these settings are used.
*/
- public static final Type APPLY_REVERB = new Type("Apply Reverb");
+ public static final Type APPLY_REVERB = new Type("Apply Reverb");
/**
* Constructs a new boolean control type.
diff --git a/jdk/src/java.desktop/share/classes/javax/sound/sampled/FloatControl.java b/jdk/src/java.desktop/share/classes/javax/sound/sampled/FloatControl.java
index 485225b85f0..40cc82e4db5 100644
--- a/jdk/src/java.desktop/share/classes/javax/sound/sampled/FloatControl.java
+++ b/jdk/src/java.desktop/share/classes/javax/sound/sampled/FloatControl.java
@@ -386,7 +386,7 @@ public abstract class FloatControl extends Control {
* @see #REVERB_RETURN
* @see #VOLUME
*/
- public static final Type MASTER_GAIN = new Type("Master Gain");
+ public static final Type MASTER_GAIN = new Type("Master Gain");
/**
* Represents a control for the auxiliary send gain on a line.
@@ -394,7 +394,7 @@ public abstract class FloatControl extends Control {
* @see #MASTER_GAIN
* @see #AUX_RETURN
*/
- public static final Type AUX_SEND = new Type("AUX Send");
+ public static final Type AUX_SEND = new Type("AUX Send");
/**
* Represents a control for the auxiliary return gain on a line.
@@ -402,7 +402,7 @@ public abstract class FloatControl extends Control {
* @see #MASTER_GAIN
* @see #AUX_SEND
*/
- public static final Type AUX_RETURN = new Type("AUX Return");
+ public static final Type AUX_RETURN = new Type("AUX Return");
/**
* Represents a control for the pre-reverb gain on a line. This control
@@ -413,7 +413,7 @@ public abstract class FloatControl extends Control {
* @see #REVERB_RETURN
* @see EnumControl.Type#REVERB
*/
- public static final Type REVERB_SEND = new Type("Reverb Send");
+ public static final Type REVERB_SEND = new Type("Reverb Send");
/**
* Represents a control for the post-reverb gain on a line. This control
@@ -423,7 +423,7 @@ public abstract class FloatControl extends Control {
* @see #MASTER_GAIN
* @see #REVERB_SEND
*/
- public static final Type REVERB_RETURN = new Type("Reverb Return");
+ public static final Type REVERB_RETURN = new Type("Reverb Return");
/**
* Represents a control for the volume on a line.
@@ -431,7 +431,7 @@ public abstract class FloatControl extends Control {
/*
* $$kk: 08.30.99: ISSUE: what units? linear or dB?
*/
- public static final Type VOLUME = new Type("Volume");
+ public static final Type VOLUME = new Type("Volume");
/**
* Represents a control for the relative pan (left-right positioning) of
@@ -442,7 +442,7 @@ public abstract class FloatControl extends Control {
*
* @see #BALANCE
*/
- public static final Type PAN = new Type("Pan");
+ public static final Type PAN = new Type("Pan");
/**
* Represents a control for the relative balance of a stereo signal
@@ -452,7 +452,7 @@ public abstract class FloatControl extends Control {
*
* @see #PAN
*/
- public static final Type BALANCE = new Type("Balance");
+ public static final Type BALANCE = new Type("Balance");
/**
* Represents a control that changes the sample rate of audio playback.
@@ -470,7 +470,7 @@ public abstract class FloatControl extends Control {
* doubling the sample rate has the effect of doubling the frequencies
* in the sound's spectrum, which raises the pitch by an octave.
*/
- public static final Type SAMPLE_RATE = new Type("Sample Rate");
+ public static final Type SAMPLE_RATE = new Type("Sample Rate");
/**
* Constructs a new float control type.
diff --git a/jdk/src/java.desktop/share/classes/javax/sound/sampled/LineEvent.java b/jdk/src/java.desktop/share/classes/javax/sound/sampled/LineEvent.java
index 19fb585eae5..ca57d1de22a 100644
--- a/jdk/src/java.desktop/share/classes/javax/sound/sampled/LineEvent.java
+++ b/jdk/src/java.desktop/share/classes/javax/sound/sampled/LineEvent.java
@@ -220,7 +220,7 @@ public class LineEvent extends EventObject {
* @see #CLOSE
* @see Line#open
*/
- public static final Type OPEN = new Type("Open");
+ public static final Type OPEN = new Type("Open");
/**
* A type of event that is sent when a line closes, freeing the system
@@ -229,7 +229,7 @@ public class LineEvent extends EventObject {
* @see #OPEN
* @see Line#close
*/
- public static final Type CLOSE = new Type("Close");
+ public static final Type CLOSE = new Type("Close");
/**
* A type of event that is sent when a line begins to engage in active
@@ -239,7 +239,7 @@ public class LineEvent extends EventObject {
* @see #STOP
* @see DataLine#start
*/
- public static final Type START = new Type("Start");
+ public static final Type START = new Type("Start");
/**
* A type of event that is sent when a line ceases active input or
@@ -249,7 +249,7 @@ public class LineEvent extends EventObject {
* @see #START
* @see DataLine#stop
*/
- public static final Type STOP = new Type("Stop");
+ public static final Type STOP = new Type("Stop");
/**
* A type of event that is sent when a line ceases to engage in active
diff --git a/jdk/src/java.desktop/share/classes/javax/swing/JComponent.java b/jdk/src/java.desktop/share/classes/javax/swing/JComponent.java
index 4e9884d9828..e832abb1d75 100644
--- a/jdk/src/java.desktop/share/classes/javax/swing/JComponent.java
+++ b/jdk/src/java.desktop/share/classes/javax/swing/JComponent.java
@@ -3735,7 +3735,7 @@ public abstract class JComponent extends Container implements Serializable,
* @since 1.3
* @deprecated This class is no longer used or needed.
* {@code java.awt.Component.AccessibleAWTComponent} provides
- * the same functionality and it is handled in {@Component}.
+ * the same functionality and it is handled in {@code Component}.
*/
@Deprecated
protected class AccessibleFocusHandler implements FocusListener {
diff --git a/jdk/src/java.desktop/share/classes/module-info.java b/jdk/src/java.desktop/share/classes/module-info.java
index 29d24e68df3..658becc98c3 100644
--- a/jdk/src/java.desktop/share/classes/module-info.java
+++ b/jdk/src/java.desktop/share/classes/module-info.java
@@ -114,10 +114,17 @@ module java.desktop {
uses javax.sound.sampled.spi.FormatConversionProvider;
uses javax.sound.sampled.spi.MixerProvider;
- provides sun.datatransfer.DesktopDatatransferService with sun.awt.datatransfer.DesktopDatatransferServiceImpl;
- provides java.net.ContentHandlerFactory with sun.awt.www.content.MultimediaContentHandlers;
- provides javax.print.PrintServiceLookup with sun.print.PrintServiceLookupProvider;
- provides javax.print.StreamPrintServiceFactory with sun.print.PSStreamPrinterFactory;
+ provides sun.datatransfer.DesktopDatatransferService with
+ sun.awt.datatransfer.DesktopDatatransferServiceImpl;
+
+ provides java.net.ContentHandlerFactory with
+ sun.awt.www.content.MultimediaContentHandlers;
+
+ provides javax.print.PrintServiceLookup with
+ sun.print.PrintServiceLookupProvider;
+
+ provides javax.print.StreamPrintServiceFactory with
+ sun.print.PSStreamPrinterFactory;
provides javax.sound.midi.spi.MidiDeviceProvider with
com.sun.media.sound.MidiInDeviceProvider,
@@ -125,14 +132,17 @@ module java.desktop {
com.sun.media.sound.RealTimeSequencerProvider,
com.sun.media.sound.SoftProvider;
- provides javax.sound.midi.spi.MidiFileReader with com.sun.media.sound.StandardMidiFileReader;
- provides javax.sound.midi.spi.MidiFileWriter with com.sun.media.sound.StandardMidiFileWriter;
+ provides javax.sound.midi.spi.MidiFileReader with
+ com.sun.media.sound.StandardMidiFileReader;
+
+ provides javax.sound.midi.spi.MidiFileWriter with
+ com.sun.media.sound.StandardMidiFileWriter;
provides javax.sound.midi.spi.SoundbankReader with
- com.sun.media.sound.AudioFileSoundbankReader,
- com.sun.media.sound.DLSSoundbankReader,
- com.sun.media.sound.JARSoundbankReader,
- com.sun.media.sound.SF2SoundbankReader;
+ com.sun.media.sound.AudioFileSoundbankReader,
+ com.sun.media.sound.DLSSoundbankReader,
+ com.sun.media.sound.JARSoundbankReader,
+ com.sun.media.sound.SF2SoundbankReader;
provides javax.sound.sampled.spi.AudioFileReader with
com.sun.media.sound.AiffFileReader,
@@ -158,4 +168,3 @@ module java.desktop {
com.sun.media.sound.DirectAudioDeviceProvider,
com.sun.media.sound.PortMixerProvider;
}
-
From 7e67ffbd41f001c1a64fc11e77d6258ef8be4411 Mon Sep 17 00:00:00 2001
From: Semyon Sadetsky The Java AWT Native Interface (JAWT) comprises a small set of native
+(eg C language-based) APIs that provide a standard supported way
+for interaction between Java API windows and surfaces, and
+platform native API windows and surfaces.
+Non-Java libraries may then render to a Java owned window.
+
+Note: in this document the terms "Java AWT Native Interface",
+"AWT Native Interface" and "JAWT" are interchangeable and
+refer to this same specification.
+
+The fundamental obstacle to native rendering without JAWT is that
+is that the rendering code cannot identify where to draw.
+The native code needs access to information about a Java
+drawing surface (such as a handle to the underlying native ID of a
+Canvas), but cannot get it.
+JAWT should be supported in all headful implementations
+where technically possible although this is not enforced by the JCK.
+There is a platform-specific and a platform
+independent portion to the API, to account for the differing
+data structures and requirements of each platform.
+This document specifies the platform independent portions and
+also documents the platform dependent portions for the Oracle JDK
+supported desktop operating environments.
+For AWT the term platform is less tied to the underlying operating
+system than it is to the desktop windowing environment.
+
+Reasons for using the AWT Native Interface include
+
+Drawbacks include
+
+An example illustrating how easy it is to use the AWT Native Interface
+is presented and discussed later in this document. JAWT usage depends on JNI The definition of Java Standard Edition includes JNI, the Java
+Native Interface. Many Java developers will never need to use it,
+but the interface is the only standard supported way for a Java
+language program to interact directly with
+application code that has been compiled to the native machine
+instructions for the host processor architecture.
+JNI is used where ever there is a need for mixed languages.
+These are by no means limited to cases like AWT. For example, you
+could use JNI to integrate with native code that communicates with
+a peripheral device, such as a scanner, connected to a system via a
+USB port. So JNI is general enough to be used to access almost any
+sort of native library.
+The rest of this document assumes a familiarity with how
+to use JNI.
+
+ How to use JAWT In this section we describe the most common usage of the AWT
+Native Interface — overriding the paint method to
+direct drawing operations to a native rendering library which then
+queries the Java VM to determine the information it needs in order
+to render. Note, however, that any native code may use the AWT
+Native Interface to learn about a target drawing surface, not just
+code in a paint method. The first step in hooking up a native rendering library to a
+Java Canvas is to define a new class that extends
+Canvas and overrides the paint method. The Java
+system routes all drawing operations for a Canvas object
+through the paint method, as it does for all other GUI
+objects. Canvas is a good candidate for the rendering surface as
+it does not have any content as a Button would. The new paint method, to be implemented in the native
+rendering library, must be declared as public native void
+, and the native library itself is loaded at runtime by including a
+call to System.loadLibrary( "myRenderingLib")in
+the static block of the class. The myRenderingLib
+name is used for the native shared library; for Linux or the Solaris
+operating environment, the actual name for the library file on disk
+is libmyRenderingLib.so . Here is a simple example of such a class: Note that this class has a main method that can be used
+to run this code as an application for testing purposes. The next step is to run the javah tool on the
+MyCanvas class file above to generate a C/C++ header file
+that describes the interface to the native paint method
+that Java expects to be used. javah is a standard tool
+included with the JDK. NB: javac -h outputdir may also be used. The final step and the most interesting one is to
+write the native rendering method, with an interface that conforms
+to the header file that javah generated, and build it as a
+standard shared library (called myRenderingLib in the
+above example) by linking it, against the appropriate JDK provided
+$JDK_HOME/lib/$JAWT_LIB library for the target platform.
+Where JAWT_LIB has the base name "jawt" and follows platform
+shared object naming rules. i.e.:
+ Here is sample source code for a native paint method
+designed for use in a X11-based drawing environment (Linux
+or Solaris) and a Java VM where the AWT Native Interface is present: The key data structure here is JAWT , which is defined
+in jawt.h (included by jawt_md.h) ; it provides
+access to all the information the native code needs to get the job
+done. The first part of the native method is boilerplate: it
+populates the JAWT structure, gets a
+JAWT_DrawingSurface structure, locks the surface (only one
+drawing engine at a time, please!), then gets a
+JAWT_DrawingSurfaceInfo structure that contains a pointer
+(in the platformInfo field) to the necessary
+platform-specific drawing information. It also includes the
+bounding rectangle of the drawing surface and the current clipping
+region. The structure of the information pointed to by
+platformInfo is defined in a machine-dependent header file
+called jawt_md.h. For X11 drawing, it includes
+information about the X11 display and X11 drawable associated with
+MyCanvas. After the drawing operations are completed,
+there is more boilerplate code as JAWT_DrawingSurfaceInfo
+is freed and JAWT_DrawingSurface is unlocked and
+freed. The corresponding code for the GDI API on the Microsoft Windows platform would
+be structured similarly, but would include the version of
+jawt_md.h for Microsoft Windows and the structure located
+in the platformInfo field of drawing surface info would be
+cast as a JAWT_Win32DrawingSurfaceInfo* . And, of course,
+the actual drawing operations would need to be changed to those
+appropriate for the Microsoft Windows platform.
+The same also for MacOS.
+ Summary The ability to draw directly into a Java Canvas from a
+native code library is extremely useful for developers planning to
+migrate a legacy software system to Java, especially one that
+includes a high-performance rendering engine. It makes it much
+easier to migrate in stages, leaving performance-sensitive
+rendering code alone, while other less-sensitive portions of code
+are converted to Java. The result can be a modern Java-centric
+application, providing the benefit of portability and development
+efficiency, but one that does not sacrifice an investment in
+performance of a key piece of native code. References The definitive reference to the Java Native Interface is The
+Java Native Interface: Programmer's Guide and Specification by
+Sheng Liang. This book was published in June
+1999 by Addison-Wesley. The ISBN is 0-201-32577-2. Appendix Header Files for jawt.h and jawt_md.h jawt.h jawt_md.h (Linux/Solaris/X11 operating environment version) jawt_md.h (Microsoft Windows version) jawt_md.h (MacOS version) {@code
diff --git a/jdk/src/java.desktop/share/classes/java/awt/package-info.java b/jdk/src/java.desktop/share/classes/java/awt/package-info.java
index b2335c33ead..76ecdae7ec0 100644
--- a/jdk/src/java.desktop/share/classes/java/awt/package-info.java
+++ b/jdk/src/java.desktop/share/classes/java/awt/package-info.java
@@ -35,10 +35,10 @@
* components can fire. See AWTEvent for a description of the AWT event model.
* The Java AWT Native Interface Specification and Guide
+Introduction
+
+
+
+
+The header file "jawt.h"
+in the Appendix fully specifies the APIs provided by JAWT.
+
+import java.awt.*;
+import java.awt.event.*;
+
+public class MyCanvas extends Canvas {
+ static {
+ System.loadLibrary("myRenderingLib");
+ }
+ public native void paint(Graphics g);
+
+ public static void main(String[] args) {
+ Frame f = new Frame();
+ f.setBounds(0, 0, 500, 110);
+ f.add(new MyCanvas());
+ f.addWindowListener( new WindowAdapter() {
+ public void windowClosing(WindowEvent ev) {
+ System.exit(0);
+ }
+ } );
+ f.show();
+ }
+}
+
+
+
+
+
+This code will call back to the Java virtual machine to
+get the drawing surface information it needs to access the
+MyCanvas peer. Once this information is available, the
+code can draw directly to MyCanvas using standard drawing
+routines supplied by the underlying operating system.
+#include "MyCanvas.h"
+#include "jawt_md.h"
+
+/*
+ * Class: MyCanvas
+ * Method: paint
+ * Signature: (Ljava/awt/Graphics;)V
+ */
+JNIEXPORT void JNICALL Java_MyCanvas_paint
+(JNIEnv* env, jobject canvas, jobject graphics)
+{
+ JAWT awt;
+ JAWT_DrawingSurface* ds;
+ JAWT_DrawingSurfaceInfo* dsi;
+ JAWT_X11DrawingSurfaceInfo* dsi_x11;
+ jboolean result;
+ jint lock;
+ GC gc;
+
+ short i;
+ char *testString = "^^^ rendered from native code ^^^";
+
+ /* Get the AWT */
+ awt.version = JAWT_VERSION_9;
+ if (JAWT_GetAWT(env, &awt) == JNI_FALSE) {
+ printf("AWT Not found\n");
+ return;
+ }
+
+ /* Get the drawing surface */
+ ds = awt.GetDrawingSurface(env, canvas);
+ if (ds == NULL) {
+ printf("NULL drawing surface\n");
+ return;
+ }
+
+ /* Lock the drawing surface */
+ lock = ds->Lock(ds);
+ if((lock & JAWT_LOCK_ERROR) != 0) {
+ printf("Error locking surface\n");
+ awt.FreeDrawingSurface(ds);
+ return;
+ }
+
+ /* Get the drawing surface info */
+ dsi = ds->GetDrawingSurfaceInfo(ds);
+ if (dsi == NULL) {
+ printf("Error getting surface info\n");
+ ds->Unlock(ds);
+ awt.FreeDrawingSurface(ds);
+ return;
+ }
+
+ /* Get the platform-specific drawing info */
+ dsi_x11 = (JAWT_X11DrawingSurfaceInfo*)dsi->platformInfo;
+
+
+ /* Now paint */
+ gc = XCreateGC(dsi_x11->display, dsi_x11->drawable, 0, 0);
+ XSetBackground(dsi_x11->display, gc, 0);
+ for (i=0; i<36;i++)
+ {
+ XSetForeground(dsi_x11->display, gc, 10*i);
+ XFillRectangle(dsi_x11->display, dsi_x11->drawable, gc,
+ 10*i, 5, 90, 90);
+ }
+ XSetForeground(dsi_x11->display, gc, 155);
+ XDrawImageString(dsi_x11->display, dsi_x11->drawable, gc,
+ 100, 110, testString, strlen(testString));
+ XFreeGC(dsi_x11->display, gc);
+
+
+ /* Free the drawing surface info */
+ ds->FreeDrawingSurfaceInfo(dsi);
+
+ /* Unlock the drawing surface */
+ ds->Unlock(ds);
+
+ /* Free the drawing surface */
+ awt.FreeDrawingSurface(ds);
+}
+
+
+#ifndef _JAVASOFT_JAWT_H_
+#define _JAVASOFT_JAWT_H_
+
+#include "jni.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * AWT native interface.
+ *
+ * The AWT native interface allows a native C or C++ application a means
+ * by which to access native structures in AWT. This is to facilitate moving
+ * legacy C and C++ applications to Java and to target the needs of the
+ * developers who need to do their own native rendering to canvases
+ * for performance or other reasons.
+ *
+ * Conversely it also provides mechanisms for an application which already
+ * has a native window to provide that to AWT for AWT rendering.
+ *
+ * Since every platform may be different in its native data structures
+ * and APIs for windowing systems the application must necessarily
+ * provided per-platform source and compile and deliver per-platform
+ * native code to use this API.
+ *
+ * These interfaces are not part of the Java SE specification and
+ * a VM is not required to implement this API. However it is strongly
+ * recommended that all implementations which support headful AWT
+ * also support these interfaces.
+ *
+ */
+
+/*
+ * AWT Native Drawing Surface (JAWT_DrawingSurface).
+ *
+ * For each platform, there is a native drawing surface structure. This
+ * platform-specific structure can be found in jawt_md.h. It is recommended
+ * that additional platforms follow the same model. It is also recommended
+ * that VMs on all platforms support the existing structures in jawt_md.h.
+ *
+ *******************
+ * EXAMPLE OF USAGE:
+ *******************
+ *
+ * On Microsoft Windows, a programmer wishes to access the HWND of a canvas
+ * to perform native rendering into it. The programmer has declared the
+ * paint() method for their canvas subclass to be native:
+ *
+ *
+ * MyCanvas.java:
+ *
+ * import java.awt.*;
+ *
+ * public class MyCanvas extends Canvas {
+ *
+ * static {
+ * System.loadLibrary("mylib");
+ * }
+ *
+ * public native void paint(Graphics g);
+ * }
+ *
+ *
+ * myfile.c:
+ *
+ * #include "jawt_md.h"
+ * #include <assert.h>
+ *
+ * JNIEXPORT void JNICALL
+ * Java_MyCanvas_paint(JNIEnv* env, jobject canvas, jobject graphics)
+ * {
+ * JAWT awt;
+ * JAWT_DrawingSurface* ds;
+ * JAWT_DrawingSurfaceInfo* dsi;
+ * JAWT_Win32DrawingSurfaceInfo* dsi_win;
+ * jboolean result;
+ * jint lock;
+ *
+ * // Get the AWT. Request version 9 to access features in that release.
+ * awt.version = JAWT_VERSION_9;
+ * result = JAWT_GetAWT(env, &awt);
+ * assert(result != JNI_FALSE);
+ *
+ * // Get the drawing surface
+ * ds = awt.GetDrawingSurface(env, canvas);
+ * assert(ds != NULL);
+ *
+ * // Lock the drawing surface
+ * lock = ds->Lock(ds);
+ * assert((lock & JAWT_LOCK_ERROR) == 0);
+ *
+ * // Get the drawing surface info
+ * dsi = ds->GetDrawingSurfaceInfo(ds);
+ *
+ * // Get the platform-specific drawing info
+ * dsi_win = (JAWT_Win32DrawingSurfaceInfo*)dsi->platformInfo;
+ *
+ * //////////////////////////////
+ * // !!! DO PAINTING HERE !!! //
+ * //////////////////////////////
+ *
+ * // Free the drawing surface info
+ * ds->FreeDrawingSurfaceInfo(dsi);
+ *
+ * // Unlock the drawing surface
+ * ds->Unlock(ds);
+ *
+ * // Free the drawing surface
+ * awt.FreeDrawingSurface(ds);
+ * }
+ *
+ */
+
+/*
+ * JAWT_Rectangle
+ * Structure for a native rectangle.
+ */
+typedef struct jawt_Rectangle {
+ jint x;
+ jint y;
+ jint width;
+ jint height;
+} JAWT_Rectangle;
+
+struct jawt_DrawingSurface;
+
+/*
+ * JAWT_DrawingSurfaceInfo
+ * Structure for containing the underlying drawing information of a component.
+ */
+typedef struct jawt_DrawingSurfaceInfo {
+ /*
+ * Pointer to the platform-specific information. This can be safely
+ * cast to a JAWT_Win32DrawingSurfaceInfo on Microsoft Windows or a
+ * JAWT_X11DrawingSurfaceInfo on Linux and Solaris. On MacOS this is a
+ * pointer to a NSObject that conforms to the JAWT_SurfaceLayers protocol.
+ * See jawt_md.h for details.
+ */
+ void* platformInfo;
+ /* Cached pointer to the underlying drawing surface */
+ struct jawt_DrawingSurface* ds;
+ /* Bounding rectangle of the drawing surface */
+ JAWT_Rectangle bounds;
+ /* Number of rectangles in the clip */
+ jint clipSize;
+ /* Clip rectangle array */
+ JAWT_Rectangle* clip;
+} JAWT_DrawingSurfaceInfo;
+
+#define JAWT_LOCK_ERROR 0x00000001
+#define JAWT_LOCK_CLIP_CHANGED 0x00000002
+#define JAWT_LOCK_BOUNDS_CHANGED 0x00000004
+#define JAWT_LOCK_SURFACE_CHANGED 0x00000008
+
+/*
+ * JAWT_DrawingSurface
+ * Structure for containing the underlying drawing information of a component.
+ * All operations on a JAWT_DrawingSurface MUST be performed from the same
+ * thread as the call to GetDrawingSurface.
+ */
+typedef struct jawt_DrawingSurface {
+ /* Cached reference to the Java environment of the calling thread.
+ * If Lock(), Unlock(), GetDrawingSurfaceInfo() or
+ * FreeDrawingSurfaceInfo() are called from a different thread,
+ * this data member should be set before calling those functions.
+ */
+ JNIEnv* env;
+ /* Cached reference to the target object */
+ jobject target;
+ /*
+ * Lock the surface of the target component for native rendering.
+ * When finished drawing, the surface must be unlocked with
+ * Unlock(). This function returns a bitmask with one or more of the
+ * following values:
+ *
+ * JAWT_LOCK_ERROR - When an error has occurred and the surface could not
+ * be locked.
+ *
+ * JAWT_LOCK_CLIP_CHANGED - When the clip region has changed.
+ *
+ * JAWT_LOCK_BOUNDS_CHANGED - When the bounds of the surface have changed.
+ *
+ * JAWT_LOCK_SURFACE_CHANGED - When the surface itself has changed
+ */
+ jint (JNICALL *Lock)
+ (struct jawt_DrawingSurface* ds);
+ /*
+ * Get the drawing surface info.
+ * The value returned may be cached, but the values may change if
+ * additional calls to Lock() or Unlock() are made.
+ * Lock() must be called before this can return a valid value.
+ * Returns NULL if an error has occurred.
+ * When finished with the returned value, FreeDrawingSurfaceInfo must be
+ * called.
+ */
+ JAWT_DrawingSurfaceInfo* (JNICALL *GetDrawingSurfaceInfo)
+ (struct jawt_DrawingSurface* ds);
+ /*
+ * Free the drawing surface info.
+ */
+ void (JNICALL *FreeDrawingSurfaceInfo)
+ (JAWT_DrawingSurfaceInfo* dsi);
+ /*
+ * Unlock the drawing surface of the target component for native rendering.
+ */
+ void (JNICALL *Unlock)
+ (struct jawt_DrawingSurface* ds);
+} JAWT_DrawingSurface;
+
+/*
+ * JAWT
+ * Structure for containing native AWT functions.
+ */
+typedef struct jawt {
+ /*
+ * Version of this structure. This must always be set before
+ * calling JAWT_GetAWT(). It affects the functions returned.
+ * Must be one of the known pre-defined versions.
+ */
+ jint version;
+ /*
+ * Return a drawing surface from a target jobject. This value
+ * may be cached.
+ * Returns NULL if an error has occurred.
+ * Target must be a java.awt.Component (should be a Canvas
+ * or Window for native rendering).
+ * FreeDrawingSurface() must be called when finished with the
+ * returned JAWT_DrawingSurface.
+ */
+ JAWT_DrawingSurface* (JNICALL *GetDrawingSurface)
+ (JNIEnv* env, jobject target);
+ /*
+ * Free the drawing surface allocated in GetDrawingSurface.
+ */
+ void (JNICALL *FreeDrawingSurface)
+ (JAWT_DrawingSurface* ds);
+ /*
+ * Since 1.4
+ * Locks the entire AWT for synchronization purposes
+ */
+ void (JNICALL *Lock)(JNIEnv* env);
+ /*
+ * Since 1.4
+ * Unlocks the entire AWT for synchronization purposes
+ */
+ void (JNICALL *Unlock)(JNIEnv* env);
+ /*
+ * Since 1.4
+ * Returns a reference to a java.awt.Component from a native
+ * platform handle. On Windows, this corresponds to an HWND;
+ * on Solaris and Linux, this is a Drawable. For other platforms,
+ * see the appropriate machine-dependent header file for a description.
+ * The reference returned by this function is a local
+ * reference that is only valid in this environment.
+ * This function returns a NULL reference if no component could be
+ * found with matching platform information.
+ */
+ jobject (JNICALL *GetComponent)(JNIEnv* env, void* platformInfo);
+
+ /**
+ * Since 9
+ * Creates a java.awt.Frame placed in a native container. Container is
+ * referenced by the native platform handle. For example on Windows this
+ * corresponds to an HWND. For other platforms, see the appropriate
+ * machine-dependent header file for a description. The reference returned
+ * by this function is a local reference that is only valid in this
+ * environment. This function returns a NULL reference if no frame could be
+ * created with matching platform information.
+ */
+ jobject (JNICALL *CreateEmbeddedFrame) (JNIEnv *env, void* platformInfo);
+
+ /**
+ * Since 9
+ * Moves and resizes the embedded frame. The new location of the top-left
+ * corner is specified by x and y parameters relative to the native parent
+ * component. The new size is specified by width and height.
+ *
+ * The embedded frame should be created by CreateEmbeddedFrame() method, or
+ * this function will not have any effect.
+ *
+ * java.awt.Component.setLocation() and java.awt.Component.setBounds() for
+ * EmbeddedFrame really don't move it within the native parent. These
+ * methods always locate the embedded frame at (0, 0) for backward
+ * compatibility. To allow moving embedded frames this method was
+ * introduced, and it works just the same way as setLocation() and
+ * setBounds() for usual, non-embedded components.
+ *
+ * Using usual get/setLocation() and get/setBounds() together with this new
+ * method is not recommended.
+ */
+ void (JNICALL *SetBounds) (JNIEnv *env, jobject embeddedFrame,
+ jint x, jint y, jint w, jint h);
+ /**
+ * Since 9
+ * Synthesize a native message to activate or deactivate an EmbeddedFrame
+ * window depending on the value of parameter doActivate, if "true"
+ * activates the window; otherwise, deactivates the window.
+ *
+ * The embedded frame should be created by CreateEmbeddedFrame() method, or
+ * this function will not have any effect.
+ */
+ void (JNICALL *SynthesizeWindowActivation) (JNIEnv *env,
+ jobject embeddedFrame, jboolean doActivate);
+} JAWT;
+
+/*
+ * Get the AWT native structure. This function returns JNI_FALSE if
+ * an error occurs.
+ */
+_JNI_IMPORT_OR_EXPORT_
+jboolean JNICALL JAWT_GetAWT(JNIEnv* env, JAWT* awt);
+
+/*
+ * Specify one of these constants as the JAWT.version
+ * Specifying an earlier version will limit the available functions to
+ * those provided in that earlier version of JAWT.
+ * See the "Since" note on each API. Methods with no "Since"
+ * may be presumed to be present in JAWT_VERSION_1_3.
+ */
+#define JAWT_VERSION_1_3 0x00010003
+#define JAWT_VERSION_1_4 0x00010004
+#define JAWT_VERSION_1_7 0x00010007
+#define JAWT_VERSION_9 0x00090000
+
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* !_JAVASOFT_JAWT_H_ */
+
+
+
+#ifndef _JAVASOFT_JAWT_MD_H_
+#define _JAVASOFT_JAWT_MD_H_
+
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Intrinsic.h>
+#include "jawt.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * X11-specific declarations for AWT native interface.
+ * See notes in jawt.h for an example of use.
+ */
+typedef struct jawt_X11DrawingSurfaceInfo {
+ Drawable drawable;
+ Display* display;
+ VisualID visualID;
+ Colormap colormapID;
+ int depth;
+} JAWT_X11DrawingSurfaceInfo;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !_JAVASOFT_JAWT_MD_H_ */
+
+
+#ifndef _JAVASOFT_JAWT_MD_H_
+#define _JAVASOFT_JAWT_MD_H_
+
+#include <windows.h>
+#include "jawt.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Microsoft Windows specific declarations for AWT native interface.
+ * See notes in jawt.h for an example of use.
+ */
+typedef struct jawt_Win32DrawingSurfaceInfo {
+ /* Native window, DDB, or DIB handle */
+ union {
+ HWND hwnd;
+ HBITMAP hbitmap;
+ void* pbits;
+ };
+ /*
+ * This HDC should always be used instead of the HDC returned from
+ * BeginPaint() or any calls to GetDC().
+ */
+ HDC hdc;
+ HPALETTE hpalette;
+} JAWT_Win32DrawingSurfaceInfo;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !_JAVASOFT_JAWT_MD_H_ */
+
+
+#ifndef _JAVASOFT_JAWT_MD_H_
+#define _JAVASOFT_JAWT_MD_H_
+
+#include "jawt.h"
+
+#ifdef __OBJC__
+#import
+
+
+
From db8bc54f61f2541b006cae07093283d29771388f Mon Sep 17 00:00:00 2001
From: Brian Burkhalter
If the serviceURL you specify has an empty URL
@@ -157,7 +157,7 @@ questions.
port.
As an alternative to the generated addresses just described, diff --git a/jdk/src/java.management/share/classes/java/lang/management/LockInfo.java b/jdk/src/java.management/share/classes/java/lang/management/LockInfo.java index 91e5545e387..108b3c9ae59 100644 --- a/jdk/src/java.management/share/classes/java/lang/management/LockInfo.java +++ b/jdk/src/java.management/share/classes/java/lang/management/LockInfo.java @@ -34,7 +34,7 @@ import sun.management.LockInfoCompositeData; * an ownable synchronizer, or the {@link Condition Condition} * object associated with synchronizers. *
- * An ownable synchronizer is + * An ownable synchronizer is * a synchronizer that may be exclusively owned by a thread and uses * {@link AbstractOwnableSynchronizer AbstractOwnableSynchronizer} * (or its subclass) to implement its synchronization property. @@ -42,7 +42,7 @@ import sun.management.LockInfoCompositeData; * the read-lock) of {@link ReentrantReadWriteLock ReentrantReadWriteLock} are * two examples of ownable synchronizers provided by the platform. * - *
- *+ *
+ * *
- * *Attribute Name - *Type + *Attribute Name + *Type ** className diff --git a/jdk/src/java.management/share/classes/java/lang/management/ManagementFactory.java b/jdk/src/java.management/share/classes/java/lang/management/ManagementFactory.java index 9a6252add85..90018468ff9 100644 --- a/jdk/src/java.management/share/classes/java/lang/management/ManagementFactory.java +++ b/jdk/src/java.management/share/classes/java/lang/management/ManagementFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -67,7 +67,7 @@ import sun.management.spi.PlatformMBeanProvider.PlatformComponent; * the management interface of a component of the Java virtual * machine. * - *Platform MXBeans
+ *Platform MXBeans
** A platform MXBean is a managed bean that * conforms to the JMX @@ -83,7 +83,7 @@ import sun.management.spi.PlatformMBeanProvider.PlatformComponent; * See * the specification of MXBeans for details. * - * + * *
Each platform MXBean is a {@link PlatformManagedObject} * and it has a unique * {@link javax.management.ObjectName ObjectName} for @@ -141,7 +141,8 @@ import sun.management.spi.PlatformMBeanProvider.PlatformComponent; * interfaces: * *
- *+ *
+ * *
* Management Interface *ObjectName @@ -184,7 +185,8 @@ import sun.management.spi.PlatformMBeanProvider.PlatformComponent; * the following management interfaces. * *- *+ *
+ * *
* Management Interface *ObjectName @@ -201,7 +203,8 @@ import sun.management.spi.PlatformMBeanProvider.PlatformComponent; * A Java virtual machine may have one or more instances of the following * management interfaces. *- *+ *
+ * *
* Management Interface *ObjectName diff --git a/jdk/src/java.management/share/classes/java/lang/management/ManagementPermission.java b/jdk/src/java.management/share/classes/java/lang/management/ManagementPermission.java index 31d00cf1c7e..8c31a32a707 100644 --- a/jdk/src/java.management/share/classes/java/lang/management/ManagementPermission.java +++ b/jdk/src/java.management/share/classes/java/lang/management/ManagementPermission.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -34,7 +34,8 @@ package java.lang.management; * provides a summary description of what the permission allows, * and discusses the risks of granting code the permission. * - *+ *
+ * *
* Permission Target Name *What the Permission Allows diff --git a/jdk/src/java.management/share/classes/java/lang/management/MemoryNotificationInfo.java b/jdk/src/java.management/share/classes/java/lang/management/MemoryNotificationInfo.java index b5a5856794d..881bdcf90b1 100644 --- a/jdk/src/java.management/share/classes/java/lang/management/MemoryNotificationInfo.java +++ b/jdk/src/java.management/share/classes/java/lang/management/MemoryNotificationInfo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -212,10 +212,11 @@ public class MemoryNotificationInfo { * The given {@code CompositeData} must contain * the following attributes: *- *+ *
+ * *
- * *Attribute Name - *Type + *Attribute Name + *Type ** poolName diff --git a/jdk/src/java.management/share/classes/java/lang/management/MemoryPoolMXBean.java b/jdk/src/java.management/share/classes/java/lang/management/MemoryPoolMXBean.java index 6a151910397..06158979745 100644 --- a/jdk/src/java.management/share/classes/java/lang/management/MemoryPoolMXBean.java +++ b/jdk/src/java.management/share/classes/java/lang/management/MemoryPoolMXBean.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -71,7 +71,7 @@ package java.lang.management; * (only supported by some garbage-collected memory pools) * * - *1. Memory Usage
+ *1. Memory Usage
* * The {@link #getUsage} method provides an estimate * of the current usage of a memory pool. @@ -86,14 +86,14 @@ package java.lang.management; * the current memory usage. An implementation should document when * this is the case. * - *2. Peak Memory Usage
+ *2. Peak Memory Usage
* * The Java virtual machine maintains the peak memory usage of a memory * pool since the virtual machine was started or the peak was reset. * The peak memory usage is returned by the {@link #getPeakUsage} method * and reset by calling the {@link #resetPeakUsage} method. * - *3. Usage Threshold
+ *3. Usage Threshold
* * Each memory pool has a manageable attribute * called the usage threshold which has a default value supplied @@ -141,7 +141,7 @@ package java.lang.management; * threshold notification mechanisms. * *- *
* - *- Polling + *
- Polling *
- ** An application can continuously monitor its memory usage * by calling either the {@link #getUsage} method for all @@ -231,7 +231,7 @@ package java.lang.management; * } *
*- Usage Threshold Notifications + *
- Usage Threshold Notifications *
** Usage threshold notification will be emitted by {@link MemoryMXBean}. * When the Java virtual machine detects that the memory usage of @@ -304,7 +304,7 @@ package java.lang.management; *
4. Collection Usage Threshold
+ *4. Collection Usage Threshold
* * Collection usage threshold is a manageable attribute only applicable * to some garbage-collected memory pools. diff --git a/jdk/src/java.management/share/classes/java/lang/management/MemoryUsage.java b/jdk/src/java.management/share/classes/java/lang/management/MemoryUsage.java index 39e0019f184..66c78d93042 100644 --- a/jdk/src/java.management/share/classes/java/lang/management/MemoryUsage.java +++ b/jdk/src/java.management/share/classes/java/lang/management/MemoryUsage.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -36,10 +36,11 @@ import sun.management.MemoryUsageCompositeData; * the heap or non-heap memory of the Java virtual machine as a whole. * *A {@code MemoryUsage} object contains four values: - *
+ *
+ * *
- * *{@code init} - *represents the initial amount of memory (in bytes) that + * {@code init} + *represents the initial amount of memory (in bytes) that * the Java virtual machine requests from the operating system * for memory management during startup. The Java virtual machine * may request additional memory from the operating system and @@ -48,13 +49,13 @@ import sun.management.MemoryUsageCompositeData; * *- * *{@code used} - *represents the amount of memory currently used (in bytes). + * {@code used} + *represents the amount of memory currently used (in bytes). * *- * *{@code committed} - *represents the amount of memory (in bytes) that is + * {@code committed} + *represents the amount of memory (in bytes) that is * guaranteed to be available for use by the Java virtual machine. * The amount of committed memory may change over time (increase * or decrease). The Java virtual machine may release memory to @@ -64,8 +65,8 @@ import sun.management.MemoryUsageCompositeData; * *- * {@code max} - *represents the maximum amount of memory (in bytes) + * {@code max} + *represents the maximum amount of memory (in bytes) * that can be used for memory management. Its value may be undefined. * The maximum amount of memory may change over time if defined. * The amount of used and committed memory will always be less than @@ -252,10 +253,11 @@ public class MemoryUsage { * must contain the following attributes: * * - *+ *
+ * *
- * *Attribute Name - *Type + *Attribute Name + *Type ** init diff --git a/jdk/src/java.management/share/classes/java/lang/management/MonitorInfo.java b/jdk/src/java.management/share/classes/java/lang/management/MonitorInfo.java index 78601f85072..81b66afd2b4 100644 --- a/jdk/src/java.management/share/classes/java/lang/management/MonitorInfo.java +++ b/jdk/src/java.management/share/classes/java/lang/management/MonitorInfo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -106,10 +106,11 @@ public class MonitorInfo extends LockInfo { * * mapped type for the {@link LockInfo} class: *- *+ *
+ * *
- * *Attribute Name - *Type + *Attribute Name + *Type ** lockedStackFrame diff --git a/jdk/src/java.management/share/classes/java/lang/management/RuntimeMXBean.java b/jdk/src/java.management/share/classes/java/lang/management/RuntimeMXBean.java index 866567a366d..def09b4a00b 100644 --- a/jdk/src/java.management/share/classes/java/lang/management/RuntimeMXBean.java +++ b/jdk/src/java.management/share/classes/java/lang/management/RuntimeMXBean.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -312,7 +312,8 @@ public interface RuntimeMXBean extends PlatformManagedObject { * {@link javax.management.openmbean.TabularData TabularData} * with two items in each row as follows: *- *+ *
+ * *
* Item Name *Item Type diff --git a/jdk/src/java.management/share/classes/java/lang/management/ThreadInfo.java b/jdk/src/java.management/share/classes/java/lang/management/ThreadInfo.java index edf758e8731..5cc5861c2d6 100644 --- a/jdk/src/java.management/share/classes/java/lang/management/ThreadInfo.java +++ b/jdk/src/java.management/share/classes/java/lang/management/ThreadInfo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -61,7 +61,7 @@ import static java.lang.Thread.State.*; *Thread priority * * - *Synchronization Statistics
+ *Synchronization Statistics
**
- The number of times that the thread has blocked for * synchronization or waited for notification.
@@ -695,10 +695,11 @@ public class ThreadInfo { * The given {@code CompositeData} must contain the following attributes * unless otherwise specified below: *- *+ *
+ * *
- * *Attribute Name - *Type + *Attribute Name + *Type ** *threadId @@ -759,16 +760,17 @@ public class ThreadInfo { *{@code java.lang.String} *- * stackTrace + *stackTrace *{@code javax.management.openmbean.CompositeData[]} * * Each element is a {@code CompositeData} representing * StackTraceElement containing the following attributes: *
- *+ *
+ * *
- * *Attribute Name - *Type + *Attribute Name + *Type ** moduleName diff --git a/jdk/src/java.management/share/classes/java/lang/management/package.html b/jdk/src/java.management/share/classes/java/lang/management/package.html index 652253b39bc..67246f00e1e 100644 --- a/jdk/src/java.management/share/classes/java/lang/management/package.html +++ b/jdk/src/java.management/share/classes/java/lang/management/package.html @@ -32,7 +32,7 @@ Java virtual machine and other components in the Java runtime. It allows both local and remote monitoring and management of the running Java virtual machine. -Platform MXBean
+Platform MXBean
A platform MXBean is a managed bean that conforms to the JMX @@ -40,7 +40,7 @@ Instrumentation Specification and only uses a set of basic data types. Each platform MXBean is a {@link java.lang.management.PlatformManagedObject} with a unique {@linkplain java.lang.management.PlatformManagedObject#getObjectName name}. -
ManagementFactory
+ManagementFactory
The {@link java.lang.management.ManagementFactory} class is the management factory class for the Java platform. This class provides a set of @@ -58,7 +58,7 @@ the specification of the management interface. This is a single MBeanServer that can be shared by different managed components running within the same Java virtual machine. -
Interoperability
+Interoperability
A management application and a platform MBeanServer of a running virtual machine can interoperate @@ -72,7 +72,7 @@ open type when being accessed via MBeanServer interface. See the MXBean specification for details. -
Ways to Access MXBeans
+Ways to Access MXBeans
An application can monitor the instrumentation of the Java virtual machine and the runtime in the following ways: @@ -163,7 +163,7 @@ Java virtual machine and the runtime in the following ways: -
Platform Extension
+Platform Extension
A Java virtual machine implementation may add its platform extension to the management interface by defining platform-dependent diff --git a/jdk/src/java.management/share/classes/javax/management/Descriptor.java b/jdk/src/java.management/share/classes/javax/management/Descriptor.java index 0b25e34b04f..8945dfb56fe 100644 --- a/jdk/src/java.management/share/classes/javax/management/Descriptor.java +++ b/jdk/src/java.management/share/classes/javax/management/Descriptor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 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 @@ -96,7 +96,8 @@ import javax.management.openmbean.OpenType; * of the mapped Java type, called opendata(J) in the MXBean type mapping rules.
* - *+ *
+ * * *
* @@ -330,7 +331,8 @@ import javax.management.openmbean.OpenType; * interest outside Model MBeans, for example. But only Model MBeans have * a predefined behavior for these fields. * - * Name Type Used in Meaning + *
+ * * *
* diff --git a/jdk/src/java.management/share/classes/javax/management/DescriptorKey.java b/jdk/src/java.management/share/classes/javax/management/DescriptorKey.java index 814e234d35c..592cb799f32 100644 --- a/jdk/src/java.management/share/classes/javax/management/DescriptorKey.java +++ b/jdk/src/java.management/share/classes/javax/management/DescriptorKey.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -94,7 +94,8 @@ import java.lang.annotation.*; * Name Type Used in Meaning then the resulting {@code Descriptor} will contain the following * fields:
* - *+ *
+ * *
* Name Value * units "bytes" @@ -143,7 +144,8 @@ import java.lang.annotation.*; * or an array of annotations. The value of the field is derived from * the value of the annotation element as follows: * - * descriptionResourceKey "bytes.key" + *
+ * *
* Annotation element Descriptor field Primitive value ({@code 5}, {@code false}, etc) *Wrapped value ({@code Integer.valueOf(5)}, diff --git a/jdk/src/java.management/share/classes/javax/management/MBeanPermission.java b/jdk/src/java.management/share/classes/javax/management/MBeanPermission.java index 5aa18b70960..c134ac5ef56 100644 --- a/jdk/src/java.management/share/classes/javax/management/MBeanPermission.java +++ b/jdk/src/java.management/share/classes/javax/management/MBeanPermission.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 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 @@ -133,7 +133,7 @@ import java.security.Permission; * any value (including another null value) but does not imply any * other value. * - * The possible actions are these:
+ *The possible actions are these:
* **
- addNotificationListener
diff --git a/jdk/src/java.management/share/classes/javax/management/MXBean.java b/jdk/src/java.management/share/classes/javax/management/MXBean.java index ca5402effda..c69ebe462fe 100644 --- a/jdk/src/java.management/share/classes/javax/management/MXBean.java +++ b/jdk/src/java.management/share/classes/javax/management/MXBean.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -93,7 +93,8 @@ import javax.management.openmbean.TabularType; Standard MBean concept. Here is how a managed object might be represented as a Standard MBean, and as an MXBean: -+
+
@@ -133,7 +134,8 @@ public interface MemoryPoolMXBean { Standard MBean MXBean So, we might define
-MemoryUsagelike this:+
+
@@ -195,7 +197,8 @@ public class MemoryUsage { Standard MBean MXBean This becomes clearer if we compare what the clients of the two models might look like:
-+
+
@@ -232,7 +235,8 @@ String name = (String) managed objects when you know the model beforehand, regardless of whether you are using Standard MBeans or MXBeans: - Standard MBean MXBean +
+
@@ -265,7 +269,8 @@ long used = usage.getUsed(); Standard MBean MXBean Implementing the MemoryPool object works similarly for both Standard MBeans and MXBeans.
-+
+
@@ -292,7 +297,8 @@ public class MemoryPool Standard MBean MXBean Registering the MBean in the MBean Server works in the same way in both cases:
-+
+
@@ -478,13 +484,14 @@ public class MemoryPool Standard MBean MXBean The following table summarizes the type mapping rules.
-+
+
- + Java type J opentype(J) opendata(J) {@code int}, {@code boolean}, etc diff --git a/jdk/src/java.management/share/classes/javax/management/modelmbean/ModelMBeanAttributeInfo.java b/jdk/src/java.management/share/classes/javax/management/modelmbean/ModelMBeanAttributeInfo.java index 447273ed9be..ec834ce8e5e 100644 --- a/jdk/src/java.management/share/classes/javax/management/modelmbean/ModelMBeanAttributeInfo.java +++ b/jdk/src/java.management/share/classes/javax/management/modelmbean/ModelMBeanAttributeInfo.java @@ -57,7 +57,8 @@ import javax.management.RuntimeOperationsException; * Note that when the Type in this table is Number, a String that is the decimal * representation of a Long can also be used. * - *
(the 8 primitive Java types)+ *
+ * *
* Name Type Meaning diff --git a/jdk/src/java.management/share/classes/javax/management/modelmbean/ModelMBeanConstructorInfo.java b/jdk/src/java.management/share/classes/javax/management/modelmbean/ModelMBeanConstructorInfo.java index 9bec078f6f3..cbdd549b13c 100644 --- a/jdk/src/java.management/share/classes/javax/management/modelmbean/ModelMBeanConstructorInfo.java +++ b/jdk/src/java.management/share/classes/javax/management/modelmbean/ModelMBeanConstructorInfo.java @@ -58,7 +58,8 @@ import javax.management.RuntimeOperationsException; * Note that when the Type in this table is Number, a String that is the decimal * representation of a Long can also be used. * - * name String *Attribute name. + *
+ * *
* Name Type Meaning diff --git a/jdk/src/java.management/share/classes/javax/management/modelmbean/ModelMBeanInfo.java b/jdk/src/java.management/share/classes/javax/management/modelmbean/ModelMBeanInfo.java index 642cddd3d27..6dd7e2adfb6 100644 --- a/jdk/src/java.management/share/classes/javax/management/modelmbean/ModelMBeanInfo.java +++ b/jdk/src/java.management/share/classes/javax/management/modelmbean/ModelMBeanInfo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 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 @@ -165,7 +165,8 @@ public interface ModelMBeanInfo * following. Note that when the Type in this table is Number, a String * that is the decimal representation of a Long can also be used. * - * name String *Constructor name. + *
+ * *
* Name Type Meaning diff --git a/jdk/src/java.management/share/classes/javax/management/modelmbean/ModelMBeanNotificationInfo.java b/jdk/src/java.management/share/classes/javax/management/modelmbean/ModelMBeanNotificationInfo.java index 507ba1a34a6..a7545023218 100644 --- a/jdk/src/java.management/share/classes/javax/management/modelmbean/ModelMBeanNotificationInfo.java +++ b/jdk/src/java.management/share/classes/javax/management/modelmbean/ModelMBeanNotificationInfo.java @@ -56,7 +56,8 @@ import javax.management.RuntimeOperationsException; * Note that when the Type in this table is Number, a String that is the decimal * representation of a Long can also be used. * - * name String *MBean name. + *
+ * *
* Name Type Meaning diff --git a/jdk/src/java.management/share/classes/javax/management/modelmbean/ModelMBeanOperationInfo.java b/jdk/src/java.management/share/classes/javax/management/modelmbean/ModelMBeanOperationInfo.java index a0541b678f3..123ed9418eb 100644 --- a/jdk/src/java.management/share/classes/javax/management/modelmbean/ModelMBeanOperationInfo.java +++ b/jdk/src/java.management/share/classes/javax/management/modelmbean/ModelMBeanOperationInfo.java @@ -59,7 +59,8 @@ import javax.management.RuntimeOperationsException; * Note that when the Type in this table is Number, a String that is the decimal * representation of a Long can also be used. * - * name String *Notification name. + *
+ * *
* Name Type Meaning diff --git a/jdk/src/java.management/share/classes/javax/management/modelmbean/package.html b/jdk/src/java.management/share/classes/javax/management/modelmbean/package.html index ddcd3d5545a..6d916044107 100644 --- a/jdk/src/java.management/share/classes/javax/management/modelmbean/package.html +++ b/jdk/src/java.management/share/classes/javax/management/modelmbean/package.html @@ -110,7 +110,7 @@ mbs.invoke(mapName, "get", new Object[] {"key"}, new String[] {Object.class.getN // returns "value" - name String *Operation name. Package Specification
+Package Specification
- See the JMX 1.4 Specification diff --git a/jdk/src/java.management/share/classes/javax/management/openmbean/package.html b/jdk/src/java.management/share/classes/javax/management/openmbean/package.html index 1c852fc4260..36ad2bfece4 100644 --- a/jdk/src/java.management/share/classes/javax/management/openmbean/package.html +++ b/jdk/src/java.management/share/classes/javax/management/openmbean/package.html @@ -77,7 +77,7 @@ questions. describes the items in the
CompositeDatainstances for the attribute. -Default values and constraints
+Default values and constraints
In Open MBeans, attributes and parameters can have default values and/or constraints associated with them in the {@code diff --git a/jdk/src/java.management/share/classes/javax/management/remote/JMXConnectionNotification.java b/jdk/src/java.management/share/classes/javax/management/remote/JMXConnectionNotification.java index 51c233d5411..5bf136430b6 100644 --- a/jdk/src/java.management/share/classes/javax/management/remote/JMXConnectionNotification.java +++ b/jdk/src/java.management/share/classes/javax/management/remote/JMXConnectionNotification.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -40,11 +40,12 @@ import javax.management.ObjectName; * *
The notification type is one of the following:
* - *+ *
+ * * *
- * * *Type - *Meaning + *Type + *Meaning *From b8116f74c0e6c30389596fa140b169dd3e3fa12b Mon Sep 17 00:00:00 2001 From: Ron Pressler Date: Mon, 1 May 2017 10:43:40 -0700 Subject: [PATCH 10/49] 8177146: MethodHandles.Lookup::bind allows illegal protected access Reviewed-by: psandoz, vlivanov, redestad --- .../java/lang/invoke/MethodHandles.java | 22 +++-- .../invoke/8177146/TestMethodHandleBind.java | 96 +++++++++++++++++++ jdk/test/java/lang/invoke/8177146/pkg/A.java | 40 ++++++++ 3 files changed, 149 insertions(+), 9 deletions(-) create mode 100644 jdk/test/java/lang/invoke/8177146/TestMethodHandleBind.java create mode 100644 jdk/test/java/lang/invoke/8177146/pkg/A.java diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java index cb5a398d68d..41b4347c7cf 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java @@ -1691,7 +1691,13 @@ return mh1; public MethodHandle bind(Object receiver, String name, MethodType type) throws NoSuchMethodException, IllegalAccessException { Class extends Object> refc = receiver.getClass(); // may get NPE MemberName method = resolveOrFail(REF_invokeSpecial, refc, name, type); - MethodHandle mh = getDirectMethodNoRestrict(REF_invokeSpecial, refc, method, findBoundCallerClass(method)); + MethodHandle mh = getDirectMethodNoRestrictInvokeSpecial(refc, method, findBoundCallerClass(method)); + if (!mh.type().leadingReferenceParameter().isAssignableFrom(receiver.getClass())) { + throw new IllegalAccessException("The restricted defining class " + + mh.type().leadingReferenceParameter().getName() + + " is not assignable from receiver class " + + receiver.getClass().getName()); + } return mh.bindArgumentL(0, receiver).setVarargs(method); } @@ -2240,7 +2246,7 @@ return mh1; throw method.makeAccessException("caller class must be a subclass below the method", caller); } MethodType rawType = mh.type(); - if (rawType.parameterType(0) == caller) return mh; + if (caller.isAssignableFrom(rawType.parameterType(0))) return mh; // no need to restrict; already narrow MethodType narrowType = rawType.changeParameterType(0, caller); assert(!mh.isVarargsCollector()); // viewAsType will lose varargs-ness assert(mh.viewAsTypeChecks(narrowType, true)); @@ -2253,11 +2259,11 @@ return mh1; final boolean checkSecurity = true; return getDirectMethodCommon(refKind, refc, method, checkSecurity, doRestrict, callerClass); } - /** Check access and get the requested method, eliding receiver narrowing rules. */ - private MethodHandle getDirectMethodNoRestrict(byte refKind, Class> refc, MemberName method, Class> callerClass) throws IllegalAccessException { + /** Check access and get the requested method, for invokespecial with no restriction on the application of narrowing rules. */ + private MethodHandle getDirectMethodNoRestrictInvokeSpecial(Class> refc, MemberName method, Class> callerClass) throws IllegalAccessException { final boolean doRestrict = false; final boolean checkSecurity = true; - return getDirectMethodCommon(refKind, refc, method, checkSecurity, doRestrict, callerClass); + return getDirectMethodCommon(REF_invokeSpecial, refc, method, checkSecurity, doRestrict, callerClass); } /** Check access and get the requested method, eliding security manager checks. */ private MethodHandle getDirectMethodNoSecurityManager(byte refKind, Class> refc, MemberName method, Class> callerClass) throws IllegalAccessException { @@ -2309,10 +2315,8 @@ return mh1; DirectMethodHandle dmh = DirectMethodHandle.make(refKind, refc, method); MethodHandle mh = dmh; // Optionally narrow the receiver argument to refc using restrictReceiver. - if (doRestrict && - (refKind == REF_invokeSpecial || - (MethodHandleNatives.refKindHasReceiver(refKind) && - restrictProtectedReceiver(method)))) { + if ((doRestrict && refKind == REF_invokeSpecial) || + (MethodHandleNatives.refKindHasReceiver(refKind) && restrictProtectedReceiver(method))) { mh = restrictReceiver(method, dmh, lookupClass()); } mh = maybeBindCaller(method, mh, callerClass); diff --git a/jdk/test/java/lang/invoke/8177146/TestMethodHandleBind.java b/jdk/test/java/lang/invoke/8177146/TestMethodHandleBind.java new file mode 100644 index 00000000000..134cc9f7514 --- /dev/null +++ b/jdk/test/java/lang/invoke/8177146/TestMethodHandleBind.java @@ -0,0 +1,96 @@ +/* + * 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* @test + * @bug 8177146 + * @run testng/othervm TestMethodHandleBind + */ + +import org.testng.annotations.Test; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodType; + +import static java.lang.invoke.MethodHandles.lookup; + +import static org.testng.Assert.*; + +public class TestMethodHandleBind extends pkg.A { + static class B extends TestMethodHandleBind {} + + @Test + public void testInstanceOfCallerClass() throws Throwable { + MethodHandle bound = lookup().bind(new TestMethodHandleBind() , "m1", MethodType.methodType(String.class)); + String x = (String)bound.invoke(); + assertEquals(x, this.getClass().getSimpleName()); + } + + @Test + public void testInstanceOfCallerSubclass() throws Throwable { + MethodHandle bound = lookup().bind(new B() , "m1", MethodType.methodType(String.class)); + // MethodHandle bound = lookup().findVirtual(B.class, "m1", MethodType.methodType(String.class)).bindTo(new B()); + String x = (String)bound.invoke(); + assertEquals(x, "B"); + } + + @Test + public void testInstanceOfReceiverClass() throws Throwable { + try { + MethodHandle bound = lookup().bind(new pkg.A() , "m1", MethodType.methodType(String.class)); + bound.invoke(); + fail("IllegalAccessException expected"); + } catch (IllegalAccessException e) { + } + } + + @Test + public void testPublicMethod() throws Throwable { + MethodHandle bound = lookup().bind(new pkg.A() , "m2", MethodType.methodType(String.class)); + String x = (String)bound.invoke(); + assertEquals(x, "A"); + } + + @Test + public void testPublicMethod2() throws Throwable { + MethodHandle bound = lookup().bind(new TestMethodHandleBind(), "m2", MethodType.methodType(String.class)); + String x = (String)bound.invoke(); + assertEquals(x, this.getClass().getSimpleName()); + } + + @Test + public void testInstanceOfCallerClassVarargs() throws Throwable { + MethodHandle bound = lookup().bind(new TestMethodHandleBind() , "m3", MethodType.methodType(String.class, String[].class)); + String x = (String)bound.invoke("a", "b", "c"); + assertEquals(x, this.getClass().getSimpleName() + "abc"); + } + + @Test + public void testInstanceOfReceiverClassVarargs() throws Throwable { + try { + MethodHandle bound = lookup().bind(new pkg.A(), "m3", MethodType.methodType(String.class, String[].class)); + bound.invoke(); + fail("IllegalAccessException expected"); + } catch (IllegalAccessException e) { + } + } +} diff --git a/jdk/test/java/lang/invoke/8177146/pkg/A.java b/jdk/test/java/lang/invoke/8177146/pkg/A.java new file mode 100644 index 00000000000..f34d52b8efd --- /dev/null +++ b/jdk/test/java/lang/invoke/8177146/pkg/A.java @@ -0,0 +1,40 @@ +/* + * 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 + * 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. + */ +package pkg; + +public class A { + protected String m1() { + return this.getClass().getSimpleName(); + } + + public String m2() { + return this.getClass().getSimpleName(); + } + + protected String m3(String... args) { + StringBuilder sb = new StringBuilder(); + for (String s : args) + sb.append(s); + return this.getClass().getSimpleName() + sb.toString(); + } +} From 0bd3951f5a454cdd6c3419d12f4121fca19f3b8d Mon Sep 17 00:00:00 2001 From: Paul Sandoz Date: Mon, 1 May 2017 11:16:01 -0700 Subject: [PATCH 11/49] 8167229: Improve VarHandle documentation Reviewed-by: martin, abuckley --- .../java/lang/invoke/MethodHandles.java | 69 ++- .../classes/java/lang/invoke/VarHandle.java | 536 +++++++++--------- 2 files changed, 307 insertions(+), 298 deletions(-) diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java index 41b4347c7cf..eceba166e24 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java @@ -1447,9 +1447,10 @@ assertEquals(""+l, (String) MH_this.invokeExact(subl)); // Listie method } /** - * Produces a VarHandle giving access to non-static fields of type - * {@code T} declared by a receiver class of type {@code R}, supporting - * shape {@code (R : T)}. + * Produces a VarHandle giving access to a non-static field {@code name} + * of type {@code type} declared in a class of type {@code recv}. + * The VarHandle's variable type is {@code type} and it has one + * coordinate type, {@code recv}. * * Access checking is performed immediately on behalf of the lookup * class. @@ -1472,7 +1473,7 @@ assertEquals(""+l, (String) MH_this.invokeExact(subl)); // Listie method *
* If the field is declared {@code volatile} then the returned VarHandle * will override access to the field (effectively ignore the - * {@code volatile} declaration) in accordance to it's specified + * {@code volatile} declaration) in accordance to its specified * access modes. *
* If the field type is {@code float} or {@code double} then numeric @@ -1568,9 +1569,10 @@ assertEquals(""+l, (String) MH_this.invokeExact(subl)); // Listie method } /** - * Produces a VarHandle giving access to a static field of type - * {@code T} declared by a given declaring class, supporting shape - * {@code ((empty) : T)}. + * Produces a VarHandle giving access to a static field {@code name} of + * type {@code type} declared in a class of type {@code decl}. + * The VarHandle's variable type is {@code type} and it has no + * coordinate types. *
* Access checking is performed immediately on behalf of the lookup * class. @@ -1596,7 +1598,7 @@ assertEquals(""+l, (String) MH_this.invokeExact(subl)); // Listie method *
* If the field is declared {@code volatile} then the returned VarHandle * will override access to the field (effectively ignore the - * {@code volatile} declaration) in accordance to it's specified + * {@code volatile} declaration) in accordance to its specified * access modes. *
* If the field type is {@code float} or {@code double} then numeric @@ -1883,11 +1885,12 @@ return mh1; } /** - * Produces a VarHandle that accesses fields of type {@code T} declared - * by a class of type {@code R}, as described by the given reflected - * field. - * If the field is non-static the VarHandle supports a shape of - * {@code (R : T)}, otherwise supports a shape of {@code ((empty) : T)}. + * Produces a VarHandle giving access to a reflected field {@code f} + * of type {@code T} declared in a class of type {@code R}. + * The VarHandle's variable type is {@code T}. + * If the field is non-static the VarHandle has one coordinate type, + * {@code R}. Otherwise, the field is static, and the VarHandle has no + * coordinate types. *
* Access checking is performed immediately on behalf of the lookup * class, regardless of the value of the field's {@code accessible} @@ -1915,7 +1918,7 @@ return mh1; *
* If the field is declared {@code volatile} then the returned VarHandle * will override access to the field (effectively ignore the - * {@code volatile} declaration) in accordance to it's specified + * {@code volatile} declaration) in accordance to its specified * access modes. *
* If the field type is {@code float} or {@code double} then numeric @@ -2576,9 +2579,11 @@ return mh1; } /** - * - * Produces a VarHandle giving access to elements of an array type - * {@code T[]}, supporting shape {@code (T[], int : T)}. + * Produces a VarHandle giving access to elements of an array of type + * {@code arrayClass}. The VarHandle's variable type is the component type + * of {@code arrayClass} and the list of coordinate types is + * {@code (arrayClass, int)}, where the {@code int} coordinate type + * corresponds to an argument that is an index into an array. *
* Certain access modes of the returned VarHandle are unsupported under * the following conditions: @@ -2633,13 +2638,14 @@ return mh1; /** * Produces a VarHandle giving access to elements of a {@code byte[]} array * viewed as if it were a different primitive array type, such as - * {@code int[]} or {@code long[]}. The shape of the resulting VarHandle is - * {@code (byte[], int : T)}, where the {@code int} coordinate type - * corresponds to an argument that is an index in a {@code byte[]} array, - * and {@code T} is the component type of the given view array class. The - * returned VarHandle accesses bytes at an index in a {@code byte[]} array, - * composing bytes to or from a value of {@code T} according to the given - * endianness. + * {@code int[]} or {@code long[]}. + * The VarHandle's variable type is the component type of + * {@code viewArrayClass} and the list of coordinate types is + * {@code (byte[], int)}, where the {@code int} coordinate type + * corresponds to an argument that is an index into a {@code byte[]} array. + * The returned VarHandle accesses bytes at an index in a {@code byte[]} + * array, composing bytes to or from a value of the component type of + * {@code viewArrayClass} according to the given endianness. *
* The supported component types (variables types) are {@code short}, * {@code char}, {@code int}, {@code long}, {@code float} and @@ -2717,13 +2723,14 @@ return mh1; * Produces a VarHandle giving access to elements of a {@code ByteBuffer} * viewed as if it were an array of elements of a different primitive * component type to that of {@code byte}, such as {@code int[]} or - * {@code long[]}. The shape of the resulting VarHandle is - * {@code (ByteBuffer, int : T)}, where the {@code int} coordinate type - * corresponds to an argument that is an index in a {@code ByteBuffer}, and - * {@code T} is the component type of the given view array class. The - * returned VarHandle accesses bytes at an index in a {@code ByteBuffer}, - * composing bytes to or from a value of {@code T} according to the given - * endianness. + * {@code long[]}. + * The VarHandle's variable type is the component type of + * {@code viewArrayClass} and the list of coordinate types is + * {@code (ByteBuffer, int)}, where the {@code int} coordinate type + * corresponds to an argument that is an index into a {@code byte[]} array. + * The returned VarHandle accesses bytes at an index in a + * {@code ByteBuffer}, composing bytes to or from a value of the component + * type of {@code viewArrayClass} according to the given endianness. *
* The supported component types (variables types) are {@code short}, * {@code char}, {@code int}, {@code long}, {@code float} and diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/VarHandle.java b/jdk/src/java.base/share/classes/java/lang/invoke/VarHandle.java index ee0f712635c..9e2533f071e 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/VarHandle.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/VarHandle.java @@ -41,7 +41,7 @@ import static java.lang.invoke.MethodHandleStatics.UNSAFE; import static java.lang.invoke.MethodHandleStatics.newInternalError; /** - * A VarHandle is a dynamically typed reference to a variable, or to a + * A VarHandle is a dynamically strongly typed reference to a variable, or to a * parametrically-defined family of variables, including static fields, * non-static fields, array elements, or components of an off-heap data * structure. Access to such variables is supported under various @@ -53,63 +53,62 @@ import static java.lang.invoke.MethodHandleStatics.newInternalError; * *
A VarHandle has: *
- *
+ * Variable and coordinate types may be primitive or reference, and are + * represented by {@code Class} objects. The list of coordinate types may be + * empty. * *- a {@link #varType variable type}, referred to as {@code T}, which is the - * type of variable(s) referenced by this VarHandle; - *
- a list of {@link #coordinateTypes coordinate types}, referred to as - * {@code CT}, where the types (primitive and reference) are represented by - * {@link Class} objects). A list of arguments corresponding to instances of - * the coordinate types uniquely locates a variable referenced by this - * VarHandle; and - *
- a shape, that combines the variable type and coordinate types, - * and is declared with the notation {@code (CT : T)}. An empty list of - * coordinate types is declared as {@code (empty)}. + *
- a {@link #varType variable type} T, the type of every variable referenced + * by this VarHandle; and + *
- a list of {@link #coordinateTypes coordinate types} + * {@code CT1, CT2, ..., CTn}, the types of coordinate expressions that + * jointly locate a variable referenced by this VarHandle. *
Factory methods that produce or {@link java.lang.invoke.MethodHandles.Lookup - * lookup} VarHandle instances document the supported variable type, coordinate - * types, and shape. + * lookup} VarHandle instances document the supported variable type and the list + * of coordinate types. * - * For example, a VarHandle referencing a non-static field will declare a shape - * of {@code (R : T)}, where {@code R} is the receiver type and - * {@code T} is the field type, and where the VarHandle and an instance of the - * receiver type can be utilized to access the field variable. - * A VarHandle referencing array elements will declare a shape of - * {@code (T[], int : T)}, where {@code T[]} is the array type and {@code T} - * its component type, and where the VarHandle, an instance of the array type, - * and an {@code int} index can be utilized to access an array element variable. + *
Each access mode is associated with one access mode method, a + * signature polymorphic method named + * for the access mode. When an access mode method is invoked on a VarHandle + * instance, the initial arguments to the invocation are coordinate expressions + * that indicate in precisely which object the variable is to be accessed. + * Trailing arguments to the invocation represent values of importance to the + * access mode. For example, the various compare-and-set or compare-and-exchange + * access modes require two trailing arguments for the variable's expected value + * and new value. * - *
Each access mode is associated with a - * signature polymorphic method of the - * same name, where the VarHandle shape and access mode uniquely determine the - * canonical {@link #accessModeType(AccessMode) access mode type}, - * which in turn determines the matching constraints on a valid symbolic - * type descriptor at the call site of an access mode's method - * invocation. + *
The arity and types of arguments to the invocation of an access mode + * method are not checked statically. Instead, each access mode method + * specifies an {@link #accessModeType(AccessMode) access mode type}, + * represented as an instance of {@link MethodType}, that serves as a kind of + * method signature against which the arguments are checked dynamically. An + * access mode type gives formal parameter types in terms of the coordinate + * types of a VarHandle instance and the types for values of importance to the + * access mode. An access mode type also gives a return type, often in terms of + * the variable type of a VarHandle instance. When an access mode method is + * invoked on a VarHandle instance, the symbolic type descriptor at the + * call site, the run time types of arguments to the invocation, and the run + * time type of the return value, must match the types + * given in the access mode type. A runtime exception will be thrown if the + * match fails. * - * As such, VarHandles are dynamically and strongly typed. Their arity, - * argument types, and return type of an access mode method invocation are not - * statically checked. If they, and associated values, do not match the arity - * and types of the access mode's type, an exception will be thrown. - * - * The parameter types of an access mode method type will consist of those that - * are the VarHandles's coordinate types (in order), followed by access mode - * parameter types specific to the access mode. - * - *
An access mode's method documents the form of its method signature, which - * is derived from the access mode parameter types. The form is declared with - * the notation {@code (CT, P1 p1, P2 p2, ..., PN pn)R}, where {@code CT} is the - * coordinate types (as documented by a VarHandle factory method), {@code P1}, - * {@code P2} and {@code PN} are the first, second and the n'th access mode - * parameters named {@code p1}, {@code p2} and {@code pn} respectively, and - * {@code R} is the return type. - * - * For example, for the generic shape of {@code (CT : T)} the - * {@link #compareAndSet} access mode method documents that its method - * signature is of the form {@code (CT, T expectedValue, T newValue)boolean}, - * where the parameter types named {@code extendedValue} and {@code newValue} - * are the access mode parameter types. If the VarHandle accesses array - * elements with a shape of say {@code (T[], int : T)} then the access mode - * method type is {@code (T[], int, T, T)boolean}. + * For example, the access mode method {@link #compareAndSet} specifies that if + * its receiver is a VarHandle instance with coordinate types + * {@code CT1, ..., CTn} and variable type {@code T}, then its access mode type + * is {@code (CT1 c1, ..., CTn cn, T expectedValue, T newValue)boolean}. + * Suppose that a VarHandle instance can access array elements, and that its + * coordinate types are {@code String[]} and {@code int} while its variable type + * is {@code String}. The access mode type for {@code compareAndSet} on this + * VarHandle instance would be + * {@code (String[] c1, int c2, String expectedValue, String newValue)boolean}. + * Such a VarHandle instance may produced by the + * {@link MethodHandles#arrayElementVarHandle(Class) array factory method} and + * access array elements as follows: + *
{@code + * String[] sa = ... + * VarHandle avh = MethodHandles.arrayElementVarHandle(String[].class); + * boolean r = avh.compareAndSet(sa, 10, "expected", "new"); + * }* *Access modes are grouped into the following categories: *
@@ -172,10 +171,10 @@ import static java.lang.invoke.MethodHandleStatics.newInternalError; * lookup} VarHandle instances document the set of access modes that are * supported, which may also include documenting restrictions based on the * variable type and whether a variable is read-only. If an access mode is not - * supported then the corresponding signature-polymorphic method will on - * invocation throw an {@code UnsupportedOperationException}. Factory methods - * should document any additional undeclared exceptions that may be thrown by - * access mode methods. + * supported then the corresponding access mode method will on invocation throw + * an {@code UnsupportedOperationException}. Factory methods should document + * any additional undeclared exceptions that may be thrown by access mode + * methods. * The {@link #get get} access mode is supported for all * VarHandle instances and the corresponding method never throws * {@code UnsupportedOperationException}. @@ -215,7 +214,7 @@ import static java.lang.invoke.MethodHandleStatics.newInternalError; * precise phrasing of the specification of access mode methods and memory fence * methods may accompany future updates of the Java Language Specification. * - *
Compilation of an access mode's method
+ *Compiling invocation of access mode methods
* A Java method call expression naming an access mode method can invoke a * VarHandle from Java source code. From the viewpoint of source code, these * methods can take any arguments and their polymorphic result (if expressed) @@ -247,7 +246,7 @@ import static java.lang.invoke.MethodHandleStatics.newInternalError; * except the null reference. * * - *Invocation of an access mode's method
+ *Performing invocation of access mode methods
* The first time an {@code invokevirtual} instruction is executed it is linked * by symbolically resolving the names in the instruction and verifying that * the method call is statically legal. This also holds for calls to access mode @@ -264,38 +263,31 @@ import static java.lang.invoke.MethodHandleStatics.newInternalError; * invoking is not present on the individual VarHandle being invoked. * *- * Invocation of an access mode's signature-polymorphic method behaves as if an - * invocation of {@link MethodHandle#invoke}, where the receiving method handle - * is bound to a VarHandle instance and the access mode. More specifically, the - * following: + * Invocation of an access mode method behaves as if an invocation of + * {@link MethodHandle#invoke}, where the receiving method handle accepts the + * VarHandle instance as the leading argument. More specifically, the + * following, where {@code {access-mode}} corresponds to the access mode method + * name: *
{@code * VarHandle vh = .. * R r = (R) vh.{access-mode}(p1, p2, ..., pN); * }- * behaves as if (modulo the access mode methods do not declare throwing of - * {@code Throwable}): + * behaves as if: *{@code * VarHandle vh = .. + * VarHandle.AccessMode am = VarHandle.AccessMode.valueFromMethodName("{access-mode}"); * MethodHandle mh = MethodHandles.varHandleExactInvoker( - * VarHandle.AccessMode.{access-mode}, - * vh.accessModeType(VarHandle.AccessMode.{access-mode})); + * am, + * vh.accessModeType(am)); * - * mh = mh.bindTo(vh); - * R r = (R) mh.invoke(p1, p2, ..., pN) + * R r = (R) mh.invoke(vh, p1, p2, ..., pN) * }- * or, more concisely, behaves as if: - *{@code - * VarHandle vh = .. - * MethodHandle mh = vh.toMethodHandle(VarHandle.AccessMode.{access-mode}); - * - * R r = (R) mh.invoke(p1, p2, ..., pN) - * }- * In terms of equivalent {@code invokevirtual} bytecode behaviour an access - * mode method invocation is equivalent to: + * (modulo access mode methods do not declare throwing of {@code Throwable}). + * This is equivalent to: *{@code * MethodHandle mh = MethodHandles.lookup().findVirtual( * VarHandle.class, - * VarHandle.AccessMode.{access-mode}.methodName(), + * "{access-mode}", * MethodType.methodType(R, p1, p2, ..., pN)); * * R r = (R) mh.invokeExact(vh, p1, p2, ..., pN) @@ -306,6 +298,17 @@ import static java.lang.invoke.MethodHandleStatics.newInternalError; * widen primitive values, as if by {@link MethodHandle#asType asType} (see also * {@link MethodHandles#varHandleInvoker}). * + * More concisely, such behaviour is equivalent to: + *{@code + * VarHandle vh = .. + * VarHandle.AccessMode am = VarHandle.AccessMode.valueFromMethodName("{access-mode}"); + * MethodHandle mh = vh.toMethodHandle(am); + * + * R r = (R) mh.invoke(p1, p2, ..., pN) + * }+ * Where, in this case, the method handle is bound to the VarHandle instance. + * + * *Invocation checking
* In typical programs, VarHandle access mode type matching will usually * succeed. But if a match fails, the JVM will throw a @@ -439,7 +442,7 @@ public abstract class VarHandle { * if the variable was declared non-{@code volatile}. Commonly referred to * as plain read access. * - *The method signature is of the form {@code (CT)T}. + *
The method signature is of the form {@code (CT1 ct1, ..., CTn ctn)T}. * *
The symbolic type descriptor at the call site of {@code get} * must match the access mode type that is the result of calling @@ -449,15 +452,15 @@ public abstract class VarHandle { * throws {@code UnsupportedOperationException}. * * @param args the signature-polymorphic parameter list of the form - * {@code (CT)} + * {@code (CT1 ct1, ..., CTn)} * , statically represented using varargs. * @return the signature-polymorphic result that is the value of the * variable * , statically represented using {@code Object}. - * @throws WrongMethodTypeException if the access mode type is not - * compatible with the caller's symbolic type descriptor. - * @throws ClassCastException if the access mode type is compatible with the - * caller's symbolic type descriptor, but a reference cast fails. + * @throws WrongMethodTypeException if the access mode type does not + * match the caller's symbolic type descriptor. + * @throws ClassCastException if the access mode type matches the caller's + * symbolic type descriptor, but a reference cast fails. */ public final native @MethodHandle.PolymorphicSignature @@ -469,21 +472,21 @@ public abstract class VarHandle { * semantics of setting as if the variable was declared non-{@code volatile} * and non-{@code final}. Commonly referred to as plain write access. * - *
The method signature is of the form {@code (CT, T newValue)void} + *
The method signature is of the form {@code (CT1 ct1, ..., CTn ctn, T newValue)void} * *
The symbolic type descriptor at the call site of {@code set} * must match the access mode type that is the result of calling * {@code accessModeType(VarHandle.AccessMode.SET)} on this VarHandle. * * @param args the signature-polymorphic parameter list of the form - * {@code (CT, T newValue)} + * {@code (CT1 ct1, ..., CTn ctn, T newValue)} * , statically represented using varargs. * @throws UnsupportedOperationException if the access mode is unsupported * for this VarHandle. - * @throws WrongMethodTypeException if the access mode type is not - * compatible with the caller's symbolic type descriptor. - * @throws ClassCastException if the access mode type is compatible with the - * caller's symbolic type descriptor, but a reference cast fails. + * @throws WrongMethodTypeException if the access mode type does not + * match the caller's symbolic type descriptor. + * @throws ClassCastException if the access mode type matches the caller's + * symbolic type descriptor, but a reference cast fails. */ public final native @MethodHandle.PolymorphicSignature @@ -497,7 +500,7 @@ public abstract class VarHandle { * Returns the value of a variable, with memory semantics of reading as if * the variable was declared {@code volatile}. * - *
The method signature is of the form {@code (CT)T}. + *
The method signature is of the form {@code (CT1 ct1, ..., CTn ctn)T}. * *
The symbolic type descriptor at the call site of {@code getVolatile} * must match the access mode type that is the result of calling @@ -505,17 +508,17 @@ public abstract class VarHandle { * VarHandle. * * @param args the signature-polymorphic parameter list of the form - * {@code (CT)} + * {@code (CT1 ct1, ..., CTn ctn)} * , statically represented using varargs. * @return the signature-polymorphic result that is the value of the * variable * , statically represented using {@code Object}. * @throws UnsupportedOperationException if the access mode is unsupported * for this VarHandle. - * @throws WrongMethodTypeException if the access mode type is not - * compatible with the caller's symbolic type descriptor. - * @throws ClassCastException if the access mode type is compatible with the - * caller's symbolic type descriptor, but a reference cast fails. + * @throws WrongMethodTypeException if the access mode type does not + * match the caller's symbolic type descriptor. + * @throws ClassCastException if the access mode type matches the caller's + * symbolic type descriptor, but a reference cast fails. */ public final native @MethodHandle.PolymorphicSignature @@ -526,7 +529,7 @@ public abstract class VarHandle { * Sets the value of a variable to the {@code newValue}, with memory * semantics of setting as if the variable was declared {@code volatile}. * - *
The method signature is of the form {@code (CT, T newValue)void}. + *
The method signature is of the form {@code (CT1 ct1, ..., CTn ctn, T newValue)void}. * *
The symbolic type descriptor at the call site of {@code setVolatile} * must match the access mode type that is the result of calling @@ -538,14 +541,14 @@ public abstract class VarHandle { * memory ordering effects compatible with {@code memory_order_seq_cst}. * * @param args the signature-polymorphic parameter list of the form - * {@code (CT, T newValue)} + * {@code (CT1 ct1, ..., CTn ctn, T newValue)} * , statically represented using varargs. * @throws UnsupportedOperationException if the access mode is unsupported * for this VarHandle. - * @throws WrongMethodTypeException if the access mode type is not - * compatible with the caller's symbolic type descriptor. - * @throws ClassCastException if the access mode type is compatible with the - * caller's symbolic type descriptor, but a reference cast fails. + * @throws WrongMethodTypeException if the access mode type does not + * match the caller's symbolic type descriptor. + * @throws ClassCastException if the access mode type matches the caller's + * symbolic type descriptor, but a reference cast fails. */ public final native @MethodHandle.PolymorphicSignature @@ -557,7 +560,7 @@ public abstract class VarHandle { * Returns the value of a variable, accessed in program order, but with no * assurance of memory ordering effects with respect to other threads. * - *
The method signature is of the form {@code (CT)T}. + *
The method signature is of the form {@code (CT1 ct1, ..., CTn ctn)T}. * *
The symbolic type descriptor at the call site of {@code getOpaque} * must match the access mode type that is the result of calling @@ -565,17 +568,17 @@ public abstract class VarHandle { * VarHandle. * * @param args the signature-polymorphic parameter list of the form - * {@code (CT)} + * {@code (CT1 ct1, ..., CTn ctn)} * , statically represented using varargs. * @return the signature-polymorphic result that is the value of the * variable * , statically represented using {@code Object}. * @throws UnsupportedOperationException if the access mode is unsupported * for this VarHandle. - * @throws WrongMethodTypeException if the access mode type is not - * compatible with the caller's symbolic type descriptor. - * @throws ClassCastException if the access mode type is compatible with the - * caller's symbolic type descriptor, but a reference cast fails. + * @throws WrongMethodTypeException if the access mode type does not + * match the caller's symbolic type descriptor. + * @throws ClassCastException if the access mode type matches the caller's + * symbolic type descriptor, but a reference cast fails. */ public final native @MethodHandle.PolymorphicSignature @@ -587,7 +590,7 @@ public abstract class VarHandle { * but with no assurance of memory ordering effects with respect to other * threads. * - *
The method signature is of the form {@code (CT, T newValue)void}. + *
The method signature is of the form {@code (CT1 ct1, ..., CTn ctn, T newValue)void}. * *
The symbolic type descriptor at the call site of {@code setOpaque} * must match the access mode type that is the result of calling @@ -595,14 +598,14 @@ public abstract class VarHandle { * VarHandle. * * @param args the signature-polymorphic parameter list of the form - * {@code (CT, T newValue)} + * {@code (CT1 ct1, ..., CTn ctn, T newValue)} * , statically represented using varargs. * @throws UnsupportedOperationException if the access mode is unsupported * for this VarHandle. - * @throws WrongMethodTypeException if the access mode type is not - * compatible with the caller's symbolic type descriptor. - * @throws ClassCastException if the access mode type is compatible with the - * caller's symbolic type descriptor, but a reference cast fails. + * @throws WrongMethodTypeException if the access mode type does not + * match the caller's symbolic type descriptor. + * @throws ClassCastException if the access mode type matches the caller's + * symbolic type descriptor, but a reference cast fails. */ public final native @MethodHandle.PolymorphicSignature @@ -616,7 +619,7 @@ public abstract class VarHandle { * Returns the value of a variable, and ensures that subsequent loads and * stores are not reordered before this access. * - *
The method signature is of the form {@code (CT)T}. + *
The method signature is of the form {@code (CT1 ct1, ..., CTn ctn)T}. * *
The symbolic type descriptor at the call site of {@code getAcquire} * must match the access mode type that is the result of calling @@ -629,17 +632,17 @@ public abstract class VarHandle { * ordering. * * @param args the signature-polymorphic parameter list of the form - * {@code (CT)} + * {@code (CT1 ct1, ..., CTn ctn)} * , statically represented using varargs. * @return the signature-polymorphic result that is the value of the * variable * , statically represented using {@code Object}. * @throws UnsupportedOperationException if the access mode is unsupported * for this VarHandle. - * @throws WrongMethodTypeException if the access mode type is not - * compatible with the caller's symbolic type descriptor. - * @throws ClassCastException if the access mode type is compatible with the - * caller's symbolic type descriptor, but a reference cast fails. + * @throws WrongMethodTypeException if the access mode type does not + * match the caller's symbolic type descriptor. + * @throws ClassCastException if the access mode type matches the caller's + * symbolic type descriptor, but a reference cast fails. */ public final native @MethodHandle.PolymorphicSignature @@ -650,7 +653,7 @@ public abstract class VarHandle { * Sets the value of a variable to the {@code newValue}, and ensures that * prior loads and stores are not reordered after this access. * - *
The method signature is of the form {@code (CT, T newValue)void}. + *
The method signature is of the form {@code (CT1 ct1, ..., CTn ctn, T newValue)void}. * *
The symbolic type descriptor at the call site of {@code setRelease} * must match the access mode type that is the result of calling @@ -663,14 +666,14 @@ public abstract class VarHandle { * ordering. * * @param args the signature-polymorphic parameter list of the form - * {@code (CT, T newValue)} + * {@code (CT1 ct1, ..., CTn ctn, T newValue)} * , statically represented using varargs. * @throws UnsupportedOperationException if the access mode is unsupported * for this VarHandle. - * @throws WrongMethodTypeException if the access mode type is not - * compatible with the caller's symbolic type descriptor. - * @throws ClassCastException if the access mode type is compatible with the - * caller's symbolic type descriptor, but a reference cast fails. + * @throws WrongMethodTypeException if the access mode type does not + * match the caller's symbolic type descriptor. + * @throws ClassCastException if the access mode type matches the caller's + * symbolic type descriptor, but a reference cast fails. */ public final native @MethodHandle.PolymorphicSignature @@ -687,7 +690,7 @@ public abstract class VarHandle { * {@code expectedValue}, as accessed with the memory semantics of * {@link #getVolatile}. * - *
The method signature is of the form {@code (CT, T expectedValue, T newValue)boolean}. + *
The method signature is of the form {@code (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)boolean}. * *
The symbolic type descriptor at the call site of {@code * compareAndSet} must match the access mode type that is the result of @@ -695,16 +698,16 @@ public abstract class VarHandle { * this VarHandle. * * @param args the signature-polymorphic parameter list of the form - * {@code (CT, T expectedValue, T newValue)} + * {@code (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)} * , statically represented using varargs. * @return {@code true} if successful, otherwise {@code false} if the * witness value was not the same as the {@code expectedValue}. * @throws UnsupportedOperationException if the access mode is unsupported * for this VarHandle. - * @throws WrongMethodTypeException if the access mode type is not - * compatible with the caller's symbolic type descriptor. - * @throws ClassCastException if the access mode type is compatible with the - * caller's symbolic type descriptor, but a reference cast fails. + * @throws WrongMethodTypeException if the access mode type does not + * match the caller's symbolic type descriptor. + * @throws ClassCastException if the access mode type matches the caller's + * symbolic type descriptor, but a reference cast fails. * @see #setVolatile(Object...) * @see #getVolatile(Object...) */ @@ -720,7 +723,7 @@ public abstract class VarHandle { * {@code expectedValue}, as accessed with the memory semantics of * {@link #getVolatile}. * - *
The method signature is of the form {@code (CT, T expectedValue, T newValue)T}. + *
The method signature is of the form {@code (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)T}. * *
The symbolic type descriptor at the call site of {@code * compareAndExchange} @@ -729,7 +732,7 @@ public abstract class VarHandle { * on this VarHandle. * * @param args the signature-polymorphic parameter list of the form - * {@code (CT, T expectedValue, T newValue)} + * {@code (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)} * , statically represented using varargs. * @return the signature-polymorphic result that is the witness value, which * will be the same as the {@code expectedValue} if successful @@ -755,7 +758,7 @@ public abstract class VarHandle { * {@code expectedValue}, as accessed with the memory semantics of * {@link #getAcquire}. * - *
The method signature is of the form {@code (CT, T expectedValue, T newValue)T}. + *
The method signature is of the form {@code (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)T}. * *
The symbolic type descriptor at the call site of {@code * compareAndExchangeAcquire} @@ -764,17 +767,17 @@ public abstract class VarHandle { * this VarHandle. * * @param args the signature-polymorphic parameter list of the form - * {@code (CT, T expectedValue, T newValue)} + * {@code (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)} * , statically represented using varargs. * @return the signature-polymorphic result that is the witness value, which * will be the same as the {@code expectedValue} if successful * , statically represented using {@code Object}. * @throws UnsupportedOperationException if the access mode is unsupported * for this VarHandle. - * @throws WrongMethodTypeException if the access mode type is not - * compatible with the caller's symbolic type descriptor. - * @throws ClassCastException if the access mode type is compatible with the - * caller's symbolic type descriptor, but a reference cast fails. + * @throws WrongMethodTypeException if the access mode type does not + * match the caller's symbolic type descriptor. + * @throws ClassCastException if the access mode type matches the caller's + * symbolic type descriptor, but a reference cast fails. * @see #set(Object...) * @see #getAcquire(Object...) */ @@ -790,7 +793,7 @@ public abstract class VarHandle { * {@code expectedValue}, as accessed with the memory semantics of * {@link #get}. * - *
The method signature is of the form {@code (CT, T expectedValue, T newValue)T}. + *
The method signature is of the form {@code (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)T}. * *
The symbolic type descriptor at the call site of {@code * compareAndExchangeRelease} @@ -799,17 +802,17 @@ public abstract class VarHandle { * on this VarHandle. * * @param args the signature-polymorphic parameter list of the form - * {@code (CT, T expectedValue, T newValue)} + * {@code (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)} * , statically represented using varargs. * @return the signature-polymorphic result that is the witness value, which * will be the same as the {@code expectedValue} if successful * , statically represented using {@code Object}. * @throws UnsupportedOperationException if the access mode is unsupported * for this VarHandle. - * @throws WrongMethodTypeException if the access mode type is not - * compatible with the caller's symbolic type descriptor. - * @throws ClassCastException if the access mode type is compatible with the - * caller's symbolic type descriptor, but a reference cast fails. + * @throws WrongMethodTypeException if the access mode type does not + * match the caller's symbolic type descriptor. + * @throws ClassCastException if the access mode type matches the caller's + * symbolic type descriptor, but a reference cast fails. * @see #setRelease(Object...) * @see #get(Object...) */ @@ -830,7 +833,7 @@ public abstract class VarHandle { *
This operation may fail spuriously (typically, due to memory * contention) even if the witness value does match the expected value. * - *
The method signature is of the form {@code (CT, T expectedValue, T newValue)boolean}. + *
The method signature is of the form {@code (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)boolean}. * *
The symbolic type descriptor at the call site of {@code * weakCompareAndSetPlain} must match the access mode type that is the result of @@ -838,17 +841,17 @@ public abstract class VarHandle { * on this VarHandle. * * @param args the signature-polymorphic parameter list of the form - * {@code (CT, T expectedValue, T newValue)} + * {@code (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)} * , statically represented using varargs. * @return {@code true} if successful, otherwise {@code false} if the * witness value was not the same as the {@code expectedValue} or if this * operation spuriously failed. * @throws UnsupportedOperationException if the access mode is unsupported * for this VarHandle. - * @throws WrongMethodTypeException if the access mode type is not - * compatible with the caller's symbolic type descriptor. - * @throws ClassCastException if the access mode type is compatible with the - * caller's symbolic type descriptor, but a reference cast fails. + * @throws WrongMethodTypeException if the access mode type does not + * match the caller's symbolic type descriptor. + * @throws ClassCastException if the access mode type matches the caller's + * symbolic type descriptor, but a reference cast fails. * @see #set(Object...) * @see #get(Object...) */ @@ -867,7 +870,7 @@ public abstract class VarHandle { *
This operation may fail spuriously (typically, due to memory * contention) even if the witness value does match the expected value. * - *
The method signature is of the form {@code (CT, T expectedValue, T newValue)boolean}. + *
The method signature is of the form {@code (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)boolean}. * *
The symbolic type descriptor at the call site of {@code * weakCompareAndSet} must match the access mode type that is the @@ -875,17 +878,17 @@ public abstract class VarHandle { * on this VarHandle. * * @param args the signature-polymorphic parameter list of the form - * {@code (CT, T expectedValue, T newValue)} + * {@code (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)} * , statically represented using varargs. * @return {@code true} if successful, otherwise {@code false} if the * witness value was not the same as the {@code expectedValue} or if this * operation spuriously failed. * @throws UnsupportedOperationException if the access mode is unsupported * for this VarHandle. - * @throws WrongMethodTypeException if the access mode type is not - * compatible with the caller's symbolic type descriptor. - * @throws ClassCastException if the access mode type is compatible with the - * caller's symbolic type descriptor, but a reference cast fails. + * @throws WrongMethodTypeException if the access mode type does not + * match the caller's symbolic type descriptor. + * @throws ClassCastException if the access mode type matches the caller's + * symbolic type descriptor, but a reference cast fails. * @see #setVolatile(Object...) * @see #getVolatile(Object...) */ @@ -904,7 +907,7 @@ public abstract class VarHandle { *
This operation may fail spuriously (typically, due to memory * contention) even if the witness value does match the expected value. * - *
The method signature is of the form {@code (CT, T expectedValue, T newValue)boolean}. + *
The method signature is of the form {@code (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)boolean}. * *
The symbolic type descriptor at the call site of {@code * weakCompareAndSetAcquire} @@ -913,17 +916,17 @@ public abstract class VarHandle { * on this VarHandle. * * @param args the signature-polymorphic parameter list of the form - * {@code (CT, T expectedValue, T newValue)} + * {@code (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)} * , statically represented using varargs. * @return {@code true} if successful, otherwise {@code false} if the * witness value was not the same as the {@code expectedValue} or if this * operation spuriously failed. * @throws UnsupportedOperationException if the access mode is unsupported * for this VarHandle. - * @throws WrongMethodTypeException if the access mode type is not - * compatible with the caller's symbolic type descriptor. - * @throws ClassCastException if the access mode type is compatible with the - * caller's symbolic type descriptor, but a reference cast fails. + * @throws WrongMethodTypeException if the access mode type does not + * match the caller's symbolic type descriptor. + * @throws ClassCastException if the access mode type matches the caller's + * symbolic type descriptor, but a reference cast fails. * @see #set(Object...) * @see #getAcquire(Object...) */ @@ -942,7 +945,7 @@ public abstract class VarHandle { *
This operation may fail spuriously (typically, due to memory * contention) even if the witness value does match the expected value. * - *
The method signature is of the form {@code (CT, T expectedValue, T newValue)boolean}. + *
The method signature is of the form {@code (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)boolean}. * *
The symbolic type descriptor at the call site of {@code * weakCompareAndSetRelease} @@ -951,17 +954,17 @@ public abstract class VarHandle { * on this VarHandle. * * @param args the signature-polymorphic parameter list of the form - * {@code (CT, T expectedValue, T newValue)} + * {@code (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)} * , statically represented using varargs. * @return {@code true} if successful, otherwise {@code false} if the * witness value was not the same as the {@code expectedValue} or if this * operation spuriously failed. * @throws UnsupportedOperationException if the access mode is unsupported * for this VarHandle. - * @throws WrongMethodTypeException if the access mode type is not - * compatible with the caller's symbolic type descriptor. - * @throws ClassCastException if the access mode type is compatible with the - * caller's symbolic type descriptor, but a reference cast fails. + * @throws WrongMethodTypeException if the access mode type does not + * match the caller's symbolic type descriptor. + * @throws ClassCastException if the access mode type matches the caller's + * symbolic type descriptor, but a reference cast fails. * @see #setRelease(Object...) * @see #get(Object...) */ @@ -976,7 +979,7 @@ public abstract class VarHandle { * previous value, as accessed with the memory semantics of * {@link #getVolatile}. * - *
The method signature is of the form {@code (CT, T newValue)T}. + *
The method signature is of the form {@code (CT1 ct1, ..., CTn ctn, T newValue)T}. * *
The symbolic type descriptor at the call site of {@code getAndSet} * must match the access mode type that is the result of calling @@ -984,17 +987,17 @@ public abstract class VarHandle { * VarHandle. * * @param args the signature-polymorphic parameter list of the form - * {@code (CT, T newValue)} + * {@code (CT1 ct1, ..., CTn ctn, T newValue)} * , statically represented using varargs. * @return the signature-polymorphic result that is the previous value of * the variable * , statically represented using {@code Object}. * @throws UnsupportedOperationException if the access mode is unsupported * for this VarHandle. - * @throws WrongMethodTypeException if the access mode type is not - * compatible with the caller's symbolic type descriptor. - * @throws ClassCastException if the access mode type is compatible with the - * caller's symbolic type descriptor, but a reference cast fails. + * @throws WrongMethodTypeException if the access mode type does not + * match the caller's symbolic type descriptor. + * @throws ClassCastException if the access mode type matches the caller's + * symbolic type descriptor, but a reference cast fails. * @see #setVolatile(Object...) * @see #getVolatile(Object...) */ @@ -1009,7 +1012,7 @@ public abstract class VarHandle { * previous value, as accessed with the memory semantics of * {@link #getAcquire}. * - *
The method signature is of the form {@code (CT, T newValue)T}. + *
The method signature is of the form {@code (CT1 ct1, ..., CTn ctn, T newValue)T}. * *
The symbolic type descriptor at the call site of {@code getAndSetAcquire} * must match the access mode type that is the result of calling @@ -1017,17 +1020,17 @@ public abstract class VarHandle { * VarHandle. * * @param args the signature-polymorphic parameter list of the form - * {@code (CT, T newValue)} + * {@code (CT1 ct1, ..., CTn ctn, T newValue)} * , statically represented using varargs. * @return the signature-polymorphic result that is the previous value of * the variable * , statically represented using {@code Object}. * @throws UnsupportedOperationException if the access mode is unsupported * for this VarHandle. - * @throws WrongMethodTypeException if the access mode type is not - * compatible with the caller's symbolic type descriptor. - * @throws ClassCastException if the access mode type is compatible with the - * caller's symbolic type descriptor, but a reference cast fails. + * @throws WrongMethodTypeException if the access mode type does not + * match the caller's symbolic type descriptor. + * @throws ClassCastException if the access mode type matches the caller's + * symbolic type descriptor, but a reference cast fails. * @see #setVolatile(Object...) * @see #getVolatile(Object...) */ @@ -1042,7 +1045,7 @@ public abstract class VarHandle { * previous value, as accessed with the memory semantics of * {@link #get}. * - *
The method signature is of the form {@code (CT, T newValue)T}. + *
The method signature is of the form {@code (CT1 ct1, ..., CTn ctn, T newValue)T}. * *
The symbolic type descriptor at the call site of {@code getAndSetRelease} * must match the access mode type that is the result of calling @@ -1050,17 +1053,17 @@ public abstract class VarHandle { * VarHandle. * * @param args the signature-polymorphic parameter list of the form - * {@code (CT, T newValue)} + * {@code (CT1 ct1, ..., CTn ctn, T newValue)} * , statically represented using varargs. * @return the signature-polymorphic result that is the previous value of * the variable * , statically represented using {@code Object}. * @throws UnsupportedOperationException if the access mode is unsupported * for this VarHandle. - * @throws WrongMethodTypeException if the access mode type is not - * compatible with the caller's symbolic type descriptor. - * @throws ClassCastException if the access mode type is compatible with the - * caller's symbolic type descriptor, but a reference cast fails. + * @throws WrongMethodTypeException if the access mode type does not + * match the caller's symbolic type descriptor. + * @throws ClassCastException if the access mode type matches the caller's + * symbolic type descriptor, but a reference cast fails. * @see #setVolatile(Object...) * @see #getVolatile(Object...) */ @@ -1078,7 +1081,7 @@ public abstract class VarHandle { * previous value, as accessed with the memory semantics of * {@link #getVolatile}. * - *
The method signature is of the form {@code (CT, T value)T}. + *
The method signature is of the form {@code (CT1 ct1, ..., CTn ctn, T value)T}. * *
The symbolic type descriptor at the call site of {@code getAndAdd} * must match the access mode type that is the result of calling @@ -1086,17 +1089,17 @@ public abstract class VarHandle { * VarHandle. * * @param args the signature-polymorphic parameter list of the form - * {@code (CT, T value)} + * {@code (CT1 ct1, ..., CTn ctn, T value)} * , statically represented using varargs. * @return the signature-polymorphic result that is the previous value of * the variable * , statically represented using {@code Object}. * @throws UnsupportedOperationException if the access mode is unsupported * for this VarHandle. - * @throws WrongMethodTypeException if the access mode type is not - * compatible with the caller's symbolic type descriptor. - * @throws ClassCastException if the access mode type is compatible with the - * caller's symbolic type descriptor, but a reference cast fails. + * @throws WrongMethodTypeException if the access mode type does not + * match the caller's symbolic type descriptor. + * @throws ClassCastException if the access mode type matches the caller's + * symbolic type descriptor, but a reference cast fails. * @see #setVolatile(Object...) * @see #getVolatile(Object...) */ @@ -1111,7 +1114,7 @@ public abstract class VarHandle { * previous value, as accessed with the memory semantics of * {@link #getAcquire}. * - *
The method signature is of the form {@code (CT, T value)T}. + *
The method signature is of the form {@code (CT1 ct1, ..., CTn ctn, T value)T}. * *
The symbolic type descriptor at the call site of {@code getAndAddAcquire} * must match the access mode type that is the result of calling @@ -1119,17 +1122,17 @@ public abstract class VarHandle { * VarHandle. * * @param args the signature-polymorphic parameter list of the form - * {@code (CT, T value)} + * {@code (CT1 ct1, ..., CTn ctn, T value)} * , statically represented using varargs. * @return the signature-polymorphic result that is the previous value of * the variable * , statically represented using {@code Object}. * @throws UnsupportedOperationException if the access mode is unsupported * for this VarHandle. - * @throws WrongMethodTypeException if the access mode type is not - * compatible with the caller's symbolic type descriptor. - * @throws ClassCastException if the access mode type is compatible with the - * caller's symbolic type descriptor, but a reference cast fails. + * @throws WrongMethodTypeException if the access mode type does not + * match the caller's symbolic type descriptor. + * @throws ClassCastException if the access mode type matches the caller's + * symbolic type descriptor, but a reference cast fails. * @see #setVolatile(Object...) * @see #getVolatile(Object...) */ @@ -1144,7 +1147,7 @@ public abstract class VarHandle { * previous value, as accessed with the memory semantics of * {@link #get}. * - *
The method signature is of the form {@code (CT, T value)T}. + *
The method signature is of the form {@code (CT1 ct1, ..., CTn ctn, T value)T}. * *
The symbolic type descriptor at the call site of {@code getAndAddRelease} * must match the access mode type that is the result of calling @@ -1152,17 +1155,17 @@ public abstract class VarHandle { * VarHandle. * * @param args the signature-polymorphic parameter list of the form - * {@code (CT, T value)} + * {@code (CT1 ct1, ..., CTn ctn, T value)} * , statically represented using varargs. * @return the signature-polymorphic result that is the previous value of * the variable * , statically represented using {@code Object}. * @throws UnsupportedOperationException if the access mode is unsupported * for this VarHandle. - * @throws WrongMethodTypeException if the access mode type is not - * compatible with the caller's symbolic type descriptor. - * @throws ClassCastException if the access mode type is compatible with the - * caller's symbolic type descriptor, but a reference cast fails. + * @throws WrongMethodTypeException if the access mode type does not + * match the caller's symbolic type descriptor. + * @throws ClassCastException if the access mode type matches the caller's + * symbolic type descriptor, but a reference cast fails. * @see #setVolatile(Object...) * @see #getVolatile(Object...) */ @@ -1185,7 +1188,7 @@ public abstract class VarHandle { *
If the variable type is the non-integral {@code boolean} type then a * logical OR is performed instead of a bitwise OR. * - *
The method signature is of the form {@code (CT, T mask)T}. + *
The method signature is of the form {@code (CT1 ct1, ..., CTn ctn, T mask)T}. * *
The symbolic type descriptor at the call site of {@code getAndBitwiseOr} * must match the access mode type that is the result of calling @@ -1193,17 +1196,17 @@ public abstract class VarHandle { * VarHandle. * * @param args the signature-polymorphic parameter list of the form - * {@code (CT, T mask)} + * {@code (CT1 ct1, ..., CTn ctn, T mask)} * , statically represented using varargs. * @return the signature-polymorphic result that is the previous value of * the variable * , statically represented using {@code Object}. * @throws UnsupportedOperationException if the access mode is unsupported * for this VarHandle. - * @throws WrongMethodTypeException if the access mode type is not - * compatible with the caller's symbolic type descriptor. - * @throws ClassCastException if the access mode type is compatible with the - * caller's symbolic type descriptor, but a reference cast fails. + * @throws WrongMethodTypeException if the access mode type does not + * match the caller's symbolic type descriptor. + * @throws ClassCastException if the access mode type matches the caller's + * symbolic type descriptor, but a reference cast fails. * @see #setVolatile(Object...) * @see #getVolatile(Object...) */ @@ -1222,7 +1225,7 @@ public abstract class VarHandle { *
If the variable type is the non-integral {@code boolean} type then a * logical OR is performed instead of a bitwise OR. * - *
The method signature is of the form {@code (CT, T mask)T}. + *
The method signature is of the form {@code (CT1 ct1, ..., CTn ctn, T mask)T}. * *
The symbolic type descriptor at the call site of {@code getAndBitwiseOrAcquire} * must match the access mode type that is the result of calling @@ -1230,17 +1233,17 @@ public abstract class VarHandle { * VarHandle. * * @param args the signature-polymorphic parameter list of the form - * {@code (CT, T mask)} + * {@code (CT1 ct1, ..., CTn ctn, T mask)} * , statically represented using varargs. * @return the signature-polymorphic result that is the previous value of * the variable * , statically represented using {@code Object}. * @throws UnsupportedOperationException if the access mode is unsupported * for this VarHandle. - * @throws WrongMethodTypeException if the access mode type is not - * compatible with the caller's symbolic type descriptor. - * @throws ClassCastException if the access mode type is compatible with the - * caller's symbolic type descriptor, but a reference cast fails. + * @throws WrongMethodTypeException if the access mode type does not + * match the caller's symbolic type descriptor. + * @throws ClassCastException if the access mode type matches the caller's + * symbolic type descriptor, but a reference cast fails. * @see #set(Object...) * @see #getAcquire(Object...) */ @@ -1259,7 +1262,7 @@ public abstract class VarHandle { *
If the variable type is the non-integral {@code boolean} type then a * logical OR is performed instead of a bitwise OR. * - *
The method signature is of the form {@code (CT, T mask)T}. + *
The method signature is of the form {@code (CT1 ct1, ..., CTn ctn, T mask)T}. * *
The symbolic type descriptor at the call site of {@code getAndBitwiseOrRelease} * must match the access mode type that is the result of calling @@ -1267,17 +1270,17 @@ public abstract class VarHandle { * VarHandle. * * @param args the signature-polymorphic parameter list of the form - * {@code (CT, T mask)} + * {@code (CT1 ct1, ..., CTn ctn, T mask)} * , statically represented using varargs. * @return the signature-polymorphic result that is the previous value of * the variable * , statically represented using {@code Object}. * @throws UnsupportedOperationException if the access mode is unsupported * for this VarHandle. - * @throws WrongMethodTypeException if the access mode type is not - * compatible with the caller's symbolic type descriptor. - * @throws ClassCastException if the access mode type is compatible with the - * caller's symbolic type descriptor, but a reference cast fails. + * @throws WrongMethodTypeException if the access mode type does not + * match the caller's symbolic type descriptor. + * @throws ClassCastException if the access mode type matches the caller's + * symbolic type descriptor, but a reference cast fails. * @see #setRelease(Object...) * @see #get(Object...) */ @@ -1296,7 +1299,7 @@ public abstract class VarHandle { *
If the variable type is the non-integral {@code boolean} type then a * logical AND is performed instead of a bitwise AND. * - *
The method signature is of the form {@code (CT, T mask)T}. + *
The method signature is of the form {@code (CT1 ct1, ..., CTn ctn, T mask)T}. * *
The symbolic type descriptor at the call site of {@code getAndBitwiseAnd} * must match the access mode type that is the result of calling @@ -1304,17 +1307,17 @@ public abstract class VarHandle { * VarHandle. * * @param args the signature-polymorphic parameter list of the form - * {@code (CT, T mask)} + * {@code (CT1 ct1, ..., CTn ctn, T mask)} * , statically represented using varargs. * @return the signature-polymorphic result that is the previous value of * the variable * , statically represented using {@code Object}. * @throws UnsupportedOperationException if the access mode is unsupported * for this VarHandle. - * @throws WrongMethodTypeException if the access mode type is not - * compatible with the caller's symbolic type descriptor. - * @throws ClassCastException if the access mode type is compatible with the - * caller's symbolic type descriptor, but a reference cast fails. + * @throws WrongMethodTypeException if the access mode type does not + * match the caller's symbolic type descriptor. + * @throws ClassCastException if the access mode type matches the caller's + * symbolic type descriptor, but a reference cast fails. * @see #setVolatile(Object...) * @see #getVolatile(Object...) */ @@ -1333,7 +1336,7 @@ public abstract class VarHandle { *
If the variable type is the non-integral {@code boolean} type then a * logical AND is performed instead of a bitwise AND. * - *
The method signature is of the form {@code (CT, T mask)T}. + *
The method signature is of the form {@code (CT1 ct1, ..., CTn ctn, T mask)T}. * *
The symbolic type descriptor at the call site of {@code getAndBitwiseAndAcquire} * must match the access mode type that is the result of calling @@ -1341,17 +1344,17 @@ public abstract class VarHandle { * VarHandle. * * @param args the signature-polymorphic parameter list of the form - * {@code (CT, T mask)} + * {@code (CT1 ct1, ..., CTn ctn, T mask)} * , statically represented using varargs. * @return the signature-polymorphic result that is the previous value of * the variable * , statically represented using {@code Object}. * @throws UnsupportedOperationException if the access mode is unsupported * for this VarHandle. - * @throws WrongMethodTypeException if the access mode type is not - * compatible with the caller's symbolic type descriptor. - * @throws ClassCastException if the access mode type is compatible with the - * caller's symbolic type descriptor, but a reference cast fails. + * @throws WrongMethodTypeException if the access mode type does not + * match the caller's symbolic type descriptor. + * @throws ClassCastException if the access mode type matches the caller's + * symbolic type descriptor, but a reference cast fails. * @see #set(Object...) * @see #getAcquire(Object...) */ @@ -1370,7 +1373,7 @@ public abstract class VarHandle { *
If the variable type is the non-integral {@code boolean} type then a * logical AND is performed instead of a bitwise AND. * - *
The method signature is of the form {@code (CT, T mask)T}. + *
The method signature is of the form {@code (CT1 ct1, ..., CTn ctn, T mask)T}. * *
The symbolic type descriptor at the call site of {@code getAndBitwiseAndRelease} * must match the access mode type that is the result of calling @@ -1378,17 +1381,17 @@ public abstract class VarHandle { * VarHandle. * * @param args the signature-polymorphic parameter list of the form - * {@code (CT, T mask)} + * {@code (CT1 ct1, ..., CTn ctn, T mask)} * , statically represented using varargs. * @return the signature-polymorphic result that is the previous value of * the variable * , statically represented using {@code Object}. * @throws UnsupportedOperationException if the access mode is unsupported * for this VarHandle. - * @throws WrongMethodTypeException if the access mode type is not - * compatible with the caller's symbolic type descriptor. - * @throws ClassCastException if the access mode type is compatible with the - * caller's symbolic type descriptor, but a reference cast fails. + * @throws WrongMethodTypeException if the access mode type does not + * match the caller's symbolic type descriptor. + * @throws ClassCastException if the access mode type matches the caller's + * symbolic type descriptor, but a reference cast fails. * @see #setRelease(Object...) * @see #get(Object...) */ @@ -1407,7 +1410,7 @@ public abstract class VarHandle { *
If the variable type is the non-integral {@code boolean} type then a * logical XOR is performed instead of a bitwise XOR. * - *
The method signature is of the form {@code (CT, T mask)T}. + *
The method signature is of the form {@code (CT1 ct1, ..., CTn ctn, T mask)T}. * *
The symbolic type descriptor at the call site of {@code getAndBitwiseXor} * must match the access mode type that is the result of calling @@ -1415,17 +1418,17 @@ public abstract class VarHandle { * VarHandle. * * @param args the signature-polymorphic parameter list of the form - * {@code (CT, T mask)} + * {@code (CT1 ct1, ..., CTn ctn, T mask)} * , statically represented using varargs. * @return the signature-polymorphic result that is the previous value of * the variable * , statically represented using {@code Object}. * @throws UnsupportedOperationException if the access mode is unsupported * for this VarHandle. - * @throws WrongMethodTypeException if the access mode type is not - * compatible with the caller's symbolic type descriptor. - * @throws ClassCastException if the access mode type is compatible with the - * caller's symbolic type descriptor, but a reference cast fails. + * @throws WrongMethodTypeException if the access mode type does not + * match the caller's symbolic type descriptor. + * @throws ClassCastException if the access mode type matches the caller's + * symbolic type descriptor, but a reference cast fails. * @see #setVolatile(Object...) * @see #getVolatile(Object...) */ @@ -1444,7 +1447,7 @@ public abstract class VarHandle { *
If the variable type is the non-integral {@code boolean} type then a * logical XOR is performed instead of a bitwise XOR. * - *
The method signature is of the form {@code (CT, T mask)T}. + *
The method signature is of the form {@code (CT1 ct1, ..., CTn ctn, T mask)T}. * *
The symbolic type descriptor at the call site of {@code getAndBitwiseXorAcquire} * must match the access mode type that is the result of calling @@ -1452,17 +1455,17 @@ public abstract class VarHandle { * VarHandle. * * @param args the signature-polymorphic parameter list of the form - * {@code (CT, T mask)} + * {@code (CT1 ct1, ..., CTn ctn, T mask)} * , statically represented using varargs. * @return the signature-polymorphic result that is the previous value of * the variable * , statically represented using {@code Object}. * @throws UnsupportedOperationException if the access mode is unsupported * for this VarHandle. - * @throws WrongMethodTypeException if the access mode type is not - * compatible with the caller's symbolic type descriptor. - * @throws ClassCastException if the access mode type is compatible with the - * caller's symbolic type descriptor, but a reference cast fails. + * @throws WrongMethodTypeException if the access mode type does not + * match the caller's symbolic type descriptor. + * @throws ClassCastException if the access mode type matches the caller's + * symbolic type descriptor, but a reference cast fails. * @see #set(Object...) * @see #getAcquire(Object...) */ @@ -1481,7 +1484,7 @@ public abstract class VarHandle { *
If the variable type is the non-integral {@code boolean} type then a * logical XOR is performed instead of a bitwise XOR. * - *
The method signature is of the form {@code (CT, T mask)T}. + *
The method signature is of the form {@code (CT1 ct1, ..., CTn ctn, T mask)T}. * *
The symbolic type descriptor at the call site of {@code getAndBitwiseXorRelease} * must match the access mode type that is the result of calling @@ -1489,17 +1492,17 @@ public abstract class VarHandle { * VarHandle. * * @param args the signature-polymorphic parameter list of the form - * {@code (CT, T mask)} + * {@code (CT1 ct1, ..., CTn ctn, T mask)} * , statically represented using varargs. * @return the signature-polymorphic result that is the previous value of * the variable * , statically represented using {@code Object}. * @throws UnsupportedOperationException if the access mode is unsupported * for this VarHandle. - * @throws WrongMethodTypeException if the access mode type is not - * compatible with the caller's symbolic type descriptor. - * @throws ClassCastException if the access mode type is compatible with the - * caller's symbolic type descriptor, but a reference cast fails. + * @throws WrongMethodTypeException if the access mode type does not + * match the caller's symbolic type descriptor. + * @throws ClassCastException if the access mode type matches the caller's + * symbolic type descriptor, but a reference cast fails. * @see #setRelease(Object...) * @see #get(Object...) */ @@ -1790,7 +1793,7 @@ public abstract class VarHandle { /** * Returns the {@code VarHandle} signature-polymorphic method name - * associated with this {@code AccessMode} value + * associated with this {@code AccessMode} value. * * @return the signature-polymorphic method name * @see #valueFromMethodName @@ -1861,14 +1864,13 @@ public abstract class VarHandle { } /** - * Obtains the canonical access mode type for this VarHandle and a given - * access mode. + * Obtains the access mode type for this VarHandle and a given access mode. * *
The access mode type's parameter types will consist of a prefix that * is the coordinate types of this VarHandle followed by further - * types as defined by the access mode's method. + * types as defined by the access mode method. * The access mode type's return type is defined by the return type of the - * access mode's method. + * access mode method. * * @param accessMode the access mode, corresponding to the * signature-polymorphic method of the same name @@ -1891,7 +1893,7 @@ public abstract class VarHandle { * *
The return of a {@code false} value for a given access mode indicates * that an {@code UnsupportedOperationException} is thrown on invocation - * of the corresponding access mode's signature-polymorphic method. + * of the corresponding access mode method. * * @param accessMode the access mode, corresponding to the * signature-polymorphic method of the same name @@ -1908,7 +1910,7 @@ public abstract class VarHandle { * * @apiNote This method, for a VarHandle {@code vh} and access mode * {@code {access-mode}}, returns a method handle that is equivalent to - * method handle {@code bhm} in the following code (though it may be more + * method handle {@code bmh} in the following code (though it may be more * efficient): *
{@code * MethodHandle mh = MethodHandles.varHandleExactInvoker( From 1e4314a63825346b18c0c9a6540d585176bbf812 Mon Sep 17 00:00:00 2001 From: Doug SimonDate: Fri, 28 Apr 2017 12:22:53 -0700 Subject: [PATCH 12/49] 8179434: test/java/lang/Class/getDeclaredField/FieldSetAccessibleTest.java fails due to JDK-8177845 Reviewed-by: mchung --- .../lang/Class/getDeclaredField/FieldSetAccessibleTest.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/jdk/test/java/lang/Class/getDeclaredField/FieldSetAccessibleTest.java b/jdk/test/java/lang/Class/getDeclaredField/FieldSetAccessibleTest.java index 6f8c336cf5f..d39dc6c9cac 100644 --- a/jdk/test/java/lang/Class/getDeclaredField/FieldSetAccessibleTest.java +++ b/jdk/test/java/lang/Class/getDeclaredField/FieldSetAccessibleTest.java @@ -286,7 +286,11 @@ public class FieldSetAccessibleTest { * Filter deployment modules */ static Set systemModules() { - Set mods = Set.of("javafx.deploy", "jdk.deploy", "jdk.plugin", "jdk.javaws"); + Set mods = Set.of("javafx.deploy", "jdk.deploy", "jdk.plugin", "jdk.javaws", + // All JVMCI packages other than jdk.vm.ci.services are dynamically + // exported to jdk.internal.vm.compiler and jdk.aot + "jdk.internal.vm.compiler", "jdk.aot" + ); return ModuleFinder.ofSystem().findAll().stream() .map(mref -> mref.descriptor().name()) .filter(mn -> !mods.contains(mn)) From 9fe1a3b3e05036a8d018c5116324b7390c9a8450 Mon Sep 17 00:00:00 2001 From: Semyon Sadetsky Date: Mon, 1 May 2017 10:24:07 -0700 Subject: [PATCH 13/49] 8160530: [TEST-BUG] Consistent failure of java/awt/dnd/MissingEventsOnModalDialog/MissingEventsOnModalDialogTest.java Reviewed-by: yan, prr, serb --- .../MissingEventsOnModalDialogTest.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/jdk/test/java/awt/dnd/MissingEventsOnModalDialog/MissingEventsOnModalDialogTest.java b/jdk/test/java/awt/dnd/MissingEventsOnModalDialog/MissingEventsOnModalDialogTest.java index 997cac38011..a9ea6ecedf1 100644 --- a/jdk/test/java/awt/dnd/MissingEventsOnModalDialog/MissingEventsOnModalDialogTest.java +++ b/jdk/test/java/awt/dnd/MissingEventsOnModalDialog/MissingEventsOnModalDialogTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 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 @@ -76,7 +76,7 @@ public class MissingEventsOnModalDialogTest { mouseDragAndDrop(robot, point, getCenterPoint(targetFrame)); - long time = System.currentTimeMillis() + 200; + long time = System.currentTimeMillis() + 1000; while (!passed) { if (time < System.currentTimeMillis()) { @@ -222,10 +222,12 @@ public class MissingEventsOnModalDialogTest { } Thread.sleep(10); } - - Point point = getCenterPoint(dialog); Robot robot = new Robot(); robot.setAutoDelay(50); + robot.waitForIdle(); + robot.delay(200); + + Point point = getCenterPoint(dialog); robot.mouseMove(point.x, point.y); robot.mousePress(InputEvent.BUTTON1_MASK); From ea8aed80d340b1bb4c1502bf3e5e67e5dc2ed627 Mon Sep 17 00:00:00 2001 From: Mark Sheppard Date: Tue, 2 May 2017 15:50:46 +0100 Subject: [PATCH 14/49] 8179512: Typo in HttpURLConnection documentation Reviewed-by: chegar --- jdk/src/java.base/share/classes/java/net/HttpURLConnection.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jdk/src/java.base/share/classes/java/net/HttpURLConnection.java b/jdk/src/java.base/share/classes/java/net/HttpURLConnection.java index 9e428e59584..448034e6225 100644 --- a/jdk/src/java.base/share/classes/java/net/HttpURLConnection.java +++ b/jdk/src/java.base/share/classes/java/net/HttpURLConnection.java @@ -54,7 +54,7 @@ import java.util.Date; * Security permissions * * If a security manager is installed, and if a method is called which results in an - * attempt to open a connection, the caller must possess either:- + * attempt to open a connection, the caller must possess either: *
- a "connect" {@link SocketPermission} to the host/port combination of the * destination URL or
*- a {@link URLPermission} that permits this request.
From 0eb6c339c348b9ab90d18719b2c6bab219800a85 Mon Sep 17 00:00:00 2001 From: Bradford WetmoreDate: Tue, 2 May 2017 10:34:22 -0700 Subject: [PATCH 15/49] 8178014: CryptoPolicyParser's API comment contains < and > characters Reviewed-by: ksrini, mullan --- .../classes/javax/crypto/CipherInputStream.java | 4 ++-- .../classes/javax/crypto/CryptoPermission.java | 14 +++++++------- .../classes/javax/crypto/CryptoPolicyParser.java | 10 +++++----- .../javax/xml/crypto/dsig/XMLSignContext.java | 4 ++-- .../javax/xml/crypto/dsig/XMLValidateContext.java | 4 ++-- 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/jdk/src/java.base/share/classes/javax/crypto/CipherInputStream.java b/jdk/src/java.base/share/classes/javax/crypto/CipherInputStream.java index 9c8bc81393a..54ad9611e2d 100644 --- a/jdk/src/java.base/share/classes/javax/crypto/CipherInputStream.java +++ b/jdk/src/java.base/share/classes/javax/crypto/CipherInputStream.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 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 @@ -93,7 +93,7 @@ public class CipherInputStream extends FilterInputStream { // stream status private boolean closed = false; - /** + /* * private convenience function. * * Entry condition: ostart = ofinish diff --git a/jdk/src/java.base/share/classes/javax/crypto/CryptoPermission.java b/jdk/src/java.base/share/classes/javax/crypto/CryptoPermission.java index 749e31926fe..ddc2648b693 100644 --- a/jdk/src/java.base/share/classes/javax/crypto/CryptoPermission.java +++ b/jdk/src/java.base/share/classes/javax/crypto/CryptoPermission.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 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 @@ -196,19 +196,19 @@ class CryptoPermission extends java.security.Permission { * Checks if the specified permission is "implied" by * this object. * - * More specifically, this method returns true if:
+ * More specifically, this method returns true if: *
- *
* * @param p the permission to check against. diff --git a/jdk/src/java.base/share/classes/javax/crypto/CryptoPolicyParser.java b/jdk/src/java.base/share/classes/javax/crypto/CryptoPolicyParser.java index 7f27ea2506a..0093ce65b6d 100644 --- a/jdk/src/java.base/share/classes/javax/crypto/CryptoPolicyParser.java +++ b/jdk/src/java.base/share/classes/javax/crypto/CryptoPolicyParser.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 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 @@ -46,10 +46,12 @@ import java.lang.reflect.*; * * The format of a permission entry in the jurisdiction policy file is: * + *- p is an instance of CryptoPermission, and
+ *
- p is an instance of CryptoPermission, and
*- p's algorithm name equals or (in the case of wildcards) - * is implied by this permission's algorithm name, and
*+ * is implied by this permission's algorithm name, and
- p's maximum allowable key size is less or - * equal to this permission's maximum allowable key size, and
*+ * equal to this permission's maximum allowable key size, and
- p's algorithm parameter spec equals or is - * implied by this permission's algorithm parameter spec, and
*+ * implied by this permission's algorithm parameter spec, and
- p's exemptionMechanism equals or * is implied by this permission's * exemptionMechanism (a
*nullexemption mechanism - * implies any other exemption mechanism). + * implies any other exemption mechanism).{@code * permission* * @author Sharon Liu * @@ -526,8 +528,7 @@ final class CryptoPolicyParser { /** * Each grant entry in the policy configuration file is represented by a - * GrantEntry object.[, * [[, ][, * [, , ]]]]; + * } - * + * GrantEntry object. *
* For example, the entry *
@@ -587,8 +588,7 @@ final class CryptoPolicyParser { /** * Each crypto permission entry in the policy configuration file is - * represented by a CryptoPermissionEntry object.- * + * represented by a CryptoPermissionEntry object. *
* For example, the entry *
diff --git a/jdk/src/java.xml.crypto/share/classes/javax/xml/crypto/dsig/XMLSignContext.java b/jdk/src/java.xml.crypto/share/classes/javax/xml/crypto/dsig/XMLSignContext.java index d495de69b98..91c2f9e744c 100644 --- a/jdk/src/java.xml.crypto/share/classes/javax/xml/crypto/dsig/XMLSignContext.java +++ b/jdk/src/java.xml.crypto/share/classes/javax/xml/crypto/dsig/XMLSignContext.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -41,7 +41,7 @@ import javax.xml.crypto.XMLCryptoContext; * (for example, you should not use the sameXMLSignContext* instance to sign two different {@link XMLSignature} objects). *- * Supported Properties + * Supported Properties *
The following properties can be set using the * {@link #setProperty setProperty} method. *
diff --git a/jdk/src/java.xml.crypto/share/classes/javax/xml/crypto/dsig/XMLValidateContext.java b/jdk/src/java.xml.crypto/share/classes/javax/xml/crypto/dsig/XMLValidateContext.java index 4c3da6615c8..d8fbfd072ce 100644 --- a/jdk/src/java.xml.crypto/share/classes/javax/xml/crypto/dsig/XMLValidateContext.java +++ b/jdk/src/java.xml.crypto/share/classes/javax/xml/crypto/dsig/XMLValidateContext.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -40,7 +40,7 @@ import javax.xml.crypto.XMLCryptoContext; * (for example, you should not use the same
XMLValidateContext* instance to validate two different {@link XMLSignature} objects). *- * Supported Properties + * Supported Properties *
The following properties can be set by an application using the * {@link #setProperty setProperty} method. *
From cc6031a373e4143877516e0172762d3822a82c74 Mon Sep 17 00:00:00 2001 From: Semyon Sadetsky
Date: Tue, 2 May 2017 12:10:55 -0700 Subject: [PATCH 16/49] 8159902: OGL surfaces are not HiDPI compatible on Linux/Solaris Reviewed-by: prr, serb --- .../sun/java2d/opengl/GLXSurfaceData.java | 36 ++++++++++++++++--- .../JInternalFrame/8069348/bug8069348.java | 4 +-- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/jdk/src/java.desktop/unix/classes/sun/java2d/opengl/GLXSurfaceData.java b/jdk/src/java.desktop/unix/classes/sun/java2d/opengl/GLXSurfaceData.java index fc7f3d90351..bfe9a26426e 100644 --- a/jdk/src/java.desktop/unix/classes/sun/java2d/opengl/GLXSurfaceData.java +++ b/jdk/src/java.desktop/unix/classes/sun/java2d/opengl/GLXSurfaceData.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -112,11 +112,13 @@ public abstract class GLXSurfaceData extends OGLSurfaceData { } public static class GLXWindowSurfaceData extends GLXSurfaceData { + protected final int scale; public GLXWindowSurfaceData(X11ComponentPeer peer, GLXGraphicsConfig gc) { super(peer, gc, peer.getColorModel(), WINDOW); + scale = gc.getScale(); } public SurfaceData getReplacement() { @@ -126,6 +128,8 @@ public abstract class GLXSurfaceData extends OGLSurfaceData { public Rectangle getBounds() { Rectangle r = peer.getBounds(); r.x = r.y = 0; + r.width = (int) Math.ceil(r.width * scale); + r.height = (int) Math.ceil(r.height * scale); return r; } @@ -135,6 +139,16 @@ public abstract class GLXSurfaceData extends OGLSurfaceData { public Object getDestination() { return peer.getTarget(); } + + @Override + public double getDefaultScaleX() { + return scale; + } + + @Override + public double getDefaultScaleY() { + return scale; + } } /** @@ -177,6 +191,7 @@ public abstract class GLXSurfaceData extends OGLSurfaceData { private Image offscreenImage; private int width, height; + private final int scale; public GLXOffScreenSurfaceData(X11ComponentPeer peer, GLXGraphicsConfig gc, @@ -186,11 +201,12 @@ public abstract class GLXSurfaceData extends OGLSurfaceData { { super(peer, gc, cm, type); - this.width = width; - this.height = height; + scale = gc.getDevice().getScaleFactor(); + this.width = width * scale; + this.height = height * scale; offscreenImage = image; - initSurface(width, height); + initSurface(this.width, this.height); } public SurfaceData getReplacement() { @@ -201,6 +217,8 @@ public abstract class GLXSurfaceData extends OGLSurfaceData { if (type == FLIP_BACKBUFFER) { Rectangle r = peer.getBounds(); r.x = r.y = 0; + r.width = (int) Math.ceil(r.width * scale); + r.height = (int) Math.ceil(r.height * scale); return r; } else { return new Rectangle(width, height); @@ -213,5 +231,15 @@ public abstract class GLXSurfaceData extends OGLSurfaceData { public Object getDestination() { return offscreenImage; } + + @Override + public double getDefaultScaleX() { + return scale; + } + + @Override + public double getDefaultScaleY() { + return scale; + } } } diff --git a/jdk/test/javax/swing/JInternalFrame/8069348/bug8069348.java b/jdk/test/javax/swing/JInternalFrame/8069348/bug8069348.java index 62d49234722..1fd61fbfd16 100644 --- a/jdk/test/javax/swing/JInternalFrame/8069348/bug8069348.java +++ b/jdk/test/javax/swing/JInternalFrame/8069348/bug8069348.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 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 @@ -37,7 +37,7 @@ import static sun.awt.OSInfo.*; /** * @test * @key headful - * @bug 8069348 + * @bug 8069348 8159902 * @summary SunGraphics2D.copyArea() does not properly work for scaled graphics * @author Alexandr Scherbatiy * @modules java.desktop/sun.awt From 1f241ad95793c18c4dd37f58d14a9848a3733e55 Mon Sep 17 00:00:00 2001 From: Semyon Sadetsky Date: Tue, 2 May 2017 13:26:29 -0700 Subject: [PATCH 17/49] 8178984: Unnecessary angle brackets in the Line2D::intersectsLine() javadoc Reviewed-by: prr, jdv --- jdk/src/java.desktop/share/classes/java/awt/geom/Line2D.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jdk/src/java.desktop/share/classes/java/awt/geom/Line2D.java b/jdk/src/java.desktop/share/classes/java/awt/geom/Line2D.java index b877519f92e..98f70b7eb8a 100644 --- a/jdk/src/java.desktop/share/classes/java/awt/geom/Line2D.java +++ b/jdk/src/java.desktop/share/classes/java/awt/geom/Line2D.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 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 @@ -618,7 +618,7 @@ public abstract class Line2D implements Shape, Cloneable { * specified line segment * @param y2 the Y coordinate of the end point of the * specified line segment - * @return {@code } if this line segment and the specified line segment + * @return {@code true} if this line segment and the specified line segment * intersect each other; {@code false} otherwise. * @since 1.2 */ From 48c6f05cf3e9eb70aabb4cb651d5a043e253ce85 Mon Sep 17 00:00:00 2001 From: Magnus Ihse Bursie Date: Wed, 3 May 2017 08:46:45 +0200 Subject: [PATCH 18/49] 8179453: Add a proper SetupProcessMarkdown Reviewed-by: erikj --- .../specs/resources/jdk-default.css | 129 ++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 jdk/make/data/docs-resources/specs/resources/jdk-default.css diff --git a/jdk/make/data/docs-resources/specs/resources/jdk-default.css b/jdk/make/data/docs-resources/specs/resources/jdk-default.css new file mode 100644 index 00000000000..eea78ea539d --- /dev/null +++ b/jdk/make/data/docs-resources/specs/resources/jdk-default.css @@ -0,0 +1,129 @@ +/* + * 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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. + */ + +body { + margin: 2em 2em; + font-family: DejaVu Sans, Bitstream Vera Sans, Luxi Sans, Verdana, Arial, Helvetica; + font-size: 10pt; + line-height: 1.4; +} + +pre, code, tt { + font-family: DejaVu Sans Mono, Bitstream Vera Sans Mono, Luxi Mono, + Courier New, monospace; +} + +blockquote { + margin: 1.5ex 0em 1.5ex 2em; +} + +p { + padding: 0pt; + margin: 1ex 0em; +} + +p:first-child, pre:first-child { margin-top: 0pt; } + +h1 { + font-weight: bold; + padding: 0pt; + margin: 2ex .5ex 1ex 0pt; +} + +h1:first-child, h2:first-child { + margin-top: 0ex; +} + +h2 { + font-weight: bold; + padding: 0pt; + margin: 2ex 0pt 1ex 0pt; +} + +h3 { + font-weight: bold; + padding: 0pt; + margin: 1.5ex 0pt 1ex 0pt; +} + +h4 { + font-weight: bold; + padding: 0pt; + margin: 1.5ex 0pt 1ex 0pt; +} + +a:link { + color: #437291; +} + +a:visited { + color: #666666; +} + +a[href]:hover { + color: #e76f00; +} + +a img { + border-width: 0px; +} + +img { + background: white; +} + +table { + border-collapse: collapse; + margin-left: 15px; + margin-right: 15px; +} + +th, td { + padding: 3px; + vertical-align: top; +} + +table, th, td { + border: 1px solid black; +} + +caption { + text-align: left; + font-style: italic; + text-indent: 15px; + margin-bottom:10px; +} + +tr:nth-child(even) { + background: #DDD; +} + +tr:nth-child(odd) { + background: #FFF; +} + +th { + background: #DDF; +} From bf1507936deb724806ea7f76964e847b0d36cf96 Mon Sep 17 00:00:00 2001 From: Kumar Srinivasan Date: Wed, 3 May 2017 07:39:45 -0700 Subject: [PATCH 19/49] 8179538: Update jdk.jdi to be HTML-5 friendly Reviewed-by: mchung, sspitsyn --- .../share/classes/com/sun/jdi/ClassType.java | 8 +--- .../classes/com/sun/jdi/InterfaceType.java | 5 +-- .../classes/com/sun/jdi/JDIPermission.java | 7 +-- .../share/classes/com/sun/jdi/Location.java | 4 +- .../classes/com/sun/jdi/ObjectReference.java | 5 +-- .../share/classes/com/sun/jdi/Type.java | 25 ++++++----- .../share/classes/com/sun/jdi/Value.java | 45 ++++++++++--------- .../com/sun/jdi/VirtualMachineManager.java | 6 +-- .../com/sun/jdi/doc-files/signature.html | 2 +- .../jdk.jdi/share/classes/module-info.java | 4 +- 10 files changed, 51 insertions(+), 60 deletions(-) diff --git a/jdk/src/jdk.jdi/share/classes/com/sun/jdi/ClassType.java b/jdk/src/jdk.jdi/share/classes/com/sun/jdi/ClassType.java index 3286c73796f..65ef602c959 100644 --- a/jdk/src/jdk.jdi/share/classes/com/sun/jdi/ClassType.java +++ b/jdk/src/jdk.jdi/share/classes/com/sun/jdi/ClassType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 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 @@ -217,9 +217,6 @@ public interface ClassType extends ReferenceType { * a member of this class or a superclass, if the size of the argument list * does not match the number of declared arguments for the method, or * if the method is an initializer, constructor or static intializer. - * @throws {@link InvalidTypeException} if any argument in the - * argument list is not assignable to the corresponding method argument - * type. * @throws ClassNotLoadedException if any argument type has not yet been loaded * through the appropriate class loader. * @throws IncompatibleThreadStateException if the specified thread has not @@ -322,9 +319,6 @@ public interface ClassType extends ReferenceType { * a member of this class, if the size of the argument list * does not match the number of declared arguments for the constructor, * or if the method is not a constructor. - * @throws {@link InvalidTypeException} if any argument in the - * argument list is not assignable to the corresponding method argument - * type. * @throws ClassNotLoadedException if any argument type has not yet been loaded * through the appropriate class loader. * @throws IncompatibleThreadStateException if the specified thread has not diff --git a/jdk/src/jdk.jdi/share/classes/com/sun/jdi/InterfaceType.java b/jdk/src/jdk.jdi/share/classes/com/sun/jdi/InterfaceType.java index 64a9fa48ee0..8ff159f7ba1 100644 --- a/jdk/src/jdk.jdi/share/classes/com/sun/jdi/InterfaceType.java +++ b/jdk/src/jdk.jdi/share/classes/com/sun/jdi/InterfaceType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 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 @@ -168,9 +168,6 @@ public interface InterfaceType extends ReferenceType { * a member of this interface, if the size of the argument list * does not match the number of declared arguments for the method, or * if the method is not static or is a static initializer. - * @throws {@link InvalidTypeException} if any argument in the - * argument list is not assignable to the corresponding method argument - * type. * @throws ClassNotLoadedException if any argument type has not yet been loaded * through the appropriate class loader. * @throws IncompatibleThreadStateException if the specified thread has not diff --git a/jdk/src/jdk.jdi/share/classes/com/sun/jdi/JDIPermission.java b/jdk/src/jdk.jdi/share/classes/com/sun/jdi/JDIPermission.java index 109500afc97..175c12a2586 100644 --- a/jdk/src/jdk.jdi/share/classes/com/sun/jdi/JDIPermission.java +++ b/jdk/src/jdk.jdi/share/classes/com/sun/jdi/JDIPermission.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 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 @@ -40,8 +40,9 @@ package com.sun.jdi; * permission allows, and discusses the risks of granting code the * permission. * - * + *
+ * *
* Permission Target Name *What the Permission Allows diff --git a/jdk/src/jdk.jdi/share/classes/com/sun/jdi/Location.java b/jdk/src/jdk.jdi/share/classes/com/sun/jdi/Location.java index b17f2418b9d..42ea4ca5e23 100644 --- a/jdk/src/jdk.jdi/share/classes/com/sun/jdi/Location.java +++ b/jdk/src/jdk.jdi/share/classes/com/sun/jdi/Location.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 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 @@ -41,7 +41,7 @@ import java.util.List; * Several mirror interfaces have locations. Each such mirror * extends a {@link Locatable} interface. ** The source information for a Location is dependent on the * stratum which is used. A stratum is a source code diff --git a/jdk/src/jdk.jdi/share/classes/com/sun/jdi/ObjectReference.java b/jdk/src/jdk.jdi/share/classes/com/sun/jdi/ObjectReference.java index fa93b015cfa..fdef1eae4d7 100644 --- a/jdk/src/jdk.jdi/share/classes/com/sun/jdi/ObjectReference.java +++ b/jdk/src/jdk.jdi/share/classes/com/sun/jdi/ObjectReference.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 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 @@ -249,9 +249,6 @@ public interface ObjectReference extends Value { * if the method is a constructor or static initializer, or * if {@link #INVOKE_NONVIRTUAL} is specified and the method is * abstract. - * @throws {@link InvalidTypeException} if any argument in the - * argument list is not assignable to the corresponding method argument - * type. * @throws ClassNotLoadedException if any argument type has not yet been loaded * through the appropriate class loader. * @throws IncompatibleThreadStateException if the specified thread has not diff --git a/jdk/src/jdk.jdi/share/classes/com/sun/jdi/Type.java b/jdk/src/jdk.jdi/share/classes/com/sun/jdi/Type.java index 41b61fcba80..50ad02747e8 100644 --- a/jdk/src/jdk.jdi/share/classes/com/sun/jdi/Type.java +++ b/jdk/src/jdk.jdi/share/classes/com/sun/jdi/Type.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 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 @@ -45,13 +45,14 @@ package com.sun.jdi; *
* The following table illustrates which subinterfaces of Type * are used to mirror types in the target VM -- - *
- *
+ * + * + *
* Subinterfaces of {@link PrimitiveType} - *- * Type declared in target as - *Is mirrored as an instance of + *+ * Type declared in target as + *Is mirrored as an instance of ** * boolean{@link BooleanType} @@ -79,12 +80,12 @@ package com.sun.jdi; ** * void{@link VoidType} - *+ * * Subinterfaces of {@link ReferenceType} - *- * Type declared in target as - *For example - *Is mirrored as an instance of + *+ * Type declared in target as + *For example + *Is mirrored as an instance of ** a class *diff --git a/jdk/src/jdk.jdi/share/classes/com/sun/jdi/Value.java b/jdk/src/jdk.jdi/share/classes/com/sun/jdi/Value.java index 75e5e410fa7..b54c7b796c9 100644 --- a/jdk/src/jdk.jdi/share/classes/com/sun/jdi/Value.java +++ b/jdk/src/jdk.jdi/share/classes/com/sun/jdi/Value.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 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 @@ -31,7 +31,7 @@ package com.sun.jdi; * value hierarchy encompassing primitive values and object values. * Date* Some examples of where values may be accessed: - *
+ *
*
* {@link ObjectReference#getValue(com.sun.jdi.Field) * ObjectReference.getValue(Field)} @@ -52,15 +52,16 @@ package com.sun.jdi; * * The following table illustrates which subinterfaces of Value * are used to mirror values in the target VM -- - *
- *
+ * + * + *
* Subinterfaces of {@link PrimitiveValue} - *- * Kind of value - *For example - - *
expression in targetIs mirrored as an - *
instance of{@link Type} of value + *
{@link #type() Value.type()}+ * Kind of value + *For example - + *
expression in targetIs mirrored as an + *
instance of{@link Type} of value *
{@link #type() Value.type()}* a boolean *{@code true} @@ -106,13 +107,13 @@ package com.sun.jdi; ** {@link VoidValue} *{@link VoidType} - *+ * * Subinterfaces of {@link ObjectReference} - *- * Kind of value - *For example - - *
expression in targetIs mirrored as an - *
instance of{@link Type} of value + *
{@link #type() Value.type()}+ * Kind of value + *For example - + *
expression in targetIs mirrored as an + *
instance of{@link Type} of value *
{@link #type() Value.type()}* a class instance *{@code this} @@ -148,13 +149,13 @@ package com.sun.jdi; *{@code this.getClass()} *
{@code .getClassLoader()}{@link ClassLoaderReference} *{@link ClassType} - *+ * * Other - *- * Kind of value - *For example - - *
expression in targetIs mirrored as - *{@link Type} of value + *+ * Kind of value + *For example - + *
expression in targetIs mirrored as + *{@link Type} of value ** null *{@code null} diff --git a/jdk/src/jdk.jdi/share/classes/com/sun/jdi/VirtualMachineManager.java b/jdk/src/jdk.jdi/share/classes/com/sun/jdi/VirtualMachineManager.java index 58c435accf3..d8f6e0bf011 100644 --- a/jdk/src/jdk.jdi/share/classes/com/sun/jdi/VirtualMachineManager.java +++ b/jdk/src/jdk.jdi/share/classes/com/sun/jdi/VirtualMachineManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 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 @@ -51,8 +51,8 @@ import java.io.IOException; * Some {@link com.sun.jdi.connect.Connector} implementations may require slightly * different handling than presented below. * - *+ *
+ * *
* Scenario *Description diff --git a/jdk/src/jdk.jdi/share/classes/com/sun/jdi/doc-files/signature.html b/jdk/src/jdk.jdi/share/classes/com/sun/jdi/doc-files/signature.html index b6b8d5ce666..3f3ac690437 100644 --- a/jdk/src/jdk.jdi/share/classes/com/sun/jdi/doc-files/signature.html +++ b/jdk/src/jdk.jdi/share/classes/com/sun/jdi/doc-files/signature.html @@ -4,7 +4,7 @@ JDI Type Signatures - +
JDI Type Signatures diff --git a/jdk/src/jdk.jdi/share/classes/module-info.java b/jdk/src/jdk.jdi/share/classes/module-info.java index 6be55916fc4..e778655cf37 100644 --- a/jdk/src/jdk.jdi/share/classes/module-info.java +++ b/jdk/src/jdk.jdi/share/classes/module-info.java @@ -45,8 +45,8 @@ * Platform Debugger Architecture documentation for this release and the Java Platform Debugger Architecture * website. - *- * Global Exceptions: + *
+ * Global Exceptions: *
* This section documents exceptions which apply to the entire API and are thus * not documented on individual methods. From 24f4f83ebcc81c22465e45885ab38b30a6ed7ae3 Mon Sep 17 00:00:00 2001 From: Lance Andersen
+ * + * @apiNote If the parent is specified as {@code null} (for the + * bootstrap class loader) then there is no guarantee that all platform + * classes are visible. * * @param parent * The parent class loader @@ -2206,6 +2219,12 @@ public abstract class ClassLoader { * this class loader are searched recursively (parent by parent) * for a {@code Package} of the given name. * + * @apiNote The {@link #getPlatformClassLoader() platform class loader} + * may delegate to the application class loader but the application class + * loader is not its ancestor. When invoked on the platform class loader, + * this method will not find packages defined to the application + * class loader. + * * @param name * The package name * @@ -2251,6 +2270,14 @@ public abstract class ClassLoader { * {@code Package} object of the same package name, each defined by * a different class loader in the class loader hierarchy. * + * @apiNote The {@link #getPlatformClassLoader() platform class loader} + * may delegate to the application class loader. In other words, + * packages in modules defined to the application class loader may be + * visible to the platform class loader. On the other hand, + * the application class loader is not its ancestor and hence + * when invoked on the platform class loader, this method will not + * return any packages defined to the application class loader. + * * @return The array of {@code Package} objects defined by this * class loader and its ancestors * diff --git a/jdk/src/java.base/share/classes/java/lang/Module.java b/jdk/src/java.base/share/classes/java/lang/Module.java index 26337d86beb..f6ab49b4519 100644 --- a/jdk/src/java.base/share/classes/java/lang/Module.java +++ b/jdk/src/java.base/share/classes/java/lang/Module.java @@ -57,6 +57,7 @@ import jdk.internal.loader.BuiltinClassLoader; import jdk.internal.loader.BootLoader; import jdk.internal.misc.JavaLangAccess; import jdk.internal.misc.SharedSecrets; +import jdk.internal.module.ModuleLoaderMap; import jdk.internal.module.ServicesCatalog; import jdk.internal.module.Resources; import jdk.internal.org.objectweb.asm.AnnotationVisitor; @@ -215,8 +216,8 @@ public final class Module implements AnnotatedElement { } /** - * Returns the layer that contains this module or {@code null} if this - * module is not in a layer. + * Returns the module layer that contains this module or {@code null} if + * this module is not in a module layer. * * A module layer contains named modules and therefore this method always * returns {@code null} when invoked on an unnamed module. @@ -691,6 +692,13 @@ public final class Module implements AnnotatedElement { *Date: Wed, 3 May 2017 12:58:17 -0400 Subject: [PATCH 20/49] 8078267: Add test to verify that a module based JDBC driver via the service-provider loading mechanism Reviewed-by: joehw --- .../DriverManagerModuleTests.java | 146 ++++++++ .../luckydogtennis/LuckyDogDriver.java | 91 +++++ .../luckydogtennis/StubConnection.java | 315 ++++++++++++++++++ .../modules/luckydogdriver/module-info.java | 27 ++ .../com/luckydogtennis/StubConnection.java | 315 ++++++++++++++++++ .../com/luckydogtennis/StubDriver.java | 97 ++++++ .../sql/modules/mystubdriver/module-info.java | 29 ++ 7 files changed, 1020 insertions(+) create mode 100644 jdk/test/java/sql/driverModuleTests/DriverManagerModuleTests.java create mode 100644 jdk/test/java/sql/modules/luckydogdriver/luckydogtennis/LuckyDogDriver.java create mode 100644 jdk/test/java/sql/modules/luckydogdriver/luckydogtennis/StubConnection.java create mode 100644 jdk/test/java/sql/modules/luckydogdriver/module-info.java create mode 100644 jdk/test/java/sql/modules/mystubdriver/com/luckydogtennis/StubConnection.java create mode 100644 jdk/test/java/sql/modules/mystubdriver/com/luckydogtennis/StubDriver.java create mode 100644 jdk/test/java/sql/modules/mystubdriver/module-info.java diff --git a/jdk/test/java/sql/driverModuleTests/DriverManagerModuleTests.java b/jdk/test/java/sql/driverModuleTests/DriverManagerModuleTests.java new file mode 100644 index 00000000000..aad39cdb1dd --- /dev/null +++ b/jdk/test/java/sql/driverModuleTests/DriverManagerModuleTests.java @@ -0,0 +1,146 @@ +/* + * 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 + * 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.sql.Connection; +import java.sql.Driver; +import java.sql.DriverManager; +import java.sql.SQLException; +import static org.testng.Assert.*; +import org.testng.annotations.AfterClass; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +/* + * @test + * @library /java/sql/modules + * @build luckydogdriver/* mystubdriver/* + * @run testng/othervm DriverManagerModuleTests + * @summary Tests that a JDBC Driver that is a module can be loaded + * via the service-provider loading mechanism. + */ +public class DriverManagerModuleTests { + + private final String LUCKYDOGDRIVER_URL = "jdbc:tennis:myDB"; + private static final String STUBDRIVERURL = "jdbc:stub:myDB"; + private static final String CONNECTION_CLASS_NAME = "com.luckydogtennis.StubConnection"; + + @BeforeClass + public static void setUpClass() throws Exception { + } + + @AfterClass + public static void tearDownClass() throws Exception { + } + + @BeforeMethod + public void setUpMethod() throws Exception { + } + + @AfterMethod + public void tearDownMethod() throws Exception { + } + + /** + * Validate JDBC drivers as modules will be accessible. One driver will be + * loaded and registered via the service-provider loading mechanism. The + * other driver will need to be explictly loaded + * + * @throws java.lang.Exception + */ + @Test + public void test() throws Exception { + System.out.println("\n$$$ runing Test()\n"); + dumpRegisteredDrivers(); + Driver d = DriverManager.getDriver(STUBDRIVERURL); + assertNotNull(d, "StubDriver should not be null"); + assertTrue(isDriverRegistered(d)); + Driver d2 = null; + + // This driver should not be found until it is explictly loaded + try { + d2 = DriverManager.getDriver(LUCKYDOGDRIVER_URL); + } catch (SQLException e) { + // ignore expected Exception + } + assertNull(d2, "LuckyDogDriver should be null"); + loadDriver(); + d2 = DriverManager.getDriver(LUCKYDOGDRIVER_URL); + assertNotNull(d2, "LuckyDogDriver should not be null"); + assertTrue(isDriverRegistered(d2), "Driver was NOT registered"); + + dumpRegisteredDrivers(); + DriverManager.deregisterDriver(d2); + assertFalse(isDriverRegistered(d2), "Driver IS STILL registered"); + dumpRegisteredDrivers(); + + } + + /** + * Validate that a Connection can be obtained from a JDBC driver which is a + * module and loaded via the service-provider loading mechanism. + * + * @throws java.lang.Exception + */ + @Test + public void test00() throws Exception { + System.out.println("\n$$$ runing Test00()\n"); + Connection con = DriverManager.getConnection(STUBDRIVERURL); + assertNotNull(con, "Returned Connection should not be NULL"); + System.out.println("con=" + con.getClass().getName()); + assertTrue(con.getClass().getName().equals(CONNECTION_CLASS_NAME)); + + } + + /** + * Utility method to see if a driver is registered + */ + private static void dumpRegisteredDrivers() { + System.out.println("\n+++ Loaded Drivers +++"); + + DriverManager.drivers().forEach(d -> System.out.println("\t\t### Driver:" + d)); + + System.out.println("++++++++++++++++++++++++"); + } + + /** + * Utility method to load the LuckyDogDriver + */ + private static void loadDriver() { + try { + Class.forName("luckydogtennis.LuckyDogDriver"); + } catch (ClassNotFoundException ex) { + System.out.println("**** Error: luckydogtennis.LuckyDogDriver not found"); + } + System.out.println("Driver Loaded"); + } + + /** + * Utility method to see if a driver is registered + */ + private static boolean isDriverRegistered(Driver d) { + return DriverManager.drivers().filter(driver-> driver == d).findFirst().isPresent(); + + } +} diff --git a/jdk/test/java/sql/modules/luckydogdriver/luckydogtennis/LuckyDogDriver.java b/jdk/test/java/sql/modules/luckydogdriver/luckydogtennis/LuckyDogDriver.java new file mode 100644 index 00000000000..39f69133035 --- /dev/null +++ b/jdk/test/java/sql/modules/luckydogdriver/luckydogtennis/LuckyDogDriver.java @@ -0,0 +1,91 @@ +/* + * 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 + * 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. + */ +package luckydogtennis; + +import java.sql.Connection; +import java.sql.Driver; +import java.sql.DriverManager; +import java.sql.DriverPropertyInfo; +import java.sql.SQLException; +import java.sql.SQLFeatureNotSupportedException; +import java.util.Properties; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class LuckyDogDriver implements Driver { + + static { + registerDriver(); + System.out.println("*****in static block LuckyDogDriver"); + } + + private static void registerDriver() { + try { + DriverManager.registerDriver(new LuckyDogDriver()); + } catch (SQLException ex) { + Logger.getLogger(LuckyDogDriver.class.getName()).log(Level.SEVERE, null, ex); + } + } + + public LuckyDogDriver() { + System.out.println("*****in LuckyDogDriver Constructor"); + } + + @Override + public Connection connect(String url, Properties info) throws SQLException { + if (acceptsURL(url)) { + return new StubConnection(); + } + return null; + } + + @Override + public boolean acceptsURL(String url) throws SQLException { + return url.matches("^jdbc:tennis:.*"); + } + + @Override + public DriverPropertyInfo[] getPropertyInfo(String url, Properties info) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public int getMajorVersion() { + return 1; + } + + @Override + public int getMinorVersion() { + return 0; + } + + @Override + public boolean jdbcCompliant() { + return true; + } + + @Override + public Logger getParentLogger() throws SQLFeatureNotSupportedException { + throw new UnsupportedOperationException("Not supported yet."); + } +} diff --git a/jdk/test/java/sql/modules/luckydogdriver/luckydogtennis/StubConnection.java b/jdk/test/java/sql/modules/luckydogdriver/luckydogtennis/StubConnection.java new file mode 100644 index 00000000000..3faece2ca33 --- /dev/null +++ b/jdk/test/java/sql/modules/luckydogdriver/luckydogtennis/StubConnection.java @@ -0,0 +1,315 @@ +/* + * 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 + * 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. + */ +package luckydogtennis; + +import java.sql.Array; +import java.sql.Blob; +import java.sql.CallableStatement; +import java.sql.Clob; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.NClob; +import java.sql.PreparedStatement; +import java.sql.SQLClientInfoException; +import java.sql.SQLException; +import java.sql.SQLWarning; +import java.sql.SQLXML; +import java.sql.Savepoint; +import java.sql.Statement; +import java.sql.Struct; +import java.util.Map; +import java.util.Properties; +import java.util.concurrent.Executor; + +public class StubConnection implements Connection{ + + @Override + public Statement createStatement() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public PreparedStatement prepareStatement(String sql) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public CallableStatement prepareCall(String sql) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public String nativeSQL(String sql) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setAutoCommit(boolean autoCommit) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public boolean getAutoCommit() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void commit() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void rollback() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void close() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public boolean isClosed() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public DatabaseMetaData getMetaData() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setReadOnly(boolean readOnly) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public boolean isReadOnly() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setCatalog(String catalog) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public String getCatalog() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setTransactionIsolation(int level) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public int getTransactionIsolation() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public SQLWarning getWarnings() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void clearWarnings() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Map > getTypeMap() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setTypeMap(Map > map) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setHoldability(int holdability) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public int getHoldability() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Savepoint setSavepoint() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Savepoint setSavepoint(String name) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void rollback(Savepoint savepoint) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void releaseSavepoint(Savepoint savepoint) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Clob createClob() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Blob createBlob() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public NClob createNClob() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public SQLXML createSQLXML() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public boolean isValid(int timeout) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setClientInfo(String name, String value) throws SQLClientInfoException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setClientInfo(Properties properties) throws SQLClientInfoException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public String getClientInfo(String name) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Properties getClientInfo() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Array createArrayOf(String typeName, Object[] elements) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Struct createStruct(String typeName, Object[] attributes) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setSchema(String schema) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public String getSchema() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void abort(Executor executor) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setNetworkTimeout(Executor executor, int milliseconds) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public int getNetworkTimeout() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public T unwrap(Class iface) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public boolean isWrapperFor(Class> iface) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } +} diff --git a/jdk/test/java/sql/modules/luckydogdriver/module-info.java b/jdk/test/java/sql/modules/luckydogdriver/module-info.java new file mode 100644 index 00000000000..5f98bc3ecd1 --- /dev/null +++ b/jdk/test/java/sql/modules/luckydogdriver/module-info.java @@ -0,0 +1,27 @@ +/* + * 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 + * 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. + */ +module luckydogdriver { + requires transitive java.logging; + requires transitive java.sql; + exports luckydogtennis; +} diff --git a/jdk/test/java/sql/modules/mystubdriver/com/luckydogtennis/StubConnection.java b/jdk/test/java/sql/modules/mystubdriver/com/luckydogtennis/StubConnection.java new file mode 100644 index 00000000000..16971149b4d --- /dev/null +++ b/jdk/test/java/sql/modules/mystubdriver/com/luckydogtennis/StubConnection.java @@ -0,0 +1,315 @@ +/* + * 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 + * 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. + */ +package com.luckydogtennis; + +import java.sql.Array; +import java.sql.Blob; +import java.sql.CallableStatement; +import java.sql.Clob; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.NClob; +import java.sql.PreparedStatement; +import java.sql.SQLClientInfoException; +import java.sql.SQLException; +import java.sql.SQLWarning; +import java.sql.SQLXML; +import java.sql.Savepoint; +import java.sql.Statement; +import java.sql.Struct; +import java.util.Map; +import java.util.Properties; +import java.util.concurrent.Executor; + +public class StubConnection implements Connection{ + + @Override + public Statement createStatement() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public PreparedStatement prepareStatement(String sql) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public CallableStatement prepareCall(String sql) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public String nativeSQL(String sql) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setAutoCommit(boolean autoCommit) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public boolean getAutoCommit() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void commit() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void rollback() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void close() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public boolean isClosed() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public DatabaseMetaData getMetaData() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setReadOnly(boolean readOnly) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public boolean isReadOnly() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setCatalog(String catalog) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public String getCatalog() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setTransactionIsolation(int level) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public int getTransactionIsolation() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public SQLWarning getWarnings() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void clearWarnings() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Map > getTypeMap() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setTypeMap(Map > map) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setHoldability(int holdability) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public int getHoldability() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Savepoint setSavepoint() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Savepoint setSavepoint(String name) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void rollback(Savepoint savepoint) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void releaseSavepoint(Savepoint savepoint) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Clob createClob() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Blob createBlob() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public NClob createNClob() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public SQLXML createSQLXML() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public boolean isValid(int timeout) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setClientInfo(String name, String value) throws SQLClientInfoException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setClientInfo(Properties properties) throws SQLClientInfoException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public String getClientInfo(String name) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Properties getClientInfo() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Array createArrayOf(String typeName, Object[] elements) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Struct createStruct(String typeName, Object[] attributes) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setSchema(String schema) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public String getSchema() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void abort(Executor executor) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setNetworkTimeout(Executor executor, int milliseconds) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public int getNetworkTimeout() throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public T unwrap(Class iface) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public boolean isWrapperFor(Class> iface) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } +} diff --git a/jdk/test/java/sql/modules/mystubdriver/com/luckydogtennis/StubDriver.java b/jdk/test/java/sql/modules/mystubdriver/com/luckydogtennis/StubDriver.java new file mode 100644 index 00000000000..d080deefbf2 --- /dev/null +++ b/jdk/test/java/sql/modules/mystubdriver/com/luckydogtennis/StubDriver.java @@ -0,0 +1,97 @@ +/* + * 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 + * 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. + */ +package com.luckydogtennis; + +import java.sql.Connection; +import java.sql.Driver; +import java.sql.DriverManager; +import java.sql.DriverPropertyInfo; +import java.sql.SQLException; +import java.sql.SQLFeatureNotSupportedException; +import java.util.Properties; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class StubDriver implements Driver { + + static { + System.out.println("*****in static block StubDriver"); + registerDriver(); + } + + private static void registerDriver() { + try { + DriverManager.registerDriver(new StubDriver()); + } catch (SQLException ex) { + Logger.getLogger(StubDriver.class.getName()).log(Level.SEVERE, null, ex); + } + } + + public StubDriver() { + System.out.println("*****in StubDriver Constructor*************"); + /* + for (StackTraceElement ste : Thread.currentThread().getStackTrace()) { + System.out.println(ste); + } + System.out.println("******************"); + */ + } + + @Override + public Connection connect(String url, Properties info) throws SQLException { + if (acceptsURL(url)) { + return new StubConnection(); + } + return null; + } + + @Override + public boolean acceptsURL(String url) throws SQLException { + return url.matches("^jdbc:stub:.*"); + } + + @Override + public DriverPropertyInfo[] getPropertyInfo(String url, Properties info) throws SQLException { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public int getMajorVersion() { + return 1; + } + + @Override + public int getMinorVersion() { + return 0; + } + + @Override + public boolean jdbcCompliant() { + return true; + } + + @Override + public Logger getParentLogger() throws SQLFeatureNotSupportedException { + throw new UnsupportedOperationException("Not supported yet."); + } +} diff --git a/jdk/test/java/sql/modules/mystubdriver/module-info.java b/jdk/test/java/sql/modules/mystubdriver/module-info.java new file mode 100644 index 00000000000..ce15e831130 --- /dev/null +++ b/jdk/test/java/sql/modules/mystubdriver/module-info.java @@ -0,0 +1,29 @@ +/* + * 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 + * 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. + */ +module mystubdriver { + requires transitive java.logging; + requires transitive java.sql; + exports com.luckydogtennis; + provides java.sql.Driver with + com.luckydogtennis.StubDriver; +} From 6aff2d0db6f574cd321d56fdfb3a82cc1a023c5b Mon Sep 17 00:00:00 2001 From: John Jiang Date: Wed, 3 May 2017 21:15:07 -0700 Subject: [PATCH 21/49] 8179451: Confidential copyright header in openjdk Using Oracle OpenJDK copyright notices Reviewed-by: weijun --- .../ssl/CertPathRestrictions/JSSEClient.java | 20 ++++++++++++++++++- .../ssl/CertPathRestrictions/JSSEServer.java | 20 ++++++++++++++++++- .../CertPathRestrictions/TLSRestrictions.java | 4 +--- 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/jdk/test/sun/security/ssl/CertPathRestrictions/JSSEClient.java b/jdk/test/sun/security/ssl/CertPathRestrictions/JSSEClient.java index 636809ba9d2..e2e1b47d506 100644 --- a/jdk/test/sun/security/ssl/CertPathRestrictions/JSSEClient.java +++ b/jdk/test/sun/security/ssl/CertPathRestrictions/JSSEClient.java @@ -1,6 +1,24 @@ /* * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. - * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. + * 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.InputStream; diff --git a/jdk/test/sun/security/ssl/CertPathRestrictions/JSSEServer.java b/jdk/test/sun/security/ssl/CertPathRestrictions/JSSEServer.java index 80d76e9b58d..338329163ea 100644 --- a/jdk/test/sun/security/ssl/CertPathRestrictions/JSSEServer.java +++ b/jdk/test/sun/security/ssl/CertPathRestrictions/JSSEServer.java @@ -1,6 +1,24 @@ /* * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. - * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. + * 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.InputStream; diff --git a/jdk/test/sun/security/ssl/CertPathRestrictions/TLSRestrictions.java b/jdk/test/sun/security/ssl/CertPathRestrictions/TLSRestrictions.java index 35293d1b8a6..2a6ffb2d135 100644 --- a/jdk/test/sun/security/ssl/CertPathRestrictions/TLSRestrictions.java +++ b/jdk/test/sun/security/ssl/CertPathRestrictions/TLSRestrictions.java @@ -4,9 +4,7 @@ * * 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. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. + * 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 From 4c0e26e374b2ab6320b70cb39c6ad865c8bd9644 Mon Sep 17 00:00:00 2001 From: Alan Bateman Date: Thu, 4 May 2017 07:26:55 +0000 Subject: [PATCH 22/49] 8178380: Module system implementation refresh (5/2017) Co-authored-by: Mandy Chung Co-authored-by: Chris Hegarty Reviewed-by: mchung, alanb, sspitsyn --- jdk/make/mapfiles/libinstrument/mapfile-vers | 1 + .../share/classes/java/lang/ClassLoader.java | 45 +- .../share/classes/java/lang/Module.java | 27 +- .../classes/java/lang/SecurityManager.java | 61 ++- .../share/classes/java/lang/System.java | 7 +- .../java/lang/invoke/MethodHandles.java | 7 +- .../java/lang/module/Configuration.java | 14 +- .../java/lang/module/ModuleDescriptor.java | 1 + .../java/lang/module/ModuleFinder.java | 8 +- .../classes/java/lang/module/Resolver.java | 150 ++---- .../classes/java/nio/file/FileSystems.java | 10 +- .../internal/loader/BuiltinClassLoader.java | 27 +- .../jdk/internal/misc/JavaLangAccess.java | 13 +- .../classes/jdk/internal/module/Checks.java | 152 +++--- .../internal/module/ClassFileAttributes.java | 53 +-- .../jdk/internal/module/ModuleBootstrap.java | 51 +- .../internal/module/ModuleHashesBuilder.java | 2 +- .../jdk/internal/module/ModuleInfo.java | 17 +- .../internal/module/ModuleInfoExtender.java | 16 +- .../jdk/internal/module/ModuleInfoWriter.java | 5 +- .../jdk/internal/module/ModuleLoaderMap.java | 74 ++- .../jdk/internal/module/ModulePatcher.java | 6 +- .../jdk/internal/module/ModulePath.java | 55 ++- .../jdk/internal/module/ModuleReferences.java | 5 +- .../jdk/internal/module/ModuleResolution.java | 31 +- .../jdk/internal/module/ModuleTarget.java | 21 +- .../classes/jdk/internal/module/Modules.java | 100 +++- .../jdk/internal/module/Resources.java | 10 +- .../java.base/share/classes/module-info.java | 1 + .../classes/sun/launcher/LauncherHelper.java | 439 ++++++++++++++---- .../launcher/resources/launcher.properties | 38 +- .../java.base/share/native/libjli/emessages.h | 3 +- jdk/src/java.base/share/native/libjli/java.c | 131 ++++-- .../java/lang/instrument/Instrumentation.java | 3 +- .../classes/java/lang/instrument/package.html | 163 ++++--- .../share/classes/module-info.java | 3 + .../sun/instrument/InstrumentationImpl.java | 13 +- .../InstrumentationImplNativeMethods.c | 17 + .../native/libinstrument/InvocationAdapter.c | 111 ++++- .../java/lang/management/ThreadInfo.java | 3 + .../sun/tools/attach/VirtualMachineImpl.java | 13 +- .../sun/tools/attach/VirtualMachineImpl.java | 13 +- .../sun/tools/attach/VirtualMachineImpl.java | 13 +- .../tools/attach/HotSpotVirtualMachine.java | 63 ++- .../sun/tools/attach/VirtualMachineImpl.java | 13 +- .../sun/tools/attach/VirtualMachineImpl.java | 23 +- .../share/classes/sun/tools/jar/Main.java | 308 ++++++++---- .../classes/sun/tools/jar/Validator.java | 2 +- .../sun/tools/jar/resources/jar.properties | 6 +- .../jlink/builder/DefaultImageBuilder.java | 12 +- .../jlink/internal/ImagePluginStack.java | 10 +- .../jdk/tools/jlink/internal/Platform.java | 19 +- .../jlink/internal/ResourcePoolManager.java | 12 +- .../internal/plugins/ReleaseInfoPlugin.java | 29 +- .../internal/plugins/SystemModulesPlugin.java | 15 +- .../jlink/plugin/ResourcePoolModule.java | 13 +- .../classes/jdk/tools/jmod/JmodTask.java | 148 +++--- .../jdk/tools/jmod/resources/jmod.properties | 6 +- .../HotSpotDiagnosticMXBean/CheckOrigin.java | 1 + jdk/test/com/sun/tools/attach/AttachSelf.java | 61 +++ jdk/test/com/sun/tools/attach/RunnerUtil.java | 5 +- .../com/sun/tools/attach/java.policy.allow | 3 +- .../com/sun/tools/attach/modules/Agent.java | 30 ++ .../com/sun/tools/attach/modules/Driver.java | 35 ++ .../tools/attach/modules/m/module-info.java} | 9 +- .../sun/tools/attach/modules/m/p/Main.java | 164 +++++++ .../lang/instrument/executableJAR/Agent.java | 33 ++ .../instrument/executableJAR/AgentHelper.java | 25 + .../executableJAR/ExecJarWithAgent.java | 138 ++++++ .../lang/instrument/executableJAR/Main.java | 41 ++ .../java/lang/invoke/DefineClassTest.java | 29 +- .../lang/module/AutomaticModulesTest.java | 21 +- .../java/lang/module/ConfigurationTest.java | 40 +- .../lang/module/ModuleDescriptorTest.java | 48 +- .../customfs/ModulesInCustomFileSystem.java | 142 ++++++ .../lang/module/customfs/m1/module-info.java | 27 ++ .../java/lang/module/customfs/m1/p/Main.java | 30 ++ .../lang/module/customfs/m2/module-info.java | 26 ++ .../java/lang/module/customfs/m2/q/Hello.java | 30 ++ .../java/nio/file/spi/SetDefaultProvider.java | 144 +++++- jdk/test/java/nio/file/spi/TestProvider.java | 29 +- jdk/test/java/nio/file/spi/m/module-info.java | 24 + jdk/test/java/nio/file/spi/m/p/Main.java | 62 +++ .../util/logging/TestLoggerWeakRefLeak.java | 4 +- .../lib/testlibrary/ModuleTargetHelper.java | 17 +- .../bootstrap/JvmstatCountersTest.java | 2 +- jdk/test/tools/jar/mmrjar/Basic.java | 65 ++- jdk/test/tools/jar/modularJar/Basic.java | 19 +- .../jar/multiRelease/whitebox/Driver.java | 28 ++ .../tools/jar/ValidatorComparatorTest.java | 101 ++++ jdk/test/tools/jlink/IntegrationTest.java | 5 - jdk/test/tools/jlink/JLinkNegativeTest.java | 2 +- .../SystemModulesTest.java | 7 +- .../UserModuleTest.java | 8 +- .../src/m1/p1/Main.java | 3 +- .../src/m4/p4/Main.java | 3 +- jdk/test/tools/jmod/JmodTest.java | 13 +- .../modules/describe/DescribeModuleTest.java | 103 ++++ .../modules/listmods/ListModsTest.java | 138 ++---- .../src/java.transaction/module-info.java | 1 - .../systemmodules/PatchSystemModules.java | 73 ++- .../ShowModuleResolutionTest.java | 84 ++++ .../modules/validate/ValidateModulesTest.java | 135 ++++++ .../src/xmlkit/ClassReader.java | 3 +- 104 files changed, 3461 insertions(+), 1162 deletions(-) create mode 100644 jdk/test/com/sun/tools/attach/AttachSelf.java create mode 100644 jdk/test/com/sun/tools/attach/modules/Agent.java create mode 100644 jdk/test/com/sun/tools/attach/modules/Driver.java rename jdk/test/{tools/launcher/modules/listmods/src/java.transaction/javax/transaction/atomic/Atomic.java => com/sun/tools/attach/modules/m/module-info.java} (88%) create mode 100644 jdk/test/com/sun/tools/attach/modules/m/p/Main.java create mode 100644 jdk/test/java/lang/instrument/executableJAR/Agent.java create mode 100644 jdk/test/java/lang/instrument/executableJAR/AgentHelper.java create mode 100644 jdk/test/java/lang/instrument/executableJAR/ExecJarWithAgent.java create mode 100644 jdk/test/java/lang/instrument/executableJAR/Main.java create mode 100644 jdk/test/java/lang/module/customfs/ModulesInCustomFileSystem.java create mode 100644 jdk/test/java/lang/module/customfs/m1/module-info.java create mode 100644 jdk/test/java/lang/module/customfs/m1/p/Main.java create mode 100644 jdk/test/java/lang/module/customfs/m2/module-info.java create mode 100644 jdk/test/java/lang/module/customfs/m2/q/Hello.java create mode 100644 jdk/test/java/nio/file/spi/m/module-info.java create mode 100644 jdk/test/java/nio/file/spi/m/p/Main.java create mode 100644 jdk/test/tools/jar/multiRelease/whitebox/Driver.java create mode 100644 jdk/test/tools/jar/multiRelease/whitebox/jdk.jartool/sun/tools/jar/ValidatorComparatorTest.java create mode 100644 jdk/test/tools/launcher/modules/describe/DescribeModuleTest.java create mode 100644 jdk/test/tools/launcher/modules/showmoduleresolution/ShowModuleResolutionTest.java create mode 100644 jdk/test/tools/launcher/modules/validate/ValidateModulesTest.java diff --git a/jdk/make/mapfiles/libinstrument/mapfile-vers b/jdk/make/mapfiles/libinstrument/mapfile-vers index 748670139bd..c51a8af2dc7 100644 --- a/jdk/make/mapfiles/libinstrument/mapfile-vers +++ b/jdk/make/mapfiles/libinstrument/mapfile-vers @@ -39,6 +39,7 @@ SUNWprivate_1.1 { Java_sun_instrument_InstrumentationImpl_getObjectSize0; Java_sun_instrument_InstrumentationImpl_appendToClassLoaderSearch0; Java_sun_instrument_InstrumentationImpl_setNativeMethodPrefixes; + Java_sun_instrument_InstrumentationImpl_loadAgent0; local: *; }; diff --git a/jdk/src/java.base/share/classes/java/lang/ClassLoader.java b/jdk/src/java.base/share/classes/java/lang/ClassLoader.java index ddce2879e2e..fc5a780e7ed 100644 --- a/jdk/src/java.base/share/classes/java/lang/ClassLoader.java +++ b/jdk/src/java.base/share/classes/java/lang/ClassLoader.java @@ -119,18 +119,24 @@ import sun.security.util.SecurityConstants; * The Java run-time has the following built-in class loaders: * * - *
- Bootstrap class loader. + *
- - *
Bootstrap class loader. * It is the virtual machine's built-in class loader, typically represented * as {@code null}, and does not have a parent.
- {@linkplain #getPlatformClassLoader() Platform class loader}. + *
- - *
{@linkplain #getPlatformClassLoader() Platform class loader}. * All platform classes are visible to the platform class loader * that can be used as the parent of a {@code ClassLoader} instance. * Platform classes include Java SE platform APIs, their implementation * classes and JDK-specific run-time classes that are defined by the - * platform class loader or its ancestors.
- {@linkplain #getSystemClassLoader() System class loader}. - * It is also known as application class - * loader and is distinct from the platform class loader. + * platform class loader or its ancestors. + *
+ *To allow for upgrading/overriding of modules defined to the platform + * class loader, and where classes in the upgraded version link to + * classes in modules defined to the application class loader, the + * platform class loader may delegate to the application class loader. + * In other words, classes in named modules defined to the application + * class loader may be visible to the platform class loader.
{@linkplain #getSystemClassLoader() System class loader}. + * It is also known as application class loader and is distinct + * from the platform class loader. * The system class loader is typically used to define classes on the * application class path, module path, and JDK-specific tools. * The platform class loader is a parent or an ancestor of the system class @@ -368,6 +374,10 @@ public abstract class ClassLoader { * Creates a new class loader of the specified name and using the * specified parent class loader for delegation. * + * @apiNote If the parent is specified as {@code null} (for the + * bootstrap class loader) then there is no guarantee that all platform + * classes are visible. + * * @param name class loader name; or {@code null} if not named * @param parent the parent class loader * @@ -390,9 +400,12 @@ public abstract class ClassLoader { * delegation. * *
If there is a security manager, its {@link - * SecurityManager#checkCreateClassLoader() - * checkCreateClassLoader} method is invoked. This may result in - * a security exception.
+ * SecurityManager#checkCreateClassLoader() checkCreateClassLoader} method + * is invoked. This may result in a security exception.This method has no effect if the package is already open * to the given module.
* + * @apiNote This method can be used for cases where a consumer + * module uses a qualified opens to open a package to an API + * module but where the reflective access to the members of classes in + * the consumer module is delegated to code in another module. Code in the + * API module can use this method to open the package in the consumer module + * to the other module. + * * @param pn * The package name * @param other @@ -1077,7 +1085,7 @@ public final class Module implements AnnotatedElement { if (loader != null) { moduleToLoader.put(name, loader); loaders.add(loader); - } else if (!isBootLayer) { + } else if (!(clf instanceof ModuleLoaderMap.Mapper)) { throw new IllegalArgumentException("loader can't be 'null'"); } } @@ -1458,11 +1466,11 @@ public final class Module implements AnnotatedElement { * encapsulated. * *- A package name is derived from the resource name. If - * the package name is a {@link #getPackages() package} in the module - * then the resource can only be located by the caller of this method - * when the package is {@link #isOpen(String,Module) open} to at least - * the caller's module. If the resource is not in a package in the module - * then the resource is not encapsulated.
+ * the package name is a {@linkplain #getPackages() package} in the + * module then the resource can only be located by the caller of this + * method when the package is {@linkplain #isOpen(String,Module) open} + * to at least the caller's module. If the resource is not in a + * package in the module then the resource is not encapsulated. * * *In the above, the package name for a resource is derived @@ -1521,8 +1529,7 @@ public final class Module implements AnnotatedElement { } // locate resource in module - JavaLangAccess jla = SharedSecrets.getJavaLangAccess(); - URL url = jla.findResource(loader, mn, name); + URL url = loader.findResource(mn, name); if (url != null) { try { return url.openStream(); diff --git a/jdk/src/java.base/share/classes/java/lang/SecurityManager.java b/jdk/src/java.base/share/classes/java/lang/SecurityManager.java index 098e8626525..b60d63e5f02 100644 --- a/jdk/src/java.base/share/classes/java/lang/SecurityManager.java +++ b/jdk/src/java.base/share/classes/java/lang/SecurityManager.java @@ -25,10 +25,10 @@ package java.lang; -import java.lang.RuntimePermission; import java.lang.module.ModuleDescriptor; import java.lang.module.ModuleDescriptor.Exports; import java.lang.module.ModuleDescriptor.Opens; +import java.lang.module.ModuleReference; import java.lang.reflect.Member; import java.io.FileDescriptor; import java.io.File; @@ -42,12 +42,15 @@ import java.security.PrivilegedAction; import java.security.Security; import java.security.SecurityPermission; import java.util.HashSet; +import java.util.Map; import java.util.Objects; import java.util.PropertyPermission; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; -import java.util.stream.Stream; +import jdk.internal.module.ModuleBootstrap; +import jdk.internal.module.ModuleLoaderMap; import jdk.internal.reflect.CallerSensitive; import sun.security.util.SecurityConstants; @@ -1431,30 +1434,30 @@ class SecurityManager { return packages; } - // The non-exported packages of the modules in the boot layer that are - // loaded by the platform class loader or its ancestors. A non-exported - // package is a package that either is not exported at all by its containing - // module or is exported in a qualified fashion by its containing module. - private static final Set
+ * the runtime package). * *nonExportedPkgs; - + // The non-exported packages in modules defined to the boot or platform + // class loaders. A non-exported package is a package that is not exported + // or is only exported to specific modules. + private static final Map nonExportedPkgs = new ConcurrentHashMap<>(); static { - // Get the modules in the boot layer - Stream bootLayerModules = ModuleLayer.boot().modules().stream(); - - // Filter out the modules loaded by the boot or platform loader - PrivilegedAction > pa = () -> - bootLayerModules.filter(SecurityManager::isBootOrPlatformModule) - .collect(Collectors.toSet()); - Set modules = AccessController.doPrivileged(pa); - - // Filter out the non-exported packages - nonExportedPkgs = modules.stream() - .map(Module::getDescriptor) - .map(SecurityManager::nonExportedPkgs) - .flatMap(Set::stream) - .collect(Collectors.toSet()); + addNonExportedPackages(ModuleLayer.boot()); } + /** + * Record the non-exported packages of the modules in the given layer + */ + static void addNonExportedPackages(ModuleLayer layer) { + Set bootModules = ModuleLoaderMap.bootModules(); + Set platformModules = ModuleLoaderMap.platformModules(); + layer.modules().stream() + .map(Module::getDescriptor) + .filter(md -> bootModules.contains(md.name()) + || platformModules.contains(md.name())) + .map(SecurityManager::nonExportedPkgs) + .flatMap(Set::stream) + .forEach(pn -> nonExportedPkgs.put(pn, Boolean.TRUE)); + } + + /** * Called by java.security.Security */ @@ -1467,14 +1470,6 @@ class SecurityManager { } } - /** - * Returns true if the module's loader is the boot or platform loader. - */ - private static boolean isBootOrPlatformModule(Module m) { - return m.getClassLoader() == null || - m.getClassLoader() == ClassLoader.getPlatformClassLoader(); - } - /** * Returns the non-exported packages of the specified module. */ @@ -1535,7 +1530,7 @@ class SecurityManager { Objects.requireNonNull(pkg, "package name can't be null"); // check if pkg is not exported to all modules - if (nonExportedPkgs.contains(pkg)) { + if (nonExportedPkgs.containsKey(pkg)) { checkPermission( new RuntimePermission("accessClassInPackage." + pkg)); return; @@ -1634,7 +1629,7 @@ class SecurityManager { Objects.requireNonNull(pkg, "package name can't be null"); // check if pkg is not exported to all modules - if (nonExportedPkgs.contains(pkg)) { + if (nonExportedPkgs.containsKey(pkg)) { checkPermission( new RuntimePermission("defineClassInPackage." + pkg)); return; diff --git a/jdk/src/java.base/share/classes/java/lang/System.java b/jdk/src/java.base/share/classes/java/lang/System.java index a57c9a74c34..a966fdc715f 100644 --- a/jdk/src/java.base/share/classes/java/lang/System.java +++ b/jdk/src/java.base/share/classes/java/lang/System.java @@ -41,7 +41,6 @@ import java.lang.reflect.Executable; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.net.URI; -import java.net.URL; import java.security.AccessControlContext; import java.security.ProtectionDomain; import java.security.AccessController; @@ -2111,9 +2110,6 @@ public final class System { public Class> findBootstrapClassOrNull(ClassLoader cl, String name) { return cl.findBootstrapClassOrNull(name); } - public URL findResource(ClassLoader cl, String mn, String name) throws IOException { - return cl.findResource(mn, name); - } public Stream packages(ClassLoader cl) { return cl.packages(); } @@ -2123,6 +2119,9 @@ public final class System { public String fastUUID(long lsb, long msb) { return Long.fastUUID(lsb, msb); } + public void addNonExportedPackages(ModuleLayer layer) { + SecurityManager.addNonExportedPackages(layer); + } public void invalidatePackageAccessCache() { SecurityManager.invalidatePackageAccessCache(); } diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java index afd8d9b2819..6536afb0e99 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java @@ -876,9 +876,7 @@ public class MethodHandles { * accessible to the class. The {@code PACKAGE} lookup mode serves to authenticate * that the lookup object was created by a caller in the runtime package (or derived * from a lookup originally created by suitably privileged code to a target class in - * the runtime package). The lookup modes cannot include {@link #PRIVATE PRIVATE} - * access. A lookup with {@code PRIVATE} access can be downgraded to drop this lookup - * mode with the {@linkplain #dropLookupMode(int) dropLookupMode} method. The {@code bytes} parameter is the class bytes of a valid class file (as defined * by the The Java Virtual Machine Specification) with a class name in the @@ -896,7 +894,6 @@ public class MethodHandles { * @throws IllegalArgumentException the bytes are for a class in a different package * to the lookup class * @throws IllegalAccessException if this lookup does not have {@code PACKAGE} access - * @throws UnsupportedOperationException if the lookup class has {@code PRIVATE} access * @throws LinkageError if the class is malformed ({@code ClassFormatError}), cannot be * verified ({@code VerifyError}), is already defined, or another linkage error occurs * @throws SecurityException if denied by the security manager @@ -911,8 +908,6 @@ public class MethodHandles { SecurityManager sm = System.getSecurityManager(); if (sm != null) sm.checkPermission(new RuntimePermission("defineClass")); - if (hasPrivateAccess()) - throw new UnsupportedOperationException("PRIVATE access not supported"); if ((lookupModes() & PACKAGE) == 0) throw new IllegalAccessException("Lookup does not have PACKAGE access"); assert (lookupModes() & (MODULE|PUBLIC)) != 0; diff --git a/jdk/src/java.base/share/classes/java/lang/module/Configuration.java b/jdk/src/java.base/share/classes/java/lang/module/Configuration.java index d5fc16c1ef6..ef7e44a114d 100644 --- a/jdk/src/java.base/share/classes/java/lang/module/Configuration.java +++ b/jdk/src/java.base/share/classes/java/lang/module/Configuration.java @@ -109,20 +109,17 @@ public final class Configuration { private final Set
* *modules; private final Map nameToModule; - // module constraints on target - private final String osName; - private final String osArch; + // constraint on target platform + private final String targetPlatform; - String osName() { return osName; } - String osArch() { return osArch; } + String targetPlatform() { return targetPlatform; } private Configuration() { this.parents = Collections.emptyList(); this.graph = Collections.emptyMap(); this.modules = Collections.emptySet(); this.nameToModule = Collections.emptyMap(); - this.osName = null; - this.osArch = null; + this.targetPlatform = null; } private Configuration(List parents, @@ -147,8 +144,7 @@ public final class Configuration { this.modules = Set.of(moduleArray); this.nameToModule = Map.ofEntries(nameEntries); - this.osName = resolver.osName(); - this.osArch = resolver.osArch(); + this.targetPlatform = resolver.targetPlatform(); } /** diff --git a/jdk/src/java.base/share/classes/java/lang/module/ModuleDescriptor.java b/jdk/src/java.base/share/classes/java/lang/module/ModuleDescriptor.java index 01b4316fa20..20d198b46ee 100644 --- a/jdk/src/java.base/share/classes/java/lang/module/ModuleDescriptor.java +++ b/jdk/src/java.base/share/classes/java/lang/module/ModuleDescriptor.java @@ -99,6 +99,7 @@ public class ModuleDescriptor * * @see ModuleDescriptor#modifiers() * @since 9 + * @spec JPMS */ public static enum Modifier { /** diff --git a/jdk/src/java.base/share/classes/java/lang/module/ModuleFinder.java b/jdk/src/java.base/share/classes/java/lang/module/ModuleFinder.java index 0be9d8d9eff..e0e6d883550 100644 --- a/jdk/src/java.base/share/classes/java/lang/module/ModuleFinder.java +++ b/jdk/src/java.base/share/classes/java/lang/module/ModuleFinder.java @@ -286,8 +286,9 @@ public interface ModuleFinder { * class names of provider classes. - + * main manifest, its value is a legal class name, and its package is + * in the set of packages derived for the module, then the value is the + * module {@linkplain ModuleDescriptor#mainClass() main class}. * * * @@ -298,8 +299,7 @@ public interface ModuleFinder { * file, where the JAR file contains a {@code .class} in the top-level * directory of the JAR file, where an entry in a service configuration * file is not a legal class name or its package name is not in the set of - * packages derived for the module, or where the module main class is not - * a legal class name or its package is not in the module. + * packages derived for the module. * *
If the JAR file has a {@code Main-Class} attribute in its - * main manifest then its value is the module {@link - * ModuleDescriptor#mainClass() main class}.
In addition to JAR files, an implementation may also support modules * that are packaged in other implementation specific module formats. If diff --git a/jdk/src/java.base/share/classes/java/lang/module/Resolver.java b/jdk/src/java.base/share/classes/java/lang/module/Resolver.java index 6adf93f8317..a723e638abe 100644 --- a/jdk/src/java.base/share/classes/java/lang/module/Resolver.java +++ b/jdk/src/java.base/share/classes/java/lang/module/Resolver.java @@ -28,6 +28,7 @@ package java.lang.module; import java.io.PrintStream; import java.lang.module.ModuleDescriptor.Provides; import java.lang.module.ModuleDescriptor.Requires.Modifier; +import java.net.URI; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Arrays; @@ -38,10 +39,8 @@ import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.Optional; import java.util.Set; -import java.util.StringJoiner; import java.util.stream.Collectors; import jdk.internal.module.ModuleHashes; @@ -69,12 +68,10 @@ final class Resolver { // true if all automatic modules have been found private boolean haveAllAutomaticModules; - // module constraints on target platform - private String osName; - private String osArch; + // constraint on target platform + private String targetPlatform; - String osName() { return osName; } - String osArch() { return osArch; } + String targetPlatform() { return targetPlatform; } /** * @throws IllegalArgumentException if there are more than one parent and @@ -89,37 +86,23 @@ final class Resolver { this.afterFinder = afterFinder; this.traceOutput = traceOutput; - // record constraints on target platform, checking that they don't conflict + // record constraint on target platform, checking for conflicts for (Configuration parent : parents) { - String value = parent.osName(); + String value = parent.targetPlatform(); if (value != null) { - if (osName == null) { - osName = value; + if (targetPlatform == null) { + targetPlatform = value; } else { - if (!value.equals(osName)) { - failParentConflict("Operating System", osName, value); - } - } - } - value = parent.osArch(); - if (value != null) { - if (osArch == null) { - osArch = value; - } else { - if (!value.equals(osArch)) { - failParentConflict("OS architecture", osArch, value); + if (!value.equals(targetPlatform)) { + String msg = "Parents have conflicting constraints on target" + + " platform: " + targetPlatform + ", " + value; + throw new IllegalArgumentException(msg); } } } } } - private void failParentConflict(String constraint, String s1, String s2) { - String msg = "Parents have conflicting constraints on target " - + constraint + ": " + s1 + ", " + s2; - throw new IllegalArgumentException(msg); - } - /** * Resolves the given named modules. * @@ -147,8 +130,7 @@ final class Resolver { } if (isTracing()) { - trace("Root module %s located", root); - mref.location().ifPresent(uri -> trace(" (%s)", uri)); + trace("root %s", nameAndInfo(mref)); } addFoundModule(mref); @@ -180,9 +162,7 @@ final class Resolver { ModuleDescriptor other = mref.descriptor(); q.offer(other); if (isTracing()) { - trace("Automatic module %s located, required by %s", - other.name(), descriptor.name()); - mref.location().ifPresent(uri -> trace(" (%s)", uri)); + trace("%s requires %s", descriptor.name(), nameAndInfo(mref)); } }); haveAllAutomaticModules = true; @@ -213,21 +193,13 @@ final class Resolver { } } + if (isTracing() && !dn.equals("java.base")) { + trace("%s requires %s", descriptor.name(), nameAndInfo(mref)); + } + if (!nameToReference.containsKey(dn)) { addFoundModule(mref); q.offer(mref.descriptor()); - - if (isTracing()) { - String prefix; - if (mref.descriptor().isAutomatic()) { - prefix = "Automatic module"; - } else { - prefix = "Module"; - } - trace(prefix + " %s located, required by %s", - dn, descriptor.name()); - mref.location().ifPresent(uri -> trace(" (%s)", uri)); - } } } @@ -291,6 +263,13 @@ final class Resolver { do { for (ModuleDescriptor descriptor : candidateConsumers) { if (!descriptor.uses().isEmpty()) { + + // the modules that provide at least one service + Set
modulesToBind = null; + if (isTracing()) { + modulesToBind = new HashSet<>(); + } + for (String service : descriptor.uses()) { Set mrefs = availableProviders.get(service); if (mrefs != null) { @@ -298,15 +277,13 @@ final class Resolver { ModuleDescriptor provider = mref.descriptor(); if (!provider.equals(descriptor)) { - trace("Module %s provides %s, used by %s", - provider.name(), service, descriptor.name()); + if (isTracing() && modulesToBind.add(provider)) { + trace("%s binds %s", descriptor.name(), + nameAndInfo(mref)); + } String pn = provider.name(); if (!nameToReference.containsKey(pn)) { - if (isTracing()) { - mref.location() - .ifPresent(uri -> trace(" (%s)", uri)); - } addFoundModule(mref); q.push(provider); } @@ -349,59 +326,31 @@ final class Resolver { if (mref instanceof ModuleReferenceImpl) { ModuleTarget target = ((ModuleReferenceImpl)mref).moduleTarget(); if (target != null) - checkTargetConstraints(mn, target); + checkTargetPlatform(mn, target); } nameToReference.put(mn, mref); } /** - * Check that the module's constraints on the target platform do not - * conflict with the constraints of other modules resolved so far or - * modules in parent configurations. + * Check that the module's constraints on the target platform does + * conflict with the constraint of other modules resolved so far. */ - private void checkTargetConstraints(String mn, ModuleTarget target) { - String value = target.osName(); + private void checkTargetPlatform(String mn, ModuleTarget target) { + String value = target.targetPlatform(); if (value != null) { - if (osName == null) { - osName = value; + if (targetPlatform == null) { + targetPlatform = value; } else { - if (!value.equals(osName)) { - failTargetConstraint(mn, target); - } - } - } - value = target.osArch(); - if (value != null) { - if (osArch == null) { - osArch = value; - } else { - if (!value.equals(osArch)) { - failTargetConstraint(mn, target); + if (!value.equals(targetPlatform)) { + findFail("Module %s has constraints on target platform (%s)" + + " that conflict with other modules: %s", mn, + value, targetPlatform); } } } } - private void failTargetConstraint(String mn, ModuleTarget target) { - String s1 = targetAsString(osName, osArch); - String s2 = targetAsString(target.osName(), target.osArch()); - findFail("Module %s has constraints on target platform (%s) that" - + " conflict with other modules: %s", mn, s1, s2); - } - - private String targetAsString(ModuleTarget target) { - return targetAsString(target.osName(), target.osArch()); - } - - private String targetAsString(String osName, String osArch) { - return new StringJoiner("-") - .add(Objects.toString(osName, "*")) - .add(Objects.toString(osArch, "*")) - .toString(); - } - - /** * Execute post-resolution checks and returns the module graph of resolved * modules as {@code Map}. The resolved modules will be in the given @@ -412,12 +361,6 @@ final class Resolver { Map > finish(Configuration cf, boolean check) { - if (isTracing()) { - trace("Result:"); - Set names = nameToReference.keySet(); - names.stream().sorted().forEach(name -> trace(" %s", name)); - } - if (check) { detectCycles(); checkHashes(); @@ -520,9 +463,8 @@ final class Resolver { findFail("Unable to compute the hash of module %s", dn); } - // skip checking the hash if the module has been patched ModuleReferenceImpl other = (ModuleReferenceImpl)mref2; - if (other != null && !other.isPatched()) { + if (other != null) { byte[] recordedHash = hashes.hashFor(dn); byte[] actualHash = other.computeHash(algorithm); if (actualHash == null) @@ -965,9 +907,17 @@ final class Resolver { private void trace(String fmt, Object ... args) { if (traceOutput != null) { - traceOutput.format("[Resolver] " + fmt, args); + traceOutput.format(fmt, args); traceOutput.println(); } } + private String nameAndInfo(ModuleReference mref) { + ModuleDescriptor descriptor = mref.descriptor(); + StringBuilder sb = new StringBuilder(descriptor.name()); + mref.location().ifPresent(uri -> sb.append(" " + uri)); + if (descriptor.isAutomatic()) + sb.append(" automatic"); + return sb.toString(); + } } diff --git a/jdk/src/java.base/share/classes/java/nio/file/FileSystems.java b/jdk/src/java.base/share/classes/java/nio/file/FileSystems.java index 08ff1f0d740..2754fa39c0a 100644 --- a/jdk/src/java.base/share/classes/java/nio/file/FileSystems.java +++ b/jdk/src/java.base/share/classes/java/nio/file/FileSystems.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 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 @@ -36,6 +36,8 @@ import java.util.Map; import java.util.ServiceConfigurationError; import java.util.ServiceLoader; +import jdk.internal.misc.VM; + /** * Factory methods for file systems. This class defines the {@link #getDefault * getDefault} method to get the default file system and factory methods to @@ -120,8 +122,8 @@ public final class FileSystems { // if the property java.nio.file.spi.DefaultFileSystemProvider is // set then its value is the name of the default provider (or a list) - String propValue = System - .getProperty("java.nio.file.spi.DefaultFileSystemProvider"); + String prop = "java.nio.file.spi.DefaultFileSystemProvider"; + String propValue = System.getProperty(prop); if (propValue != null) { for (String cn: propValue.split(",")) { try { @@ -184,7 +186,7 @@ public final class FileSystems { * @return the default file system */ public static FileSystem getDefault() { - if (jdk.internal.misc.VM.isBooted()) { + if (VM.isModuleSystemInited()) { return DefaultFileSystemHolder.defaultFileSystem; } else { return BuiltinFileSystemHolder.builtinFileSystem; diff --git a/jdk/src/java.base/share/classes/jdk/internal/loader/BuiltinClassLoader.java b/jdk/src/java.base/share/classes/jdk/internal/loader/BuiltinClassLoader.java index ce3bb67e8dd..5d1c97c6d25 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/loader/BuiltinClassLoader.java +++ b/jdk/src/java.base/share/classes/jdk/internal/loader/BuiltinClassLoader.java @@ -172,12 +172,10 @@ public class BuiltinClassLoader } /** - * Register a module this this class loader. This has the effect of making - * the types in the module visible. + * Register a module this class loader. This has the effect of making the + * types in the module visible. */ public void loadModule(ModuleReference mref) { - assert !VM.isModuleSystemInited(); - String mn = mref.descriptor().name(); if (nameToModule.putIfAbsent(mn, mref) != null) { throw new InternalError(mn + " already defined to this loader"); @@ -191,6 +189,11 @@ public class BuiltinClassLoader + other.mref().descriptor().name()); } } + + // clear resources cache if VM is already initialized + if (VM.isModuleSystemInited() && resourceCache != null) { + resourceCache = null; + } } /** @@ -355,7 +358,10 @@ public class BuiltinClassLoader private List findMiscResource(String name) throws IOException { SoftReference