RFR: 7017818 NLS: JConsoleResources.java cannot be handled by translation team

Mandy Chung mandy.chung at oracle.com
Thu May 24 10:00:36 PDT 2012


Thumbs up. Minor comment (no need for new webrev if you fix it):

Resources.java L46: the AssertionError is not needed since it can't get 
there.
L133:  would it be better to throw an internal error here to catch any 
regression e.g. if isWriteField is modified incorrectly for whatever reason?

Messages.java - it'd be good to add a comment there to describe that the 
names are auto-generated and there are some names with double underscore 
or ends with '_' that will help anyone who has question if they are 
typos or some convention we should follow.

Mandy

On 5/24/2012 9:20 AM, Erik Gahlin wrote:
> Here is an updated webrev:
> http://cr.openjdk.java.net/~egahlin/7017818_6/
>
> Changes from previous webrev:
>
> - Removed all @SuppressWarning changes
> - Moved the Messages class from sun.tools.jconsole.resource to 
> sun.tools.jconsole and updated the makefile
> - Aligned parameters in the method calls.
> - Changed CONNECTION_LOST back to CONNECTION_LOST1 and kept message 
> keys as is since they should work with the property files sent away.
>
> Erik
>
> Mandy Chung skrev 2012-05-22 23:49:
>> Erik,
>>
>> I approve what you have - please go through and fix the formatting 
>> nits.  I inlined my comment below and you can follow up them later if 
>> needed.
>>
>> On 5/22/2012 12:40 PM, Erik Gahlin wrote:
>>> Thanks for reviewing,
>>>
>>> I got a lot of unused import warnings from the IDE when I changed the
>>> Resources class. When I cleaned them up I thought I might as well 
>>> clean up the
>>> others too, so I could more easily see that I had taken care of all the
>>> warnings I caused. Same thing with unused member variables and 
>>> unused methods.
>>>
>>> Import-statements will not change how the program executes, so I 
>>> thought it
>>> was safe to remove them (no risk of introducing new bugs).
>>>
>>> ...
>>>>   Anyway,
>>>> the warning cleanup deserves a separate CR and review.
>>> Breaking it up into seperate patches and CRs will take time. Is it 
>>> really
>>> necessary?
>>
>> I'm okay for this patch to include the removal of unused imports and 
>> dead code fixes.  The warnings I referred to are the 
>> @SuppressedWarnings("serial") and rawtypes changes since it may 
>> require a separate pair of eyes to review them.   As a general 
>> advice, when the number of warnings cleaned up is not small, it's 
>> always recommended to separate them as two separate CRs for bug 
>> management and backport and it also helps the reviewers :)
>>
>> Since you have made the change along with the fix for this CR, I can 
>> understand why you said it will take time.  I also understand that 
>> you're under a time pressure.  I can go with what you have but please 
>> consider in the future when to separate the change in a separate CR.
>>
>>
>>>
>>> I cleaned up the code so I could make the fix more easily. I don't 
>>> think it's
>>> worth the hazzle to create a separate bug and patch. I might as well 
>>> revert
>>> the clean ups.
>>>
>>
>> BTW, backporting to an update release might request not to include 
>> the warnings cleanup.  I'm not sure the putback approval requirements 
>> for 7u6.
>>
>>>>
>>>> Below are comments on the change to support translateability.
>>>>
>>>> sun/tools/jconsole/resources/Messages.java
>>>>    I suggest to move Messages to sun.tools.jconsole since
>>>>    it's a utility class and conventionally resources are put
>>>>    in a "resources" subpackage (i.e. sun.tools.jconsole.resources
>>>>    in this case).
>>> I think one package private Message class for each package and separate
>>> resource files for each package would be the best, but I didn't want
>>> this CR to blow up, so I put the Message class where the other Java 
>>> classes
>>> related to resources were before.
>>>
>>> I can move it to sun.tools.jconsole, if you think that's better.
>>>
>>
>> I think so so that sun.tools.jconsole.resources.* are resource files.
>>
>>>>
>>>>    The initializeMessage  method uses the field name as the
>>>>    key and initializes its value to its localized message via
>>>>    reflection. Such approach seems strange.
>>> I like to enforce one-to-one mapping between the keys in the 
>>> property file and
>>> the keys used in the Java code. When going through the fields in the 
>>> Message
>>> class, using reflection, I can ensure that all fields have a 
>>> corresponding
>>> property value in the file, and vice versa.
>>>
>>> With this approrach it's not necessary click through all the GUI to 
>>> verify that
>>> all keys exists in the property file. It's also possible to detect 
>>> if a value
>>> in a property file is no longer in use.
>>>
>>> The code that does the one-to-one check was removed, but it should 
>>> probably be
>>> added back so similar problems can be catched automatically in the 
>>> future.
>>>
>>>>
>>>>    Have you considered about defining the constants with
>>>>    the key as the value (i.e. the variable name and its
>>>>    value are the same).
>>> The Java constants can't be the same as the property value
>>
>> I meant the key value in messages.properties (not the property 
>> value). Essentially variable and the value is the same e.g.  static 
>> final String ONE_DAY = "ONE_DAY";
>>
>>>>   Instead of initializing each
>>>>    static field of the Messages class, you can build
>>>>    a map of a key to the localized message + itsmnemonic
>>>>    key (like what you have done in building the MNEMONIC_LOOKUP
>>>>    map - why not change such hash map to map from a string to
>>>>    an object {message+mnemonic}).  In that case, the MNEMONIC_LOOKUP
>>>>    doesn't need to be a synchronized map and could be done
>>>>    as the class initialization of Resources class.
>>>>
>>>>    It would only need to keep
>>>>    Resources.getText(String) method that returns the localized
>>>>    message, e.g.
>>>>        Resources.getText(Messages.HELP_ABOUT_DIALOG_TITLE)
>>>>
>>>>    I just don't see it's worth the complexity to initialize
>>>>    the static fields via reflection to get rid of a convenience
>>>>    method.
>>>
>>> The synchronization is not really needed, if you always use the keys to
>>> lookup the messages. The static initializer in the Message class should
>>> ensure correct ordering.
>>>
>>> Looking up messages "dynamically" means you have to trigger all the
>>> code in the GUI that needs a translated message to be sure you got 
>>> things
>>> correct. Since there are several hundred messages I think the
>>> static-fields-reflection approach is better.
>>>
>>>>
>>>>
>>>>    It is only my suggestion and I understand that this fix needs
>>>>    to be backport to 7u6. If you agree that replacing this
>>>>    static field initialization logic with a separate map,
>>>>    I'm okay with pushing this approach to 7u6 and push
>>>>    a better fix to jdk8.   Or I miss the benefit you were
>>>>    considering :)
>>>
>>> You are missing it :)
>>>
>>> .. and it's probably because I removed the code that did the actual 
>>> check :)
>>>
>>
>> I agree that checking one-to-one mapping between the keys in the 
>> property file and
>> the keys used in the Java code is good.  What you need is to compare 
>> the list of constants with the keys in messages.properties.  Anyway, 
>> my suggestion was just to simplify such initialization.  You can go 
>> with what you have.
>>
>>>>     
>>>>    There are a few names with '_' suffix e.g. L93, 97, 104, 160
>>>>    and also some names with '__' (L97, 159).  Do you want to
>>>>    embed the space of the message in the key name?  In any case,
>>>>    the key names with '_' suffix or double underscores '__' is
>>>>    a little confusing.  It would be better just to use '_' for
>>>>    separating words of a key name and no need for '_' suffix.
>>>>    The names 'CHART_COLON', 'ERROR_COLON_MBEANS...', 'JCONSOLE_COLON',
>>>>    and the ones with 'COLON' to describe its message with ":"
>>>>    are strange.  If ":" was removed from the message in the
>>>>    future, the name would need to be modified to follow this
>>>>    naming convention which is overkill.
>>> The keys were generated programmatically.
>>>
>>
>> Ah - that's what I guess.
>>
>>> The 'COLON' was needed so I could differentiate between message that 
>>> looked
>>> the same, except for the ':' at the end. The pattern was applied to all
>>> messages. Some of those message were removed (since they were no 
>>> longer in use)
>>>
>>> I can remove the 'COLON'  suffix where it's not needed, same thing 
>>> with spaces.
>>>
>>
>> That'd be good since "COLON" and '_' is meaningless w.r.t. the key 
>> name.  IDE refactoring feature should make this renaming effortless :)
>>
>>> I will go over the message keys and clean up the names, but they 
>>> were not that
>>> clean before either :)
>>
>> Thanks.
>> Mandy
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/serviceability-dev/attachments/20120524/672786d2/attachment-0001.html 


More information about the serviceability-dev mailing list