Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8274633

Drop support for pre JDK 1.4 DatagramSocketImpl implementations

XMLWordPrintable

    • Icon: CSR CSR
    • Resolution: Approved
    • Icon: P3 P3
    • 18
    • core-libs
    • None
    • behavioral
    • low
    • Hide
      Only DatagramSocketImpls which have been compiled on JDK 1.3 or older could be affected by this. In that case, java.net.DatagramSocket connections will now fail with an exception, because the connect() and disconnect() methods added in 1.4 will not be overriden. The methods leaveGroup() and joinGroup() will fail with an with an AbstractMethodError because the corresponding abstract mathod added in 1.4 will not be implemented. The risk is considered to be low because DatagramSocketImpl is a poorly specified API and it is thought unlikely that there are many implementations and even fewer that have not been compiled since 1.3.
      Show
      Only DatagramSocketImpls which have been compiled on JDK 1.3 or older could be affected by this. In that case, java.net.DatagramSocket connections will now fail with an exception, because the connect() and disconnect() methods added in 1.4 will not be overriden. The methods leaveGroup() and joinGroup() will fail with an with an AbstractMethodError because the corresponding abstract mathod added in 1.4 will not be implemented. The risk is considered to be low because DatagramSocketImpl is a poorly specified API and it is thought unlikely that there are many implementations and even fewer that have not been compiled since 1.3.
    • Java API

      Summary

      Drop support for java.net.DatagramSocketImpl implementations written prior to Java 1.4, specifically ones which do not have support for connected sockets, for peeking at received datagrams, and for joining and leaving a group at a specific interface. This support is legacy. Such implementations do not compile with JDK 1.4 or newer, so it should be relatively safe to drop this support.

      Problem

      We wish to resolve technical debt associated with java.net.DatagramSocket/MulticastSocket. For example, code that attempts to allow a connection to be made in a limited fashion with an old DatagramSocketImpl implementation, which does not implement the corresponding connect method that was later added to the DatagramSocketImpl interface.

      Solution

      The proposed solution is to remove the check for old impls. In addition, we are changing the default behavior of two concrete methods in DatagramSocketImpl: connect and disconnect. The default implementation of these methods was to do nothing, on the assumption that a missing implementation would be detected by the check for old impl. Now that this check is gone - we are changing the default implementation to throw an exception (a SocketException for connect, and a UncheckIOException for disconnect). Additional documentation for the exception clauses, and a corresponding @implSpec, will also be added to the javadoc for the connect and disconnect methods in DatagramSocketImpl where missing. This will inform users that they must provide their own implementations of these methods if they choose to provide their own DatagramSocketImpl implementation (see specification below). Note: DatagramSocket already specifies that SocketException (or UncheckedIOException) will be thrown if connect (or disconnect) fail to connect (or disconnect) - so no changes are needed in the DatagramSocket API specification.

      Specification

      This is binary incompatible insofar as a DatagramSocketImpl compiled with Java 1.3, or earlier would function in some limited way with later releases, but now will not function at all. This is a behavior change. The specification for the corresponding method will be updated will an @implSpec note to inform the user that they must provide their own implementations of these methods if they choose to provide their own DatagramSocketImpl implementation (see below).

      java/net/DatagramSocketImpl.java

          /**
           * Connects a datagram socket to a remote destination. This associates the remote
           * address with the local socket so that datagrams may only be sent to this destination
           * and received from this destination. This may be overridden to call a native
           * system connect.
           *
           * <p>If the remote destination to which the socket is connected does not
           * exist, or is otherwise unreachable, and if an ICMP destination unreachable
           * packet has been received for that address, then a subsequent call to
           * send or receive may throw a PortUnreachableException.
           * Note, there is no guarantee that the exception will be thrown.
           *
      +    * @implSpec The default implementation of this method throws {@code SocketException}.
           *
           * @param   address the remote InetAddress to connect to
           * @param   port the remote port number
           * @throws  SocketException may be thrown if the socket cannot be
           *          connected to the remote destination
           * @since   1.4
           */
          protected void connect(InetAddress address, int port) throws SocketException {
      
      
          /**
           * Disconnects a datagram socket from its remote destination.
           *
      +    * @implSpec The default implementation of this method throws {@code UncheckedIOException}.
           *
      +    * @throws UncheckedIOException if disconnect fails or no implementation is provided
           * @since 1.4
           */
          protected void disconnect() {

            pconcannon Patrick Concannon (Inactive)
            dfuchs Daniel Fuchs
            Alan Bateman, Daniel Fuchs
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

              Created:
              Updated:
              Resolved: