Skip to content

Commit 627f27a

Browse files
committed
WW-5422 Fixes support for trimable locale string in request
1 parent 649760d commit 627f27a

File tree

6 files changed

+63
-18
lines changed

6 files changed

+63
-18
lines changed

core/src/main/java/com/opensymphony/xwork2/ActionSupport.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,11 @@ public boolean isValidLocale(Locale locale) {
9090
return getLocaleProvider().isValidLocale(locale);
9191
}
9292

93+
@Override
94+
public Locale toLocale(String localeStr) {
95+
return getLocaleProvider().toLocale(localeStr);
96+
}
97+
9398
@Override
9499
public boolean hasKey(String key) {
95100
return getTextProvider().hasKey(key);

core/src/main/java/com/opensymphony/xwork2/DefaultLocaleProvider.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public Locale getLocale() {
4848
public boolean isValidLocaleString(String localeStr) {
4949
Locale locale = null;
5050
try {
51-
locale = LocaleUtils.toLocale(StringUtils.trimToNull(localeStr));
51+
locale = LocaleUtils.toLocale(localeStr);
5252
} catch (IllegalArgumentException e) {
5353
LOG.warn(new ParameterizedMessage("Cannot convert [{}] to proper locale", localeStr), e);
5454
}
@@ -59,4 +59,15 @@ public boolean isValidLocaleString(String localeStr) {
5959
public boolean isValidLocale(Locale locale) {
6060
return LocaleUtils.isAvailableLocale(locale);
6161
}
62+
63+
@Override
64+
public Locale toLocale(String localeStr) {
65+
Locale locale = null;
66+
try {
67+
locale = LocaleUtils.toLocale(StringUtils.trimToNull(localeStr));
68+
} catch (IllegalArgumentException e) {
69+
LOG.warn(new ParameterizedMessage("Cannot convert [{}] to proper locale", localeStr), e);
70+
}
71+
return locale;
72+
}
6273
}

core/src/main/java/com/opensymphony/xwork2/LocaleProvider.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818
*/
1919
package com.opensymphony.xwork2;
2020

21+
import org.apache.commons.lang3.LocaleUtils;
22+
import org.apache.commons.lang3.StringUtils;
23+
2124
import java.util.Locale;
2225

2326

@@ -58,4 +61,17 @@ public interface LocaleProvider {
5861
*/
5962
boolean isValidLocale(Locale locale);
6063

64+
/**
65+
* Tries to convert provided locale string into {@link Locale} or returns null
66+
* @param localeStr a String representing locale, e.g.: en_EN
67+
* @return instance of {@link Locale} or null
68+
* @since Struts 6.5.0
69+
*/
70+
default Locale toLocale(String localeStr) {
71+
try {
72+
return LocaleUtils.toLocale(StringUtils.trimToNull(localeStr));
73+
} catch (IllegalArgumentException e) {
74+
return null;
75+
}
76+
}
6177
}

core/src/main/java/com/opensymphony/xwork2/validator/DelegatingValidatorContext.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,10 +122,15 @@ public boolean isValidLocale(Locale locale) {
122122
return localeProvider.isValidLocale(locale);
123123
}
124124

125+
@Override
126+
public Locale toLocale(String localeStr) {
127+
return localeProvider.toLocale(localeStr);
128+
}
129+
125130
public boolean hasKey(String key) {
126131
return textProvider.hasKey(key);
127132
}
128-
133+
129134
public String getText(String aTextName) {
130135
return textProvider.getText(aTextName);
131136
}
@@ -280,6 +285,11 @@ public boolean isValidLocaleString(String localeStr) {
280285
public boolean isValidLocale(Locale locale) {
281286
return getLocaleProvider().isValidLocale(locale);
282287
}
288+
289+
@Override
290+
public Locale toLocale(String localeStr) {
291+
return getLocaleProvider().toLocale(localeStr);
292+
}
283293
}
284294

285295
/**

core/src/main/java/org/apache/struts2/interceptor/I18nInterceptor.java

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import com.opensymphony.xwork2.inject.Inject;
2525
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
2626
import com.opensymphony.xwork2.util.TextParseUtil;
27-
import org.apache.commons.lang3.LocaleUtils;
2827
import org.apache.logging.log4j.LogManager;
2928
import org.apache.logging.log4j.Logger;
3029
import org.apache.logging.log4j.message.ParameterizedMessage;
@@ -85,7 +84,7 @@ public void setRequestCookieParameterName(String requestCookieParameterName) {
8584
}
8685

8786
public void setLocaleStorage(String storageName) {
88-
if (storageName == null || "".equals(storageName)) {
87+
if (storageName == null || storageName.isEmpty()) {
8988
this.storage = Storage.ACCEPT_LANGUAGE;
9089
} else {
9190
try {
@@ -169,27 +168,21 @@ protected LocaleHandler getLocaleHandler(ActionInvocation invocation) {
169168
}
170169

171170
/**
172-
* Creates a Locale object from the request param, which might
173-
* be already a Local or a String
171+
* Creates a Locale object from the request param
174172
*
175173
* @param requestedLocale the parameter from the request
176-
* @return the Locale
174+
* @return instance of {@link Locale} or null
177175
*/
178-
protected Locale getLocaleFromParam(Object requestedLocale) {
176+
protected Locale getLocaleFromParam(String requestedLocale) {
179177
LocaleProvider localeProvider = localeProviderFactory.createLocaleProvider();
180178

181179
Locale locale = null;
182180
if (requestedLocale != null) {
183-
if (requestedLocale instanceof Locale) {
184-
locale = (Locale) requestedLocale;
185-
} else {
186-
String localeStr = requestedLocale.toString();
187-
if (localeProvider.isValidLocaleString(localeStr)) {
188-
locale = LocaleUtils.toLocale(localeStr);
189-
} else {
190-
locale = localeProvider.getLocale();
191-
}
181+
locale = localeProvider.toLocale(requestedLocale);
182+
if (locale == null) {
183+
locale = localeProvider.getLocale();
192184
}
185+
193186
if (locale != null) {
194187
LOG.debug("Found locale: {}", locale);
195188
}
@@ -285,7 +278,7 @@ protected AcceptLanguageLocaleHandler(ActionInvocation invocation) {
285278
@Override
286279
@SuppressWarnings("rawtypes")
287280
public Locale find() {
288-
if (supportedLocale.size() > 0) {
281+
if (!supportedLocale.isEmpty()) {
289282
Enumeration locales = actionInvocation.getInvocationContext().getServletRequest().getLocales();
290283
while (locales.hasMoreElements()) {
291284
Locale locale = (Locale) locales.nextElement();

core/src/test/java/org/apache/struts2/interceptor/I18nInterceptorTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,16 @@ public void testNotExistingLocale() throws Exception {
147147
assertEquals(Locale.getDefault(), session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should create a locale object
148148
}
149149

150+
public void testTrimableLocaleString() throws Exception {
151+
prepare(I18nInterceptor.DEFAULT_PARAMETER, "de ");
152+
153+
interceptor.intercept(mai);
154+
155+
assertFalse(mai.getInvocationContext().getParameters().get(I18nInterceptor.DEFAULT_PARAMETER).isDefined()); // should have been removed
156+
assertNotNull(session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should be stored here
157+
assertEquals(Locale.GERMAN, session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should create a locale object
158+
}
159+
150160
public void testWithVariant() throws Exception {
151161
prepare(I18nInterceptor.DEFAULT_PARAMETER, "ja_JP_JP");
152162
interceptor.intercept(mai);

0 commit comments

Comments
 (0)