On Sun, 17 Sep 2023 13:38:08 GMT, Aleksei Efimov <aefi...@openjdk.org> wrote:

> ### Summary 
> 
> The changes in this PR add new API to `java.net.InetAddress`, 
> `java.net.Inet4Address`, and
>  `java.net.Inet6Address` classes to parse IP address literals:
>  ```
> method public static java.net.InetAddress 
> java.net.InetAddress.ofLiteral(java.lang.String)
> method public static java.net.Inet4Address 
> java.net.Inet4Address.ofLiteral(java.lang.String)
> method public static java.net.InetAddress 
> java.net.Inet6Address.ofLiteral(java.lang.String)
> ``` 
> 
> ### How new methods differ from existing ones
> 
> These methods differ from `InetAddress.getByName` and 
> `InetAddress.getAllByName` in the following ways:
> 1. If a string supplied is not an address literal it is not forwarded to the 
> system-wide resolver, but IllegalArgumentException is thrown instead. The 
> system-wide resolver is never called from these new methods.
> 2. No reverse lookup is performed to resolve a hostname for the supplied 
> address literal - the `InetAddress[46 ]` instances returned by the new 
> `ofLiteral` API has no hostname set.
> 3. Each `ofLiteral` static method returns addresses of its class only. It 
> gives the ability to check if an IP address literal is of a specific address 
> type. 
> 
> ### The list of noteworthy changes
> - `IPv4-mapped IPv6 address` and `IPv4-compatible IPv6 addresses` require 
> some special handling in the new API to implement all supported IP address 
> types.  
> - All address literal parsing code has been moved from 
> `InetAddress.getAllByName` to address type-specific 
> `Inet4Address.parseAddressString` and `Inet6Address.parseAddressString` 
> methods.
> - The text with scoped IPv6 addresses architecture draft IETF file has been 
> replaced from `[draft-ietf-ipngwg-scoping-arch-04.txt]` to reference `RFC 
> 4007: IPv6 Scoped Address Architecture`. The "RFC 4007" has been also added 
> as `@ spec` into Inet6Address class-level Javadoc.
> 
> ### Testing 
> 
> `jdk-tier1`, `jdk-tier2`, and `jdk-tier3` test sets show no failure with the 
> changes.
> 
> `java/net` JCK tests are failing with new methods added failure (CSR is 
> planned for this change):
> 
> Added Methods
> -------------
> 
> java.net.Inet4Address:                  method public static 
> java.net.Inet4Address java.net.Inet4Address.ofLiteral(java.lang.String)
> java.net.Inet6Address:                  method public static 
> java.net.InetAddress java.net.Inet6Address.ofLiteral(java.lang.String)
> java.net.InetAddress:                   method public static 
> java.net.InetAddress java.net.InetAddress.ofLiteral(java.lang.String)

Thanks for all the comments/feedback/suggestions provided. They highlight the 
fact that this change requires additional work in the following areas:
- Improving new methods Javadoc to mention all supported IP address literal 
forms.
- Having Inet4Addres.ofLiteral responsible for parsing IPv4-mapped IPv6 
addresses looks strange. That will require method signature changes, but will 
keep javadoc and API less confusing.

In comming days I will work on fixing the above issues first. The methods name 
can be discussed after that.

The next iteration contains the following changes:

- Improvements to Javadoc of the new methods. That includes the addition of all 
supported IP address literal forms.
- `Inet4Addres.ofLiteral` is no longer capable of parsing IPv4-mapped IPv6 
address literals - it can be done with `Inet6Address.ofLiteral` instead.
- Added missing `null` checks for literal parameters.
- Added new test scenarios.

To restart the conversation around the method name, I've prepared the following 
table with a list of method names discussed during the previous review 
iteration:

| Name | Usage Example | Notes |
|-------|--------------|-------|
| `ofLiteral` | `InetAddress.ofLiteral` | Current version. Cleary conveys it 
takes only an IP literal. Matches its implementation. Good for IDE 
autocompletion. |
| `parse` | `InetAddress.parse` | The fact that only IP address literals are 
taken as a parameter is obscured a bit. But still suggests that the InetAddress 
instance is constructed by parsing some text. Good for IDE.|
| `parseLiteral` | `InetAddress.parseLiteral` | Method name changed to hint 
that an IP address literal is taken as a parameter. Good for IDE. Matches its 
implementation.|
| `getByAddress` | `InetAddress.getByAddress` | Overrides existing method in 
InetAddress, but adds new method to Inet4Address and Inet6Address. Introduces 
new meaning of `address` term - IP address literal string. In existing API the 
`address` means a raw byte array.|

My preference is to proceed with one of the following two:
`ofLiteral` or `parseLiteral`.

-------------

PR Comment: https://git.openjdk.org/jdk/pull/15775#issuecomment-1725438962
PR Comment: https://git.openjdk.org/jdk/pull/15775#issuecomment-1732371463
PR Comment: https://git.openjdk.org/jdk/pull/15775#issuecomment-1747264766

Reply via email to