On Wed, 19 Apr 2023 20:07:32 GMT, Justin Lu <j...@openjdk.org> wrote:

>> Update the registry and accompanying tests with the **IANA 4/13/2022** 
>> update.
>> 
>> This update introduces the case where an IANA entry can have a preferred 
>> value, but that preferred value has a preferred value as well.
>> 
>> This causes unexpected failures in JDK tests because of how locale 
>> equivalencies are created.
>> 
>> eg: `ar-ajp` has a preferred value of `ajp` but `ajp` has a preferred value 
>> of `apc`
>> 
>> Normally, when the JDK is built, _LocaleEquivlalentMaps.java_ generates the 
>> following
>> 
>> 
>> ...
>> singleEquivMap.put("ar-ajp", "ajp");
>> singleEquivMap.put("ajp", "ar-ajp");
>> ...
>> multiEquivsMap.put("ajp", new String[] {"apc", "ar-apc"});
>> multiEquivsMap.put("apc", new String[] {"ajp", "ar-apc"});
>> multiEquivsMap.put("ar-apc", new String[] {"apc", "ajp"});
>> ...
>> 
>> 
>> When `LocaleMatcher.parse(ACCEPT_LANGUAGE)` is called with `ACCEPT_LANGUAGE` 
>> containing `apc` and `ajp` in that order, the following occurs:
>> 
>> `apc` is found, `apc` is added, all of `apc's` equivalencies are added: 
>> `ajp` and `ar-apc`
>> 
>> When parse iterates to `ajp`, it finds that it is already added to the list, 
>> and does not add it's equivalency `ar-ajp`.
>> 
>> To address this, the build process must be adjusted so that the 
>> equivalencies are built as 
>> 
>> 
>> ...
>> multiEquivsMap.put("ajp", new String[] {"apc", "ar-ajp", "ar-apc"});
>> multiEquivsMap.put("apc", new String[] {"ajp", "ar-ajp", "ar-apc"});
>> multiEquivsMap.put("ar-ajp", new String[] {"apc", "ajp", "ar-apc"});
>> multiEquivsMap.put("ar-apc", new String[] {"apc", "ajp", "ar-ajp"});
>> ...
>> 
>> 
>> As, if `ar-ajp` has a preferred value of `ajp`, and `ajp` has a preferred 
>> value of `apc`, this technically means that `ar-ajp` is equivalent to `apc` 
>> and its equivalencies as well. This way, when 
>> `LocaleMatcher.parse(ACCEPT_LANGUAGE)` iterates to `apc`, it will add all of 
>> it's equivalencies including `ar-ajp`.
>
> Justin Lu has updated the pull request incrementally with one additional 
> commit since the last revision:
> 
>   Copyright

make/jdk/src/classes/build/tools/generatelsrequivmaps/EquivMapsGenerator.java 
line 2:

> 1: /*
> 2:  * Copyright (c) 2012, 2023, Oracle and/or its affiliates. All rights 
> reserved.

Cannot comment on unmodified lines, but instead of calculating the initial load 
itself, `HashMap.newHashMap()` can be used for initializing maps.

make/jdk/src/classes/build/tools/generatelsrequivmaps/EquivMapsGenerator.java 
line 144:

> 142:                 boolean foundInOther = false;
> 143:                 final String finalPref = ","+preferred;
> 144:                 final String inbtwnPref = ","+preferred+",";

This could utilize regex?

make/jdk/src/classes/build/tools/generatelsrequivmaps/EquivMapsGenerator.java 
line 146:

> 144:                 final String inbtwnPref = ","+preferred+",";
> 145:                 // Check if current pref exists inside a value for 
> another pref
> 146:                 List<StringBuilder> doublePrefs = 
> initialLanguageMap.entrySet()

`values()` fits here

make/jdk/src/classes/build/tools/generatelsrequivmaps/EquivMapsGenerator.java 
line 150:

> 148:                                 
> e.getValue().toString().contains(inbtwnPref)))
> 149:                         .map(Map.Entry::getValue)
> 150:                         .collect(Collectors.toList());

Can replace `collect()` with `toList()`

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

PR Review Comment: https://git.openjdk.org/jdk/pull/13501#discussion_r1171923706
PR Review Comment: https://git.openjdk.org/jdk/pull/13501#discussion_r1171920639
PR Review Comment: https://git.openjdk.org/jdk/pull/13501#discussion_r1171922562
PR Review Comment: https://git.openjdk.org/jdk/pull/13501#discussion_r1171923033

Reply via email to