diff --git a/core/src/main/java/com/opensymphony/xwork2/interceptor/I18nInterceptor.java b/core/src/main/java/com/opensymphony/xwork2/interceptor/I18nInterceptor.java
deleted file mode 100644
index acc0d7b13..000000000
--- a/core/src/main/java/com/opensymphony/xwork2/interceptor/I18nInterceptor.java
+++ /dev/null
@@ -1,288 +0,0 @@
-/*
- * Copyright 2002-2006,2009 The Apache Software Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.opensymphony.xwork2.interceptor;
-
-import com.opensymphony.xwork2.ActionInvocation;
-import com.opensymphony.xwork2.util.LocalizedTextUtil;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.apache.struts2.dispatcher.Parameter;
-import org.apache.struts2.dispatcher.HttpParameters;
-
-import java.util.Arrays;
-import java.util.Locale;
-import java.util.Map;
-
-/**
- *
- *
- * An interceptor that handles setting the locale specified in a session as the locale for the current action request.
- * In addition, this interceptor will look for a specific HTTP request parameter and set the locale to whatever value is
- * provided. This means that this interceptor can be used to allow for your application to dynamically change the locale
- * for the user's session or, alternatively, only for the current request (since XWork 2.1.3).
- * This is very useful for applications that require multi-lingual support and want the user to
- * be able to set his or her language preference at any point. The locale parameter is removed during the execution of
- * this interceptor, ensuring that properties aren't set on an action (such as request_locale) that have no typical
- * corresponding setter in your action.
- *
- *
- *
- * For example, using the default parameter name, a request to foo.action?request_locale=en_US, then the
- * locale for US English is saved in the user's session and will be used for all future requests.
- * If there is no locale set (for example with the first visit), the interceptor uses the browser locale.
- *
- *
- *
- * Interceptor parameters:
- *
- *
- *
- * - parameterName (optional) - the name of the HTTP request parameter that dictates the locale to switch to and save
- * in the session. By default this is request_locale
- * - requestOnlyParameterName (optional) - the name of the HTTP request parameter that dictates the locale to switch to
- * for the current request only, without saving it in the session. By default this is request_only_locale
- * - attributeName (optional) - the name of the session key to store the selected locale. By default this is
- * WW_TRANS_I18N_LOCALE
- *
- *
- *
- * Extending the interceptor:
- *
- *
- *
- * There are no known extensions points for this interceptor.
- *
- *
- *
- * Example code:
- *
- *
- *
- * <action name="someAction" class="com.examples.SomeAction">
- * <interceptor-ref name="i18n"/>
- * <interceptor-ref name="basicStack"/>
- * <result name="success">good_result.ftl</result>
- * </action>
- *
- *
- *
- * @author Aleksei Gopachenko
- */
-public class I18nInterceptor extends AbstractInterceptor {
- private static final long serialVersionUID = 2496830135246700300L;
-
- protected static final Logger LOG = LogManager.getLogger(I18nInterceptor.class);
-
- public static final String DEFAULT_SESSION_ATTRIBUTE = "WW_TRANS_I18N_LOCALE";
- public static final String DEFAULT_PARAMETER = "request_locale";
- public static final String DEFAULT_REQUESTONLY_PARAMETER = "request_only_locale";
-
- protected String parameterName = DEFAULT_PARAMETER;
- protected String requestOnlyParameterName = DEFAULT_REQUESTONLY_PARAMETER;
- protected String attributeName = DEFAULT_SESSION_ATTRIBUTE;
-
- // Request-Only = None
- protected enum Storage { SESSION, NONE }
-
- public I18nInterceptor() {
- LOG.debug("new I18nInterceptor()");
- }
-
- public void setParameterName(String parameterName) {
- this.parameterName = parameterName;
- }
-
- public void setRequestOnlyParameterName(String requestOnlyParameterName) {
- this.requestOnlyParameterName = requestOnlyParameterName;
- }
-
- public void setAttributeName(String attributeName) {
- this.attributeName = attributeName;
- }
-
- @Override
- public String intercept(ActionInvocation invocation) throws Exception {
- if (LOG.isDebugEnabled()) {
- LOG.debug("Intercept '{}/{}' {", invocation.getProxy().getNamespace(), invocation.getProxy().getActionName());
- }
-
- LocaleFinder localeFinder = new LocaleFinder(invocation);
- Locale locale = getLocaleFromParam(localeFinder.getRequestedLocale());
- locale = storeLocale(invocation, locale, localeFinder.getStorage());
- saveLocale(invocation, locale);
-
- if (LOG.isDebugEnabled()) {
- LOG.debug("before Locale: {}", invocation.getStack().findValue("locale"));
- }
-
- final String result = invocation.invoke();
-
- if (LOG.isDebugEnabled()) {
- LOG.debug("after Locale {}", invocation.getStack().findValue("locale"));
- LOG.debug("intercept } ");
- }
-
- return result;
- }
-
- /**
- * Store the locale to the chosen storage, like f. e. the session
- *
- * @param invocation the action invocation
- * @param locale the locale to store
- * @param storage the place to store this locale (like Storage.SESSSION.toString())
- *
- * @return the locale
- */
- protected Locale storeLocale(ActionInvocation invocation, Locale locale, String storage) {
- //save it in session
- Map session = invocation.getInvocationContext().getSession();
-
- if (session != null) {
- synchronized (session) {
- if (locale == null) {
- storage = Storage.NONE.toString();
- locale = readStoredLocale(invocation, session);
- }
-
- if (Storage.SESSION.toString().equals(storage)) {
- session.put(attributeName, locale);
- }
- }
- }
- return locale;
- }
-
- protected class LocaleFinder {
- protected String storage = Storage.SESSION.toString();
- protected Parameter requestedLocale = null;
-
- protected ActionInvocation actionInvocation = null;
-
- protected LocaleFinder(ActionInvocation invocation) {
- actionInvocation = invocation;
- find();
- }
-
- protected void find() {
- //get requested locale
- HttpParameters params = actionInvocation.getInvocationContext().getParameters();
-
- storage = Storage.SESSION.toString();
-
- requestedLocale = findLocaleParameter(params, parameterName);
- if (requestedLocale.isDefined()) {
- return;
- }
-
- requestedLocale = findLocaleParameter(params, requestOnlyParameterName);
- if (requestedLocale.isDefined()) {
- storage = Storage.NONE.toString();
- }
- }
-
- public String getStorage() {
- return storage;
- }
-
- public String getRequestedLocale() {
- return requestedLocale.getValue();
- }
- }
-
- /**
- * Creates a Locale object from the request param, which might
- * be already a Local or a String
- *
- * @param requestedLocale the parameter from the request
- * @return the Locale
- */
- protected Locale getLocaleFromParam(Object requestedLocale) {
- Locale locale = null;
- if (requestedLocale != null) {
- locale = (requestedLocale instanceof Locale) ?
- (Locale) requestedLocale :
- LocalizedTextUtil.localeFromString(requestedLocale.toString(), null);
- if (locale != null) {
- LOG.debug("Applied request locale: {}", locale);
- }
- }
-
- if (locale != null && !Arrays.asList(Locale.getAvailableLocales()).contains(locale)) {
- locale = Locale.getDefault();
- }
- return locale;
- }
-
- /**
- * Reads the locale from the session, and if not found from the
- * current invocation (=browser)
- *
- * @param invocation the current invocation
- * @param session the current session
- * @return the read locale
- */
- protected Locale readStoredLocale(ActionInvocation invocation, Map session) {
- Locale locale = this.readStoredLocalFromSession(invocation, session);
-
- if (locale != null) {
- return locale;
- }
-
- return this.readStoredLocalFromCurrentInvocation(invocation);
- }
-
- protected Locale readStoredLocalFromSession(ActionInvocation invocation, Map session) {
- // check session for saved locale
- Object sessionLocale = session.get(attributeName);
- if (sessionLocale != null && sessionLocale instanceof Locale) {
- Locale locale = (Locale) sessionLocale;
- LOG.debug("Applied session locale: {}", locale);
- return locale;
- }
- return null;
- }
-
- protected Locale readStoredLocalFromCurrentInvocation(ActionInvocation invocation) {
- // no overriding locale definition found, stay with current invocation (=browser) locale
- Locale locale = invocation.getInvocationContext().getLocale();
- if (locale != null) {
- LOG.debug("Applied invocation context locale: {}", locale);
- }
- return locale;
- }
-
- protected Parameter findLocaleParameter(HttpParameters params, String parameterName) {
- Parameter requestedLocale = params.get(parameterName);
- params.remove(parameterName);
- if (requestedLocale.isDefined()) {
- LOG.debug("Requested locale: {}", requestedLocale.getValue());
- }
- return requestedLocale;
- }
-
- /**
- * Save the given locale to the ActionInvocation.
- *
- * @param invocation The ActionInvocation.
- * @param locale The locale to save.
- */
- protected void saveLocale(ActionInvocation invocation, Locale locale) {
- invocation.getInvocationContext().setLocale(locale);
- }
-
-}
diff --git a/core/src/main/java/org/apache/struts2/interceptor/I18nInterceptor.java b/core/src/main/java/org/apache/struts2/interceptor/I18nInterceptor.java
index a5c67f2aa..15c6e786c 100644
--- a/core/src/main/java/org/apache/struts2/interceptor/I18nInterceptor.java
+++ b/core/src/main/java/org/apache/struts2/interceptor/I18nInterceptor.java
@@ -22,22 +22,40 @@ package org.apache.struts2.interceptor;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
+import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
+import com.opensymphony.xwork2.util.LocalizedTextUtil;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.StrutsStatics;
import org.apache.struts2.dispatcher.HttpParameters;
+import org.apache.struts2.dispatcher.Parameter;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
+import java.util.Arrays;
import java.util.Locale;
import java.util.Map;
/**
*
*
- * This interceptor extends the original xwork i18n interceptor
- * and adds functionality to support cookies.
+ * An interceptor that handles setting the locale specified in a session as the locale for the current action request.
+ * In addition, this interceptor will look for a specific HTTP request parameter and set the locale to whatever value is
+ * provided, it also looks for specific cookie to read locale from. This means that this interceptor can be used to allow
+ * for your application to dynamically change the locale for the user's session or, alternatively, only for the current
+ * request (since XWork 2.1.3).
+ * This is very useful for applications that require multi-lingual support and want the user to
+ * be able to set his or her language preference at any point. The locale parameter is removed during the execution of
+ * this interceptor, ensuring that properties aren't set on an action (such as request_locale) that have no typical
+ * corresponding setter in your action.
*
*
+ *
+ * For example, using the default parameter name, a request to foo.action?request_locale=en_US, then the
+ * locale for US English is saved in the user's session and will be used for all future requests.
+ * If there is no locale set (for example with the first visit), the interceptor uses the browser locale.
+ *
*
*
*
@@ -70,8 +88,20 @@ import java.util.Map;
* </action>
*
*/
-public class I18nInterceptor extends com.opensymphony.xwork2.interceptor.I18nInterceptor {
- private static final long serialVersionUID = 4587460933182760358L;
+public class I18nInterceptor extends AbstractInterceptor {
+
+ private static final Logger LOG = LogManager.getLogger(I18nInterceptor.class);
+
+ public static final String DEFAULT_SESSION_ATTRIBUTE = "WW_TRANS_I18N_LOCALE";
+ public static final String DEFAULT_PARAMETER = "request_locale";
+ public static final String DEFAULT_REQUESTONLY_PARAMETER = "request_only_locale";
+
+ protected String parameterName = DEFAULT_PARAMETER;
+ protected String requestOnlyParameterName = DEFAULT_REQUESTONLY_PARAMETER;
+ protected String attributeName = DEFAULT_SESSION_ATTRIBUTE;
+
+ // Request-Only = None
+ protected enum Storage { SESSION, NONE }
public static final String DEFAULT_COOKIE_ATTRIBUTE = DEFAULT_SESSION_ATTRIBUTE;
@@ -80,35 +110,16 @@ public class I18nInterceptor extends com.opensymphony.xwork2.interceptor.I18nInt
public static final String DEFAULT_COOKIE_PARAMETER = "request_cookie_locale";
protected String requestCookieParameterName = DEFAULT_COOKIE_PARAMETER;
- protected class CookieLocaleFinder extends LocaleFinder {
- protected CookieLocaleFinder(ActionInvocation invocation) {
- super(invocation);
- }
+ public void setParameterName(String parameterName) {
+ this.parameterName = parameterName;
+ }
- @Override
- protected void find() {
- //get requested locale
- HttpParameters params = actionInvocation.getInvocationContext().getParameters();
- storage = Storage.SESSION.toString();
+ public void setRequestOnlyParameterName(String requestOnlyParameterName) {
+ this.requestOnlyParameterName = requestOnlyParameterName;
+ }
- requestedLocale = findLocaleParameter(params, parameterName);
-
- if (requestedLocale != null) {
- return;
- }
-
- requestedLocale = findLocaleParameter(params, requestCookieParameterName);
- if (requestedLocale != null) {
- storage = COOKIE_STORAGE;
- return;
- }
-
- requestedLocale = findLocaleParameter(params, requestOnlyParameterName);
- if (requestedLocale != null) {
- storage = Storage.NONE.toString();
- }
-
- }
+ public void setAttributeName(String attributeName) {
+ this.attributeName = attributeName;
}
@Override
@@ -137,7 +148,15 @@ public class I18nInterceptor extends com.opensymphony.xwork2.interceptor.I18nInt
return result;
}
- @Override
+ /**
+ * Store the locale to the chosen storage, like f. e. the session
+ *
+ * @param invocation the action invocation
+ * @param locale the locale to store
+ * @param storage the place to store this locale (like Storage.SESSSION.toString())
+ *
+ * @return the locale
+ */
protected Locale storeLocale(ActionInvocation invocation, Locale locale, String storage) {
if (COOKIE_STORAGE.equals(storage)) {
ActionContext ac = invocation.getInvocationContext();
@@ -150,10 +169,32 @@ public class I18nInterceptor extends com.opensymphony.xwork2.interceptor.I18nInt
storage = Storage.SESSION.toString();
}
- return super.storeLocale(invocation, locale, storage);
+ //save it in session
+ Map session = invocation.getInvocationContext().getSession();
+
+ if (session != null) {
+ synchronized (session) {
+ if (locale == null) {
+ storage = Storage.NONE.toString();
+ locale = readStoredLocale(invocation, session);
+ }
+
+ if (Storage.SESSION.toString().equals(storage)) {
+ session.put(attributeName, locale);
+ }
+ }
+ }
+ return locale;
}
- @Override
+ /**
+ * Reads the locale from the session, and if not found from the
+ * current invocation (=browser)
+ *
+ * @param invocation the current invocation
+ * @param session the current session
+ * @return the read locale
+ */
protected Locale readStoredLocale(ActionInvocation invocation, Map session) {
Locale locale = this.readStoredLocalFromSession(invocation, session);
@@ -173,7 +214,139 @@ public class I18nInterceptor extends com.opensymphony.xwork2.interceptor.I18nInt
return this.readStoredLocalFromCurrentInvocation(invocation);
}
+ /**
+ * Creates a Locale object from the request param, which might
+ * be already a Local or a String
+ *
+ * @param requestedLocale the parameter from the request
+ * @return the Locale
+ */
+ protected Locale getLocaleFromParam(Object requestedLocale) {
+ Locale locale = null;
+ if (requestedLocale != null) {
+ locale = (requestedLocale instanceof Locale) ?
+ (Locale) requestedLocale :
+ LocalizedTextUtil.localeFromString(requestedLocale.toString(), null);
+ if (locale != null) {
+ LOG.debug("Applied request locale: {}", locale);
+ }
+ }
+
+ if (locale != null && !Arrays.asList(Locale.getAvailableLocales()).contains(locale)) {
+ locale = Locale.getDefault();
+ }
+ return locale;
+ }
+
+ protected Locale readStoredLocalFromSession(ActionInvocation invocation, Map session) {
+ // check session for saved locale
+ Object sessionLocale = session.get(attributeName);
+ if (sessionLocale != null && sessionLocale instanceof Locale) {
+ Locale locale = (Locale) sessionLocale;
+ LOG.debug("Applied session locale: {}", locale);
+ return locale;
+ }
+ return null;
+ }
+
+ protected Locale readStoredLocalFromCurrentInvocation(ActionInvocation invocation) {
+ // no overriding locale definition found, stay with current invocation (=browser) locale
+ Locale locale = invocation.getInvocationContext().getLocale();
+ if (locale != null) {
+ LOG.debug("Applied invocation context locale: {}", locale);
+ }
+ return locale;
+ }
+
+ protected Parameter findLocaleParameter(HttpParameters params, String parameterName) {
+ Parameter requestedLocale = params.get(parameterName);
+ params.remove(parameterName);
+ if (requestedLocale.isDefined()) {
+ LOG.debug("Requested locale: {}", requestedLocale.getValue());
+ }
+ return requestedLocale;
+ }
+
+ /**
+ * Save the given locale to the ActionInvocation.
+ *
+ * @param invocation The ActionInvocation.
+ * @param locale The locale to save.
+ */
+ protected void saveLocale(ActionInvocation invocation, Locale locale) {
+ invocation.getInvocationContext().setLocale(locale);
+ }
+
public void setRequestCookieParameterName(String requestCookieParameterName) {
this.requestCookieParameterName = requestCookieParameterName;
}
+
+ protected class LocaleFinder {
+ protected String storage = Storage.SESSION.toString();
+ protected Parameter requestedLocale = null;
+
+ protected ActionInvocation actionInvocation = null;
+
+ protected LocaleFinder(ActionInvocation invocation) {
+ actionInvocation = invocation;
+ find();
+ }
+
+ protected void find() {
+ //get requested locale
+ HttpParameters params = actionInvocation.getInvocationContext().getParameters();
+
+ storage = Storage.SESSION.toString();
+
+ requestedLocale = findLocaleParameter(params, parameterName);
+ if (requestedLocale.isDefined()) {
+ return;
+ }
+
+ requestedLocale = findLocaleParameter(params, requestOnlyParameterName);
+ if (requestedLocale.isDefined()) {
+ storage = Storage.NONE.toString();
+ }
+ }
+
+ public String getStorage() {
+ return storage;
+ }
+
+ public String getRequestedLocale() {
+ return requestedLocale.getValue();
+ }
+ }
+
+ protected class CookieLocaleFinder extends LocaleFinder {
+ protected CookieLocaleFinder(ActionInvocation invocation) {
+ super(invocation);
+ }
+
+ @Override
+ protected void find() {
+ //get requested locale
+ HttpParameters params = actionInvocation.getInvocationContext().getParameters();
+ storage = Storage.SESSION.toString();
+
+ requestedLocale = findLocaleParameter(params, parameterName);
+
+ if (requestedLocale.isDefined()) {
+ return;
+ }
+
+ requestedLocale = findLocaleParameter(params, requestCookieParameterName);
+ if (requestedLocale.isDefined()) {
+ storage = COOKIE_STORAGE;
+ return;
+ }
+
+ requestedLocale = findLocaleParameter(params, requestOnlyParameterName);
+ if (requestedLocale.isDefined()) {
+ storage = Storage.NONE.toString();
+ }
+
+ }
+ }
+
}
diff --git a/core/src/test/java/com/opensymphony/xwork2/interceptor/I18nInterceptorTest.java b/core/src/test/java/com/opensymphony/xwork2/interceptor/I18nInterceptorTest.java
deleted file mode 100644
index f4dfa9384..000000000
--- a/core/src/test/java/com/opensymphony/xwork2/interceptor/I18nInterceptorTest.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- * Copyright 2002-2006,2009 The Apache Software Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.opensymphony.xwork2.interceptor;
-
-import com.opensymphony.xwork2.Action;
-import com.opensymphony.xwork2.ActionContext;
-import com.opensymphony.xwork2.ActionInvocation;
-import com.opensymphony.xwork2.SimpleFooAction;
-import com.opensymphony.xwork2.mock.MockActionInvocation;
-import junit.framework.TestCase;
-import org.apache.struts2.dispatcher.HttpParameters;
-import org.apache.struts2.dispatcher.Parameter;
-
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-
-/**
- * Unit test for I18nInterceptor.
- *
- * @author Claus Ibsen
- */
-public class I18nInterceptorTest extends TestCase {
-
- private I18nInterceptor interceptor;
- private ActionContext ac;
- private Map session;
- private ActionInvocation mai;
-
- public void testEmptyParamAndSession() throws Exception {
- interceptor.intercept(mai);
- }
-
- public void testNoSession() throws Exception {
- ac.setSession(null);
- interceptor.intercept(mai);
- }
-
- public void testDefaultLocale() throws Exception {
- prepare(I18nInterceptor.DEFAULT_PARAMETER, "_"); // bad locale that would get us default locale instead
- interceptor.intercept(mai);
-
- assertFalse(mai.getInvocationContext().getParameters().get(I18nInterceptor.DEFAULT_PARAMETER).isDefined()); // should have been removed
-
- assertNotNull(session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should be stored here
- assertEquals(Locale.getDefault(), session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should create a locale object
- }
-
- public void testDenmarkLocale() throws Exception {
- prepare(I18nInterceptor.DEFAULT_PARAMETER, "da_DK");
- interceptor.intercept(mai);
-
- assertFalse(mai.getInvocationContext().getParameters().get(I18nInterceptor.DEFAULT_PARAMETER).isDefined()); // should have been removed
-
- Locale denmark = new Locale("da", "DK");
- assertNotNull(session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should be stored here
- assertEquals(denmark, session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should create a locale object
- }
-
- public void testDenmarkLocaleRequestOnly() throws Exception {
- prepare(I18nInterceptor.DEFAULT_REQUESTONLY_PARAMETER, "da_DK");
- interceptor.intercept(mai);
-
- assertFalse(mai.getInvocationContext().getParameters().get(I18nInterceptor.DEFAULT_PARAMETER).isDefined()); // should have been removed
-
- Locale denmark = new Locale("da", "DK");
- assertNull(session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should be stored here
- assertEquals(denmark, mai.getInvocationContext().getLocale()); // should create a locale object
- }
-
- public void testCountryOnlyLocale() throws Exception {
- prepare(I18nInterceptor.DEFAULT_PARAMETER, "NL");
- interceptor.intercept(mai);
-
- assertFalse(mai.getInvocationContext().getParameters().get(I18nInterceptor.DEFAULT_PARAMETER).isDefined()); // should have been removed
-
- Locale denmark = new Locale("NL");
- assertNotNull(session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should be stored here
- assertEquals(denmark, session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should create a locale object
- }
-
- public void testLanguageOnlyLocale() throws Exception {
- prepare(I18nInterceptor.DEFAULT_PARAMETER, "da_");
- interceptor.intercept(mai);
-
- assertFalse(mai.getInvocationContext().getParameters().get(I18nInterceptor.DEFAULT_PARAMETER).isDefined()); // should have been removed
-
- Locale denmark = new Locale("da");
- assertNotNull(session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should be stored here
- assertEquals(denmark, session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should create a locale object
- }
-
- public void testWithVariant() throws Exception {
- prepare(I18nInterceptor.DEFAULT_PARAMETER, "ja_JP_JP");
- interceptor.intercept(mai);
-
- assertFalse(mai.getInvocationContext().getParameters().get(I18nInterceptor.DEFAULT_PARAMETER).isDefined()); // should have been removed
-
- Locale variant = new Locale("ja", "JP", "JP");
- Locale locale = (Locale) session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE);
- assertNotNull(locale); // should be stored here
- assertEquals(variant, locale);
- assertEquals("JP", locale.getVariant());
- }
-
- public void testWithVariantRequestOnly() throws Exception {
- prepare(I18nInterceptor.DEFAULT_REQUESTONLY_PARAMETER, "ja_JP_JP");
- interceptor.intercept(mai);
-
- assertFalse(mai.getInvocationContext().getParameters().get(I18nInterceptor.DEFAULT_PARAMETER).isDefined()); // should have been removed
- assertNull(session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE));
-
- Locale variant = new Locale("ja", "JP", "JP");
- Locale locale = mai.getInvocationContext().getLocale();
- assertNotNull(locale); // should be stored here
- assertEquals(variant, locale);
- assertEquals("JP", locale.getVariant());
- }
-
- public void testRealLocaleObjectInParams() throws Exception {
- prepare(I18nInterceptor.DEFAULT_PARAMETER, Locale.CANADA_FRENCH);
- interceptor.intercept(mai);
-
- assertFalse(mai.getInvocationContext().getParameters().get(I18nInterceptor.DEFAULT_PARAMETER).isDefined()); // should have been removed
-
- assertNotNull(session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should be stored here
- assertEquals(Locale.CANADA_FRENCH, session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should create a locale object
- }
-
- public void testRealLocalesInParams() throws Exception {
- Locale[] locales = new Locale[] { Locale.CANADA_FRENCH };
- assertTrue(locales.getClass().isArray());
- prepare(I18nInterceptor.DEFAULT_PARAMETER, locales);
- interceptor.intercept(mai);
-
- assertFalse(mai.getInvocationContext().getParameters().get(I18nInterceptor.DEFAULT_PARAMETER).isDefined()); // should have been removed
-
- assertNotNull(session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should be stored here
- assertEquals(Locale.CANADA_FRENCH, session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE));
- }
-
- public void testSetParameterAndAttributeNames() throws Exception {
- // given
- prepare("world", Locale.CHINA);
-
- interceptor.setAttributeName("hello");
- interceptor.setParameterName("world");
-
- // when
- interceptor.intercept(mai);
-
- // then
- assertFalse(mai.getInvocationContext().getParameters().contains("world")); // should have been removed
-
- assertNotNull(session.get("hello")); // should be stored here
- assertEquals(Locale.CHINA, session.get("hello"));
- }
-
- public void testActionContextLocaleIsPreservedWhenNotOverridden() throws Exception {
- final Locale locale1 = Locale.TRADITIONAL_CHINESE;
- mai.getInvocationContext().setLocale(locale1);
- interceptor.intercept(mai);
-
- Locale locale = (Locale) session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE);
- assertNull(locale); // should not be stored here
- locale = mai.getInvocationContext().getLocale();
- assertEquals(locale1, locale);
- }
-
- private void prepare(String key, Serializable value) {
- Map params = new HashMap<>();
- params.put(key, value);
-
- mai.getInvocationContext().setParameters(HttpParameters.create(params).build());
- }
-
- @Override
- protected void setUp() throws Exception {
- interceptor = new I18nInterceptor();
- interceptor.init();
-
- session = new HashMap();
-
- Map ctx = new HashMap<>();
- ctx.put(ActionContext.PARAMETERS, HttpParameters.createEmpty().build());
- ctx.put(ActionContext.SESSION, session);
- ac = new ActionContext(ctx);
-
- Action action = new SimpleFooAction();
- mai = new MockActionInvocation();
- ((MockActionInvocation) mai).setAction(action);
- ((MockActionInvocation) mai).setInvocationContext(ac);
- }
-
- @Override
- protected void tearDown() throws Exception {
- interceptor.destroy();
- interceptor = null;
- ac = null;
- session = null;
- mai = null;
- }
-
-}
diff --git a/core/src/test/java/org/apache/struts2/interceptor/I18nInterceptorTest.java b/core/src/test/java/org/apache/struts2/interceptor/I18nInterceptorTest.java
index 07abec2a9..5089be992 100644
--- a/core/src/test/java/org/apache/struts2/interceptor/I18nInterceptorTest.java
+++ b/core/src/test/java/org/apache/struts2/interceptor/I18nInterceptorTest.java
@@ -24,43 +24,189 @@ import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.mock.MockActionInvocation;
+import junit.framework.TestCase;
+import org.apache.struts2.ServletActionContext;
import org.apache.struts2.StrutsStatics;
+import org.apache.struts2.dispatcher.HttpParameters;
import org.easymock.EasyMock;
import org.easymock.IArgumentMatcher;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
+import org.springframework.mock.web.MockHttpServletRequest;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
+import java.io.Serializable;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
-import static org.jmock.expectation.AssertMo.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
+public class I18nInterceptorTest extends TestCase {
-public class I18nInterceptorTest {
private I18nInterceptor interceptor;
private ActionInvocation mai;
private ActionContext ac;
- private Map params;
private Map session;
- @Before
+ public void testEmptyParamAndSession() throws Exception {
+ interceptor.intercept(mai);
+ }
+
+ public void testNoSession() throws Exception {
+ ac.setSession(null);
+ interceptor.intercept(mai);
+ }
+
+ public void testDefaultLocale() throws Exception {
+ prepare(I18nInterceptor.DEFAULT_PARAMETER, "_"); // bad locale that would get us default locale instead
+ interceptor.intercept(mai);
+
+ assertFalse(mai.getInvocationContext().getParameters().get(I18nInterceptor.DEFAULT_PARAMETER).isDefined()); // should have been removed
+
+ assertNotNull(session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should be stored here
+ assertEquals(Locale.getDefault(), session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should create a locale object
+ }
+
+ public void testDenmarkLocale() throws Exception {
+ prepare(I18nInterceptor.DEFAULT_PARAMETER, "da_DK");
+ interceptor.intercept(mai);
+
+ assertFalse(mai.getInvocationContext().getParameters().get(I18nInterceptor.DEFAULT_PARAMETER).isDefined()); // should have been removed
+
+ Locale denmark = new Locale("da", "DK");
+ assertNotNull(session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should be stored here
+ assertEquals(denmark, session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should create a locale object
+ }
+
+ public void testDenmarkLocaleRequestOnly() throws Exception {
+ prepare(I18nInterceptor.DEFAULT_REQUESTONLY_PARAMETER, "da_DK");
+ interceptor.intercept(mai);
+
+ assertFalse(mai.getInvocationContext().getParameters().get(I18nInterceptor.DEFAULT_PARAMETER).isDefined()); // should have been removed
+
+ Locale denmark = new Locale("da", "DK");
+ assertNull(session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should be stored here
+ assertEquals(denmark, mai.getInvocationContext().getLocale()); // should create a locale object
+ }
+
+ public void testCountryOnlyLocale() throws Exception {
+ prepare(I18nInterceptor.DEFAULT_PARAMETER, "NL");
+ interceptor.intercept(mai);
+
+ assertFalse(mai.getInvocationContext().getParameters().get(I18nInterceptor.DEFAULT_PARAMETER).isDefined()); // should have been removed
+
+ Locale denmark = new Locale("NL");
+ assertNotNull(session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should be stored here
+ assertEquals(denmark, session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should create a locale object
+ }
+
+ public void testLanguageOnlyLocale() throws Exception {
+ prepare(I18nInterceptor.DEFAULT_PARAMETER, "da_");
+ interceptor.intercept(mai);
+
+ assertFalse(mai.getInvocationContext().getParameters().get(I18nInterceptor.DEFAULT_PARAMETER).isDefined()); // should have been removed
+
+ Locale denmark = new Locale("da");
+ assertNotNull(session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should be stored here
+ assertEquals(denmark, session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should create a locale object
+ }
+
+ public void testWithVariant() throws Exception {
+ prepare(I18nInterceptor.DEFAULT_PARAMETER, "ja_JP_JP");
+ interceptor.intercept(mai);
+
+ assertFalse(mai.getInvocationContext().getParameters().get(I18nInterceptor.DEFAULT_PARAMETER).isDefined()); // should have been removed
+
+ Locale variant = new Locale("ja", "JP", "JP");
+ Locale locale = (Locale) session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE);
+ assertNotNull(locale); // should be stored here
+ assertEquals(variant, locale);
+ assertEquals("JP", locale.getVariant());
+ }
+
+ public void testWithVariantRequestOnly() throws Exception {
+ prepare(I18nInterceptor.DEFAULT_REQUESTONLY_PARAMETER, "ja_JP_JP");
+ interceptor.intercept(mai);
+
+ assertFalse(mai.getInvocationContext().getParameters().get(I18nInterceptor.DEFAULT_PARAMETER).isDefined()); // should have been removed
+ assertNull(session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE));
+
+ Locale variant = new Locale("ja", "JP", "JP");
+ Locale locale = mai.getInvocationContext().getLocale();
+ assertNotNull(locale); // should be stored here
+ assertEquals(variant, locale);
+ assertEquals("JP", locale.getVariant());
+ }
+
+ public void testRealLocaleObjectInParams() throws Exception {
+ prepare(I18nInterceptor.DEFAULT_PARAMETER, Locale.CANADA_FRENCH);
+ interceptor.intercept(mai);
+
+ assertFalse(mai.getInvocationContext().getParameters().get(I18nInterceptor.DEFAULT_PARAMETER).isDefined()); // should have been removed
+
+ assertNotNull(session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should be stored here
+ assertEquals(Locale.CANADA_FRENCH, session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should create a locale object
+ }
+
+ public void testRealLocalesInParams() throws Exception {
+ Locale[] locales = new Locale[] { Locale.CANADA_FRENCH };
+ assertTrue(locales.getClass().isArray());
+ prepare(I18nInterceptor.DEFAULT_PARAMETER, locales);
+ interceptor.intercept(mai);
+
+ assertFalse(mai.getInvocationContext().getParameters().get(I18nInterceptor.DEFAULT_PARAMETER).isDefined()); // should have been removed
+
+ assertNotNull(session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should be stored here
+ assertEquals(Locale.CANADA_FRENCH, session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE));
+ }
+
+ public void testSetParameterAndAttributeNames() throws Exception {
+ // given
+ prepare("world", Locale.CHINA);
+
+ interceptor.setAttributeName("hello");
+ interceptor.setParameterName("world");
+
+ // when
+ interceptor.intercept(mai);
+
+ // then
+ assertFalse(mai.getInvocationContext().getParameters().contains("world")); // should have been removed
+
+ assertNotNull(session.get("hello")); // should be stored here
+ assertEquals(Locale.CHINA, session.get("hello"));
+ }
+
+ public void testActionContextLocaleIsPreservedWhenNotOverridden() throws Exception {
+ final Locale locale1 = Locale.TRADITIONAL_CHINESE;
+ mai.getInvocationContext().setLocale(locale1);
+ interceptor.intercept(mai);
+
+ Locale locale = (Locale) session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE);
+ assertNull(locale); // should not be stored here
+ locale = mai.getInvocationContext().getLocale();
+ assertEquals(locale1, locale);
+ }
+
+ private void prepare(String key, Serializable value) {
+ Map params = new HashMap<>();
+ params.put(key, value);
+
+ mai.getInvocationContext().setParameters(HttpParameters.create(params).build());
+ }
+
public void setUp() throws Exception {
interceptor = new I18nInterceptor();
interceptor.init();
- params = new HashMap();
session = new HashMap();
Map ctx = new HashMap();
- ctx.put(ActionContext.PARAMETERS, params);
+ ctx.put(ActionContext.PARAMETERS, HttpParameters.createEmpty().build());
ctx.put(ActionContext.SESSION, session);
+
ac = new ActionContext(ctx);
+ ServletActionContext.setContext(ac);
+ ServletActionContext.setRequest(new MockHttpServletRequest());
+
Action action = new Action() {
public String execute() throws Exception {
return SUCCESS;
@@ -71,12 +217,10 @@ public class I18nInterceptorTest {
((MockActionInvocation) mai).setInvocationContext(ac);
}
- @After
public void tearDown() throws Exception {
interceptor.destroy();
interceptor = null;
ac = null;
- params = null;
session = null;
mai = null;
}
@@ -109,10 +253,9 @@ public class I18nInterceptorTest {
}
}
- @Test
public void testCookieCreation() throws Exception {
- params.put(I18nInterceptor.DEFAULT_COOKIE_PARAMETER, "da_DK");
+ prepare(I18nInterceptor.DEFAULT_COOKIE_PARAMETER, "da_DK");
final Cookie cookie = new Cookie(I18nInterceptor.DEFAULT_COOKIE_ATTRIBUTE, "da_DK");
@@ -129,136 +272,4 @@ public class I18nInterceptorTest {
assertNotNull(session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should be stored here
assertEquals(denmark, session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should create a locale object
}
-
- @Test
- public void testNoSession() throws Exception {
- ac.setSession(null);
- interceptor.intercept(mai);
- }
-
- @Test
- public void testDefaultLocale() throws Exception {
- params.put(I18nInterceptor.DEFAULT_PARAMETER, "_"); // bad locale that would get us default locale instead
- interceptor.intercept(mai);
-
- assertNull(params.get(I18nInterceptor.DEFAULT_PARAMETER)); // should have been removed
-
- assertNotNull(session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should be stored here
- assertEquals(Locale.getDefault(), session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should create a locale object
- }
-
- @Test
- public void testDenmarkLocale() throws Exception {
- params.put(I18nInterceptor.DEFAULT_PARAMETER, "da_DK");
- interceptor.intercept(mai);
-
- assertNull(params.get(I18nInterceptor.DEFAULT_PARAMETER)); // should have been removed
-
- Locale denmark = new Locale("da", "DK");
- assertNotNull(session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should be stored here
- assertEquals(denmark, session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should create a locale object
- }
-
- @Test
- public void testDenmarkLocaleRequestOnly() throws Exception {
- params.put(I18nInterceptor.DEFAULT_REQUESTONLY_PARAMETER, "da_DK");
- interceptor.intercept(mai);
-
- assertNull(params.get(I18nInterceptor.DEFAULT_PARAMETER)); // should have been removed
-
- Locale denmark = new Locale("da", "DK");
- assertNull(session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should be stored here
- assertEquals(denmark, mai.getInvocationContext().getLocale()); // should create a locale object
- }
-
- @Test
- public void testCountryOnlyLocale() throws Exception {
- params.put(I18nInterceptor.DEFAULT_PARAMETER, "NL");
- interceptor.intercept(mai);
-
- assertNull(params.get(I18nInterceptor.DEFAULT_PARAMETER)); // should have been removed
-
- Locale denmark = new Locale("NL");
- assertNotNull(session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should be stored here
- assertEquals(denmark, session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should create a locale object
- }
-
- @Test
- public void testLanguageOnlyLocale() throws Exception {
- params.put(I18nInterceptor.DEFAULT_PARAMETER, "da_");
- interceptor.intercept(mai);
-
- assertNull(params.get(I18nInterceptor.DEFAULT_PARAMETER)); // should have been removed
-
- Locale denmark = new Locale("da");
- assertNotNull(session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should be stored here
- assertEquals(denmark, session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should create a locale object
- }
-
- @Test
- public void testWithVariant() throws Exception {
- params.put(I18nInterceptor.DEFAULT_PARAMETER, "ja_JP_JP");
- interceptor.intercept(mai);
-
- assertNull(params.get(I18nInterceptor.DEFAULT_PARAMETER)); // should have been removed
-
- Locale variant = new Locale("ja", "JP", "JP");
- Locale locale = (Locale) session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE);
- assertNotNull(locale); // should be stored here
- assertEquals(variant, locale);
- assertEquals("JP", locale.getVariant());
- }
-
- @Test
- public void testWithVariantRequestOnly() throws Exception {
- params.put(I18nInterceptor.DEFAULT_REQUESTONLY_PARAMETER, "ja_JP_JP");
- interceptor.intercept(mai);
-
- assertNull(params.get(I18nInterceptor.DEFAULT_PARAMETER)); // should have been removed
- assertNull(session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE));
-
- Locale variant = new Locale("ja", "JP", "JP");
- Locale locale = mai.getInvocationContext().getLocale();
- assertNotNull(locale); // should be stored here
- assertEquals(variant, locale);
- assertEquals("JP", locale.getVariant());
- }
-
- @Test
- public void testRealLocaleObjectInParams() throws Exception {
- params.put(I18nInterceptor.DEFAULT_PARAMETER, Locale.CANADA_FRENCH);
- interceptor.intercept(mai);
-
- assertNull(params.get(I18nInterceptor.DEFAULT_PARAMETER)); // should have been removed
-
- assertNotNull(session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should be stored here
- assertEquals(Locale.CANADA_FRENCH, session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should create a locale object
- }
-
- @Test
- public void testRealLocalesInParams() throws Exception {
- Locale[] locales = new Locale[]{Locale.CANADA_FRENCH};
- assertTrue(locales.getClass().isArray());
- params.put(I18nInterceptor.DEFAULT_PARAMETER, locales);
- interceptor.intercept(mai);
-
- assertNull(params.get(I18nInterceptor.DEFAULT_PARAMETER)); // should have been removed
-
- assertNotNull(session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should be stored here
- assertEquals(Locale.CANADA_FRENCH, session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE));
- }
-
- @Test
- public void testSetParameterAndAttributeNames() throws Exception {
- interceptor.setAttributeName("hello");
- interceptor.setParameterName("world");
-
- params.put("world", Locale.CHINA);
- interceptor.intercept(mai);
-
- assertNull(params.get("world")); // should have been removed
-
- assertNotNull(session.get("hello")); // should be stored here
- assertEquals(Locale.CHINA, session.get("hello"));
- }
}