WW-4722 Refactors code to use predefined storage locatio
Project: http://git-wip-us.apache.org/repos/asf/struts/repo Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/6457f002 Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/6457f002 Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/6457f002 Branch: refs/heads/master Commit: 6457f002d97cde76f98444ec98abdb9bc4be191f Parents: 6e1ea61 Author: Lukasz Lenart <lukaszlen...@apache.org> Authored: Thu Dec 1 17:21:22 2016 +0100 Committer: Lukasz Lenart <lukaszlen...@apache.org> Committed: Thu Dec 1 17:21:22 2016 +0100 ---------------------------------------------------------------------- .../struts2/interceptor/I18nInterceptor.java | 99 ++++++++++++-------- .../interceptor/I18nInterceptorTest.java | 40 ++++---- 2 files changed, 79 insertions(+), 60 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/struts/blob/6457f002/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 b1f8e8e..02409c4 100644 --- a/core/src/main/java/org/apache/struts2/interceptor/I18nInterceptor.java +++ b/core/src/main/java/org/apache/struts2/interceptor/I18nInterceptor.java @@ -115,6 +115,10 @@ public class I18nInterceptor extends AbstractInterceptor { this.parameterName = parameterName; } + public void setAttributeName(String attributeName) { + this.attributeName = attributeName; + } + public void setRequestOnlyParameterName(String requestOnlyParameterName) { this.requestOnlyParameterName = requestOnlyParameterName; } @@ -123,10 +127,6 @@ public class I18nInterceptor extends AbstractInterceptor { this.requestCookieParameterName = requestCookieParameterName; } - public void setAttributeName(String attributeName) { - this.attributeName = attributeName; - } - public void setLocaleStorage(String storageName) { if (storageName == null || "".equals(storageName)) { this.storage = Storage.NONE; @@ -152,9 +152,9 @@ public class I18nInterceptor extends AbstractInterceptor { invocation.getProxy().getNamespace(), invocation.getProxy().getActionName()); } - LocaleFinder localeFinder = new CookieLocaleFinder(invocation); - Locale locale = getLocaleFromParam(localeFinder.getRequestedLocale()); - locale = storeLocale(invocation, locale, localeFinder.getStorage()); + RequestOnlyLocaleFinder localeFinder = getLocaleFinder(invocation); + Locale locale = getLocaleFromParam(localeFinder.find()); + locale = storeLocale(invocation, locale, storage); saveLocale(invocation, locale); if (LOG.isDebugEnabled()) { @@ -171,6 +171,20 @@ public class I18nInterceptor extends AbstractInterceptor { 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); + } + + LOG.debug("Using LocaleFinder implementation {}", localeFinder.getClass().getName()); + return localeFinder; + } + /** * Store the locale to the chosen storage, like f. e. the session * @@ -308,71 +322,74 @@ public class I18nInterceptor extends AbstractInterceptor { invocation.getInvocationContext().setLocale(locale); } - protected class LocaleFinder { - protected Storage storage = Storage.SESSION; - protected Parameter requestedLocale = null; + protected class RequestOnlyLocaleFinder { protected ActionInvocation actionInvocation = null; - protected LocaleFinder(ActionInvocation invocation) { + protected RequestOnlyLocaleFinder(ActionInvocation invocation) { actionInvocation = invocation; - find(); } - protected void find() { - //get requested locale + public String find() { HttpParameters params = actionInvocation.getInvocationContext().getParameters(); - storage = Storage.SESSION; - - requestedLocale = findLocaleParameter(params, parameterName); - if (requestedLocale.isDefined()) { - return; - } - - requestedLocale = findLocaleParameter(params, requestOnlyParameterName); + Parameter requestedLocale = findLocaleParameter(params, requestOnlyParameterName); if (requestedLocale.isDefined()) { storage = Storage.NONE; + return requestedLocale.getValue(); } + + return null; } + } + + protected class SessionLocaleFinder extends RequestOnlyLocaleFinder { - public Storage getStorage() { - return storage; + protected SessionLocaleFinder(ActionInvocation invocation) { + super(invocation); } - public String getRequestedLocale() { + public String find() { + String requestOnlyLocale = super.find(); + + if (requestOnlyLocale != null) { + return requestOnlyLocale; + } + + HttpParameters params = actionInvocation.getInvocationContext().getParameters(); + + Parameter requestedLocale = findLocaleParameter(params, parameterName); + if (requestedLocale.isDefined()) { + return requestedLocale.getValue(); + } + return requestedLocale.getValue(); } + } - protected class CookieLocaleFinder extends LocaleFinder { + protected class CookieLocaleFinder extends RequestOnlyLocaleFinder { protected CookieLocaleFinder(ActionInvocation invocation) { super(invocation); } @Override - protected void find() { - //get requested locale - HttpParameters params = actionInvocation.getInvocationContext().getParameters(); - storage = Storage.SESSION; - - requestedLocale = findLocaleParameter(params, parameterName); + public String find() { + String requestOnlySessionLocale = super.find(); - if (requestedLocale.isDefined()) { - return; + if (requestOnlySessionLocale != null) { + return requestOnlySessionLocale; } - requestedLocale = findLocaleParameter(params, requestCookieParameterName); - if (requestedLocale.isDefined()) { - storage = Storage.COOKIE; - return; - } + HttpParameters params = actionInvocation.getInvocationContext().getParameters(); - requestedLocale = findLocaleParameter(params, requestOnlyParameterName); + Parameter requestedLocale = findLocaleParameter(params, requestCookieParameterName); if (requestedLocale.isDefined()) { - storage = Storage.NONE; + storage = Storage.COOKIE; + return requestedLocale.getValue(); } + return null; } } http://git-wip-us.apache.org/repos/asf/struts/blob/6457f002/core/src/test/java/org/apache/struts2/interceptor/I18nInterceptorTest.java ---------------------------------------------------------------------- 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 5018815..8da9f68 100644 --- a/core/src/test/java/org/apache/struts2/interceptor/I18nInterceptorTest.java +++ b/core/src/test/java/org/apache/struts2/interceptor/I18nInterceptorTest.java @@ -187,6 +187,27 @@ public class I18nInterceptorTest extends TestCase { assertEquals(locale1, locale); } + public void testCookieCreation() throws Exception { + + prepare(I18nInterceptor.DEFAULT_COOKIE_PARAMETER, "da_DK"); + + final Cookie cookie = new Cookie(I18nInterceptor.DEFAULT_COOKIE_ATTRIBUTE, "da_DK"); + + HttpServletResponse response = EasyMock.createMock(HttpServletResponse.class); + response.addCookie(CookieMatcher.eqCookie(cookie)); + EasyMock.replay(response); + + ac.put(StrutsStatics.HTTP_RESPONSE, response); + interceptor.setLocaleStorage(I18nInterceptor.Storage.COOKIE.name()); + interceptor.intercept(mai); + + EasyMock.verify(response); + + 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 + } + private void prepare(String key, Serializable value) { Map<String, Serializable> params = new HashMap<>(); params.put(key, value); @@ -255,23 +276,4 @@ public class I18nInterceptorTest extends TestCase { } } - public void testCookieCreation() throws Exception { - - prepare(I18nInterceptor.DEFAULT_COOKIE_PARAMETER, "da_DK"); - - final Cookie cookie = new Cookie(I18nInterceptor.DEFAULT_COOKIE_ATTRIBUTE, "da_DK"); - - HttpServletResponse response = EasyMock.createMock(HttpServletResponse.class); - response.addCookie(CookieMatcher.eqCookie(cookie)); - EasyMock.replay(response); - - ac.put(StrutsStatics.HTTP_RESPONSE, response); - interceptor.intercept(mai); - - EasyMock.verify(response); - - 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 - } }