Skip to content

Commit

Permalink
WW-5422 Fixes support for trimable locale string in request
Browse files Browse the repository at this point in the history
  • Loading branch information
lukaszlenart committed May 11, 2024
1 parent 649760d commit 3e3111c
Show file tree
Hide file tree
Showing 6 changed files with 73 additions and 18 deletions.
5 changes: 5 additions & 0 deletions core/src/main/java/com/opensymphony/xwork2/ActionSupport.java
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,11 @@ public boolean isValidLocale(Locale locale) {
return getLocaleProvider().isValidLocale(locale);
}

@Override
public Locale toLocale(String localeStr) {
return getLocaleProvider().toLocale(localeStr);
}

@Override
public boolean hasKey(String key) {
return getTextProvider().hasKey(key);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ public Locale getLocale() {
public boolean isValidLocaleString(String localeStr) {
Locale locale = null;
try {
locale = LocaleUtils.toLocale(StringUtils.trimToNull(localeStr));
locale = LocaleUtils.toLocale(localeStr);
} catch (IllegalArgumentException e) {
LOG.warn(new ParameterizedMessage("Cannot convert [{}] to proper locale", localeStr), e);
}
Expand All @@ -59,4 +59,15 @@ public boolean isValidLocaleString(String localeStr) {
public boolean isValidLocale(Locale locale) {
return LocaleUtils.isAvailableLocale(locale);
}

@Override
public Locale toLocale(String localeStr) {
Locale locale = null;
try {
locale = LocaleUtils.toLocale(StringUtils.trimToNull(localeStr));
} catch (IllegalArgumentException e) {
LOG.warn(new ParameterizedMessage("Cannot convert [{}] to proper locale", localeStr), e);
}
return locale;
}
}
16 changes: 16 additions & 0 deletions core/src/main/java/com/opensymphony/xwork2/LocaleProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@
*/
package com.opensymphony.xwork2;

import org.apache.commons.lang3.LocaleUtils;
import org.apache.commons.lang3.StringUtils;

import java.util.Locale;


Expand Down Expand Up @@ -58,4 +61,17 @@ public interface LocaleProvider {
*/
boolean isValidLocale(Locale locale);

/**
* Tries to convert provided locale string into {@link Locale} or returns null
* @param localeStr a String representing locale, e.g.: en_EN
* @return instance of {@link Locale} or null
* @since Struts 6.5.0
*/
default Locale toLocale(String localeStr) {
try {
return LocaleUtils.toLocale(StringUtils.trimToNull(localeStr));
} catch (IllegalArgumentException e) {
return null;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -122,10 +122,15 @@ public boolean isValidLocale(Locale locale) {
return localeProvider.isValidLocale(locale);
}

@Override
public Locale toLocale(String localeStr) {
return localeProvider.toLocale(localeStr);
}

public boolean hasKey(String key) {
return textProvider.hasKey(key);
}

public String getText(String aTextName) {
return textProvider.getText(aTextName);
}
Expand Down Expand Up @@ -280,6 +285,11 @@ public boolean isValidLocaleString(String localeStr) {
public boolean isValidLocale(Locale locale) {
return getLocaleProvider().isValidLocale(locale);
}

@Override
public Locale toLocale(String localeStr) {
return getLocaleProvider().toLocale(localeStr);
}
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
import com.opensymphony.xwork2.inject.Inject;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.opensymphony.xwork2.util.TextParseUtil;
import org.apache.commons.lang3.LocaleUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.message.ParameterizedMessage;
Expand Down Expand Up @@ -85,7 +84,7 @@ public void setRequestCookieParameterName(String requestCookieParameterName) {
}

public void setLocaleStorage(String storageName) {
if (storageName == null || "".equals(storageName)) {
if (storageName == null || storageName.isEmpty()) {
this.storage = Storage.ACCEPT_LANGUAGE;
} else {
try {
Expand Down Expand Up @@ -169,27 +168,21 @@ protected LocaleHandler getLocaleHandler(ActionInvocation invocation) {
}

/**
* Creates a Locale object from the request param, which might
* be already a Local or a String
* Creates a Locale object from the request param
*
* @param requestedLocale the parameter from the request
* @return the Locale
* @return instance of {@link Locale} or null
*/
protected Locale getLocaleFromParam(Object requestedLocale) {
protected Locale getLocaleFromParam(String requestedLocale) {
LocaleProvider localeProvider = localeProviderFactory.createLocaleProvider();

Locale locale = null;
if (requestedLocale != null) {
if (requestedLocale instanceof Locale) {
locale = (Locale) requestedLocale;
} else {
String localeStr = requestedLocale.toString();
if (localeProvider.isValidLocaleString(localeStr)) {
locale = LocaleUtils.toLocale(localeStr);
} else {
locale = localeProvider.getLocale();
}
locale = localeProvider.toLocale(requestedLocale);
if (locale == null) {
locale = localeProvider.getLocale();
}

if (locale != null) {
LOG.debug("Found locale: {}", locale);
}
Expand Down Expand Up @@ -285,7 +278,7 @@ protected AcceptLanguageLocaleHandler(ActionInvocation invocation) {
@Override
@SuppressWarnings("rawtypes")
public Locale find() {
if (supportedLocale.size() > 0) {
if (!supportedLocale.isEmpty()) {
Enumeration locales = actionInvocation.getInvocationContext().getServletRequest().getLocales();
while (locales.hasMoreElements()) {
Locale locale = (Locale) locales.nextElement();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,26 @@ public void testNotExistingLocale() throws Exception {
assertEquals(Locale.getDefault(), session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should create a locale object
}

public void testTrimableLocaleString1() throws Exception {
prepare(I18nInterceptor.DEFAULT_PARAMETER, "de\n");

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.GERMAN, session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)); // should create a locale object
}

public void testTrimableLocaleString2() throws Exception {
prepare(I18nInterceptor.DEFAULT_PARAMETER, "de ");

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.GERMAN, 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);
Expand Down

0 comments on commit 3e3111c

Please sign in to comment.