On 15.08.2013 22:51, ma...@apache.org wrote: > Author: markt > Date: Thu Aug 15 20:51:38 2013 > New Revision: 1514485 > > URL: http://svn.apache.org/r1514485 > Log: > Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=55399 > Have the message in the response line use the locale set for the response. > > Modified: > tomcat/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java > tomcat/trunk/java/org/apache/coyote/http11/AbstractOutputBuffer.java > tomcat/trunk/java/org/apache/coyote/spdy/SpdyProcessor.java > tomcat/trunk/java/org/apache/tomcat/util/http/HttpMessages.java > > Modified: tomcat/trunk/java/org/apache/tomcat/util/http/HttpMessages.java > URL: > http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/http/HttpMessages.java?rev=1514485&r1=1514484&r2=1514485&view=diff > ============================================================================== > --- tomcat/trunk/java/org/apache/tomcat/util/http/HttpMessages.java (original) > +++ tomcat/trunk/java/org/apache/tomcat/util/http/HttpMessages.java Thu Aug > 15 20:51:38 2013 > @@ -16,6 +16,10 @@ > */ > package org.apache.tomcat.util.http; > > +import java.util.Locale; > +import java.util.Map; > +import java.util.concurrent.ConcurrentHashMap; > + > import org.apache.tomcat.util.res.StringManager; > > /** > @@ -28,14 +32,24 @@ import org.apache.tomcat.util.res.String > * @author cos...@eng.sun.com > */ > public class HttpMessages { > + > + private static final Map<Locale,HttpMessages> instances = > + new ConcurrentHashMap<>(); > + > + private static final HttpMessages DEFAULT = > getInstance(Locale.getDefault());
Problem here, see below. > + > // XXX move message resources in this package > - private static final StringManager sm = > - StringManager.getManager("org.apache.tomcat.util.http.res"); > + private final StringManager sm; > + > + private String st_200 = null; > + private String st_302 = null; > + private String st_400 = null; > + private String st_404 = null; > + > + private HttpMessages(StringManager sm) { > + this.sm = sm; > + } > > - private static String st_200=null; > - private static String st_302=null; > - private static String st_400=null; > - private static String st_404=null; > > /** Get the status string associated with a status code. > * No I18N - return the messages defined in the HTTP spec. > @@ -45,36 +59,53 @@ public class HttpMessages { > * Common messages are cached. > * > */ > - public static String getMessage( int status ) { > + public String getMessage(int status) { > // method from Response. > > // Does HTTP requires/allow international messages or > // are pre-defined? The user doesn't see them most of the time > switch( status ) { > case 200: > - if( st_200==null ) { > - st_200=sm.getString( "sc.200"); > + if(st_200 == null ) { > + st_200 = sm.getString("sc.200"); > } > return st_200; > case 302: > - if( st_302==null ) { > - st_302=sm.getString( "sc.302"); > + if(st_302 == null ) { > + st_302 = sm.getString("sc.302"); > } > return st_302; > case 400: > - if( st_400==null ) { > - st_400=sm.getString( "sc.400"); > + if(st_400 == null ) { > + st_400 = sm.getString("sc.400"); > } > return st_400; > case 404: > - if( st_404==null ) { > - st_404=sm.getString( "sc.404"); > + if(st_404 == null ) { > + st_404 = sm.getString("sc.404"); > } > return st_404; > } > return sm.getString("sc."+ status); > } > > + > + public static HttpMessages getInstance(Locale locale) { > + HttpMessages result = instances.get(locale); > + if (result == null) { > + StringManager sm = StringManager.getManager( > + "org.apache.tomcat.util.http.res", locale); > + if (Locale.getDefault().equals(sm.getLocale())) { > + result = DEFAULT; DEFAULT is set above by a call to this method here which already tries to use it. On one of my systems this leads to "result" being set to null here and ... > + } else { > + result = new HttpMessages(sm); > + } > + instances.put(locale, result); an NPE here because "instances" is a ConcurrentHashMap that doesn't allow null. After that no request processing is possible, because the static initializer setting DEFAULT had failed and any further use of this class leads to a java.lang.ExceptionInInitializerError. One solution might be setting private static final HttpMessages DEFAULT = new HttpMessages(StringManager.getManager("org.apache.tomcat.util.http.res", Locale.getDefault())); above. At least this worked for me. > + } > + return result; > + } > + > + Regards, Rainer --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org