You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by vv...@apache.org on 2010/04/13 10:52:24 UTC
svn commit: r933522 - in
/felix/trunk/webconsole/src/main/java/org/apache/felix/webconsole/internal:
Util.java servlet/ConfigurationListener2.java servlet/OsgiManager.java
Author: vvalchev
Date: Tue Apr 13 08:52:24 2010
New Revision: 933522
URL: http://svn.apache.org/viewvc?rev=933522&view=rev
Log:
Fixed FELIX-2267 /Improved locale detection/
https://issues.apache.org/jira/browse/FELIX-2267
Modified:
felix/trunk/webconsole/src/main/java/org/apache/felix/webconsole/internal/Util.java
felix/trunk/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/ConfigurationListener2.java
felix/trunk/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/OsgiManager.java
Modified: felix/trunk/webconsole/src/main/java/org/apache/felix/webconsole/internal/Util.java
URL: http://svn.apache.org/viewvc/felix/trunk/webconsole/src/main/java/org/apache/felix/webconsole/internal/Util.java?rev=933522&r1=933521&r2=933522&view=diff
==============================================================================
--- felix/trunk/webconsole/src/main/java/org/apache/felix/webconsole/internal/Util.java (original)
+++ felix/trunk/webconsole/src/main/java/org/apache/felix/webconsole/internal/Util.java Tue Apr 13 08:52:24 2010
@@ -142,6 +142,43 @@ public class Util
}
return l;
}
+
+ /**
+ * This method expects a locale string in format language_COUNTRY, or
+ * language. The method will determine which is the correct form of locale
+ * string and construct a <code>Locale</code> object.
+ *
+ * @param locale the locale string, if <code>null</code> - default locale is
+ * returned
+ * @return a locale object
+ * @see Locale
+ */
+ public static final Locale parseLocaleString(String locale)
+ {
+ if (locale == null)
+ {
+ return Locale.getDefault();
+ }
+ int idx = locale.indexOf('_');
+ String language;
+ String country = "";
+ if (idx < 0)
+ { // "en"
+ language = locale;
+ }
+ else
+ { // "en_US"
+ language = locale.substring(0, idx); // "en"
+ idx++; // "_"
+ int last = locale.indexOf('_', idx); // "US"
+ if (last < 0)
+ {
+ last = locale.length();
+ }
+ country = locale.substring(idx, last);
+ }
+ return new Locale(language, country);
+ }
private static final class BundleNameComparator implements Comparator
{
Modified: felix/trunk/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/ConfigurationListener2.java
URL: http://svn.apache.org/viewvc/felix/trunk/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/ConfigurationListener2.java?rev=933522&r1=933521&r2=933522&view=diff
==============================================================================
--- felix/trunk/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/ConfigurationListener2.java (original)
+++ felix/trunk/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/ConfigurationListener2.java Tue Apr 13 08:52:24 2010
@@ -94,6 +94,9 @@ class ConfigurationListener2 extends Con
adList.add( new AttributeDefinitionImpl( OsgiManager.PROP_PASSWORD, "Password",
"The password for the user allowed to access the OSGi Management Console.",
OsgiManager.DEFAULT_PASSWORD ) );
+ adList.add( new AttributeDefinitionImpl( OsgiManager.PROP_LOCALE, "Locale",
+ "If set, this locale forces the localization to use this locale instead of the one, requested by the web browser",
+ "" ) );
adList.add( new AttributeDefinitionImpl( OsgiManager.PROP_LOG_LEVEL, "Log Level", "Logging Level",
AttributeDefinition.INTEGER, new String[]
{ String.valueOf( OsgiManager.DEFAULT_LOG_LEVEL ) }, 0, new String[]
Modified: felix/trunk/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/OsgiManager.java
URL: http://svn.apache.org/viewvc/felix/trunk/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/OsgiManager.java?rev=933522&r1=933521&r2=933522&view=diff
==============================================================================
--- felix/trunk/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/OsgiManager.java (original)
+++ felix/trunk/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/OsgiManager.java Tue Apr 13 08:52:24 2010
@@ -18,6 +18,7 @@ package org.apache.felix.webconsole.inte
import java.io.IOException;
+import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Dictionary;
@@ -34,13 +35,16 @@ import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
+import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import org.apache.felix.webconsole.AbstractWebConsolePlugin;
import org.apache.felix.webconsole.BrandingPlugin;
import org.apache.felix.webconsole.WebConsoleConstants;
import org.apache.felix.webconsole.internal.OsgiManagerPlugin;
+import org.apache.felix.webconsole.internal.Util;
import org.apache.felix.webconsole.internal.core.BundlesServlet;
import org.apache.felix.webconsole.internal.filter.FilteringResponseWrapper;
import org.apache.felix.webconsole.internal.i18n.ResourceBundleManager;
@@ -90,6 +94,13 @@ public class OsgiManager extends Generic
*/
public static final String PARAM_NO_REDIRECT_AFTER_ACTION = "_noredir_";
+ /**
+ * The name of the cookie storing user-configured locale
+ * See https://issues.apache.org/jira/browse/FELIX-2267
+ */
+ private static final String COOKIE_LOCALE = "felix.webconsole.locale";
+
+
static final String PROP_MANAGER_ROOT = "manager.root";
static final String PROP_DEFAULT_RENDER = "default.render";
@@ -104,6 +115,8 @@ public class OsgiManager extends Generic
static final String PROP_LOG_LEVEL = "loglevel";
+ static final String PROP_LOCALE = "locale";
+
public static final int DEFAULT_LOG_LEVEL = LogService.LOG_WARNING;
static final String DEFAULT_PAGE = BundlesServlet.NAME;
@@ -163,6 +176,9 @@ public class OsgiManager extends Generic
private Dictionary configuration;
+ // See https://issues.apache.org/jira/browse/FELIX-2267
+ private Locale configuredLocale;
+
private Set enabledPlugins;
ResourceBundleManager resourceBundleManager;
@@ -313,7 +329,7 @@ public class OsgiManager extends Generic
}
- private void service( final HttpServletRequest request, HttpServletResponse response ) throws ServletException,
+ private void service( HttpServletRequest request, HttpServletResponse response ) throws ServletException,
IOException
{
// check whether we are not at .../{webManagerRoot}
@@ -336,6 +352,7 @@ public class OsgiManager extends Generic
slash = pathInfo.length();
}
+ final Locale locale = getConfiguredLocale( request );
final String label = pathInfo.substring( 1, slash );
AbstractWebConsolePlugin plugin = holder.getPlugin( label );
@@ -349,7 +366,7 @@ public class OsgiManager extends Generic
if ( plugin != null )
{
- final Map labelMap = holder.getLocalizedLabelMap( resourceBundleManager, request.getLocale() );
+ final Map labelMap = holder.getLocalizedLabelMap( resourceBundleManager, locale );
// the official request attributes
request.setAttribute( WebConsoleConstants.ATTR_LABEL_MAP, labelMap );
@@ -362,6 +379,7 @@ public class OsgiManager extends Generic
request.setAttribute( ATTR_APP_ROOT_OLD, request.getContextPath() + request.getServletPath() );
// wrap the response for localization and template variable replacement
+ request = wrapRequest( request, locale );
response = wrapResponse( request, response, plugin );
plugin.service( request, response );
@@ -372,6 +390,30 @@ public class OsgiManager extends Generic
}
}
+ // See https://issues.apache.org/jira/browse/FELIX-2267
+ private final Locale getConfiguredLocale(HttpServletRequest request)
+ {
+ Locale locale = null;
+
+ Cookie[] cookies = request.getCookies();
+ for (int i = 0; cookies != null && i < cookies.length; i++)
+ {
+ if (COOKIE_LOCALE.equals(cookies[i].getName()))
+ {
+ locale = Util.parseLocaleString(cookies[i].getValue());
+ break;
+ }
+ }
+
+ // TODO: check UserAdmin ?
+
+ if (locale == null)
+ locale = configuredLocale;
+ if (locale == null)
+ locale = request.getLocale();
+
+ return locale;
+ }
public void destroy()
{
@@ -468,6 +510,17 @@ public class OsgiManager extends Generic
}
}
+ private HttpServletRequest wrapRequest( final HttpServletRequest request, final Locale locale ) {
+ return new HttpServletRequestWrapper( request ) {
+ /**
+ * @see javax.servlet.ServletRequestWrapper#getLocale()
+ */
+ public Locale getLocale()
+ {
+ return locale;
+ }
+ };
+ }
private HttpServletResponse wrapResponse( final HttpServletRequest request, final HttpServletResponse response,
final AbstractWebConsolePlugin plugin )
@@ -643,6 +696,10 @@ public class OsgiManager extends Generic
configuration = config;
+ final Object locale = config.get( PROP_LOCALE );
+ configuredLocale = locale == null || locale.toString().trim().length() == 0 //
+ ? null : Util.parseLocaleString( locale.toString().trim() );
+
logLevel = getProperty( config, PROP_LOG_LEVEL, DEFAULT_LOG_LEVEL );
AbstractWebConsolePlugin.setLogLevel( logLevel );