You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by lu...@apache.org on 2017/01/15 16:59:52 UTC
struts git commit: WW-4734 Fixes proper lookup flow
Repository: struts
Updated Branches:
refs/heads/master 253799c6c -> 7f80ef1bb
WW-4734 Fixes proper lookup flow
Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/7f80ef1b
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/7f80ef1b
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/7f80ef1b
Branch: refs/heads/master
Commit: 7f80ef1bb52fb10abf85804ef0df35a36d54da96
Parents: 253799c
Author: Lukasz Lenart <lu...@apache.org>
Authored: Sun Jan 15 17:59:41 2017 +0100
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Sun Jan 15 17:59:41 2017 +0100
----------------------------------------------------------------------
.../struts2/interceptor/I18nInterceptor.java | 319 ++++++++++---------
1 file changed, 164 insertions(+), 155 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/struts/blob/7f80ef1b/core/src/main/java/org/apache/struts2/interceptor/I18nInterceptor.java
----------------------------------------------------------------------
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 f5a778d..c30182a 100644
--- a/core/src/main/java/org/apache/struts2/interceptor/I18nInterceptor.java
+++ b/core/src/main/java/org/apache/struts2/interceptor/I18nInterceptor.java
@@ -66,7 +66,7 @@ import java.util.Map;
* in the session. By default this is <b>request_locale</b></li>
*
* <li>requestCookieParameterName (optional) - the name of the HTTP request parameter that dictates the locale to switch to
- * and save in a cookien. By default this is <b>request_cookie_locale</b></li>
+ * and save in a cookie. By default this is <b>request_cookie_locale</b></li>
*
* <li>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 <b>request_only_locale</b></li>
@@ -148,113 +148,53 @@ public class I18nInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
- LOG.debug("Intercept '{}/{}'",
- invocation.getProxy().getNamespace(), invocation.getProxy().getActionName());
+ LOG.debug("Intercept '{}/{}'", invocation.getProxy().getNamespace(), invocation.getProxy().getActionName());
- RequestOnlyLocaleFinder localeFinder = getLocaleFinder(invocation);
- Locale locale = getLocaleFromParam(localeFinder.find());
- locale = storeLocale(invocation, locale);
- useLocale(invocation, locale);
-
- if (LOG.isDebugEnabled()) {
- LOG.debug("Before action invocation Locale={}", invocation.getStack().findValue("locale"));
- }
-
- final String result = invocation.invoke();
-
- if (LOG.isDebugEnabled()) {
- LOG.debug("After action invocation Locale={}", invocation.getStack().findValue("locale"));
- }
-
- return result;
- }
-
- protected RequestOnlyLocaleFinder getLocaleFinder(ActionInvocation invocation) {
- RequestOnlyLocaleFinder localeFinder;
- if (this.storage == Storage.COOKIE) {
- localeFinder = new CookieLocaleFinder(invocation);
- } else if (this.storage == Storage.SESSION) {
- localeFinder = new SessionLocaleFinder(invocation);
- } else {
- localeFinder = new RequestOnlyLocaleFinder(invocation);
- }
+ LocaleHandler localeHandler = getLocaleHandler(invocation);
+ Locale locale = localeHandler.find();
- LOG.debug("Using LocaleFinder implementation {}", localeFinder.getClass().getName());
- return localeFinder;
- }
-
- /**
- * Store the locale to the chosen storage, like f. e. the session
- *
- * @param invocation the action invocation
- * @param locale the locale to store
- *
- * @return the locale
- */
- protected Locale storeLocale(ActionInvocation invocation, Locale locale) {
if (locale == null) {
- storage = Storage.NONE;
- locale = readStoredLocale(invocation);
- }
-
- if (storage == Storage.COOKIE) {
- storeLocaleInCookie(invocation, locale);
+ locale = localeHandler.read(invocation);
}
- if (Storage.SESSION == storage) {
- storeLocaleInSession(invocation, locale);
+ if (localeHandler.shouldStore()) {
+ locale = localeHandler.store(invocation, locale);
}
- return locale;
- }
-
- protected void storeLocaleInCookie(ActionInvocation ignore, Locale locale) {
- HttpServletResponse response = ServletActionContext.getResponse();
-
- Cookie cookie = new Cookie(DEFAULT_COOKIE_ATTRIBUTE, locale.toString());
- cookie.setMaxAge(1209600); // two weeks
- response.addCookie(cookie);
- }
+ useLocale(invocation, locale);
- protected void storeLocaleInSession(ActionInvocation invocation, Locale locale) {
- //save it in session
- Map<String, Object> session = invocation.getInvocationContext().getSession();
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Before action invocation Locale={}", invocation.getStack().findValue("locale"));
+ }
- if (session != null) {
- String sessionId = ServletActionContext.getRequest().getSession().getId();
- synchronized (sessionId.intern()) {
- session.put(attributeName, locale);
+ try {
+ return invocation.invoke();
+ } finally {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("After action invocation Locale={}", invocation.getStack().findValue("locale"));
}
}
}
/**
- * Reads the locale from the session or from a cookie and if not found
- * from the current invocation (=browser)
+ * Override this method to use your own implementation of {@link LocaleHandler}
*
- * @param invocation the current invocation
- * @return the read locale
+ * @param invocation current action invocation context
+ * @return instance of {@link LocaleHandler}
*/
- protected Locale readStoredLocale(ActionInvocation invocation) {
- Locale locale;
- if (storage == Storage.SESSION) {
- locale = readStoredLocalFromSession(invocation);
- if (locale != null) {
- LOG.debug("Found stored Locale {} in session, using it!", locale);
- return locale;
- }
- }
+ protected LocaleHandler getLocaleHandler(ActionInvocation invocation) {
+ LocaleHandler localeHandler;
- if (storage == Storage.COOKIE) {
- locale = readStoredLocaleFromCookie(invocation);
- if (locale != null) {
- LOG.debug("Found stored Locale {} in cookie, using it!", locale);
- return locale;
- }
+ if (this.storage == Storage.COOKIE) {
+ localeHandler = new CookieLocaleHandler(invocation);
+ } else if (this.storage == Storage.SESSION) {
+ localeHandler = new SessionLocaleHandler(invocation);
+ } else {
+ localeHandler = new RequestOnlyLocaleHandler(invocation);
}
- LOG.debug("Neither locale was in session nor in cookies, searching current Invocation context");
- return readStoredLocaleFromCurrentInvocation(invocation);
+ LOG.debug("Using LocaleFinder implementation {}", localeHandler.getClass().getName());
+ return localeHandler;
}
/**
@@ -276,7 +216,7 @@ public class I18nInterceptor extends AbstractInterceptor {
}
}
if (locale != null) {
- LOG.debug("Applied request locale: {}", locale);
+ LOG.debug("Found locale: {}", locale);
}
}
@@ -289,46 +229,8 @@ public class I18nInterceptor extends AbstractInterceptor {
return locale;
}
- protected Locale readStoredLocalFromSession(ActionInvocation invocation) {
- // check session for saved locale
- Map<String, Object> session = invocation.getInvocationContext().getSession();
-
- if (session != null) {
- String sessionId = ServletActionContext.getRequest().getSession().getId();
- synchronized (sessionId.intern()) {
- 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 readStoredLocaleFromCookie(ActionInvocation ignore) {
- Cookie[] cookies = ServletActionContext.getRequest().getCookies();
- if (cookies != null) {
- for (Cookie cookie : cookies) {
- if (DEFAULT_COOKIE_ATTRIBUTE.equals(cookie.getName())) {
- return getLocaleFromParam(cookie.getValue());
- }
- }
- }
- return null;
- }
-
- protected Locale readStoredLocaleFromCurrentInvocation(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) {
+ protected Parameter findLocaleParameter(ActionInvocation invocation, String parameterName) {
+ HttpParameters params = invocation.getInvocationContext().getParameters();
Parameter requestedLocale = params.get(parameterName);
params.remove(parameterName);
if (requestedLocale.isDefined()) {
@@ -347,75 +249,182 @@ public class I18nInterceptor extends AbstractInterceptor {
invocation.getInvocationContext().setLocale(locale);
}
- protected class RequestOnlyLocaleFinder {
+ /**
+ * Uses to handle reading/storing Locale from/in different locations
+ */
+ protected interface LocaleHandler {
+ Locale find();
+ Locale read(ActionInvocation invocation);
+ Locale store(ActionInvocation invocation, Locale locale);
+ boolean shouldStore();
+ }
+
+ protected class RequestOnlyLocaleHandler implements LocaleHandler {
protected ActionInvocation actionInvocation = null;
+ protected boolean shouldStore = true;
- protected RequestOnlyLocaleFinder(ActionInvocation invocation) {
+ protected RequestOnlyLocaleHandler(ActionInvocation invocation) {
actionInvocation = invocation;
}
- public String find() {
- HttpParameters params = actionInvocation.getInvocationContext().getParameters();
+ public Locale find() {
+ LOG.debug("Searching locale in request under parameter {}", requestOnlyParameterName);
- Parameter requestedLocale = findLocaleParameter(params, requestOnlyParameterName);
+ Parameter requestedLocale = findLocaleParameter(actionInvocation, requestOnlyParameterName);
if (requestedLocale.isDefined()) {
- storage = Storage.NONE;
- return requestedLocale.getValue();
+ return getLocaleFromParam(requestedLocale.getValue());
}
return null;
}
+
+ @Override
+ public Locale store(ActionInvocation invocation, Locale locale) {
+ return locale;
+ }
+
+ @Override
+ public Locale read(ActionInvocation invocation) {
+ LOG.debug("Searching current Invocation context");
+ // 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;
+ }
+
+ @Override
+ public boolean shouldStore() {
+ return shouldStore;
+ }
}
- protected class SessionLocaleFinder extends RequestOnlyLocaleFinder {
+ protected class SessionLocaleHandler extends RequestOnlyLocaleHandler {
- protected SessionLocaleFinder(ActionInvocation invocation) {
+ protected SessionLocaleHandler(ActionInvocation invocation) {
super(invocation);
}
- public String find() {
- String requestOnlyLocale = super.find();
+ public Locale find() {
+ Locale requestOnlyLocale = super.find();
if (requestOnlyLocale != null) {
+ LOG.debug("Found locale under request only param, it won't be stored in session!");
+ shouldStore = false;
return requestOnlyLocale;
}
- HttpParameters params = actionInvocation.getInvocationContext().getParameters();
-
- Parameter requestedLocale = findLocaleParameter(params, parameterName);
+ LOG.debug("Searching locale in request under parameter {}", parameterName);
+ Parameter requestedLocale = findLocaleParameter(actionInvocation, parameterName);
if (requestedLocale.isDefined()) {
- return requestedLocale.getValue();
+ return getLocaleFromParam(requestedLocale.getValue());
}
- return requestedLocale.getValue();
+ return null;
}
+ @Override
+ public Locale store(ActionInvocation invocation, Locale locale) {
+ //save it in session
+ Map<String, Object> session = invocation.getInvocationContext().getSession();
+
+ if (session != null) {
+ String sessionId = ServletActionContext.getRequest().getSession().getId();
+ synchronized (sessionId.intern()) {
+ session.put(attributeName, locale);
+ }
+ }
+ return locale;
+ }
+
+ @Override
+ public Locale read(ActionInvocation invocation) {
+ Locale locale = null;
+
+ LOG.debug("Checks session for saved locale");
+ Map<String, Object> session = invocation.getInvocationContext().getSession();
+
+ if (session != null) {
+ String sessionId = ServletActionContext.getRequest().getSession().getId();
+ synchronized (sessionId.intern()) {
+ Object sessionLocale = session.get(attributeName);
+ if (sessionLocale != null && sessionLocale instanceof Locale) {
+ locale = (Locale) sessionLocale;
+ LOG.debug("Applied session locale: {}", locale);
+ }
+ }
+ }
+
+ if (locale == null) {
+ LOG.debug("No Locale defined in session, fetching from current request and it won't be stored in session!");
+ shouldStore = false;
+ locale = super.read(invocation);
+ } else {
+ LOG.debug("Found stored Locale {} in session, using it!", locale);
+ }
+
+ return locale;
+ }
}
- protected class CookieLocaleFinder extends RequestOnlyLocaleFinder {
- protected CookieLocaleFinder(ActionInvocation invocation) {
+ protected class CookieLocaleHandler extends RequestOnlyLocaleHandler {
+ protected CookieLocaleHandler(ActionInvocation invocation) {
super(invocation);
}
@Override
- public String find() {
- String requestOnlySessionLocale = super.find();
+ public Locale find() {
+ Locale requestOnlySessionLocale = super.find();
if (requestOnlySessionLocale != null) {
+ shouldStore = false;
return requestOnlySessionLocale;
}
- HttpParameters params = actionInvocation.getInvocationContext().getParameters();
-
- Parameter requestedLocale = findLocaleParameter(params, requestCookieParameterName);
+ LOG.debug("Searching locale in request under parameter {}", requestCookieParameterName);
+ Parameter requestedLocale = findLocaleParameter(actionInvocation, requestCookieParameterName);
if (requestedLocale.isDefined()) {
- storage = Storage.COOKIE;
- return requestedLocale.getValue();
+ return getLocaleFromParam(requestedLocale.getValue());
}
return null;
}
+
+ @Override
+ public Locale store(ActionInvocation invocation, Locale locale) {
+ HttpServletResponse response = ServletActionContext.getResponse();
+
+ Cookie cookie = new Cookie(attributeName, locale.toString());
+ cookie.setMaxAge(1209600); // two weeks
+ response.addCookie(cookie);
+
+ return locale;
+ }
+
+ @Override
+ public Locale read(ActionInvocation invocation) {
+ Locale locale = null;
+
+ Cookie[] cookies = ServletActionContext.getRequest().getCookies();
+ if (cookies != null) {
+ for (Cookie cookie : cookies) {
+ if (attributeName.equals(cookie.getName())) {
+ locale = getLocaleFromParam(cookie.getValue());
+ }
+ }
+ }
+
+ if (locale == null) {
+ LOG.debug("No Locale defined in cookie, fetching from current request and it won't be stored!");
+ shouldStore = false;
+ locale = super.read(invocation);
+ } else {
+ LOG.debug("Found stored Locale {} in cookie, using it!", locale);
+ }
+ return locale;
+ }
}
}