[15] RFR: 8239836: ZoneRules.of() doesn't check transitionList/standardOffsetTL arguments validity
Roger Riggs
Roger.Riggs at oracle.com
Mon Mar 9 20:06:46 UTC 2020
+1
On 3/9/20 12:05 PM, Joe Wang wrote:
> The changes look good to me.
>
> Best,
> Joe
>
> On 3/9/20 1:44 AM, Stephen Colebourne wrote:
>> Fine by me, but I'm not an OpenJDK Reviewer
>> Stephen
>>
>> On Mon, 9 Mar 2020 at 03:05, <naoto.sato at oracle.com> wrote:
>>> Thanks, Stephen.
>>>
>>> Updated the webrev for those two suggestions:
>>>
>>> http://cr.openjdk.java.net/~naoto/8239836/webrev.04/
>>>
>>> Naoto
>>>
>>> On 3/8/20 4:22 PM, Stephen Colebourne wrote:
>>>> standardOffsets[0] == wallOffsets[0] needs to use .equals()
>>>>
>>>> Unrelated, there is a Javadoc/spec error at line 578 of the "new"
>>>> file. It should be getValidOffsets, not getOffset.
>>>>
>>>> Apart from that, it looks good.
>>>>
>>>> thanks
>>>> Stephen
>>>>
>>>>
>>>> On Wed, 4 Mar 2020 at 19:06, <naoto.sato at oracle.com> wrote:
>>>>> Hi Stephen,
>>>>>
>>>>> Thank you for the detailed explanation and correcting the
>>>>> implementation. I incorporated all the suggestions below, as well as
>>>>> adding a new test for isFixedOffset() implementation (with some
>>>>> clean-up):
>>>>>
>>>>> https://cr.openjdk.java.net/~naoto/8239836/webrev.03/
>>>>>
>>>>> Please take a look at it.
>>>>>
>>>>> Naoto
>>>>>
>>>>> On 3/3/20 3:30 PM, Stephen Colebourne wrote:
>>>>>> I fear more changes are needed here.
>>>>>>
>>>>>> 1) The code is isFixedOffset() is indeed wrong, but the fix is
>>>>>> insufficient. The zone is fixed if baseStandardOffset=baseWallOffset
>>>>>> and all three other lists are empty. A fixed offset rule is the
>>>>>> equivalent of a ZoneOffset. See ZoneId.normalized() for the code
>>>>>> that
>>>>>> assumes that.
>>>>>>
>>>>>> 2) The code in getOffset(Instant) is wrong, but so is the proposed
>>>>>> fix. The purpose of the if statement is to optimise the following
>>>>>> few
>>>>>> lines which refer to savingsInstantTransitions and wallOffsets. The
>>>>>> code does have a bug as it should return the first wall offset.
>>>>>> Corrected code:
>>>>>> public ZoneOffset getOffset(Instant instant) {
>>>>>> if (savingsInstantTransitions.length == 0) {
>>>>>> return wallOffsets[0];
>>>>>> }
>>>>>> With the correct definition of isFixedOffset() it becomes apparent
>>>>>> that this if statement is in fact not related to the fixed offset.
>>>>>>
>>>>>> Currently this test case fails (a zone in DST for all eternity):
>>>>>> ZoneRules rules = ZoneRules.of(
>>>>>> ZoneOffset.ofHours(1),
>>>>>> ZoneOffset.ofHours(2),
>>>>>> Collections.emptyList(),
>>>>>> Collections.emptyList(),
>>>>>> Collections.emptyList());
>>>>>> assertEquals(rules.getStandardOffset(Instant.EPOCH),
>>>>>> ZoneOffset.ofHours(1));
>>>>>> assertEquals(rules.getOffset(Instant.EPOCH),
>>>>>> ZoneOffset.ofHours(2));
>>>>>>
>>>>>> 3) The code in getStandardOffset(Instant) also has an error as it
>>>>>> checks the wrong array. It should check standardTransitions as
>>>>>> that is
>>>>>> what is used in the following few lines. Corrected code:
>>>>>> public ZoneOffset getStandardOffset(Instant instant) {
>>>>>> if (standardTransitions.length == 0) {
>>>>>> return standardOffsets[0];
>>>>>> }
>>>>>>
>>>>>> 4) The code in getOffsetInfo(LocalDateTime dt) has a similar fault.
>>>>>> Since it protects savingsLocalTransitions, it should return
>>>>>> wallOffsets[0].
>>>>>>
>>>>>> 5) The code in getDaylightSavings(Instant instant) has an optimising
>>>>>> if statement that should refer to isFixedOffset().
>>>>>>
>>>>>> 6) Also, in the test.
>>>>>> assertTrue(!rules.isFixedOffset());
>>>>>> should be
>>>>>> assertFalse(rules.isFixedOffset());
>>>>>>
>>>>>> The class has worked so far as every normal case has
>>>>>> baseStandardOffset = baseWallOffset, even though it is conceptually
>>>>>> valid for this not to be true.
>>>>>>
>>>>>> Stephen
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Thu, 27 Feb 2020 at 20:42, <naoto.sato at oracle.com> wrote:
>>>>>>> Hello,
>>>>>>>
>>>>>>> Please review the fix to the following issue:
>>>>>>>
>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8239836
>>>>>>>
>>>>>>> The proposed changeset is located at:
>>>>>>>
>>>>>>> https://cr.openjdk.java.net/~naoto/8239836/webrev.00/
>>>>>>>
>>>>>>> It turned out that 'transitionList' is not necessarily a
>>>>>>> superset of
>>>>>>> 'standardOffsetTransitionList', as in some occasions where a
>>>>>>> standard
>>>>>>> offset change and a savings change happen at the same time
>>>>>>> (canceling
>>>>>>> each other), resulting in no wall time transition. This means
>>>>>>> that the
>>>>>>> "rules" in the sample code is a valid ZoneRules instance.
>>>>>>>
>>>>>>> However, there is an assumption in ZoneRules where no (wall time)
>>>>>>> transition means the fixed offset zone. With that assumption, the
>>>>>>> example rule is considered a fixed offset zone which is not
>>>>>>> correct. So
>>>>>>> the fix proposed here is not to throw an IAE but to recognize
>>>>>>> the rule
>>>>>>> as a valid, non-fixed offset ZoneRules instance.
>>>>>>>
>>>>>>> Naoto
>>>>>>>
>>>>>>>
>
More information about the core-libs-dev
mailing list