Hi,
Thanks everyone for the feedback.
Chris, I've incorporated the changes you asked for, and they can be
found in the updated webrev here:
http://cr.openjdk.java.net/~pconcannon/7021373/webrevs/webrev.01/
I’ve taken the @throws IAE from DatagramPacket::getSocketAddress, and
logged it as a separate issue as it seems further work is needed in
deciding how to move forward with it. See
https://bugs.openjdk.java.net/browse/JDK-8237890
Kind regards,
Patrick
On 24/01/2020 16:36, Chris Hegarty wrote:
Maybe we can retain existing behaviour, while implicitly specifying
the IAE?
@@ -311,16 +312,21 @@
setAddress(addr.getAddress());
setPort(addr.getPort());
}
/**
* Gets the SocketAddress (usually IP address + port number) of
the remote
* host that this packet is being sent to or is coming from.
*
+ * <p> This method is the equivalent to invoking:
+ * <pre> {@code
+ * new InetSocketAddress(getAddress(), getPort())
+ * }</pre>
+ *
* @return the {@code SocketAddress}
* @since 1.4
* @see #setSocketAddress
*/
public synchronized SocketAddress getSocketAddress() {
return new InetSocketAddress(getAddress(), getPort());
}
This approach leans on the behaviour of other existing methods,
and show up further gaps in their specifications ( which should
be resolved anyway ) [*]
[*]
/**
* Returns the IP address of the machine to which this datagram
is being
* sent or from which the datagram was received.
*
* @return the IP address of the machine to which this datagram
is being
- * sent or from which the datagram was received.
+ * sent or from which the datagram was received; may be null
* @see java.net.InetAddress
* @see #setAddress(java.net.InetAddress)
*/
public synchronized InetAddress getAddress() {
return address;
}
/**
* Returns the port number on the remote host to which this
datagram is
* being sent or from which the datagram was received.
*
* @return the port number on the remote host to which this
datagram is
- * being sent or from which the datagram was received.
+ * being sent or from which the datagram was received;
{@code -1}
+ * if not set
* @see #setPort(int)
*/
public synchronized int getPort() {
return port;
}
/**
* Returns the data buffer. The data received or the data to be sent
-Chris.
On 24 Jan 2020, at 12:26, Alan Bateman <alan.bate...@oracle.com
<mailto:alan.bate...@oracle.com>> wrote:
On 24/01/2020 11:49, Daniel Fuchs wrote:
If I'm not mistaken, one side effect here is that this allows
the DatagramSocketAdaptor to throw IllegalArgumentException when
it is not connected and passed a DatagramPacket in which the port
as not been set.
Yes, that's the outlier I mentioned in the reply (that usage should
probably be changed anyway as the send shouldn't be create a
SocketAddress).
:
I wonder if it might be more prudent to just keep and document
the current behavior.
Maybe. We normally default to specifying the long standing behavior
but there are cases where the risk of fixing an issue is very low,
e.g DatagramSocket.send was changed recently to throw IAE for a case
that was previously unspecified and where the implementation threw an
accidental NPE.
-Alan.