Author: mputz
Date: 2011-05-25 09:22:33 -0400 (Wed, 25 May 2011)
New Revision: 6561
Added:
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/component/portal/src/main/java/org/exoplatform/portal/Constants.java
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/component/resources/src/main/java/org/exoplatform/services/resources/LocaleContextInfo.java
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/component/resources/src/main/java/org/exoplatform/services/resources/LocalePolicy.java
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/component/web/src/main/java/org/exoplatform/web/application/ApplicationRequestPhaseLifecycle.java
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/component/web/src/main/java/org/exoplatform/web/application/Phase.java
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/application/localization/
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/application/localization/BaseHttpRequestWrapper.java
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/application/localization/DefaultLocalePolicyService.java
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/application/localization/HttpRequestWrapper.java
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/application/localization/LocalizationFilter.java
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/application/localization/LocalizationLifecycle.java
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/application/localization/NoBrowserLocalePolicyService.java
Modified:
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/portlet/exoadmin/src/main/java/org/exoplatform/organization/webui/component/UIUserInfo.java
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/web/portal/src/main/webapp/WEB-INF/web.xml
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/web/portal/src/main/webapp/WEB-INF/webui-configuration.xml
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/conf/portal/configuration.xml
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/application/PortalRequestContext.java
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/application/PortalRequestHandler.java
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/application/PortalStateManager.java
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/webui/application/ExoUserContext.java
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UILanguageSelector.java
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UIPortal.java
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UIPortalComposer.java
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/webui/workspace/UIPortalApplication.java
Log:
JBEPP-953: Backport of GTNPORTAL-1407 to EPP 5.0.0 to prevent loss of language selection
at session timeout in public mode
Added:
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/component/portal/src/main/java/org/exoplatform/portal/Constants.java
===================================================================
---
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/component/portal/src/main/java/org/exoplatform/portal/Constants.java
(rev 0)
+++
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/component/portal/src/main/java/org/exoplatform/portal/Constants.java 2011-05-25
13:22:33 UTC (rev 6561)
@@ -0,0 +1,35 @@
+/**
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.exoplatform.portal;
+
+/**
+ * @author <a href="trong.tran(a)exoplatform.com">Trong Tran</a>
+ * @version $Revision$
+ */
+
+public class Constants
+{
+ public static final String USER_LANGUAGE = "user.language";
+
+ public static final String USER_SKIN = "user.skin";
+
+ public static final String PORTAL_WINDOW_STATE = "portal:windowState";
+
+ public static final String PORTAL_PORTLET_MODE = "portal:portletMode";
+}
Added:
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/component/resources/src/main/java/org/exoplatform/services/resources/LocaleContextInfo.java
===================================================================
---
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/component/resources/src/main/java/org/exoplatform/services/resources/LocaleContextInfo.java
(rev 0)
+++
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/component/resources/src/main/java/org/exoplatform/services/resources/LocaleContextInfo.java 2011-05-25
13:22:33 UTC (rev 6561)
@@ -0,0 +1,237 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.exoplatform.services.resources;
+
+import java.util.List;
+import java.util.Locale;
+import java.util.Set;
+
+/**
+ * Data structure that holds the inputs for {@link LocalePolicy} pluggable policies
mechanism.
+ *
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class LocaleContextInfo
+{
+ private Set<Locale> supportedLocales;
+ private List<Locale> browserLocales;
+ private List<Locale> cookieLocales;
+ private Locale userProfileLocale;
+ private String remoteUser;
+ private Locale portalLocale;
+ private Locale sessionLocale;
+
+ /**
+ * Setter for supportedLocales
+ * @param supportedLocales locales supported by portal
+ */
+ public void setSupportedLocales(Set<Locale> supportedLocales)
+ {
+ this.supportedLocales = supportedLocales;
+ }
+
+ /**
+ * Getter for supportedLocales
+ * @return supportedLocales
+ */
+ public Set<Locale> getSupportedLocales()
+ {
+ return supportedLocales;
+ }
+
+ /**
+ * Setter for browserLocales
+ * @param browserLocales list of locales as preferred by client's browser
+ */
+ public void setBrowserLocales(List<Locale> browserLocales)
+ {
+ this.browserLocales = browserLocales;
+ }
+
+ /**
+ * Getter for browserLocales
+ * @return browserLocales
+ */
+ public List<Locale> getBrowserLocales()
+ {
+ return browserLocales;
+ }
+
+ /**
+ * Setter for cookieLocales
+ * @param cookieLocales locales stored in user's browser cookie
+ */
+ public void setCookieLocales(List<Locale> cookieLocales)
+ {
+ this.cookieLocales = cookieLocales;
+ }
+
+ /**
+ * Getter for cookieLocales
+ * @return cookieLocales
+ */
+ public List<Locale> getCookieLocales()
+ {
+ return cookieLocales;
+ }
+
+ /**
+ * Setter for userProfileLocale
+ * @param userProfileLocale locale loaded from user's profile
+ */
+ public void setUserProfileLocale(Locale userProfileLocale)
+ {
+ this.userProfileLocale = userProfileLocale;
+ }
+
+ /**
+ * Getter for userProfileLocale
+ * @return userProfileLocale
+ */
+ public Locale getUserProfileLocale()
+ {
+ return userProfileLocale;
+ }
+
+ /**
+ * Setter for remoteUser
+ * @param remoteUser username of the currently logged in user. Null for anonymous
users.
+ */
+ public void setRemoteUser(String remoteUser)
+ {
+ this.remoteUser = remoteUser;
+ }
+
+ /**
+ * Getter for remoteUser
+ * @return remoteUser
+ */
+ public String getRemoteUser()
+ {
+ return remoteUser;
+ }
+
+ /**
+ * Setter for portalLocale
+ * @param portalLocale default locale configured for the portal
+ */
+ public void setPortalLocale(Locale portalLocale)
+ {
+ this.portalLocale = portalLocale;
+ }
+
+ /**
+ * Getter for portalLocale
+ * @return portalLocale
+ */
+ public Locale getPortalLocale()
+ {
+ return portalLocale;
+ }
+
+ /**
+ * Setter for sessionLocale
+ * @param locale Locale stored in current session
+ */
+ public void setSessionLocale(Locale locale)
+ {
+ this.sessionLocale = locale;
+ }
+
+ /**
+ * Getter for sessionLocale
+ * @return sessionLocale
+ */
+ public Locale getSessionLocale()
+ {
+ return sessionLocale;
+ }
+
+ /**
+ * Helper method that returns the locale only if it's supported by portal.
+ * Otherwise it returns null.
+ *
+ * @param locale locale to check
+ * @return original locale if supported, null otherwise
+ */
+ public Locale getLocaleIfSupported(Locale locale)
+ {
+ if (locale == null)
+ return null;
+ if (supportedLocales.contains(locale))
+ return locale;
+ return null;
+ }
+
+ /**
+ * Helper method that returns the locale only if it's language is supported by
portal.
+ * Otherwise it returns null.
+ *
+ * @param locale locale to check
+ * @return original locale if language is supported, null otherwise
+ */
+ public Locale getLocaleIfLangSupported(Locale locale)
+ {
+ if (locale == null)
+ return null;
+ if (supportedLocales.contains(locale))
+ return locale;
+
+ if ("".equals(locale.getCountry()) == false)
+ {
+ Locale loc = new Locale(locale.getLanguage());
+ if (supportedLocales.contains(loc))
+ {
+ // return original locale
+ return locale;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Helper method to convert String representation of Locale into Locale object.
+ * @param portalLocaleName String representation of Locale
+ * @return locale
+ */
+ public static Locale getLocale(String portalLocaleName)
+ {
+ int pos = portalLocaleName.indexOf("_");
+ if (pos < 0)
+ return new Locale(portalLocaleName);
+
+ return new Locale(portalLocaleName.substring(0, pos),
portalLocaleName.substring(pos+1));
+ }
+
+ /**
+ * Helper method to get a String representation of the Locale
+ * @param locale
+ * @return String representation of the locale
+ */
+ public static String getLocaleAsString(Locale locale)
+ {
+ if (locale.getCountry().length() == 0)
+ return locale.getLanguage();
+
+ return locale.getLanguage() + "_" + locale.getCountry();
+ }
+}
Added:
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/component/resources/src/main/java/org/exoplatform/services/resources/LocalePolicy.java
===================================================================
---
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/component/resources/src/main/java/org/exoplatform/services/resources/LocalePolicy.java
(rev 0)
+++
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/component/resources/src/main/java/org/exoplatform/services/resources/LocalePolicy.java 2011-05-25
13:22:33 UTC (rev 6561)
@@ -0,0 +1,41 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.exoplatform.services.resources;
+
+import java.util.Locale;
+
+/**
+ * This interface represents a pluggable mechanism for different locale determining
algorithms
+ *
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public interface LocalePolicy
+{
+ /**
+ * Determine the Locale to be used for current request
+ *
+ * @param localeContext locale context info available to implementations
+ * as inputs to use when determining appropriate Locale
+ * @return Locale to be used for current user's request
+ */
+ public Locale determineLocale(LocaleContextInfo localeContext);
+}
Added:
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/component/web/src/main/java/org/exoplatform/web/application/ApplicationRequestPhaseLifecycle.java
===================================================================
---
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/component/web/src/main/java/org/exoplatform/web/application/ApplicationRequestPhaseLifecycle.java
(rev 0)
+++
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/component/web/src/main/java/org/exoplatform/web/application/ApplicationRequestPhaseLifecycle.java 2011-05-25
13:22:33 UTC (rev 6561)
@@ -0,0 +1,47 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.exoplatform.web.application;
+
+/**
+ * Interface that extends {@link ApplicationLifecycle} with request phase methods that
allow interception of
+ * before/after ACTION phase, and before/after RENDER phase of request processing.
+ *
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public interface ApplicationRequestPhaseLifecycle<E extends RequestContext> extends
ApplicationLifecycle<E>
+{
+ /**
+ * Perform any processing required at the beginning of {@link Phase#ACTION} or {@link
Phase#RENDER} phase.
+ * @param app Application
+ * @param context current RequestContext
+ * @param phase starting phase
+ */
+ public void onStartRequestPhase(Application app, E context, Phase phase);
+
+ /**
+ * Perform any processing required at the end of {@link Phase#ACTION} or {@link
Phase#RENDER} phase.
+ * @param app Application
+ * @param context current RequestContext
+ * @param phase ending phase
+ */
+ public void onEndRequestPhase(Application app, E context, Phase phase);
+}
Added:
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/component/web/src/main/java/org/exoplatform/web/application/Phase.java
===================================================================
---
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/component/web/src/main/java/org/exoplatform/web/application/Phase.java
(rev 0)
+++
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/component/web/src/main/java/org/exoplatform/web/application/Phase.java 2011-05-25
13:22:33 UTC (rev 6561)
@@ -0,0 +1,33 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.exoplatform.web.application;
+
+/**
+ * Enum representing request processing phases.
+ *
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public enum Phase
+{
+ ACTION,
+ RENDER
+}
Modified:
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/portlet/exoadmin/src/main/java/org/exoplatform/organization/webui/component/UIUserInfo.java
===================================================================
---
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/portlet/exoadmin/src/main/java/org/exoplatform/organization/webui/component/UIUserInfo.java 2011-05-25
09:27:20 UTC (rev 6560)
+++
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/portlet/exoadmin/src/main/java/org/exoplatform/organization/webui/component/UIUserInfo.java 2011-05-25
13:22:33 UTC (rev 6561)
@@ -20,6 +20,8 @@
package org.exoplatform.organization.webui.component;
import org.exoplatform.commons.serialization.api.annotations.Serialized;
+import org.exoplatform.portal.Constants;
+import org.exoplatform.portal.application.PortalRequestContext;
import org.exoplatform.portal.webui.util.Util;
import org.exoplatform.portal.webui.workspace.UIPortalApplication;
import org.exoplatform.portal.webui.workspace.UIWorkingWorkspace;
@@ -123,7 +125,7 @@
{
UserProfileHandler hanlder = service.getUserProfileHandler();
UserProfile userProfile =
hanlder.findUserProfileByName(event.getRequestContext().getRemoteUser());
- String language = userProfile.getAttribute("user.language");
+ String language = userProfile.getAttribute(Constants.USER_LANGUAGE);
UIPortalApplication uiApp = Util.getUIPortalApplication();
if (language == null || language.trim().length() < 1)
@@ -133,9 +135,8 @@
LocaleConfig localeConfig = localeConfigService.getLocaleConfig(language);
if (localeConfig == null)
localeConfig = localeConfigService.getDefaultLocaleConfig();
- uiApp.setLocale(localeConfig.getLocale());
- uiApp.setOrientation(localeConfig.getOrientation());
- uiApp.localizeNavigations();
+ PortalRequestContext prqCtx = Util.getPortalRequestContext();
+ prqCtx.setLocale(localeConfig.getLocale());
Util.getPortalRequestContext().addUIComponentToUpdateByAjax(
uiApp.findFirstComponentOfType(UIWorkingWorkspace.class));
Modified:
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/web/portal/src/main/webapp/WEB-INF/web.xml
===================================================================
---
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/web/portal/src/main/webapp/WEB-INF/web.xml 2011-05-25
09:27:20 UTC (rev 6560)
+++
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/web/portal/src/main/webapp/WEB-INF/web.xml 2011-05-25
13:22:33 UTC (rev 6561)
@@ -21,10 +21,11 @@
-->
-<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application
2.3//EN"
- "http://java.sun.com/dtd/web-app_2_3.dtd">
-<web-app>
- <display-name>portal</display-name>
+<web-app
xmlns="http://java.sun.com/xml/ns/j2ee"
+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
+
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
+ version="2.4"> <display-name>portal</display-name>
<!--Uncomment for clustered setup-->
<!--
@@ -34,13 +35,13 @@
<context-param>
<param-name>org.exoplatform.frameworks.jcr.command.web.fckeditor.digitalAssetsWorkspace</param-name>
<param-value>portal</param-value>
- <description>Binary assets workspace name</description>
+ <!-- Binary assets workspace name -->
</context-param>
<context-param>
<param-name>org.exoplatform.frameworks.jcr.command.web.fckeditor.digitalAssetsPath</param-name>
<param-value>/</param-value>
- <description>Binary assets path</description>
+ <!-- Binary assets path -->
</context-param>
<!-- ================================================================== -->
@@ -50,6 +51,10 @@
<filter-name>GenericFilter</filter-name>
<filter-class>org.exoplatform.web.filter.GenericFilter</filter-class>
</filter>
+ <filter>
+ <filter-name>LocalizationFilter</filter-name>
+ <filter-class>org.exoplatform.portal.application.localization.LocalizationFilter</filter-class>
+ </filter>
<filter>
<filter-name>ResourceRequestFilter</filter-name>
<filter-class>org.exoplatform.portal.application.ResourceRequestFilter</filter-class>
@@ -101,6 +106,20 @@
<url-pattern>/*</url-pattern>
</filter-mapping>
+ <filter-mapping>
+ <filter-name>LocalizationFilter</filter-name>
+ <!-- use a wider pattern or additional mappings to include custom resources
+ that require request.getLocale() to reflect user's portal page language.
+ LocalizationFilter is re-entrant - you can safely use it as the following:
+ <url-pattern>/*</url-pattern>
+ -->
+ <url-pattern>*.jsp</url-pattern>
+ <dispatcher>INCLUDE</dispatcher>
+ <dispatcher>FORWARD</dispatcher>
+ <dispatcher>REQUEST</dispatcher>
+ <dispatcher>ERROR</dispatcher>
+ </filter-mapping>
+
<filter-mapping>
<filter-name>GenericFilter</filter-name>
<url-pattern>/*</url-pattern>
@@ -178,7 +197,7 @@
<servlet>
<servlet-name>RestServer</servlet-name>
- <description>eXo - Platform REST Server</description>
+ <!-- eXo - Platform REST Server -->
<servlet-class>org.exoplatform.services.rest.servlet.RestServlet</servlet-class>
<load-on-startup>4</load-on-startup>
</servlet>
Modified:
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/web/portal/src/main/webapp/WEB-INF/webui-configuration.xml
===================================================================
---
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/web/portal/src/main/webapp/WEB-INF/webui-configuration.xml 2011-05-25
09:27:20 UTC (rev 6560)
+++
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/web/portal/src/main/webapp/WEB-INF/webui-configuration.xml 2011-05-25
13:22:33 UTC (rev 6561)
@@ -37,6 +37,7 @@
<listener>org.exoplatform.portal.application.PortalApplicationLifecycle</listener>
<listener>org.exoplatform.webui.application.MonitorApplicationLifecycle</listener>
<listener>org.exoplatform.portal.application.UserProfileLifecycle</listener>
+
<listener>org.exoplatform.portal.application.localization.LocalizationLifecycle</listener>
</application-lifecycle-listeners>
<events>
Modified:
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/conf/portal/configuration.xml
===================================================================
---
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/conf/portal/configuration.xml 2011-05-25
09:27:20 UTC (rev 6560)
+++
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/conf/portal/configuration.xml 2011-05-25
13:22:33 UTC (rev 6561)
@@ -30,5 +30,11 @@
<component>
<type>org.exoplatform.portal.application.PortalStatisticService</type>
- </component>
+ </component>
+
+ <component>
+ <key>org.exoplatform.services.resources.LocalePolicy</key>
+
<!--type>org.exoplatform.portal.application.NoBrowserLocalePolicyService</type-->
+
<type>org.exoplatform.portal.application.localization.DefaultLocalePolicyService</type>
+ </component>
</configuration>
Modified:
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/application/PortalRequestContext.java
===================================================================
---
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/application/PortalRequestContext.java 2011-05-25
09:27:20 UTC (rev 6560)
+++
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/application/PortalRequestContext.java 2011-05-25
13:22:33 UTC (rev 6561)
@@ -118,6 +118,8 @@
private Map<String, String[]> parameterMap;
+ private Locale locale = Locale.ENGLISH;
+
public JavascriptManager getJavascriptManager()
{
return jsmanager_;
@@ -243,9 +245,14 @@
return ((UIPortalApplication)uiApplication_).getOrientation();
}
+ public void setLocale(Locale locale)
+ {
+ this.locale = locale;
+ }
+
public Locale getLocale()
{
- return ((UIPortalApplication)uiApplication_).getLocale();
+ return locale;
}
@SuppressWarnings("unchecked")
Modified:
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/application/PortalRequestHandler.java
===================================================================
---
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/application/PortalRequestHandler.java 2011-05-25
09:27:20 UTC (rev 6560)
+++
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/application/PortalRequestHandler.java 2011-05-25
13:22:33 UTC (rev 6561)
@@ -25,6 +25,8 @@
import org.exoplatform.web.WebAppController;
import org.exoplatform.web.WebRequestHandler;
import org.exoplatform.web.application.ApplicationLifecycle;
+import org.exoplatform.web.application.ApplicationRequestPhaseLifecycle;
+import org.exoplatform.web.application.Phase;
import org.exoplatform.webui.application.WebuiRequestContext;
import org.exoplatform.webui.core.UIApplication;
@@ -102,11 +104,17 @@
if (!context.isResponseComplete() && !context.getProcessRender())
{
+ startRequestPhaseLifecycle(app, context, lifecycles, Phase.ACTION);
uiApp.processAction(context);
+ endRequestPhaseLifecycle(app, context, lifecycles, Phase.ACTION);
}
if (!context.isResponseComplete())
+ {
+ startRequestPhaseLifecycle(app, context, lifecycles, Phase.RENDER);
uiApp.processRender(context);
+ endRequestPhaseLifecycle(app, context, lifecycles, Phase.RENDER);
+ }
if (uiApp != null)
uiApp.setLastAccessApplication(System.currentTimeMillis());
@@ -137,4 +145,24 @@
WebuiRequestContext.setCurrentInstance(null);
}
}
+
+ private void startRequestPhaseLifecycle(PortalApplication app, PortalRequestContext
context,
+ List<ApplicationLifecycle> lifecycles,
Phase phase)
+ {
+ for (ApplicationLifecycle lifecycle : lifecycles)
+ {
+ if (lifecycle instanceof ApplicationRequestPhaseLifecycle)
+ ((ApplicationRequestPhaseLifecycle) lifecycle).onStartRequestPhase(app,
context, phase);
+ }
+ }
+
+ private void endRequestPhaseLifecycle(PortalApplication app, PortalRequestContext
context,
+ List<ApplicationLifecycle> lifecycles,
Phase phase)
+ {
+ for (ApplicationLifecycle lifecycle : lifecycles)
+ {
+ if (lifecycle instanceof ApplicationRequestPhaseLifecycle)
+ ((ApplicationRequestPhaseLifecycle) lifecycle).onEndRequestPhase(app,
context, phase);
+ }
+ }
}
Modified:
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/application/PortalStateManager.java
===================================================================
---
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/application/PortalStateManager.java 2011-05-25
09:27:20 UTC (rev 6560)
+++
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/application/PortalStateManager.java 2011-05-25
13:22:33 UTC (rev 6561)
@@ -141,7 +141,7 @@
// For now do nothing....
}
- private UserPortalConfig getUserPortalConfig(PortalRequestContext context) throws
Exception
+ public static UserPortalConfig getUserPortalConfig(PortalRequestContext context)
throws Exception
{
ExoContainer appContainer =
context.getApplication().getApplicationServiceContainer();
UserPortalConfigService service_ =
(UserPortalConfigService)appContainer.getComponentInstanceOfType(UserPortalConfigService.class);
Added:
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/application/localization/BaseHttpRequestWrapper.java
===================================================================
---
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/application/localization/BaseHttpRequestWrapper.java
(rev 0)
+++
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/application/localization/BaseHttpRequestWrapper.java 2011-05-25
13:22:33 UTC (rev 6561)
@@ -0,0 +1,497 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.exoplatform.portal.application.localization;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.security.Principal;
+import java.util.Enumeration;
+import java.util.Locale;
+import java.util.Map;
+
+/**
+ * This class is an alternative for {@link
javax.servlet.http.HttpServletRequestWrapper}.
+ * One reason for favoring it is to avoid situations when servlet container decides to
replace
+ * the delegate via {@link
javax.servlet.ServletRequestWrapper#setRequest(javax.servlet.ServletRequest)}.
+ *
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class BaseHttpRequestWrapper implements HttpServletRequest
+{
+
+ private HttpServletRequest delegate;
+
+ /**
+ * Create new instance
+ * @param request delegate {@link HttpServletRequest}
+ */
+ public BaseHttpRequestWrapper(HttpServletRequest request)
+ {
+ delegate = request;
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getAuthType()
+ */
+ public String getAuthType()
+ {
+ return delegate.getAuthType();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getCookies()
+ */
+ public Cookie[] getCookies()
+ {
+ return delegate.getCookies();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getDateHeader(String)
+ */
+ public long getDateHeader(String name)
+ {
+ return delegate.getDateHeader(name);
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getHeader(String)
+ */
+ public String getHeader(String name)
+ {
+ return delegate.getHeader(name);
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getHeaders(String)
+ */
+ public Enumeration getHeaders(String name)
+ {
+ return delegate.getHeaders(name);
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getHeaderNames()
+ */
+ public Enumeration getHeaderNames()
+ {
+ return delegate.getHeaderNames();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getIntHeader(String)
+ */
+ public int getIntHeader(String name)
+ {
+ return delegate.getIntHeader(name);
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getMethod()
+ */
+ public String getMethod()
+ {
+ return delegate.getMethod();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getPathInfo()
+ */
+ public String getPathInfo()
+ {
+ return delegate.getPathInfo();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getPathTranslated()
+ */
+ public String getPathTranslated()
+ {
+ return delegate.getPathTranslated();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getContextPath()
+ */
+ public String getContextPath()
+ {
+ return delegate.getContextPath();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getQueryString()
+ */
+ public String getQueryString()
+ {
+ return delegate.getQueryString();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getRemoteUser()
+ */
+ public String getRemoteUser()
+ {
+ return delegate.getRemoteUser();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#isUserInRole(String)
+ */
+ public boolean isUserInRole(String role)
+ {
+ return delegate.isUserInRole(role);
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getUserPrincipal()
+ */
+ public Principal getUserPrincipal()
+ {
+ return delegate.getUserPrincipal();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getRequestedSessionId()
+ */
+ public String getRequestedSessionId()
+ {
+ return delegate.getRequestedSessionId();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getRequestURI()
+ */
+ public String getRequestURI()
+ {
+ return delegate.getRequestURI();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getRequestURL()
+ */
+ public StringBuffer getRequestURL()
+ {
+ return delegate.getRequestURL();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getServletPath()
+ */
+ public String getServletPath()
+ {
+ return delegate.getServletPath();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getSession(boolean)
+ */
+ public HttpSession getSession(boolean create)
+ {
+ return delegate.getSession(create);
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getSession()
+ */
+ public HttpSession getSession()
+ {
+ return delegate.getSession();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#isRequestedSessionIdValid()
+ */
+ public boolean isRequestedSessionIdValid()
+ {
+ return delegate.isRequestedSessionIdValid();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#isRequestedSessionIdFromCookie()
+ */
+ public boolean isRequestedSessionIdFromCookie()
+ {
+ return delegate.isRequestedSessionIdFromCookie();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#isRequestedSessionIdFromURL()
+ */
+ public boolean isRequestedSessionIdFromURL()
+ {
+ return delegate.isRequestedSessionIdFromURL();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#isRequestedSessionIdFromUrl()
+ */
+ public boolean isRequestedSessionIdFromUrl()
+ {
+ return delegate.isRequestedSessionIdFromUrl();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getAttribute(String)
+ */
+ public Object getAttribute(String name)
+ {
+ return delegate.getAttribute(name);
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getAttributeNames()
+ */
+ public Enumeration getAttributeNames()
+ {
+ return delegate.getAttributeNames();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getCharacterEncoding()
+ */
+ public String getCharacterEncoding()
+ {
+ return delegate.getCharacterEncoding();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#setCharacterEncoding(String)
+ */
+ public void setCharacterEncoding(String env) throws UnsupportedEncodingException
+ {
+ delegate.setCharacterEncoding(env);
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getContentLength()
+ */
+ public int getContentLength()
+ {
+ return delegate.getContentLength();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getContentType()
+ */
+ public String getContentType()
+ {
+ return delegate.getContentType();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getInputStream()
+ */
+ public ServletInputStream getInputStream() throws IOException
+ {
+ return delegate.getInputStream();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getParameter(String)
+ */
+ public String getParameter(String name)
+ {
+ return delegate.getParameter(name);
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getParameterNames()
+ */
+ public Enumeration getParameterNames()
+ {
+ return delegate.getParameterNames();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getParameterValues(String)
+ */
+ public String[] getParameterValues(String name)
+ {
+ return delegate.getParameterValues(name);
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getParameterMap()
+ */
+ public Map getParameterMap()
+ {
+ return delegate.getParameterMap();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getProtocol()
+ */
+ public String getProtocol()
+ {
+ return delegate.getProtocol();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getScheme()
+ */
+ public String getScheme()
+ {
+ return delegate.getScheme();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getServerName()
+ */
+ public String getServerName()
+ {
+ return delegate.getServerName();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getServerPort()
+ */
+ public int getServerPort()
+ {
+ return delegate.getServerPort();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getReader()
+ */
+ public BufferedReader getReader() throws IOException
+ {
+ return delegate.getReader();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getRemoteAddr()
+ */
+ public String getRemoteAddr()
+ {
+ return delegate.getRemoteAddr();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getRemoteHost()
+ */
+ public String getRemoteHost()
+ {
+ return delegate.getRemoteHost();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#setAttribute(String, Object)
+ */
+ public void setAttribute(String name, Object o)
+ {
+ delegate.setAttribute(name, o);
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#removeAttribute(String)
+ */
+ public void removeAttribute(String name)
+ {
+ delegate.removeAttribute(name);
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getLocale()
+ */
+ public Locale getLocale()
+ {
+ return delegate.getLocale();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getLocales()
+ */
+ public Enumeration getLocales()
+ {
+ return delegate.getLocales();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#isSecure()
+ */
+ public boolean isSecure()
+ {
+ return delegate.isSecure();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getRequestDispatcher(String)
+ */
+ public RequestDispatcher getRequestDispatcher(String path)
+ {
+ return delegate.getRequestDispatcher(path);
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getRealPath(String)
+ */
+ public String getRealPath(String path)
+ {
+ return delegate.getRealPath(path);
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getRemotePort()
+ */
+ public int getRemotePort()
+ {
+ return delegate.getRemotePort();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getLocalName()
+ */
+ public String getLocalName()
+ {
+ return delegate.getLocalName();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getLocalAddr()
+ */
+ public String getLocalAddr()
+ {
+ return delegate.getLocalAddr();
+ }
+
+ /**
+ * @see javax.servlet.http.HttpServletRequest#getLocalPort()
+ */
+ public int getLocalPort()
+ {
+ return delegate.getLocalPort();
+ }
+
+ /**
+ * Get the underlying request - the delegate
+ */
+ public HttpServletRequest getRequest()
+ {
+ return delegate;
+ }
+}
Added:
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/application/localization/DefaultLocalePolicyService.java
===================================================================
---
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/application/localization/DefaultLocalePolicyService.java
(rev 0)
+++
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/application/localization/DefaultLocalePolicyService.java 2011-05-25
13:22:33 UTC (rev 6561)
@@ -0,0 +1,173 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.exoplatform.portal.application.localization;
+
+import org.exoplatform.services.resources.LocaleContextInfo;
+import org.exoplatform.services.resources.LocalePolicy;
+import org.picocontainer.Startable;
+
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * This service represents a default policy for determining LocaleConfig to be used for
user's session.
+ * This service is registered through portal services configuration file:
conf/portal/configuration.xml
+ * Custom locale determination policy can be implemented by overriding or completely
replacing this class,
+ * and registering an alternative implementation.
+ *
+ * To gracefully fallback from more specific locales (lang_COUNTRY) to more generic
(lang) without loss
+ * of information about user's language selection use {@link
LocaleContextInfo#getLocaleIfLangSupported(java.util.Locale)}
+ * and return a more specific Locale. The Locale will be appropriately narrowed by
LocalePolicy caller.
+ *
+ * Special care needs to be taken to assure Locale consistency
+ * between portal requests and non-portal requests - like login redirect upon failed
authentication attempt.
+ * To keep consistency at least one of {@link LocaleContextInfo#cookieLocales} and {@link
LocaleContextInfo#sessionLocale}
+ * needs to be enabled.
+ *
+ * @see NoBrowserLocalePolicyService
+ * @see LocalizationFilter
+ *
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class DefaultLocalePolicyService implements LocalePolicy, Startable
+{
+ /**
+ * @see LocalePolicy#determineLocale(LocaleContextInfo)
+ */
+ public Locale determineLocale(LocaleContextInfo context)
+ {
+ Locale locale = null;
+ if (context.getRemoteUser() == null)
+ locale = getLocaleConfigForAnonymous(context);
+ else
+ locale = getLocaleConfigForRegistered(context);
+
+ if (locale == null)
+ locale = context.getPortalLocale();
+
+ return locale;
+ }
+
+ /**
+ * Override this method to change the LocaleConfig determination for registered
users.
+ * Default is: use user's profile language, if not available fall back to LOCALE
cookie,
+ * and finally if that is not available either fall back to browser language
preference.
+ *
+ * @param context locale context info available to implementations in order to
determine appropriate Locale
+ * @return Locale representing a language to use, or null
+ */
+ protected Locale getLocaleConfigForRegistered(LocaleContextInfo context)
+ {
+ Locale locale = context.getLocaleIfLangSupported(context.getUserProfileLocale());
+ if (locale == null)
+ locale = getLocaleConfigFromCookie(context);
+ if (locale == null)
+ locale = getLocaleConfigFromSession(context);
+ if (locale == null)
+ locale = getLocaleConfigFromBrowser(context);
+
+ return locale;
+ }
+
+ /**
+ * Override this method to change the Locale determination based on browser language
preferences.
+ * If you want to disable the use of browser language preferences simply return null.
+ *
+ * @param context locale context info available to implementations in order to
determine appropriate Locale
+ * @return Locale representing a language to use, or null
+ */
+ protected Locale getLocaleConfigFromBrowser(LocaleContextInfo context)
+ {
+ List<Locale> locales = context.getBrowserLocales();
+ if (locales != null)
+ {
+ for (Locale loc: locales)
+ return context.getLocaleIfLangSupported(loc);
+ }
+ return null;
+ }
+
+ /**
+ * Override this method to change Locale determination for users that aren't
logged in.
+ * By default the request's LOCALE cookie is used, if that is not available the
browser
+ * language preferences are used.
+ *
+ * @param context locale context info available to implementations in order to
determine appropriate Locale
+ * @return Locale representing a language to use, or null
+ */
+ protected Locale getLocaleConfigForAnonymous(LocaleContextInfo context)
+ {
+ Locale locale = getLocaleConfigFromCookie(context);
+ if (locale == null)
+ locale = getLocaleConfigFromSession(context);
+ if (locale == null)
+ locale = getLocaleConfigFromBrowser(context);
+
+ return locale;
+ }
+
+ /**
+ * Override this method to change the Locale determination based on session
attribute.
+ * Note: this is mostly a backup for cookie, as either one usually has to be enabled
for
+ * locale to remain synchronized between portal and non-portal pages.
+ *
+ * @param context locale context info available to implementations in order to
determine appropriate Locale
+ * @return Locale representing a language to use, or null
+ */
+ protected Locale getLocaleConfigFromSession(LocaleContextInfo context)
+ {
+ return context.getSessionLocale();
+ }
+
+ /**
+ * Override this method to change the Locale determination based on browser cookie.
+ * If you want to disable the use of browser cookies simply return null.
+ *
+ * @param context locale context info available to implementations in order to
determine appropriate Locale
+ * @return Locale representing a language to use, or null
+ */
+ protected Locale getLocaleConfigFromCookie(LocaleContextInfo context)
+ {
+ List<Locale> locales = context.getCookieLocales();
+ if (locales != null)
+ {
+ for (Locale locale: locales)
+ return context.getLocaleIfLangSupported(locale);
+ }
+ return null;
+ }
+
+ /**
+ * Starter interface method
+ */
+ public void start()
+ {
+ }
+
+ /**
+ * Starter interface method
+ */
+ public void stop()
+ {
+ }
+
+}
Added:
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/application/localization/HttpRequestWrapper.java
===================================================================
---
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/application/localization/HttpRequestWrapper.java
(rev 0)
+++
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/application/localization/HttpRequestWrapper.java 2011-05-25
13:22:33 UTC (rev 6561)
@@ -0,0 +1,97 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.exoplatform.portal.application.localization;
+
+import org.exoplatform.portal.application.PortalRequestContext;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class HttpRequestWrapper extends BaseHttpRequestWrapper
+{
+ private static final List<Locale> EMPTY_LOCALE_LIST = Collections.emptyList();
+
+ /**
+ * Constructs a request object wrapping the given request.
+ *
+ * @throws IllegalArgumentException if the request is null
+ */
+ public HttpRequestWrapper(HttpServletRequest request)
+ {
+ super(request);
+ }
+
+ /**
+ * Note: Keep the implementation here in sync with {@link
org.exoplatform.portal.webui.application.ExoUserContext#getLocale}
+ * @return
+ */
+ @Override
+ public Locale getLocale()
+ {
+ if (PortalRequestContext.getCurrentInstance() != null)
+ return getRequest().getLocale();
+
+ Locale current = LocalizationFilter.getCurrentLocale();
+ if (current != null)
+ return current;
+
+ return getRequest().getLocale();
+ }
+
+ @Override
+ public Enumeration getLocales()
+ {
+ Locale current = LocalizationFilter.getCurrentLocale();
+ if (PortalRequestContext.getCurrentInstance() != null || current == null)
+ return getRequest().getLocales();
+
+ Locale loc = getLocale();
+ if (loc == null)
+ {
+ return Collections.enumeration(EMPTY_LOCALE_LIST);
+ }
+ else
+ {
+ LinkedList<Locale> locs = new LinkedList<Locale>();
+ locs.add(loc);
+
+ Enumeration<Locale> clientLocs = (Enumeration<Locale>)
getRequest().getLocales();
+ while (clientLocs.hasMoreElements())
+ {
+ current = clientLocs.nextElement();
+ if (current.getLanguage().equals(loc.getLanguage()) &&
current.getCountry().equals(loc.getCountry()))
+ continue;
+ locs.add(current);
+ }
+
+ return Collections.enumeration(locs);
+ }
+ }
+}
Added:
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/application/localization/LocalizationFilter.java
===================================================================
---
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/application/localization/LocalizationFilter.java
(rev 0)
+++
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/application/localization/LocalizationFilter.java 2011-05-25
13:22:33 UTC (rev 6561)
@@ -0,0 +1,235 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.exoplatform.portal.application.localization;
+
+import org.exoplatform.container.ExoContainer;
+import org.exoplatform.container.ExoContainerContext;
+import org.exoplatform.container.RootContainer;
+import org.exoplatform.container.component.ComponentRequestLifecycle;
+import org.exoplatform.container.component.RequestLifeCycle;
+import org.exoplatform.portal.Constants;
+import org.exoplatform.portal.application.PortalRequestContext;
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+import org.exoplatform.services.organization.OrganizationService;
+import org.exoplatform.services.organization.UserProfile;
+import org.exoplatform.services.resources.LocaleConfig;
+import org.exoplatform.services.resources.LocaleConfigService;
+import org.exoplatform.services.resources.LocaleContextInfo;
+import org.exoplatform.services.resources.LocalePolicy;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Locale;
+import java.util.Set;
+
+/**
+ * This filter provides {@link HttpServletRequest#getLocale()} and {@link
HttpServletRequest#getLocales()}
+ * override for extra-portlet requests (i.e. unbridged .jsp). Thanks to it dynamic
resources can be localized
+ * to keep in sync with the rest of the portal. This filter is re-entrant, and can safely
be installed for
+ * INCLUDE, FORWARD, and ERROR dispatch methods.
+ *
+ * A concrete example of re-entrant use is login/jsp/login.jsp used when authentication
fails at portal login.
+ *
+ * By default {@link HttpServletRequest#getLocale()} and {@link
HttpServletRequest#getLocales()} reflect
+ * browser language preference. When using this filter these two calls employ the same
Locale determination algorithm
+ * as LocalizationLifecycle does.
+ *
+ * This filter can be activated / deactivated via portal module's web.xml
+ *
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class LocalizationFilter implements Filter
+{
+ private static Log log = ExoLogger.getLogger("portal:LocalizationFilter");
+
+ private static ThreadLocal<Locale> currentLocale = new
ThreadLocal<Locale>();
+
+ public void init(FilterConfig filterConfig) throws ServletException
+ {
+ }
+
+ public void doFilter(ServletRequest request, ServletResponse response, FilterChain
chain) throws IOException, ServletException
+ {
+
+ HttpServletRequest req = (HttpServletRequest) request;
+ HttpServletResponse res = (HttpServletResponse) response;
+
+ try
+ {
+ // Due to forwards, and includes the filter might be reentered
+ // If current requestContext exists use its Locale
+ PortalRequestContext context = PortalRequestContext.getCurrentInstance();
+ if (context != null && context.getLocale() != null)
+ {
+ // No need to wrap if reentered
+ boolean skipWrapping = currentLocale.get() != null;
+ // overwrite any already set currentLocale
+ currentLocale.set(context.getLocale());
+ if (!skipWrapping)
+ {
+ req = new HttpRequestWrapper(req);
+ }
+ chain.doFilter(req, res);
+ return;
+ }
+
+ // If reentered we don't need to wrap
+ if (currentLocale.get() != null)
+ {
+ chain.doFilter(request, response);
+ return;
+ }
+
+
+ // Initialize currentLocale
+ ExoContainer container = ExoContainerContext.getCurrentContainerIfPresent();
+ if (container == null)
+ {
+ // Nothing we can do, move on
+ chain.doFilter(req, res);
+ return;
+ }
+
+ if (container instanceof RootContainer)
+ container = (ExoContainer)
container.getComponentInstance("portal");
+
+ LocaleConfigService localeConfigService = (LocaleConfigService)
+ container.getComponentInstanceOfType(LocaleConfigService.class);
+ LocalePolicy localePolicy = (LocalePolicy)
container.getComponentInstanceOfType(LocalePolicy.class);
+
+ LocaleContextInfo localeCtx = new LocaleContextInfo();
+
+ Set<Locale> supportedLocales = new HashSet();
+ for (LocaleConfig lc: localeConfigService.getLocalConfigs())
+ {
+ supportedLocales.add(lc.getLocale());
+ }
+ localeCtx.setSupportedLocales(supportedLocales);
+
+ localeCtx.setBrowserLocales(Collections.list(request.getLocales()));
+ localeCtx.setCookieLocales(LocalizationLifecycle.getCookieLocales(req));
+ localeCtx.setSessionLocale(LocalizationLifecycle.getSessionLocale(req));
+ localeCtx.setUserProfileLocale(getUserProfileLocale(container,
req.getRemoteUser()));
+ localeCtx.setRemoteUser(req.getRemoteUser());
+
+ localeCtx.setPortalLocale(Locale.ENGLISH);
+ Locale locale = localePolicy.determineLocale(localeCtx);
+ boolean supported = supportedLocales.contains(locale);
+
+ if (!supported && !"".equals(locale.getCountry()))
+ {
+ locale = new Locale(locale.getLanguage());
+ supported = supportedLocales.contains(locale);
+ }
+ if (!supported)
+ {
+ if (log.isWarnEnabled())
+ log.warn("Unsupported locale returned by LocalePolicy: " +
localePolicy + ". Falling back to 'en'.");
+ locale = Locale.ENGLISH;
+ }
+
+ currentLocale.set(locale);
+ chain.doFilter(new HttpRequestWrapper(req), res);
+ }
+ catch(Exception e)
+ {
+ throw new RuntimeException("LocalizationFilter exception: ", e);
+ }
+ finally
+ {
+ currentLocale.remove();
+ }
+ }
+
+ private Locale getUserProfileLocale(ExoContainer container, String user)
+ {
+ UserProfile userProfile = null;
+ OrganizationService svc = (OrganizationService)
+ container.getComponentInstanceOfType(OrganizationService.class);
+
+ if (user != null)
+ {
+ try
+ {
+ beginContext(svc);
+ userProfile = svc.getUserProfileHandler().findUserProfileByName(user);
+ }
+ catch (Exception ignored)
+ {
+ log.error("IGNORED: Failed to load UserProfile for username: " +
user, ignored);
+ }
+ finally
+ {
+ try
+ {
+ endContext(svc);
+ }
+ catch(Exception ignored)
+ {
+ // we don't care
+ }
+ }
+
+ if (userProfile == null && log.isWarnEnabled())
+ log.warn("Could not load user profile for " + user);
+ }
+
+ String lang = userProfile == null ? null :
userProfile.getUserInfoMap().get(Constants.USER_LANGUAGE);
+ return (lang != null) ? LocaleContextInfo.getLocale(lang) : null;
+ }
+
+ public void beginContext(OrganizationService orgService) throws Exception
+ {
+ if (orgService instanceof ComponentRequestLifecycle)
+ {
+ RequestLifeCycle.begin((ComponentRequestLifecycle)orgService);
+ }
+ }
+
+ public void endContext(OrganizationService orgService) throws Exception
+ {
+ // do the same check as in beginContext to make it symmetric
+ if (orgService instanceof ComponentRequestLifecycle)
+ {
+ RequestLifeCycle.end();
+ }
+ }
+
+ public void destroy()
+ {
+ }
+
+ public static Locale getCurrentLocale()
+ {
+ return currentLocale.get();
+ }
+}
Added:
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/application/localization/LocalizationLifecycle.java
===================================================================
---
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/application/localization/LocalizationLifecycle.java
(rev 0)
+++
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/application/localization/LocalizationLifecycle.java 2011-05-25
13:22:33 UTC (rev 6561)
@@ -0,0 +1,398 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.exoplatform.portal.application.localization;
+
+import org.exoplatform.container.ExoContainer;
+import org.exoplatform.portal.Constants;
+import org.exoplatform.portal.application.PortalRequestContext;
+import org.exoplatform.portal.application.PortalStateManager;
+import org.exoplatform.portal.application.UserProfileLifecycle;
+import org.exoplatform.portal.config.UserPortalConfig;
+import org.exoplatform.portal.webui.workspace.UIPortalApplication;
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+import org.exoplatform.services.organization.OrganizationService;
+import org.exoplatform.services.organization.UserProfile;
+import org.exoplatform.services.resources.LocaleConfig;
+import org.exoplatform.services.resources.LocaleConfigService;
+import org.exoplatform.services.resources.LocaleContextInfo;
+import org.exoplatform.services.resources.LocalePolicy;
+import org.exoplatform.web.application.Application;
+import org.exoplatform.web.application.ApplicationRequestPhaseLifecycle;
+import org.exoplatform.web.application.Phase;
+import org.exoplatform.webui.application.WebuiRequestContext;
+import org.exoplatform.webui.core.UIApplication;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Set;
+
+/**
+ * This class takes care of loading / initializing / saving the current Locale.
+ * Current Locale is used to create properly localized response to current request.
+ *
+ * At the beginning of request {@link LocalePolicy} is used to determine the
+ * initial Locale to be used for processing the request.
+ *
+ * This Locale is then set on current {@link
org.exoplatform.portal.application.PortalRequestContext} (it's presumed that current
+ * {@link org.exoplatform.web.application.RequestContext} is of type
PortalRequestContext) by calling
+ * {@link org.exoplatform.portal.application.PortalRequestContext#setLocale}.
+ *
+ * During request processing {@link
org.exoplatform.portal.application.PortalRequestContext#getLocale} is the ultimate
reference consulted by any
+ * rendering code that needs to know about current Locale.
+ *
+ * When this Locale is changed during action processing, the new Locale choice is saved
+ * into user's profile or into browser's cookie in order to be used by future
requests.
+ *
+ * This Lifecycle depends on UserProfileLifecycle being registered before this one, as it
relies on it
+ * for loading the user profile. See WEB-INF/webui-configuration.xml in web/portal
module.
+ *
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class LocalizationLifecycle implements
ApplicationRequestPhaseLifecycle<WebuiRequestContext>
+{
+ private static final String LOCALE_COOKIE = "LOCALE";
+
+ private static final String LOCALE_SESSION_ATTR = "org.gatein.LOCALE";
+
+ private static final String PREV_LOCALE_SESSION_ATTR =
"org.gatein.LAST_LOCALE";
+
+ private static final ThreadLocal<Locale> calculatedLocale = new
ThreadLocal<Locale>();
+
+ private static Log log =
ExoLogger.getLogger("portal:LocalizationLifecycle");
+
+ /**
+ * @see org.exoplatform.web.application.ApplicationLifecycle#onInit
+ */
+ public void onInit(Application app) throws Exception
+ {
+ }
+
+ /**
+ * Initialize Locale to be used for the processing of current request
+ *
+ * @see org.exoplatform.web.application.ApplicationLifecycle#onStartRequest
+ */
+ public void onStartRequest(Application app, WebuiRequestContext context) throws
Exception
+ {
+ if (context instanceof PortalRequestContext == false)
+ throw new IllegalArgumentException("Expected PortalRequestContext, but got:
" + context);
+
+ PortalRequestContext reqCtx = (PortalRequestContext) context;
+ ExoContainer container = app.getApplicationServiceContainer();
+
+ LocaleConfigService localeConfigService = (LocaleConfigService)
+ container.getComponentInstanceOfType(LocaleConfigService.class);
+ LocalePolicy localePolicy = (LocalePolicy)
container.getComponentInstanceOfType(LocalePolicy.class);
+
+ LocaleContextInfo localeCtx = new LocaleContextInfo();
+
+ Set<Locale> supportedLocales = new HashSet();
+ for (LocaleConfig lc: localeConfigService.getLocalConfigs())
+ {
+ supportedLocales.add(lc.getLocale());
+ }
+ localeCtx.setSupportedLocales(supportedLocales);
+
+ HttpServletRequest request = HttpServletRequest.class.cast(context.getRequest());
+ localeCtx.setBrowserLocales(Collections.list(request.getLocales()));
+ localeCtx.setCookieLocales(getCookieLocales(request));
+ localeCtx.setSessionLocale(getSessionLocale(request));
+ localeCtx.setUserProfileLocale(getUserProfileLocale(reqCtx));
+ localeCtx.setRemoteUser(reqCtx.getRemoteUser());
+
+ UserPortalConfig userPortalConfig = null;
+ try
+ {
+ userPortalConfig = PortalStateManager.getUserPortalConfig(reqCtx);
+ if (userPortalConfig == null)
+ log.warn("No UserPortalConfig available! Portal locale set to
'en'");
+ }
+ catch(Exception ignored)
+ {
+ if (log.isDebugEnabled())
+ log.debug("IGNORED: Failed to load UserPortalConfig: ", ignored);
+ }
+
+ String portalLocaleName = "en";
+ if (userPortalConfig != null)
+ portalLocaleName = userPortalConfig.getPortalConfig().getLocale();
+
+ Locale portalLocale = LocaleContextInfo.getLocale(portalLocaleName);
+ localeCtx.setPortalLocale(portalLocale);
+
+ Locale locale = localePolicy.determineLocale(localeCtx);
+ boolean supported = supportedLocales.contains(locale);
+
+ if (!supported && !"".equals(locale.getCountry()))
+ {
+ locale = new Locale(locale.getLanguage());
+ supported = supportedLocales.contains(locale);
+ }
+ if (!supported)
+ {
+ if (log.isWarnEnabled())
+ log.warn("Unsupported locale returned by LocalePolicy: " +
localePolicy + ". Falling back to 'en'.");
+ locale = Locale.ENGLISH;
+ }
+ reqCtx.setLocale(locale);
+ calculatedLocale.set(locale);
+ }
+
+ /**
+ * @see
org.exoplatform.web.application.ApplicationRequestPhaseLifecycle#onStartRequestPhase
+ */
+ public void onStartRequestPhase(Application app, WebuiRequestContext context, Phase
phase)
+ {
+ }
+
+ /**
+ * Save any locale change - to cookie for anonymous users, to profile for logged-in
users
+ *
+ * @see
org.exoplatform.web.application.ApplicationRequestPhaseLifecycle#onEndRequestPhase
+ */
+ public void onEndRequestPhase(Application app, WebuiRequestContext context, Phase
phase)
+ {
+ if (phase == Phase.ACTION)
+ {
+ // if onStartRequest survived the cast, this one should as well - no check
necessary
+ PortalRequestContext reqCtx = (PortalRequestContext) context;
+ Locale loc = reqCtx.getLocale();
+ Locale remembered = calculatedLocale.get();
+ calculatedLocale.remove();
+
+ boolean refreshNeeded = false;
+
+ // if locale changed since previous request
+ Locale sessLocale = getPreviousLocale(reqCtx.getRequest());
+ if (loc != null && sessLocale != null &&
!loc.equals(sessLocale))
+ {
+ refreshNeeded = true;
+ }
+ // if locale changed during this request's processing
+ if (loc != null && (remembered == null || !loc.equals(remembered)))
+ {
+ refreshNeeded = true;
+ saveLocale(reqCtx, loc);
+ }
+
+ if (refreshNeeded)
+ {
+ UIApplication uiapp = context.getUIApplication();
+ // we presume PortalRequestContext, and UIPortalApplication
+ resetOrientation(reqCtx, loc);
+ ((UIPortalApplication) uiapp).localizeNavigations();
+ }
+
+ savePreviousLocale(reqCtx, loc);
+ }
+ }
+
+ /**
+ * @see org.exoplatform.web.application.ApplicationLifecycle#onEndRequest
+ */
+ public void onEndRequest(Application app, WebuiRequestContext context) throws
Exception
+ {
+ }
+
+ /**
+ * @see org.exoplatform.web.application.ApplicationLifecycle#onDestroy
+ */
+ public void onDestroy(Application app) throws Exception
+ {
+ }
+
+ /**
+ * Use {@link UserProfile} already loaded by {@link
org.exoplatform.portal.application.UserProfileLifecycle} or load one ourselves.
+ * @param context current PortalRequestContext
+ * @return Locale from user's profile or null
+ */
+ private Locale getUserProfileLocale(PortalRequestContext context)
+ {
+ String lang = null;
+
+ UserProfile userProfile = getLoadedProfile(context);
+ lang = userProfile == null ? null :
userProfile.getUserInfoMap().get(Constants.USER_LANGUAGE);
+ return (lang != null) ? LocaleContextInfo.getLocale(lang) : null;
+ }
+
+ private UserProfile loadUserProfile(ExoContainer container, PortalRequestContext
context)
+ {
+ UserProfile userProfile = null;
+ OrganizationService svc = (OrganizationService)
+ container.getComponentInstanceOfType(OrganizationService.class);
+
+ String user = context.getRemoteUser();
+ if (user != null)
+ {
+ try
+ {
+ userProfile = svc.getUserProfileHandler().findUserProfileByName(user);
+ }
+ catch (Exception ignored)
+ {
+ log.error("IGNORED: Failed to load UserProfile for username: " +
user, ignored);
+ }
+
+ if (userProfile == null && log.isWarnEnabled())
+ log.warn("Could not load user profile for " + user + ". Using
default portal locale.");
+ }
+ return userProfile;
+ }
+
+ private UserProfile getLoadedProfile(PortalRequestContext context)
+ {
+ return (UserProfile)
context.getAttribute(UserProfileLifecycle.USER_PROFILE_ATTRIBUTE_NAME);
+ }
+
+ public static List<Locale> getCookieLocales(HttpServletRequest request)
+ {
+ Cookie [] cookies = request.getCookies();
+ if (cookies != null)
+ {
+ for (Cookie cookie: cookies)
+ {
+ if (LOCALE_COOKIE.equals(cookie.getName()))
+ {
+ List<Locale> locales = new ArrayList<Locale>();
+ locales.add(LocaleContextInfo.getLocale(cookie.getValue()));
+ return locales;
+ }
+ }
+ }
+ return Collections.emptyList();
+ }
+
+ public static Locale getSessionLocale(HttpServletRequest request)
+ {
+ return getLocaleFromSession(request, LOCALE_SESSION_ATTR);
+ }
+
+ public static Locale getPreviousLocale(HttpServletRequest request)
+ {
+ return getLocaleFromSession(request, PREV_LOCALE_SESSION_ATTR);
+ }
+
+ private static Locale getLocaleFromSession(HttpServletRequest request, String
attrName)
+ {
+ String lang = null;
+ HttpSession session = request.getSession(false);
+ if (session != null)
+ lang = (String) session.getAttribute(attrName);
+ return (lang != null) ? LocaleContextInfo.getLocale(lang) : null;
+ }
+
+ private void saveLocale(PortalRequestContext context, Locale loc)
+ {
+ String user = context.getRemoteUser();
+ if (user != null)
+ {
+ saveLocaleToUserProfile(context, loc, user);
+ }
+ else
+ {
+ saveLocaleToCookie(context, loc);
+ }
+
+ saveSessionLocale(context, loc);
+ }
+
+ private void resetOrientation(PortalRequestContext context, Locale loc)
+ {
+ ExoContainer container =
context.getApplication().getApplicationServiceContainer();
+ LocaleConfigService localeConfigService = (LocaleConfigService)
+ container.getComponentInstanceOfType(LocaleConfigService.class);
+ LocaleConfig localeConfig =
localeConfigService.getLocaleConfig(LocaleContextInfo.getLocaleAsString(loc));
+ if (localeConfig == null)
+ {
+ if (log.isWarnEnabled())
+ log.warn("Locale changed to unsupported Locale during request
processing: " + loc);
+ return;
+ }
+ // we presume PortalRequestContext, and UIPortalApplication
+ ((UIPortalApplication)
context.getUIApplication()).setOrientation(localeConfig.getOrientation());
+ }
+
+ private void saveSessionLocale(PortalRequestContext context, Locale loc)
+ {
+ saveLocaleToSession(context, LOCALE_SESSION_ATTR, loc);
+ }
+
+ private void savePreviousLocale(PortalRequestContext context, Locale loc)
+ {
+ saveLocaleToSession(context, PREV_LOCALE_SESSION_ATTR, loc);
+ }
+
+ private void saveLocaleToSession(PortalRequestContext context, String attrName, Locale
loc)
+ {
+ HttpServletRequest res = context.getRequest();
+ HttpSession session = res.getSession(false);
+ if (session != null)
+ session.setAttribute(attrName, LocaleContextInfo.getLocaleAsString(loc));
+ }
+
+ private void saveLocaleToCookie(PortalRequestContext context, Locale loc)
+ {
+ HttpServletResponse res = context.getResponse();
+ Cookie cookie = new Cookie(LOCALE_COOKIE,
LocaleContextInfo.getLocaleAsString(loc));
+ cookie.setMaxAge(Integer.MAX_VALUE);
+ cookie.setPath("/");
+ res.addCookie(cookie);
+ }
+
+ private void saveLocaleToUserProfile(PortalRequestContext context, Locale loc, String
user)
+ {
+ ExoContainer container =
context.getApplication().getApplicationServiceContainer();
+ OrganizationService svc = (OrganizationService)
+ container.getComponentInstanceOfType(OrganizationService.class);
+
+ // Don't rely on UserProfileLifecycle loaded UserProfile when doing
+ // an update to avoid a potential overwrite of other changes
+ UserProfile userProfile = loadUserProfile(container, context);
+ if (userProfile != null)
+ {
+ userProfile.getUserInfoMap().put(Constants.USER_LANGUAGE,
LocaleContextInfo.getLocaleAsString(loc));
+ try
+ {
+ svc.getUserProfileHandler().saveUserProfile(userProfile, false);
+ }
+ catch (Exception ignored)
+ {
+ log.error("IGNORED: Failed to save profile for user: " + user,
ignored);
+ userProfile = null;
+ }
+ }
+
+ if (userProfile == null)
+ {
+ if (log.isWarnEnabled())
+ log.warn("Unable to save locale into profile for user: " + user);
+ }
+ }
+}
Added:
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/application/localization/NoBrowserLocalePolicyService.java
===================================================================
---
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/application/localization/NoBrowserLocalePolicyService.java
(rev 0)
+++
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/application/localization/NoBrowserLocalePolicyService.java 2011-05-25
13:22:33 UTC (rev 6561)
@@ -0,0 +1,47 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.exoplatform.portal.application.localization;
+
+import org.exoplatform.services.resources.LocaleContextInfo;
+
+import java.util.Locale;
+
+/**
+ * This implementation of {@link org.exoplatform.services.resources.LocalePolicy}
disregards client browser language preference.
+ * Localization will therefore not be affected by different OS or browser language
settings.
+ *
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class NoBrowserLocalePolicyService extends DefaultLocalePolicyService
+{
+ /**
+ * Override super method with no-op.
+ *
+ * @param context locale context info available to implementations in order to
determine appropriate Locale
+ * @return null
+ */
+ @Override
+ protected Locale getLocaleConfigFromBrowser(LocaleContextInfo context)
+ {
+ return null;
+ }
+}
Modified:
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/webui/application/ExoUserContext.java
===================================================================
---
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/webui/application/ExoUserContext.java 2011-05-25
09:27:20 UTC (rev 6560)
+++
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/webui/application/ExoUserContext.java 2011-05-25
13:22:33 UTC (rev 6561)
@@ -19,8 +19,8 @@
package org.exoplatform.portal.webui.application;
+import org.exoplatform.portal.application.PortalRequestContext;
import org.exoplatform.services.organization.UserProfile;
-import org.gatein.common.util.Tools;
import org.gatein.pc.api.invocation.resolver.AttributeResolver;
import org.gatein.pc.api.invocation.resolver.PrincipalAttributeResolver;
import org.gatein.pc.api.spi.UserContext;
@@ -29,6 +29,7 @@
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
@@ -119,23 +120,51 @@
return Collections.unmodifiableMap(filteredMap);
}
- /** Returns the client request locale or <code>Locale.ENGLISH</code> if no
request was provided. */
+ /**
+ * Returns current PortalRequestContext's locale. It falls back to
+ * clientRequest locale ({@link HttpServletRequest#getLocale}), or
<code>Locale.ENGLISH</code>
+ * if clientRequest object is not available.
+ */
public Locale getLocale()
{
+ PortalRequestContext context = PortalRequestContext.getCurrentInstance();
+ if(context != null) {
+ Locale loc = context.getLocale();
+ if (loc != null)
+ return loc;
+ }
+
return clientRequest != null ? clientRequest.getLocale() : Locale.ENGLISH;
}
- /** Returns the client request locales or an empty list if no request was provided.
*/
+ /**
+ * Returns the list of client request locales, making sure the first one in the List
+ * is the same as what getLocale() method returns.
+ */
@SuppressWarnings("unchecked")
public List<Locale> getLocales()
{
- if (clientRequest == null)
+ Locale loc = getLocale();
+ if (loc == null)
{
return EMPTY_LOCALE_LIST;
}
else
{
- return Tools.toList((Enumeration<Locale>)clientRequest.getLocales());
+ LinkedList<Locale> locs = new LinkedList<Locale>();
+ locs.add(loc);
+ if (clientRequest != null)
+ {
+ Enumeration<Locale> clientLocs = (Enumeration<Locale>)
clientRequest.getLocales();
+ while (clientLocs.hasMoreElements())
+ {
+ Locale current = clientLocs.nextElement();
+ if (current.getLanguage().equals(loc.getLanguage()) &&
current.getCountry().equals(loc.getCountry()))
+ continue;
+ locs.add(current);
+ }
+ }
+ return Collections.unmodifiableList(locs);
}
}
Modified:
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UILanguageSelector.java
===================================================================
---
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UILanguageSelector.java 2011-05-25
09:27:20 UTC (rev 6560)
+++
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UILanguageSelector.java 2011-05-25
13:22:33 UTC (rev 6561)
@@ -19,6 +19,9 @@
package org.exoplatform.portal.webui.portal;
+import org.exoplatform.container.ExoContainer;
+import org.exoplatform.container.ExoContainerContext;
+import org.exoplatform.portal.application.PortalRequestContext;
import org.exoplatform.portal.webui.util.Util;
import org.exoplatform.portal.webui.workspace.UIMaskWorkspace;
import org.exoplatform.portal.webui.workspace.UIPortalApplication;
@@ -27,6 +30,7 @@
import org.exoplatform.services.organization.UserProfileHandler;
import org.exoplatform.services.resources.LocaleConfig;
import org.exoplatform.services.resources.LocaleConfigService;
+import org.exoplatform.services.resources.ResourceBundleService;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.core.UIContainer;
@@ -41,6 +45,8 @@
import java.util.Comparator;
import java.util.List;
import java.util.Locale;
+import java.util.ResourceBundle;
+import java.util.MissingResourceException;
@ComponentConfig(template =
"system:/groovy/portal/webui/portal/UILanguageSelector.gtmpl", events = {
@EventConfig(listeners = UILanguageSelector.SaveActionListener.class),
@@ -62,16 +68,60 @@
{
LocaleConfig localeConfig = (LocaleConfig)object;
Locale locale = localeConfig.getLocale();
- String displayName =
capitalizeFirstLetter(locale.getDisplayLanguage(currentLocale));
String lang = locale.getLanguage();
String country = locale.getCountry();
- String localedName = capitalizeFirstLetter(locale.getDisplayLanguage(locale));;
+ ResourceBundle currentLocaleResourceBundle = getResourceBundle(currentLocale);
+ ResourceBundle localeResourceBundle = getResourceBundle(locale);
+
+ String key = "Locale." + lang;
+
+ String displayName = null;
+ try
+ {
+ String translation = currentLocaleResourceBundle.getString(key);
+ displayName = translation;
+ }
+ catch (MissingResourceException e)
+ {
+ displayName =
capitalizeFirstLetter(locale.getDisplayLanguage(currentLocale));
+ }
+
+ String localedName = null;
+ try
+ {
+ String translation = localeResourceBundle.getString(key);
+ localedName = translation;
+ }
+ catch (MissingResourceException e)
+ {
+ localedName = capitalizeFirstLetter(locale.getDisplayLanguage(locale));
+ }
+
if (country != null && country.length() > 0)
{
- displayName = capitalizeFirstLetter(locale.getDisplayLanguage(currentLocale)) +
" - " + capitalizeFirstLetter(locale.getDisplayCountry(currentLocale));
- localedName = capitalizeFirstLetter(locale.getDisplayLanguage(locale)) +
" - " + capitalizeFirstLetter(locale.getDisplayCountry(locale));
lang = lang + "_" + country;
+ key = "Locale." + lang;
+
+ try
+ {
+ String translation = currentLocaleResourceBundle.getString(key);
+ displayName = translation;
+ }
+ catch (MissingResourceException e)
+ {
+ displayName =
capitalizeFirstLetter(locale.getDisplayLanguage(currentLocale)) + " - " +
capitalizeFirstLetter(locale.getDisplayCountry(currentLocale));
+ }
+
+ try
+ {
+ String translation = localeResourceBundle.getString(key);
+ localedName = translation;
+ }
+ catch (MissingResourceException e)
+ {
+ localedName = capitalizeFirstLetter(locale.getDisplayLanguage(locale)) +
" - " + capitalizeFirstLetter(locale.getDisplayCountry(locale));
+ }
}
if (localedName == null || localedName.length() == 0)
@@ -129,9 +179,10 @@
LocaleConfig localeConfig = localeConfigService.getLocaleConfig(language);
if (localeConfig == null)
localeConfig = localeConfigService.getDefaultLocaleConfig();
- uiApp.setLocale(localeConfig.getLocale());
- uiApp.setOrientation(localeConfig.getOrientation());
- uiApp.localizeNavigations();
+ PortalRequestContext prqCtx = PortalRequestContext.getCurrentInstance();
+ prqCtx.setLocale(localeConfig.getLocale());
+ //uiApp.setOrientation(localeConfig.getOrientation());
+ //uiApp.localizeNavigations();
OrganizationService orgService =
event.getSource().getApplicationComponent(OrganizationService.class);
String remoteUser = event.getRequestContext().getRemoteUser();
if (remoteUser != null)
@@ -158,4 +209,15 @@
result.replace(0, 1, result.substring(0, 1).toUpperCase());
return result.toString();
}
-}
\ No newline at end of file
+
+ private ResourceBundle getResourceBundle(Locale locale) throws Exception
+ {
+ ExoContainer appContainer = ExoContainerContext.getCurrentContainer();
+ ResourceBundleService service =
+
(ResourceBundleService)appContainer.getComponentInstanceOfType(ResourceBundleService.class);
+ ResourceBundle res = service.getResourceBundle("locale.portal.webui",
locale);
+ return res;
+ }
+
+
+}
Modified:
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UIPortal.java
===================================================================
---
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UIPortal.java 2011-05-25
09:27:20 UTC (rev 6560)
+++
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UIPortal.java 2011-05-25
13:22:33 UTC (rev 6561)
@@ -261,7 +261,7 @@
uiPageBody.setPageBody(selectedNode_, this);
//Refresh locale
- Locale locale = Util.getUIPortalApplication().getLocale();
+ Locale locale = Util.getPortalRequestContext().getLocale();
localizePageNavigation(navigation, locale);
}
Modified:
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UIPortalComposer.java
===================================================================
---
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UIPortalComposer.java 2011-05-25
09:27:20 UTC (rev 6560)
+++
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UIPortalComposer.java 2011-05-25
13:22:33 UTC (rev 6561)
@@ -220,7 +220,7 @@
// TODO dang.tung - change layout when portal get language from UIPortal
// (user and browser not support)
//
----------------------------------------------------------------------------------------------------
- String portalAppLanguage = uiPortalApp.getLocale().getLanguage();
+ String portalAppLanguage = prContext.getLocale().getLanguage();
OrganizationService orgService =
getApplicationComponent(OrganizationService.class);
UserProfile userProfile =
orgService.getUserProfileHandler().findUserProfileByName(remoteUser);
String userLanguage = userProfile.getUserInfoMap().get("user.language");
@@ -231,9 +231,9 @@
{
if (!portalAppLanguage.equals(userLanguage) &&
!portalAppLanguage.equals(browserLanguage))
{
- uiPortalApp.setLocale(localeConfig.getLocale());
+ prContext.setLocale(localeConfig.getLocale());
//editPortal.refreshNavigation(localeConfig.getLocale());
- uiPortalApp.localizeNavigations();
+ //uiPortalApp.localizeNavigations();
}
uiPortalApp.setSkin(editPortal.getSkin());
}
Modified:
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/webui/workspace/UIPortalApplication.java
===================================================================
---
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/webui/workspace/UIPortalApplication.java 2011-05-25
09:27:20 UTC (rev 6560)
+++
epp/portal/branches/EPP_5_0_0_GA_JBEPP-953/webui/portal/src/main/java/org/exoplatform/portal/webui/workspace/UIPortalApplication.java 2011-05-25
13:22:33 UTC (rev 6561)
@@ -45,6 +45,7 @@
import org.exoplatform.services.organization.UserProfile;
import org.exoplatform.services.resources.LocaleConfig;
import org.exoplatform.services.resources.LocaleConfigService;
+import org.exoplatform.services.resources.LocaleContextInfo;
import org.exoplatform.services.resources.Orientation;
import org.exoplatform.services.resources.ResourceBundleManager;
import org.exoplatform.web.application.javascript.JavascriptConfigService;
@@ -93,8 +94,6 @@
private String nodePath_;
- private Locale locale_ = Locale.ENGLISH;
-
private Orientation orientation_ = Orientation.LT;
final static public String UI_WORKING_WS_ID = "UIWorkingWorkspace";
@@ -143,10 +142,9 @@
// dang.tung - set portal language by user preference -> browser ->
// default
// ------------------------------------------------------------------------------
- String portalLanguage = null;
LocaleConfigService localeConfigService =
getApplicationComponent(LocaleConfigService.class);
OrganizationService orgService =
getApplicationComponent(OrganizationService.class);
- LocaleConfig localeConfig =
localeConfigService.getLocaleConfig(userPortalConfig_.getPortalConfig().getLocale());
+
String user = context.getRemoteUser();
String portalSkin = null;
@@ -155,7 +153,6 @@
UserProfile userProfile =
orgService.getUserProfileHandler().findUserProfileByName(user);
if (userProfile != null)
{
- portalLanguage =
userProfile.getUserInfoMap().get("user.language");
portalSkin = userProfile.getUserInfoMap().get("user.skin");
}
else
@@ -164,20 +161,22 @@
log.warn("Could not load user profile for " + user + ".
Using default portal locale.");
}
}
- localeConfig = localeConfigService.getLocaleConfig(portalLanguage);
- if (portalLanguage == null || !portalLanguage.equals(localeConfig.getLanguage()))
+ Locale locale = context.getLocale();
+ if (locale == null)
{
- // if user language no support by portal -> get browser language if no
- // ->
- // get portal
- portalLanguage = context.getRequest().getLocale().getLanguage();
- localeConfig = localeConfigService.getLocaleConfig(portalLanguage);
- if (!portalLanguage.equals(localeConfig.getLanguage()))
- {
- localeConfig =
localeConfigService.getLocaleConfig(userPortalConfig_.getPortalConfig().getLocale());
- }
+ if (log.isWarnEnabled())
+ log.warn("No locale set on PortalRequestContext! Falling back to
'en'.");
+ locale = Locale.ENGLISH;
}
- setLocale(localeConfig.getLocale());
+ String localeName = LocaleContextInfo.getLocaleAsString(locale);
+ LocaleConfig localeConfig = localeConfigService.getLocaleConfig(localeName);
+ if (localeConfig == null)
+ {
+ if (log.isWarnEnabled())
+ log.warn("Unsupported locale set on PortalRequestContext: " +
localeName + "! Falling back to 'en'.");
+ localeConfig =
localeConfigService.getLocaleConfig(Locale.ENGLISH.getLanguage());
+ }
+
setOrientation(localeConfig.getOrientation());
// -------------------------------------------------------------------------------
context.setUIApplication(this);
@@ -301,14 +300,9 @@
public Locale getLocale()
{
- return locale_;
+ return Util.getPortalRequestContext().getLocale();
}
- public void setLocale(Locale locale)
- {
- locale_ = locale;
- }
-
public void setModeState(int mode)
{
this.modeState = mode;