gatein SVN: r6561 - in epp/portal/branches/EPP_5_0_0_GA_JBEPP-953: component/resources/src/main/java/org/exoplatform/services/resources and 9 other directories.
by do-not-reply@jboss.org
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;
13 years, 7 months
gatein SVN: r6560 - maven/dep/trunk.
by do-not-reply@jboss.org
Author: thomas.heute(a)jboss.com
Date: 2011-05-25 05:27:20 -0400 (Wed, 25 May 2011)
New Revision: 6560
Modified:
maven/dep/trunk/pom.xml
Log:
GTNMAVEN-29: Use GateIn Parent 1.1.0-Beta02
Modified: maven/dep/trunk/pom.xml
===================================================================
--- maven/dep/trunk/pom.xml 2011-05-25 08:51:07 UTC (rev 6559)
+++ maven/dep/trunk/pom.xml 2011-05-25 09:27:20 UTC (rev 6560)
@@ -12,9 +12,9 @@
<packaging>pom</packaging>
<parent>
- <artifactId>jboss-parent</artifactId>
- <groupId>org.jboss</groupId>
- <version>5</version>
+ <groupId>org.gatein</groupId>
+ <artifactId>gatein-parent</artifactId>
+ <version>1.1.0-Beta02</version>
</parent>
<scm>
13 years, 7 months
gatein SVN: r6558 - maven/parent/tags.
by do-not-reply@jboss.org
Author: thomas.heute(a)jboss.com
Date: 2011-05-25 04:50:48 -0400 (Wed, 25 May 2011)
New Revision: 6558
Added:
maven/parent/tags/1.1.0-Beta02/
Log:
[maven-release-plugin] copy for tag 1.1.0-Beta02
13 years, 7 months
gatein SVN: r6556 - portal/branches/branch-GTNPORTAL-1872/webui/portal/src/main/java/org/exoplatform/portal/webui/page.
by do-not-reply@jboss.org
Author: ndkhoiits
Date: 2011-05-25 04:48:22 -0400 (Wed, 25 May 2011)
New Revision: 6556
Modified:
portal/branches/branch-GTNPORTAL-1872/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIPageNodeForm.java
Log:
GTNPORTAL-1652 New page for node is created even if it is canceled
Modified: portal/branches/branch-GTNPORTAL-1872/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIPageNodeForm.java
===================================================================
--- portal/branches/branch-GTNPORTAL-1872/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIPageNodeForm.java 2011-05-25 08:38:59 UTC (rev 6555)
+++ portal/branches/branch-GTNPORTAL-1872/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIPageNodeForm.java 2011-05-25 08:48:22 UTC (rev 6556)
@@ -68,10 +68,6 @@
private PageNode pageNode_;
- private String owner_;
-
- private String ownerType_;
-
private Object selectedParent;
/**
@@ -313,10 +309,23 @@
}
- uiPageNodeForm.invokeSetBindingBean(pageNode);
UIPageSelector2 pageSelector = uiPageNodeForm.getChild(UIPageSelector2.class);
if (pageSelector.getPage() == null)
- pageNode.setPageReference(null);
+ {
+ pageSelector.setValue(null);
+ }
+ else
+ {
+ Page page = pageSelector.getPage();
+ DataStorage storage = uiPageNodeForm.getApplicationComponent(DataStorage.class);
+ if (storage.getPage(page.getPageId()) == null)
+ {
+ storage.create(page);
+ pageSelector.setValue(page.getPageId());
+ }
+ }
+
+ uiPageNodeForm.invokeSetBindingBean(pageNode);
UIFormInputIconSelector uiIconSelector = uiPageNodeForm.getChild(UIFormInputIconSelector.class);
if (uiIconSelector.getSelectedIcon().equals("Default"))
pageNode.setIcon(null);
@@ -499,9 +508,7 @@
return;
}
- // save page to database
- dataService.create(page);
- pageSelector.setValue(page.getPageId());
+ pageSelector.setPage(page);
}
}
}
13 years, 7 months
gatein SVN: r6555 - maven/parent/trunk.
by do-not-reply@jboss.org
Author: thomas.heute(a)jboss.com
Date: 2011-05-25 04:38:59 -0400 (Wed, 25 May 2011)
New Revision: 6555
Modified:
maven/parent/trunk/pom.xml
Log:
GTNMAVEN-28: Upgrade to JBoss Parent Pom 6-beta-2
Modified: maven/parent/trunk/pom.xml
===================================================================
--- maven/parent/trunk/pom.xml 2011-05-25 08:34:09 UTC (rev 6554)
+++ maven/parent/trunk/pom.xml 2011-05-25 08:38:59 UTC (rev 6555)
@@ -5,7 +5,7 @@
<parent>
<groupId>org.jboss</groupId>
<artifactId>jboss-parent</artifactId>
- <version>5</version>
+ <version>6-beta-2</version>
</parent>
<name>GateIn - Maven parent</name>
@@ -33,11 +33,6 @@
<maven.compiler.showWarnings>true</maven.compiler.showWarnings>
<maven.compiler.optimize>true</maven.compiler.optimize>
- <!-- maven-compiler-plugin -->
- <maven.compiler.target>1.6</maven.compiler.target>
- <maven.compiler.source>1.6</maven.compiler.source>
-
- <!-- maven-enforcer-plugin -->
<maven.min.version>2.2.1</maven.min.version>
<!-- maven-release-plugin -->
@@ -49,21 +44,13 @@
<!-- **************** -->
<!-- Plugins versions -->
<!-- **************** -->
- <version.antrun.plugin>1.6</version.antrun.plugin>
- <version.clean.plugin>2.4.1</version.clean.plugin>
<version.checkstyle.plugin>2.6</version.checkstyle.plugin>
<version.compiler.plugin>2.3.2</version.compiler.plugin>
<version.dependency.plugin>2.2</version.dependency.plugin>
- <version.deploy.plugin>2.5</version.deploy.plugin>
- <version.install.plugin>2.3.1</version.install.plugin>
- <version.jar.plugin>2.3.1</version.jar.plugin>
<version.surefire.plugin>2.7.2</version.surefire.plugin>
- <version.resources.plugin>2.4.3</version.resources.plugin>
+ <version.site.plugin>2.2</version.site.plugin>
<version.war.plugin>2.1.1</version.war.plugin>
<version.ear.plugin>2.5</version.ear.plugin>
- <version.site.plugin>2.2</version.site.plugin>
- <version.source.plugin>2.1.2</version.source.plugin>
- <version.javadoc.plugin>2.7</version.javadoc.plugin>
<version.buildnumber.plugin>1.0-beta-4</version.buildnumber.plugin>
<version.exec.plugin>1.2</version.exec.plugin>
<version.build-helper.plugin>1.5</version.build-helper.plugin>
@@ -80,6 +67,11 @@
<!-- Plugins are sorted by shortname : clean, deploy, ... -->
<plugins>
<plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-site-plugin</artifactId>
+ <version>${version.site.plugin}</version>
+ </plugin>
+ <plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>${version.exec.plugin}</version>
@@ -89,11 +81,6 @@
<artifactId>build-helper-maven-plugin</artifactId>
<version>${version.build-helper.plugin}</version>
</plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-antrun-plugin</artifactId>
- <version>${version.antrun.plugin}</version>
- </plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>buildnumber-maven-plugin</artifactId>
@@ -106,11 +93,6 @@
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-clean-plugin</artifactId>
- <version>${version.clean.plugin}</version>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${version.compiler.plugin}</version>
</plugin>
@@ -121,41 +103,11 @@
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-deploy-plugin</artifactId>
- <version>${version.deploy.plugin}</version>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-install-plugin</artifactId>
- <version>${version.install.plugin}</version>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-resources-plugin</artifactId>
- <version>${version.resources.plugin}</version>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-javadoc-plugin</artifactId>
- <version>${version.javadoc.plugin}</version>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-site-plugin</artifactId>
- <version>${version.site.plugin}</version>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${version.surefire.plugin}</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-source-plugin</artifactId>
- <version>${version.source.plugin}</version>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>${version.war.plugin}</version>
</plugin>
@@ -166,29 +118,6 @@
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-jar-plugin</artifactId>
- <version>${version.jar.plugin}</version>
- <configuration>
- <archive>
- <manifest>
- <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
- </manifest>
- </archive>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-javadoc-plugin</artifactId>
- <configuration>
- <archive>
- <manifest>
- <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
- </manifest>
- </archive>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<configuration>
<archive>
13 years, 7 months
gatein SVN: r6552 - portal/branches/branch-GTNPORTAL-1872/portlet/dashboard/src/main/java/org/exoplatform/dashboard/webui/component.
by do-not-reply@jboss.org
Author: kien_nguyen
Date: 2011-05-25 03:25:02 -0400 (Wed, 25 May 2011)
New Revision: 6552
Modified:
portal/branches/branch-GTNPORTAL-1872/portlet/dashboard/src/main/java/org/exoplatform/dashboard/webui/component/UITabPaneDashboard.java
Log:
GTNPORTAL-1898 New dashboard page (node) isnt visible at Tabbed dashboard
Modified: portal/branches/branch-GTNPORTAL-1872/portlet/dashboard/src/main/java/org/exoplatform/dashboard/webui/component/UITabPaneDashboard.java
===================================================================
--- portal/branches/branch-GTNPORTAL-1872/portlet/dashboard/src/main/java/org/exoplatform/dashboard/webui/component/UITabPaneDashboard.java 2011-05-25 06:43:27 UTC (rev 6551)
+++ portal/branches/branch-GTNPORTAL-1872/portlet/dashboard/src/main/java/org/exoplatform/dashboard/webui/component/UITabPaneDashboard.java 2011-05-25 07:25:02 UTC (rev 6552)
@@ -73,8 +73,6 @@
private DataStorage dataService;
- private PageNavigation pageNavigation;
-
private UIPortal uiPortal;
final private static int MAX_SHOWED_TAB_NUMBER = 6;
@@ -86,17 +84,8 @@
configService = getApplicationComponent(UserPortalConfigService.class);
dataService = getApplicationComponent(DataStorage.class);
uiPortal = Util.getUIPortal();
- initPageNavigation();
}
- private void initPageNavigation() throws Exception
- {
- //String remoteUser = Util.getPortalRequestContext().getRemoteUser();
- //pageNavigation = getPageNavigation(PortalConfig.USER_TYPE + "::" + remoteUser);
- //TODO: Check this part carefully
- this.pageNavigation = uiPortal.getSelectedNavigation();
- }
-
/*
private PageNavigation getPageNavigation(String owner) throws Exception
{
@@ -148,11 +137,7 @@
public PageNavigation getPageNavigation() throws Exception
{
- if (pageNavigation == null)
- {
- initPageNavigation();
- }
- return pageNavigation;
+ return uiPortal.getSelectedNavigation();
}
/**
@@ -164,6 +149,7 @@
{
try
{
+ PageNavigation pageNavigation = getPageNavigation();
List<PageNode> nodes = pageNavigation.getNodes();
PageNode tobeRemoved = nodes.get(nodeIndex);
PageNode selectedNode = uiPortal.getSelectedNode();
@@ -236,6 +222,7 @@
{
nodeLabel = "Tab_" + getCurrentNumberOfTabs();
}
+ PageNavigation pageNavigation = getPageNavigation();
Page page =
configService.createPageTemplate(UITabPaneDashboard.PAGE_TEMPLATE, pageNavigation.getOwnerType(),
pageNavigation.getOwnerId());
@@ -309,9 +296,9 @@
return true;
}
- private boolean nameExisted(String nodeName)
+ private boolean nameExisted(String nodeName) throws Exception
{
- for (PageNode node : pageNavigation.getNodes())
+ for (PageNode node : getPageNavigation().getNodes())
{
if (node.getName().equals(nodeName))
{
@@ -325,6 +312,7 @@
{
try
{
+ PageNavigation pageNavigation = getPageNavigation();
List<PageNode> nodes = pageNavigation.getNodes();
List<PageNode> selectedPath = uiPortal.getSelectedPath();
PageNode parentNode = null;
@@ -383,6 +371,7 @@
try
{
+ PageNavigation pageNavigation = getPageNavigation();
ArrayList<PageNode> nodes = pageNavigation.getNodes();
PageNode firstNode = nodes.get(firstIndex);
PageNode secondNode = nodes.get(secondIndex);
13 years, 7 months
gatein SVN: r6551 - portal/branches/branch-GTNPORTAL-1872/webui/portal/src/main/java/org/exoplatform/portal/webui/page.
by do-not-reply@jboss.org
Author: kien_nguyen
Date: 2011-05-25 02:43:27 -0400 (Wed, 25 May 2011)
New Revision: 6551
Modified:
portal/branches/branch-GTNPORTAL-1872/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIWizardPageSetInfo.java
Log:
GTNPORTAL-1899 Visible checkbox for dashboard page doesnt make sense
Modified: portal/branches/branch-GTNPORTAL-1872/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIWizardPageSetInfo.java
===================================================================
--- portal/branches/branch-GTNPORTAL-1872/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIWizardPageSetInfo.java 2011-05-24 21:34:40 UTC (rev 6550)
+++ portal/branches/branch-GTNPORTAL-1872/webui/portal/src/main/java/org/exoplatform/portal/webui/page/UIWizardPageSetInfo.java 2011-05-25 06:43:27 UTC (rev 6551)
@@ -43,6 +43,8 @@
import org.exoplatform.webui.form.UIForm;
import org.exoplatform.webui.form.UIFormCheckBoxInput;
import org.exoplatform.webui.form.UIFormDateTimeInput;
+import org.exoplatform.webui.form.UIFormInput;
+import org.exoplatform.webui.form.UIFormInputBase;
import org.exoplatform.webui.form.UIFormStringInput;
import org.exoplatform.webui.form.validator.DateTimeValidator;
import org.exoplatform.webui.form.validator.IdentifierValidator;
@@ -96,8 +98,19 @@
.setMaxLength(255).addValidator(StringLengthValidator.class, 3, 120));
addUIFormInput(uiVisibleCheck.setChecked(true));
addUIFormInput(uiDateInputCheck);
- addUIFormInput(new UIFormDateTimeInput(START_PUBLICATION_DATE, null, null).addValidator(DateTimeValidator.class));
- addUIFormInput(new UIFormDateTimeInput(END_PUBLICATION_DATE, null, null).addValidator(DateTimeValidator.class));
+ UIFormInputBase<String> startPubDateInput = new UIFormDateTimeInput(START_PUBLICATION_DATE, null, null).addValidator(DateTimeValidator.class);
+ UIFormInputBase<String> endPubDateInput = new UIFormDateTimeInput(END_PUBLICATION_DATE, null, null).addValidator(DateTimeValidator.class);
+ addUIFormInput(startPubDateInput);
+ addUIFormInput(endPubDateInput);
+
+ boolean isUserNav = Util.getUIPortal().getSelectedNavigation().getOwnerType().equals(PortalConfig.USER_TYPE);
+ if (isUserNav)
+ {
+ uiVisibleCheck.setRendered(false);
+ uiDateInputCheck.setRendered(false);
+ startPubDateInput.setRendered(false);
+ endPubDateInput.setRendered(false);
+ }
}
public void setEditMode() throws Exception
13 years, 7 months
gatein SVN: r6550 - in portal/trunk: component/portal/src/test/resources/conf and 1 other directories.
by do-not-reply@jboss.org
Author: julien_viet
Date: 2011-05-24 17:34:40 -0400 (Tue, 24 May 2011)
New Revision: 6550
Modified:
portal/trunk/component/portal/src/test/resources/conf/exo.portal.component.portal-configuration1.xml
portal/trunk/pom.xml
portal/trunk/web/portal/src/main/webapp/WEB-INF/conf/jcr/jcr-configuration.xml
Log:
GTNPORTAL-1911 : Update to Chromattic 1.1.0-beta5 / JCR 1.14.0-CR2 / MOP 1.1.0-Beta02
Modified: portal/trunk/component/portal/src/test/resources/conf/exo.portal.component.portal-configuration1.xml
===================================================================
--- portal/trunk/component/portal/src/test/resources/conf/exo.portal.component.portal-configuration1.xml 2011-05-24 21:04:19 UTC (rev 6549)
+++ portal/trunk/component/portal/src/test/resources/conf/exo.portal.component.portal-configuration1.xml 2011-05-24 21:34:40 UTC (rev 6550)
@@ -74,11 +74,16 @@
</component>
<component>
- <key>org.exoplatform.services.jcr.ext.hierarchy.NodeHierarchyCreator</key>
- <type>org.exoplatform.services.jcr.ext.hierarchy.impl.NodeHierarchyCreatorImpl</type>
+ <key>org.exoplatform.services.jcr.ext.distribution.DataDistributionManager</key>
+ <type>org.exoplatform.services.jcr.ext.distribution.impl.DataDistributionManagerImpl</type>
</component>
<component>
+ <key>org.exoplatform.services.jcr.ext.hierarchy.NodeHierarchyCreator</key>
+ <type>org.exoplatform.services.jcr.ext.hierarchy.impl.NodeHierarchyCreatorImpl</type>
+ </component>
+
+ <component>
<key>org.exoplatform.portal.config.UserACL</key>
<type>org.exoplatform.portal.config.UserACL</type>
<init-params>
Modified: portal/trunk/pom.xml
===================================================================
--- portal/trunk/pom.xml 2011-05-24 21:04:19 UTC (rev 6549)
+++ portal/trunk/pom.xml 2011-05-24 21:34:40 UTC (rev 6550)
@@ -38,10 +38,10 @@
<name>GateIn - Portal</name>
<properties>
- <org.exoplatform.kernel.version>2.3.0-CR1</org.exoplatform.kernel.version>
- <org.exoplatform.core.version>2.4.0-CR1</org.exoplatform.core.version>
- <org.exoplatform.ws.version>2.2.0-CR1</org.exoplatform.ws.version>
- <org.exoplatform.jcr.version>1.14.0-CR1</org.exoplatform.jcr.version>
+ <org.exoplatform.kernel.version>2.3.0-CR2</org.exoplatform.kernel.version>
+ <org.exoplatform.core.version>2.4.0-CR2</org.exoplatform.core.version>
+ <org.exoplatform.ws.version>2.2.0-CR2</org.exoplatform.ws.version>
+ <org.exoplatform.jcr.version>1.14.0-CR2</org.exoplatform.jcr.version>
<org.shindig.version>1.0-r790473-Patch06</org.shindig.version>
<nl.captcha.simplecaptcha.version>1.1.1-GA-Patch01</nl.captcha.simplecaptcha.version>
<org.gatein.common.version>2.0.4-Beta02</org.gatein.common.version>
@@ -49,8 +49,8 @@
<org.gatein.pc.version>2.3.0-Beta03</org.gatein.pc.version>
<org.picketlink.idm>1.3.0.Alpha03</org.picketlink.idm>
<org.gatein.wsrp.version>2.1.0-Beta04</org.gatein.wsrp.version>
- <org.gatein.mop.version>1.1.0-Beta01</org.gatein.mop.version>
- <version.chromattic>1.1.0-beta2</version.chromattic>
+ <org.gatein.mop.version>1.1.0-Beta02</org.gatein.mop.version>
+ <version.chromattic>1.1.0-beta5</version.chromattic>
<version.reflext>1.1.0-beta12</version.reflext>
<jcip.version>1.0</jcip.version>
Modified: portal/trunk/web/portal/src/main/webapp/WEB-INF/conf/jcr/jcr-configuration.xml
===================================================================
--- portal/trunk/web/portal/src/main/webapp/WEB-INF/conf/jcr/jcr-configuration.xml 2011-05-24 21:04:19 UTC (rev 6549)
+++ portal/trunk/web/portal/src/main/webapp/WEB-INF/conf/jcr/jcr-configuration.xml 2011-05-24 21:34:40 UTC (rev 6550)
@@ -49,6 +49,11 @@
</component>
<component>
+ <key>org.exoplatform.services.jcr.ext.distribution.DataDistributionManager</key>
+ <type>org.exoplatform.services.jcr.ext.distribution.impl.DataDistributionManagerImpl</type>
+ </component>
+
+ <component>
<key>org.exoplatform.services.jcr.ext.hierarchy.NodeHierarchyCreator</key>
<type>org.exoplatform.services.jcr.ext.hierarchy.impl.NodeHierarchyCreatorImpl</type>
</component>
13 years, 7 months