Author: mstruk
Date: 2010-08-30 09:10:13 -0400 (Mon, 30 Aug 2010)
New Revision: 3969
Modified:
portal/trunk/component/resources/src/main/java/org/exoplatform/services/resources/LocaleContextInfo.java
portal/trunk/portlet/exoadmin/src/main/java/org/exoplatform/organization/webui/component/UIUserInfo.java
portal/trunk/webui/portal/src/main/java/org/exoplatform/portal/application/PortalRequestHandler.java
portal/trunk/webui/portal/src/main/java/org/exoplatform/portal/application/localization/DefaultLocalePolicyService.java
portal/trunk/webui/portal/src/main/java/org/exoplatform/portal/application/localization/LocalizationFilter.java
portal/trunk/webui/portal/src/main/java/org/exoplatform/portal/application/localization/LocalizationLifecycle.java
portal/trunk/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UILanguageSelector.java
portal/trunk/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UIPortalComposer.java
Log:
GTNPORTAL-1355, GTNPORTAL-1306: Additional fixes
GTNPORTAL-1355:
- Added SessionLocale to LocaleContextInfo in order to keep the fix working when cookies
are disabled.
- Hopefully fixed TX context issue when accessing OrganizationService.
GTNPORTAL-1306:
- Made it more robust and fixed orientation and navigation localization when browser
language settings change between two requests - moved it to LocalizationLifecycle.
- Disabled cookies for now.
Modified:
portal/trunk/component/resources/src/main/java/org/exoplatform/services/resources/LocaleContextInfo.java
===================================================================
---
portal/trunk/component/resources/src/main/java/org/exoplatform/services/resources/LocaleContextInfo.java 2010-08-30
11:44:17 UTC (rev 3968)
+++
portal/trunk/component/resources/src/main/java/org/exoplatform/services/resources/LocaleContextInfo.java 2010-08-30
13:10:13 UTC (rev 3969)
@@ -38,6 +38,7 @@
private Locale userProfileLocale;
private String remoteUser;
private Locale portalLocale;
+ private Locale sessionLocale;
/**
* Setter for supportedLocales
@@ -148,6 +149,24 @@
}
/**
+ * 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.
*
Modified:
portal/trunk/portlet/exoadmin/src/main/java/org/exoplatform/organization/webui/component/UIUserInfo.java
===================================================================
---
portal/trunk/portlet/exoadmin/src/main/java/org/exoplatform/organization/webui/component/UIUserInfo.java 2010-08-30
11:44:17 UTC (rev 3968)
+++
portal/trunk/portlet/exoadmin/src/main/java/org/exoplatform/organization/webui/component/UIUserInfo.java 2010-08-30
13:10:13 UTC (rev 3969)
@@ -137,8 +137,6 @@
localeConfig = localeConfigService.getDefaultLocaleConfig();
PortalRequestContext prqCtx = PortalRequestContext.getCurrentInstance();
prqCtx.setLocale(localeConfig.getLocale());
- uiApp.setOrientation(localeConfig.getOrientation());
- uiApp.localizeNavigations();
Util.getPortalRequestContext().addUIComponentToUpdateByAjax(
uiApp.findFirstComponentOfType(UIWorkingWorkspace.class));
Modified:
portal/trunk/webui/portal/src/main/java/org/exoplatform/portal/application/PortalRequestHandler.java
===================================================================
---
portal/trunk/webui/portal/src/main/java/org/exoplatform/portal/application/PortalRequestHandler.java 2010-08-30
11:44:17 UTC (rev 3968)
+++
portal/trunk/webui/portal/src/main/java/org/exoplatform/portal/application/PortalRequestHandler.java 2010-08-30
13:10:13 UTC (rev 3969)
@@ -177,5 +177,4 @@
((ApplicationRequestPhaseLifecycle) lifecycle).onEndRequestPhase(app,
context, phase);
}
}
-
}
Modified:
portal/trunk/webui/portal/src/main/java/org/exoplatform/portal/application/localization/DefaultLocalePolicyService.java
===================================================================
---
portal/trunk/webui/portal/src/main/java/org/exoplatform/portal/application/localization/DefaultLocalePolicyService.java 2010-08-30
11:44:17 UTC (rev 3968)
+++
portal/trunk/webui/portal/src/main/java/org/exoplatform/portal/application/localization/DefaultLocalePolicyService.java 2010-08-30
13:10:13 UTC (rev 3969)
@@ -71,6 +71,8 @@
if (locale == null)
locale = getLocaleConfigFromCookie(context);
if (locale == null)
+ locale = getLocaleConfigFromSession(context);
+ if (locale == null)
locale = getLocaleConfigFromBrowser(context);
return locale;
@@ -86,9 +88,11 @@
protected Locale getLocaleConfigFromBrowser(LocaleContextInfo context)
{
List<Locale> locales = context.getBrowserLocales();
- for (Locale loc: locales)
- return context.getLocaleIfSupported(loc);
-
+ if (locales != null)
+ {
+ for (Locale loc: locales)
+ return context.getLocaleIfSupported(loc);
+ }
return null;
}
@@ -104,12 +108,27 @@
{
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.
*
@@ -119,9 +138,11 @@
protected Locale getLocaleConfigFromCookie(LocaleContextInfo context)
{
List<Locale> locales = context.getCookieLocales();
- for (Locale locale: locales)
- return context.getLocaleIfSupported(locale);
-
+ if (locales != null)
+ {
+ for (Locale locale: locales)
+ return context.getLocaleIfSupported(locale);
+ }
return null;
}
Modified:
portal/trunk/webui/portal/src/main/java/org/exoplatform/portal/application/localization/LocalizationFilter.java
===================================================================
---
portal/trunk/webui/portal/src/main/java/org/exoplatform/portal/application/localization/LocalizationFilter.java 2010-08-30
11:44:17 UTC (rev 3968)
+++
portal/trunk/webui/portal/src/main/java/org/exoplatform/portal/application/localization/LocalizationFilter.java 2010-08-30
13:10:13 UTC (rev 3969)
@@ -24,6 +24,8 @@
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;
@@ -51,14 +53,15 @@
/**
* This filter provides {@link HttpServletRequest#getLocale()} and {@link
HttpServletRequest#getLocales()}
- * override for extra-portlet requests (i.e. unbridged .jsp). Thanks to this dynamic
resources can be localized
- * to keep in synch with the rest of the portal.
+ * 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 for this is login/jsp/login.jsp used when authentication fails at
portal login.
+ * 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
- * that LocalizationLifecycle uses.
+ * as LocalizationLifecycle does.
*
* This filter can be activated / deactivated via portal module's web.xml
*
@@ -133,7 +136,8 @@
localeCtx.setSupportedLocales(supportedLocales);
localeCtx.setBrowserLocales(Collections.list(request.getLocales()));
- localeCtx.setCookieLocales(LocalizationLifecycle.getCookieLocales(req));
+ //localeCtx.setCookieLocales(LocalizationLifecycle.getCookieLocales(req));
+ localeCtx.setSessionLocale(LocalizationLifecycle.getSessionLocale(req));
localeCtx.setUserProfileLocale(getUserProfileLocale(container,
req.getRemoteUser()));
localeCtx.setRemoteUser(req.getRemoteUser());
@@ -169,21 +173,50 @@
{
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 + ". Using
default portal locale.");
+ log.warn("Could not load user profile for " + user);
}
String lang = userProfile == null ? null :
userProfile.getUserInfoMap().get(Constants.USER_LANGUAGE);
return (lang != null) ? new Locale(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()
{
}
Modified:
portal/trunk/webui/portal/src/main/java/org/exoplatform/portal/application/localization/LocalizationLifecycle.java
===================================================================
---
portal/trunk/webui/portal/src/main/java/org/exoplatform/portal/application/localization/LocalizationLifecycle.java 2010-08-30
11:44:17 UTC (rev 3968)
+++
portal/trunk/webui/portal/src/main/java/org/exoplatform/portal/application/localization/LocalizationLifecycle.java 2010-08-30
13:10:13 UTC (rev 3969)
@@ -27,6 +27,7 @@
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;
@@ -40,10 +41,12 @@
import org.exoplatform.web.application.Phase;
import org.exoplatform.web.application.RequestFailure;
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;
@@ -75,8 +78,12 @@
*/
public class LocalizationLifecycle implements
ApplicationRequestPhaseLifecycle<WebuiRequestContext>
{
- private static final String COOKIE_NAME = "LOCALE";
+ 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");
@@ -116,8 +123,8 @@
HttpServletRequest request = HttpServletRequest.class.cast(context.getRequest());
localeCtx.setBrowserLocales(Collections.list(request.getLocales()));
-
- localeCtx.setCookieLocales(getCookieLocales(request));
+ //localeCtx.setCookieLocales(getCookieLocales(request));
+ localeCtx.setSessionLocale(getSessionLocale(request));
localeCtx.setUserProfileLocale(getUserProfileLocale(reqCtx));
localeCtx.setRemoteUser(reqCtx.getRemoteUser());
@@ -173,8 +180,31 @@
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);
}
}
@@ -249,7 +279,7 @@
{
for (Cookie cookie: cookies)
{
- if (COOKIE_NAME.equals(cookie.getName()))
+ if (LOCALE_COOKIE.equals(cookie.getName()))
{
List<Locale> locales = new ArrayList<Locale>();
locales.add(LocaleContextInfo.getLocale(cookie.getValue()));
@@ -260,6 +290,25 @@
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) ? new Locale(lang) : null;
+ }
+
private void saveLocale(PortalRequestContext context, Locale loc)
{
String user = context.getRemoteUser();
@@ -269,14 +318,51 @@
}
else
{
- saveLocaleToCookie(context, loc);
+ // disabled for now
+ //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(COOKIE_NAME, LocaleContextInfo.getLocaleAsString(loc));
+ Cookie cookie = new Cookie(LOCALE_COOKIE,
LocaleContextInfo.getLocaleAsString(loc));
cookie.setMaxAge(Integer.MAX_VALUE);
cookie.setPath("/");
res.addCookie(cookie);
Modified:
portal/trunk/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UILanguageSelector.java
===================================================================
---
portal/trunk/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UILanguageSelector.java 2010-08-30
11:44:17 UTC (rev 3968)
+++
portal/trunk/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UILanguageSelector.java 2010-08-30
13:10:13 UTC (rev 3969)
@@ -178,8 +178,8 @@
localeConfig = localeConfigService.getDefaultLocaleConfig();
PortalRequestContext prqCtx = PortalRequestContext.getCurrentInstance();
prqCtx.setLocale(localeConfig.getLocale());
- uiApp.setOrientation(localeConfig.getOrientation());
- uiApp.localizeNavigations();
+ //uiApp.setOrientation(localeConfig.getOrientation());
+ //uiApp.localizeNavigations();
}
}
Modified:
portal/trunk/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UIPortalComposer.java
===================================================================
---
portal/trunk/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UIPortalComposer.java 2010-08-30
11:44:17 UTC (rev 3968)
+++
portal/trunk/webui/portal/src/main/java/org/exoplatform/portal/webui/portal/UIPortalComposer.java 2010-08-30
13:10:13 UTC (rev 3969)
@@ -233,7 +233,7 @@
{
prContext.setLocale(localeConfig.getLocale());
//editPortal.refreshNavigation(localeConfig.getLocale());
- uiPortalApp.localizeNavigations();
+ //uiPortalApp.localizeNavigations();
}
uiPortalApp.setSkin(editPortal.getSkin());
}