You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@knox.apache.org by Kevin Minder <ke...@hortonworks.com> on 2013/07/02 21:07:32 UTC
Fwd: Internationalization (i18n) and logging
Hi Everyone,
Below is an email I sent to Larry long ago (pre Apache Knox) about the
i18n and logging framework in the code. I thought I has put something
more thorough together previously but I can find it. This information
needs to be migrated to the Knox wiki.
Kevin.
-------- Original Message --------
Subject: Internationalization
Date: Thu, 03 Jan 2013 15:16:29 -0500
From: Kevin Minder <ke...@hortonworks.com>
To: Larry McCay <lm...@hortonworks.com>
Larry,
I've been meaning to mention this but I keep forgetting. I have a model
for i18n for both resources and message logging that I really like and I
want to make sure you understand how it works and can start using it.
Basically take a look at
ambari-gateway/gateway-server/src/main/java/org/apache/hadoop/gateway/GatewayMessages.java
ambari-gateway/gateway-server/src/main/java/org/apache/hadoop/gateway/GatewayResources.java
and then at the usages of some of these methods in say
ambari-gateway/gateway-server/src/main/java/org/apache/hadoop/gateway/GatewayServer.java
As private statics dynamic proxies are created for the interfaces.
private static GatewayResources res = ResourcesFactory.get(
GatewayResources.class );
private static GatewayMessages log = MessagesFactory.get(
GatewayMessages.class );
Then you can call the methods anywhere in the class
log.failedToParseCommandLine( e );
in this case
@Message( level = MessageLevel.FATAL, text = "Failed to parse command
line: {0}" )
void failedToParseCommandLine( @StackTrace( level =
MessageLevel.DEBUG ) ParseException e );
means log a message at level fatal and create the message from the text
and the toString of the param. If the logger level is debug or finer
the stack trace is also logged.
Resources are similar.
System.out.println( res.gatewayVersionMessage(
buildProperties.getProperty( "build.version", "unknown" ),
buildProperties.getProperty( "build.hash", "unknown" ) ) );
in this case
@Resource( text="Apache Hadoop Gateway {0} ({1})" )
String gatewayVersionMessage( String version, String hash );
will merge the version and hash information into the text and return it.
I haven't done it yet but I'll eventually write and APT
<http://docs.oracle.com/javase/1.5.0/docs/guide/apt/index.html> plugin
to extract the text in the annotation out into resource bundles for
translation.
*Note: My preference is to have one resource and message class for each
module but sometimes this doesn't make sense.*
If you are interested the code can be found at
ambari-gateway/gateway-i18n/src/main/java/org/apache/hadoop/gateway/i18n/**
*Note: The performance key here is to avoid as much as possible any
string concatenation. Pass all the parts to the message method and use
the format text to do the concatenation.* *Under the covers it uses the
**java.text.MessageFormat class so that is the syntax required.*
Kevin.
Re: Fwd: Internationalization (i18n) and logging
Posted by Kevin Minder <ke...@hortonworks.com>.
Found the writeup I did.
https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=31821870
On 7/2/13 3:07 PM, Kevin Minder wrote:
> Hi Everyone,
> Below is an email I sent to Larry long ago (pre Apache Knox) about the
> i18n and logging framework in the code. I thought I has put something
> more thorough together previously but I can find it. This information
> needs to be migrated to the Knox wiki.
> Kevin.
>
> -------- Original Message --------
> Subject: Internationalization
> Date: Thu, 03 Jan 2013 15:16:29 -0500
> From: Kevin Minder <ke...@hortonworks.com>
> To: Larry McCay <lm...@hortonworks.com>
>
>
>
> Larry,
> I've been meaning to mention this but I keep forgetting. I have a
> model for i18n for both resources and message logging that I really
> like and I want to make sure you understand how it works and can start
> using it.
>
> Basically take a look at
>
> ambari-gateway/gateway-server/src/main/java/org/apache/hadoop/gateway/GatewayMessages.java
> ambari-gateway/gateway-server/src/main/java/org/apache/hadoop/gateway/GatewayResources.java
>
> and then at the usages of some of these methods in say
> ambari-gateway/gateway-server/src/main/java/org/apache/hadoop/gateway/GatewayServer.java
>
> As private statics dynamic proxies are created for the interfaces.
> private static GatewayResources res = ResourcesFactory.get(
> GatewayResources.class );
> private static GatewayMessages log = MessagesFactory.get(
> GatewayMessages.class );
>
> Then you can call the methods anywhere in the class
> log.failedToParseCommandLine( e );
> in this case
> @Message( level = MessageLevel.FATAL, text = "Failed to parse
> command line: {0}" )
> void failedToParseCommandLine( @StackTrace( level =
> MessageLevel.DEBUG ) ParseException e );
> means log a message at level fatal and create the message from the
> text and the toString of the param. If the logger level is debug or
> finer the stack trace is also logged.
>
> Resources are similar.
> System.out.println( res.gatewayVersionMessage(
> buildProperties.getProperty( "build.version", "unknown" ),
> buildProperties.getProperty( "build.hash", "unknown" ) ) );
> in this case
> @Resource( text="Apache Hadoop Gateway {0} ({1})" )
> String gatewayVersionMessage( String version, String hash );
> will merge the version and hash information into the text and return it.
>
> I haven't done it yet but I'll eventually write and APT
> <http://docs.oracle.com/javase/1.5.0/docs/guide/apt/index.html> plugin
> to extract the text in the annotation out into resource bundles for
> translation.
> *Note: My preference is to have one resource and message class for
> each module but sometimes this doesn't make sense.*
>
> If you are interested the code can be found at
> ambari-gateway/gateway-i18n/src/main/java/org/apache/hadoop/gateway/i18n/**
>
> *Note: The performance key here is to avoid as much as possible any
> string concatenation. Pass all the parts to the message method and
> use the format text to do the concatenation.* *Under the covers it
> uses the **java.text.MessageFormat class so that is the syntax required.*
>
> Kevin.
>
>