RFR: 8298046: Fix hidden but significant trailing whitespace in properties files for serviceability code

Chris Plummer cjplummer at openjdk.org
Fri Dec 2 21:28:23 UTC 2022


On Fri, 2 Dec 2022 16:42:57 GMT, Magnus Ihse Bursie <ihse at openjdk.org> wrote:

> According to [the specification](https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/util/Properties.html#load(java.io.Reader)) trailing whitespaces in the values of properties files are (somewhat surprisingly) actually significant.
> 
> We have multiple files in the JDK with trailing whitespaces in the values. For most of this files, this is likely incorrect and due to oversight, but in a few cases it might actually be intended (like "The value is: ").
> 
> After a discussion in the PR for [JDK-8295729](https://bugs.openjdk.org/browse/JDK-8295729), the consensus was to replace valid trailing spaces with the corresponding unicode sequence, `\u0020`. (And of course remove non-wanted trailing spaces.)
> 
> Doing so has a dual benefit:
> 
> 1) It makes it clear to everyone reading the code that there is a trailing space and it is intended
> 
> 2) It will allow us to remove all actual trailing space characters, and turn on the corresponding check in jcheck to keep the properties files, just like all other source code files, free of trailing spaces.
> 
> Ultimately, the call of whether a trailing space is supposed to be there, or is a bug, lies with the respective component teams owning these files. Thus I have split up the set of properties files with trailing spaces in several groups, to match the JDK teams, and open a JBS issue for each of them. This issue is for code I believe belong with the serviceability team.

Changes requested by cjplummer (Reviewer).

src/jdk.jconsole/share/classes/sun/tools/jconsole/resources/messages_de.properties line 27:

> 25: 
> 26: ONE_DAY=\ 1 Tag
> 27: ONE_HOUR=\ 1 Stunde\u0020

Suggestion:

ONE_HOUR=\ 1 Stunde

src/jdk.jconsole/share/classes/sun/tools/jconsole/resources/messages_zh_CN.properties line 174:

> 172: MBEANS_TAB_UNSUBSCRIBE_NOTIFICATIONS_BUTTON=\u53D6\u6D88\u8BA2\u9605(&U)
> 173: MBEANS_TAB_UNSUBSCRIBE_NOTIFICATIONS_BUTTON_TOOLTIP=\u505C\u6B62\u76D1\u542C\u901A\u77E5
> 174: MANAGE_HOTSPOT_MBEANS_IN_COLON_=\u7BA1\u7406\u4EE5\u4E0B\u4F4D\u7F6E\u7684 HotSpot MBean:\u0020

Suggestion:

MANAGE_HOTSPOT_MBEANS_IN_COLON_=\u7BA1\u7406\u4EE5\u4E0B\u4F4D\u7F6E\u7684 HotSpot MBean:

src/jdk.jdi/share/classes/com/sun/tools/jdi/resources/jdi_de.properties line 37:

> 35: raw.description = Startet das Ziel mit einer vom Benutzer angegebenen Befehlszeile und wird daran angeh\u00E4ngt
> 36: sun.home = Home-Verzeichnis des SDK oder der Laufzeitumgebung, die zum Starten der Anwendung verwendet wird
> 37: sun.home.label = Home\u0020

Suggestion:

sun.home.label = Home

src/jdk.jdi/share/classes/com/sun/tools/jdi/resources/jdi_de.properties line 51:

> 49: generic_attaching.address = Adresse zum Anh\u00E4ngen f\u00FCr VM-Verbindungen
> 50: generic_attaching.address.label = Adresse
> 51: generic_attaching.timeout = Timeout beim Warten auf das Anh\u00E4ngen\u0020

Suggestion:

generic_attaching.timeout = Timeout beim Warten auf das Anh\u00E4ngen

src/jdk.jdi/share/classes/com/sun/tools/jdi/resources/jdi_ja.properties line 37:

> 35: raw.description = \u30E6\u30FC\u30B6\u30FC\u304C\u6307\u5B9A\u3057\u305F\u30B3\u30DE\u30F3\u30C9\u30E9\u30A4\u30F3\u3092\u4F7F\u7528\u3057\u3066\u30BF\u30FC\u30B2\u30C3\u30C8\u3092\u8D77\u52D5\u3057\u3001\u63A5\u7D9A\u3057\u307E\u3059
> 36: sun.home = SDK\u306E\u30DB\u30FC\u30E0\u30FB\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u307E\u305F\u306F\u3001\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3\u306E\u8D77\u52D5\u306B\u4F7F\u7528\u3055\u308C\u308B\u5B9F\u884C\u74B0\u5883
> 37: sun.home.label = \u30DB\u30FC\u30E0\u0020

Suggestion:

sun.home.label = \u30DB\u30FC\u30E0

src/jdk.jdi/share/classes/com/sun/tools/jdi/resources/jdi_ja.properties line 51:

> 49: generic_attaching.address = VM\u306B\u63A5\u7D9A\u3059\u308B\u30A2\u30C9\u30EC\u30B9
> 50: generic_attaching.address.label = \u30A2\u30C9\u30EC\u30B9
> 51: generic_attaching.timeout = \u63A5\u7D9A\u3092\u5F85\u3064\u9593\u306E\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u0020

Suggestion:

generic_attaching.timeout = \u63A5\u7D9A\u3092\u5F85\u3064\u9593\u306E\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8

src/jdk.jdi/share/classes/com/sun/tools/jdi/resources/jdi_zh_CN.properties line 37:

> 35: raw.description = \u4F7F\u7528\u7528\u6237\u6307\u5B9A\u7684\u547D\u4EE4\u884C\u542F\u52A8\u76EE\u6807\u5E76\u9644\u52A0\u5230\u8BE5\u76EE\u6807
> 36: sun.home = \u7528\u4E8E\u542F\u52A8\u5E94\u7528\u7A0B\u5E8F\u7684 SDK \u6216\u8FD0\u884C\u65F6\u73AF\u5883\u7684\u4E3B\u76EE\u5F55
> 37: sun.home.label = \u4E3B\u76EE\u5F55\u0020

Suggestion:

sun.home.label = \u4E3B\u76EE\u5F55

src/jdk.management.agent/share/classes/jdk/internal/agent/resources/agent.properties line 27:

> 25: 
> 26: agent.err.error			   = Error
> 27: agent.err.exception                = Exception thrown by the agent\u0020

Suggestion:

agent.err.exception                = Exception thrown by the agent

src/jdk.management.agent/share/classes/jdk/internal/agent/resources/agent.properties line 38:

> 36: 
> 37: agent.err.agentclass.notfound      = Management agent class not found
> 38: agent.err.agentclass.failed        = Management agent class failed\u0020

Suggestion:

agent.err.agentclass.failed        = Management agent class failed

src/jdk.management.agent/share/classes/jdk/internal/agent/resources/agent_de.properties line 27:

> 25: 
> 26: agent.err.error			   = Fehler
> 27: agent.err.exception                = Ausnahme von Agent ausgel\u00F6st\u0020

Suggestion:

agent.err.exception                = Ausnahme von Agent ausgel\u00F6st

src/jdk.management.agent/share/classes/jdk/internal/agent/resources/agent_es.properties line 27:

> 25: 
> 26: agent.err.error			   = Error
> 27: agent.err.exception                = Excepci\u00F3n devuelta por el agente\u0020

Suggestion:

agent.err.exception                = Excepci\u00F3n devuelta por el agente

src/jdk.management.agent/share/classes/jdk/internal/agent/resources/agent_es.properties line 38:

> 36: 
> 37: agent.err.agentclass.notfound      = Clase de agente de gesti\u00F3n no encontrada
> 38: agent.err.agentclass.failed        = Fallo de clase de agente de gesti\u00F3n\u0020

Suggestion:

agent.err.agentclass.failed        = Fallo de clase de agente de gesti\u00F3n

src/jdk.management.agent/share/classes/jdk/internal/agent/resources/agent_fr.properties line 27:

> 25: 
> 26: agent.err.error			   = Erreur
> 27: agent.err.exception                = Exception envoy\u00E9e par l'agent\u0020

Suggestion:

agent.err.exception                = Exception envoy\u00E9e par l'agent

src/jdk.management.agent/share/classes/jdk/internal/agent/resources/agent_fr.properties line 38:

> 36: 
> 37: agent.err.agentclass.notfound      = Classe d'agents de gestion introuvable
> 38: agent.err.agentclass.failed        = Echec de la classe d'agents de gestion\u0020

Suggestion:

agent.err.agentclass.failed        = Echec de la classe d'agents de gestion

src/jdk.management.agent/share/classes/jdk/internal/agent/resources/agent_it.properties line 27:

> 25: 
> 26: agent.err.error			   = Errore
> 27: agent.err.exception                = Eccezione dell'agente\u0020

Suggestion:

agent.err.exception                = Eccezione dell'agente

src/jdk.management.agent/share/classes/jdk/internal/agent/resources/agent_it.properties line 38:

> 36: 
> 37: agent.err.agentclass.notfound      = Classe agente gestione non trovata
> 38: agent.err.agentclass.failed        = Errore classe agente gestione\u0020

Suggestion:

agent.err.agentclass.failed        = Errore classe agente gestione

src/jdk.management.agent/share/classes/jdk/internal/agent/resources/agent_ja.properties line 27:

> 25: 
> 26: agent.err.error			   = \u30A8\u30E9\u30FC
> 27: agent.err.exception                = \u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u304C\u4F8B\u5916\u3092\u30B9\u30ED\u30FC\u3057\u307E\u3057\u305F\u0020

Suggestion:

agent.err.exception                = \u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u304C\u4F8B\u5916\u3092\u30B9\u30ED\u30FC\u3057\u307E\u3057\u305F

src/jdk.management.agent/share/classes/jdk/internal/agent/resources/agent_ja.properties line 38:

> 36: 
> 37: agent.err.agentclass.notfound      = \u7BA1\u7406\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u30FB\u30AF\u30E9\u30B9\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093
> 38: agent.err.agentclass.failed        = \u7BA1\u7406\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u30FB\u30AF\u30E9\u30B9\u304C\u5931\u6557\u3057\u307E\u3057\u305F\u0020

Suggestion:

agent.err.agentclass.failed        = \u7BA1\u7406\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u30FB\u30AF\u30E9\u30B9\u304C\u5931\u6557\u3057\u307E\u3057\u305F

src/jdk.management.agent/share/classes/jdk/internal/agent/resources/agent_ko.properties line 27:

> 25: 
> 26: agent.err.error			   = \uC624\uB958
> 27: agent.err.exception                = \uC5D0\uC774\uC804\uD2B8\uC5D0 \uC608\uC678\uC0AC\uD56D\uC774 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.\u0020

Suggestion:

agent.err.exception                = \uC5D0\uC774\uC804\uD2B8\uC5D0 \uC608\uC678\uC0AC\uD56D\uC774 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.

src/jdk.management.agent/share/classes/jdk/internal/agent/resources/agent_ko.properties line 38:

> 36: 
> 37: agent.err.agentclass.notfound      = \uAD00\uB9AC \uC5D0\uC774\uC804\uD2B8 \uD074\uB798\uC2A4\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
> 38: agent.err.agentclass.failed        = \uAD00\uB9AC \uC5D0\uC774\uC804\uD2B8 \uD074\uB798\uC2A4\uB97C \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.\u0020

Suggestion:

agent.err.agentclass.failed        = \uAD00\uB9AC \uC5D0\uC774\uC804\uD2B8 \uD074\uB798\uC2A4\uB97C \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.

src/jdk.management.agent/share/classes/jdk/internal/agent/resources/agent_pt_BR.properties line 27:

> 25: 
> 26: agent.err.error			   = Erro
> 27: agent.err.exception                = Exce\u00E7\u00E3o gerada pelo agente\u0020

Suggestion:

agent.err.exception                = Exce\u00E7\u00E3o gerada pelo agente

src/jdk.management.agent/share/classes/jdk/internal/agent/resources/agent_pt_BR.properties line 38:

> 36: 
> 37: agent.err.agentclass.notfound      = Classe do agente de gerenciamento n\u00E3o encontrada
> 38: agent.err.agentclass.failed        = Falha na classe do agente de gerenciamento\u0020

Suggestion:

agent.err.agentclass.failed        = Falha na classe do agente de gerenciamento

src/jdk.management.agent/share/classes/jdk/internal/agent/resources/agent_sv.properties line 27:

> 25: 
> 26: agent.err.error			   = Fel
> 27: agent.err.exception                = Agenten orsakade ett undantag\u0020

Suggestion:

agent.err.exception                = Agenten orsakade ett undantag

src/jdk.management.agent/share/classes/jdk/internal/agent/resources/agent_sv.properties line 38:

> 36: 
> 37: agent.err.agentclass.notfound      = Administrationsagentklassen hittades inte
> 38: agent.err.agentclass.failed        = Administrationsagentklassen utf\u00F6rdes inte\u0020

Suggestion:

agent.err.agentclass.failed        = Administrationsagentklassen utf\u00F6rdes inte

src/jdk.management.agent/share/classes/jdk/internal/agent/resources/agent_zh_CN.properties line 38:

> 36: 
> 37: agent.err.agentclass.notfound      = \u627E\u4E0D\u5230\u7BA1\u7406\u4EE3\u7406\u7C7B
> 38: agent.err.agentclass.failed        = \u7BA1\u7406\u4EE3\u7406\u7C7B\u5931\u8D25\u0020

Suggestion:

agent.err.agentclass.failed        = \u7BA1\u7406\u4EE3\u7406\u7C7B\u5931\u8D25

src/jdk.management.agent/share/classes/jdk/internal/agent/resources/agent_zh_CN.properties line 67:

> 65: agent.err.invalid.option	   = \u6307\u5B9A\u7684\u9009\u9879\u65E0\u6548
> 66: 
> 67: jmxremote.ConnectorBootstrap.starting = \u6B63\u5728\u542F\u52A8 JMX \u8FDE\u63A5\u5668\u670D\u52A1\u5668:\u0020

Suggestion:

jmxremote.ConnectorBootstrap.starting = \u6B63\u5728\u542F\u52A8 JMX \u8FDE\u63A5\u5668\u670D\u52A1\u5668:

src/jdk.management.agent/share/classes/jdk/internal/agent/resources/agent_zh_TW.properties line 27:

> 25: 
> 26: agent.err.error			   = \u932F\u8AA4
> 27: agent.err.exception                = \u4EE3\u7406\u7A0B\u5F0F\u767C\u751F\u7570\u5E38\u0020

Suggestion:

agent.err.exception                = \u4EE3\u7406\u7A0B\u5F0F\u767C\u751F\u7570\u5E38

src/jdk.management.agent/share/classes/jdk/internal/agent/resources/agent_zh_TW.properties line 38:

> 36: 
> 37: agent.err.agentclass.notfound      = \u627E\u4E0D\u5230\u7BA1\u7406\u4EE3\u7406\u7A0B\u5F0F\u985E\u5225
> 38: agent.err.agentclass.failed        = \u7BA1\u7406\u4EE3\u7406\u7A0B\u5F0F\u985E\u5225\u5931\u6557\u0020

Suggestion:

agent.err.agentclass.failed        = \u7BA1\u7406\u4EE3\u7406\u7A0B\u5F0F\u985E\u5225\u5931\u6557

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

PR: https://git.openjdk.org/jdk/pull/11490


More information about the serviceability-dev mailing list