RFR: 8072379: Implement jdk.Version and jdk.OracleVersion

joe darcy joe.darcy at oracle.com
Mon Nov 30 00:17:50 UTC 2015


PPS Perhaps this is already planned as future work, but it might be a 
kindness to those analyzing JDK version strings if there was a class 
that did a "best effort" at understanding Sun and Oracle JDK version 
strings pre-Verona to those post-Verona. In other words, a version class 
where

     new JdkVersion("1.8.0_25")

would have major() == 8 and minor() == 25, but have the specified 
meaning for strings for Verona strings where the first group was 
numerically 9 or larger.

Cheers,

-Joe

On 11/25/2015 3:57 PM, joe darcy wrote:
> PS If the concepts the two classes Version and OracleVersion are 
> trying to capture is a "Vendor-Version" then perhaps that can be 
> surfaced more directly in the API. That is, if the basic notion is to 
> interpret a version string in a way appropriate to and specialized for 
> a given vendor of the JDK (a la the java.vendor system property), then 
> perhaps a type like
>
> // API sketch
> public final class VendorVersion {
>     public VendorVersion(String vendor, Version version, 
> Comparator<Version> versionComp>) { ...}
>
>     @Override
>     public boolean equals(VendorVersion vv) {
>         // Usual instance of checks
>         return Objects.equals(vendor, vv.vendor()) && 
> versionComp.version(), vv.version());
>     }
>
>     int compareVersion(VendorVersion vv) {
>         if (!vendor.equals(vv.vendor()))
>             // throw an exception
>         return versionComp(version, vv.version);
>     }
>
>     // ...
> }
>
> might serve the purposes at hand.
>
> HTH,
>
> -Joe
>
> On 11/25/2015 1:31 PM, joe darcy wrote:
>> Hello,
>>
>> On 11/25/2015 8:48 AM, Mandy Chung wrote:
>>>> On Nov 24, 2015, at 5:54 PM, Iris Clark <iris.clark at oracle.com> wrote:
>>>>
>>>> Hi.
>>>>
>>>> Please review the new classes jdk.Version and jdk.OracleVersion.  
>>>> These are
>>>> simple Java APIs to parse, validate, and compare version numbers.
>>>>
>>>>   Webrev
>>>>
>>>> http://cr.openjdk.java.net/~irisa/verona/8072379/webrev.1/
>>> This looks good to me.  Alan raises a good question whether 
>>> jdk.OracleVersion is intended to be pushed to OpenJDK.
>>>
>>>
>>
>> I share the concerns that have been raised about the naming and 
>> placement of a class named "OracleVersion".
>>
>> Is the intention that downstream JDK distributions, such as IcedTea, 
>> whether based on OpenJDK or otherwise, would provide their own 
>> specialization of the jdk.Version class?
>>
>> If so, should there be some kind of provider interface to find 
>> system's the version interpreter?
>>
>> For example, what class, if any would be expected to provide detailed 
>> analysis of the version string emitted by, say, a OpenJDK build used 
>> as the reference implementation of Java SE 9?
>>
>> The equals / hashCode behavior of Version and OracleVersion is bit 
>> surprising and I think somewhat underspecified given the possibility 
>> of defining subclasses.
>>
>> The (overridable) equals method in Version says "Two Versions are 
>> equal if and only if they represent the same version string." If that 
>> is interpreted to mean the Versions are equal if their toString 
>> output is equal, the toString spec says "Returns a string 
>> representation of this version." and the (overridable) implementation 
>> in Version looks at versions, pre, build, and optional.
>>
>> Since OracleVersion does not override equals, a plain Version object 
>> and an OracleVersion object can compare as equal. Additionally, a 
>> VersionWithDifferentToStringOutput("1.2.3") object which overrides 
>> toString would not be semantically equivalent to a Version("1.2.3") 
>> object. Worse, there could be a non-communicability behavior in the 
>> equals method since
>>
>>     (new Version("1.2.3")).equals(new 
>> VersionWithDifferentToStringOutput("1.2.3"))
>>
>> could return "true" while
>>
>>     (new VersionWithDifferentToStringOutput("1.2.3")).equals(new 
>> Version("1.2.3"))
>>
>> could easily and legitimately return "false" by the specification.
>>
>> How is this API supposed to behave if the component version strings 
>> have a numerical value greater than Integer.MAX_VALUE?
>>
>> Was using Longs to record numerical versions rather than Integers 
>> considered?
>>
>> Thanks,
>>
>> -Joe
>




More information about the core-libs-dev mailing list