RFR: 8343418: Unnecessary Hashtable usage in CSS.htmlAttrToCssAttrMap [v3]

Alexey Ivanov aivanov at openjdk.org
Tue Nov 12 14:41:01 UTC 2024


On Wed, 6 Nov 2024 06:40:52 GMT, Andrey Turbanov <aturbanov at openjdk.org> wrote:

>> If a thread-safe implementation is not needed, it is recommended to use HashMap instead of legacy synchronized Hashtable. 
>> Map `CSS.htmlAttrToCssAttrMap` is modified only within static initialization block and then only `get` method is called.
>> 
>> The only subtle difference is that Hashtable doesn't allow `null` keys and throws NPE from `get` method.
>> I've checked all possible keys which are passed to `htmlAttrToCssAttrMap.get`.
>> Currently 3 different execution paths are possible:
>> 
>> **1,2**
>> When `HTML.Attribute.BORDER` is passed as a key. It's definitely non-null.
>> 
>> javax.swing.text.html.CSS#translateHTMLToCSS
>>   translateAttribute(HTML.Attribute.BORDER, "1", cssAttrSet);
>>     CSS.Attribute[] cssAttrList = getCssAttribute(key);
>> 
>> 
>> javax.swing.text.html.CSS#translateAttributes
>>    translateAttribute(HTML.Attribute.BORDER, Integer.toString(borderWidth), cssAttrSet);
>>      CSS.Attribute[] cssAttrList = getCssAttribute(key);`
>> 
>> 
>> **3**
>> When non-null `key` is passed as a key.
>> 
>> javax.swing.text.html.CSS#translateAttributes
>> 
>>     if (name instanceof HTML.Attribute) { // from this `instanceof` we know that it's non-null
>>          HTML.Attribute key = (HTML.Attribute)name;
>> 
>>       translateAttribute(key, (String) htmlAttrSet.getAttribute(key), cssAttrSet);
>>         CSS.Attribute[] cssAttrList = getCssAttribute(key);
>> 
>> 
>> ![idea_analyze_dataflow_to_here](https://github.com/user-attachments/assets/48ace4de-6d0a-468e-bb14-b579a193254b)
>> 
>> 
>> I've used HashMap.newHashMap method instead of constructor to avoid resizing of internal HashMap array.
>
> Andrey Turbanov has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Use immutable map instead of HashMap.
>   It fits even better: has the same null handling as Hashtable

Looks good to me, except for a tiny nit.

I ran clientlibs tests, no failures found.

src/java.desktop/share/classes/javax/swing/text/html/CSS.java line 1119:

> 1117:         htmlAttrToCssAttrMap = Map.ofEntries(
> 1118:                 Map.entry(HTML.Attribute.COLOR,
> 1119:                         new CSS.Attribute[]{CSS.Attribute.COLOR}),

Suggestion:

                Map.entry(HTML.Attribute.COLOR,
                          new CSS.Attribute[]{CSS.Attribute.COLOR}),

I'd align the wrapped line to the opening parenthesis, the difference is subtle in this case, yet it would follow the style used previously.

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

Marked as reviewed by aivanov (Reviewer).

PR Review: https://git.openjdk.org/jdk/pull/21785#pullrequestreview-2429784833
PR Review Comment: https://git.openjdk.org/jdk/pull/21785#discussion_r1838214567


More information about the client-libs-dev mailing list