From b3b8b909e39f403dd76ce349ca546c7dff627e1a Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Tue, 7 Mar 2017 11:26:22 +0100 Subject: [PATCH 01/21] Converts into a bean --- .../xwork2/util/LocalizedTextUtil.java | 46 ++++++++++--------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/core/src/main/java/com/opensymphony/xwork2/util/LocalizedTextUtil.java b/core/src/main/java/com/opensymphony/xwork2/util/LocalizedTextUtil.java index ad3a713dac..d69300f5c1 100644 --- a/core/src/main/java/com/opensymphony/xwork2/util/LocalizedTextUtil.java +++ b/core/src/main/java/com/opensymphony/xwork2/util/LocalizedTextUtil.java @@ -25,10 +25,12 @@ import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.ModelDriven; import com.opensymphony.xwork2.conversion.impl.XWorkConverter; +import com.opensymphony.xwork2.inject.Inject; import com.opensymphony.xwork2.util.reflection.ReflectionProviderFactory; import org.apache.commons.lang3.ObjectUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.apache.struts2.StrutsConstants; import java.beans.PropertyDescriptor; import java.lang.reflect.Field; @@ -93,8 +95,8 @@ public class LocalizedTextUtil { private static final ConcurrentMap> classLoaderMap = new ConcurrentHashMap<>(); - private static boolean reloadBundles = false; - private static boolean devMode; + private boolean reloadBundles = false; + private boolean devMode = false; private static final ConcurrentMap bundlesMap = new ConcurrentHashMap<>(); private static final ConcurrentMap messageFormats = new ConcurrentHashMap<>(); @@ -124,12 +126,14 @@ public static void clearDefaultResourceBundles() { * * @param reloadBundles reload bundles? */ - public static void setReloadBundles(boolean reloadBundles) { - LocalizedTextUtil.reloadBundles = reloadBundles; + @Inject(StrutsConstants.STRUTS_I18N_RELOAD) + public void setReloadBundles(String reloadBundles) { + this.reloadBundles = Boolean.parseBoolean(reloadBundles); } - public static void setDevMode(boolean devMode) { - LocalizedTextUtil.devMode = devMode; + @Inject(StrutsConstants.STRUTS_DEVMODE) + public void setDevMode(String devMode) { + this.devMode = Boolean.parseBoolean(devMode); } /** @@ -209,7 +213,7 @@ public static Locale localeFromString(String localeStr, Locale defaultLocale) { * @param locale the locale the message should be for * @return a localized message based on the specified key, or null if no localized message can be found for it */ - public static String findDefaultText(String aTextName, Locale locale) { + public String findDefaultText(String aTextName, Locale locale) { List localList = classLoaderMap.get(Thread.currentThread().getContextClassLoader().hashCode()); for (String bundleName : localList) { @@ -242,7 +246,7 @@ public static String findDefaultText(String aTextName, Locale locale) { * @param params an array of objects to be substituted into the message text * @return A formatted message based on the specified key, or null if no localized message can be found for it */ - public static String findDefaultText(String aTextName, Locale locale, Object[] params) { + public String findDefaultText(String aTextName, Locale locale, Object[] params) { String defaultText = findDefaultText(aTextName, locale); if (defaultText != null) { MessageFormat mf = buildMessageFormat(defaultText, locale); @@ -261,7 +265,7 @@ public static String findDefaultText(String aTextName, Locale locale, Object[] p * @param locale the locale. * @return the bundle, null if not found. */ - public static ResourceBundle findResourceBundle(String aBundleName, Locale locale) { + public ResourceBundle findResourceBundle(String aBundleName, Locale locale) { ClassLoader classLoader = getCurrentThreadContextClassLoader(); String key = createMissesKey(String.valueOf(classLoader.hashCode()), aBundleName, locale); @@ -323,7 +327,7 @@ public static void clearBundle(final String bundleName) { * @param locale the locale. * @return the key to use for lookup/storing in the bundle misses cache. */ - private static String createMissesKey(String prefix, String aBundleName, Locale locale) { + private String createMissesKey(String prefix, String aBundleName, Locale locale) { return prefix + aBundleName + "_" + locale.toString(); } @@ -338,7 +342,7 @@ private static String createMissesKey(String prefix, String aBundleName, Locale * @return the localized text, or null if none can be found and no defaultMessage is provided * @see #findText(Class aClass, String aTextName, Locale locale, String defaultMessage, Object[] args) */ - public static String findText(Class aClass, String aTextName, Locale locale) { + public String findText(Class aClass, String aTextName, Locale locale) { return findText(aClass, aTextName, locale, aTextName, new Object[0]); } @@ -388,7 +392,7 @@ public static String findText(Class aClass, String aTextName, Locale locale) { * resource bundle * @return the localized text, or null if none can be found and no defaultMessage is provided */ - public static String findText(Class aClass, String aTextName, Locale locale, String defaultMessage, Object[] args) { + public String findText(Class aClass, String aTextName, Locale locale, String defaultMessage, Object[] args) { ValueStack valueStack = ActionContext.getContext().getValueStack(); return findText(aClass, aTextName, locale, defaultMessage, args, valueStack); @@ -445,7 +449,7 @@ public static String findText(Class aClass, String aTextName, Locale locale, Str * one in the ActionContext ThreadLocal * @return the localized text, or null if none can be found and no defaultMessage is provided */ - public static String findText(Class aClass, String aTextName, Locale locale, String defaultMessage, Object[] args, + public String findText(Class aClass, String aTextName, Locale locale, String defaultMessage, Object[] args, ValueStack valueStack) { String indexedTextName = null; if (aTextName == null) { @@ -630,7 +634,7 @@ private static boolean unableToFindTextForKey(GetDefaultMessageReturnArg result) * @return the localized text, or null if none can be found and no defaultMessage is provided * @see #findText(java.util.ResourceBundle, String, java.util.Locale, String, Object[]) */ - public static String findText(ResourceBundle bundle, String aTextName, Locale locale) { + public String findText(ResourceBundle bundle, String aTextName, Locale locale) { return findText(bundle, aTextName, locale, aTextName, new Object[0]); } @@ -656,7 +660,7 @@ public static String findText(ResourceBundle bundle, String aTextName, Locale lo * @param args arguments for the message formatter. * @return the localized text, or null if none can be found and no defaultMessage is provided */ - public static String findText(ResourceBundle bundle, String aTextName, Locale locale, String defaultMessage, Object[] args) { + public String findText(ResourceBundle bundle, String aTextName, Locale locale, String defaultMessage, Object[] args) { ValueStack valueStack = ActionContext.getContext().getValueStack(); return findText(bundle, aTextName, locale, defaultMessage, args, valueStack); } @@ -684,7 +688,7 @@ public static String findText(ResourceBundle bundle, String aTextName, Locale lo * @param valueStack the OGNL value stack. * @return the localized text, or null if none can be found and no defaultMessage is provided */ - public static String findText(ResourceBundle bundle, String aTextName, Locale locale, String defaultMessage, Object[] args, + public String findText(ResourceBundle bundle, String aTextName, Locale locale, String defaultMessage, Object[] args, ValueStack valueStack) { try { reloadBundles(valueStack.getContext()); @@ -711,7 +715,7 @@ public static String findText(ResourceBundle bundle, String aTextName, Locale lo /** * @return the default message. */ - private static GetDefaultMessageReturnArg getDefaultMessage(String key, Locale locale, ValueStack valueStack, Object[] args, + private GetDefaultMessageReturnArg getDefaultMessage(String key, Locale locale, ValueStack valueStack, Object[] args, String defaultMessage) { GetDefaultMessageReturnArg result = null; boolean found = true; @@ -739,7 +743,7 @@ private static GetDefaultMessageReturnArg getDefaultMessage(String key, Locale l /** * @return the message from the named resource bundle. */ - private static String getMessage(String bundleName, Locale locale, String key, ValueStack valueStack, Object[] args) { + private String getMessage(String bundleName, Locale locale, String key, ValueStack valueStack, Object[] args) { ResourceBundle bundle = findResourceBundle(bundleName, locale); if (bundle == null) { return null; @@ -790,7 +794,7 @@ private static MessageFormat buildMessageFormat(String pattern, Locale locale) { * * @return the message */ - private static String findMessage(Class clazz, String key, String indexedKey, Locale locale, Object[] args, Set checked, + private String findMessage(Class clazz, String key, String indexedKey, Locale locale, Object[] args, Set checked, ValueStack valueStack) { if (checked == null) { checked = new TreeSet(); @@ -852,11 +856,11 @@ private static String findMessage(Class clazz, String key, String indexedKey, Lo return null; } - private static void reloadBundles() { + private void reloadBundles() { reloadBundles(ActionContext.getContext() != null ? ActionContext.getContext().getContextMap() : null); } - private static void reloadBundles(Map context) { + private void reloadBundles(Map context) { if (reloadBundles) { try { Boolean reloaded; From ae09c6a0878ea3beac58567b58cfbdea261f4945 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Wed, 8 Mar 2017 17:41:42 +0100 Subject: [PATCH 02/21] Defines LocalizedTextUtil as a bean --- core/src/main/resources/struts-default.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/main/resources/struts-default.xml b/core/src/main/resources/struts-default.xml index 26c89eac6e..d8e80f140d 100644 --- a/core/src/main/resources/struts-default.xml +++ b/core/src/main/resources/struts-default.xml @@ -130,6 +130,7 @@ + From fa1a5f9e6927ab7521c30366631e128371d41277 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Wed, 8 Mar 2017 17:42:13 +0100 Subject: [PATCH 03/21] Adds LocalizedTextUtil as a bean --- .../opensymphony/xwork2/config/impl/DefaultConfiguration.java | 4 ++++ .../xwork2/config/providers/XWorkConfigurationProvider.java | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java b/core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java index 08977b250a..31bf283a7c 100644 --- a/core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java +++ b/core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java @@ -246,6 +246,8 @@ protected Container createBootstrapContainer(List providers) builder.factory(ReflectionProvider.class, OgnlReflectionProvider.class, Scope.SINGLETON); builder.factory(ValueStackFactory.class, OgnlValueStackFactory.class, Scope.SINGLETON); + builder.factory(LocalizedTextUtil.class, LocalizedTextUtil.class, Scope.SINGLETON); + builder.factory(XWorkConverter.class, Scope.SINGLETON); builder.factory(ConversionPropertiesProcessor.class, DefaultConversionPropertiesProcessor.class, Scope.SINGLETON); builder.factory(ConversionFileProcessor.class, DefaultConversionFileProcessor.class, Scope.SINGLETON); @@ -270,10 +272,12 @@ protected Container createBootstrapContainer(List providers) builder.factory(ValueSubstitutor.class, EnvsValueSubstitutor.class, Scope.SINGLETON); builder.constant(XWorkConstants.DEV_MODE, "false"); + builder.constant(StrutsConstants.STRUTS_DEVMODE, "false"); builder.constant(XWorkConstants.LOG_MISSING_PROPERTIES, "false"); builder.constant(XWorkConstants.ENABLE_OGNL_EVAL_EXPRESSION, "false"); builder.constant(XWorkConstants.ENABLE_OGNL_EXPRESSION_CACHE, "true"); builder.constant(XWorkConstants.RELOAD_XML_CONFIGURATION, "false"); + builder.constant(StrutsConstants.STRUTS_I18N_RELOAD, "false"); return builder.create(true); } diff --git a/core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java b/core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java index fc335d821e..de0b9635ef 100644 --- a/core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java +++ b/core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java @@ -70,6 +70,7 @@ import com.opensymphony.xwork2.ognl.accessor.XWorkMapPropertyAccessor; import com.opensymphony.xwork2.ognl.accessor.XWorkMethodAccessor; import com.opensymphony.xwork2.util.CompoundRoot; +import com.opensymphony.xwork2.util.LocalizedTextUtil; import com.opensymphony.xwork2.util.OgnlTextParser; import com.opensymphony.xwork2.util.PatternMatcher; import com.opensymphony.xwork2.util.TextParser; @@ -177,6 +178,7 @@ public void register(ContainerBuilder builder, LocatableProperties props) .factory(NullHandler.class, Object.class.getName(), InstantiatingNullHandler.class, Scope.SINGLETON) .factory(ActionValidatorManager.class, AnnotationActionValidatorManager.class, Scope.SINGLETON) .factory(ActionValidatorManager.class, "no-annotations", DefaultActionValidatorManager.class, Scope.SINGLETON) + .factory(LocalizedTextUtil.class, LocalizedTextUtil.class, Scope.SINGLETON) .factory(TextProvider.class, "system", DefaultTextProvider.class, Scope.SINGLETON) .factory(TextProvider.class, TextProviderSupport.class, Scope.SINGLETON) .factory(LocaleProvider.class, DefaultLocaleProvider.class, Scope.SINGLETON) @@ -194,6 +196,8 @@ public void register(ContainerBuilder builder, LocatableProperties props) ; props.setProperty(StrutsConstants.STRUTS_ENABLE_DYNAMIC_METHOD_INVOCATION, Boolean.FALSE.toString()); + props.setProperty(StrutsConstants.STRUTS_I18N_RELOAD, Boolean.FALSE.toString()); + props.setProperty(StrutsConstants.STRUTS_DEVMODE, Boolean.FALSE.toString()); props.setProperty(XWorkConstants.DEV_MODE, Boolean.FALSE.toString()); props.setProperty(XWorkConstants.LOG_MISSING_PROPERTIES, Boolean.FALSE.toString()); props.setProperty(XWorkConstants.ENABLE_OGNL_EXPRESSION_CACHE, Boolean.TRUE.toString()); From 239327ea363e020af0a0de2669bc2e991bfe6bfb Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Wed, 8 Mar 2017 17:42:42 +0100 Subject: [PATCH 04/21] Marks static methods as deprecated --- .../xwork2/util/LocalizedTextUtil.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/com/opensymphony/xwork2/util/LocalizedTextUtil.java b/core/src/main/java/com/opensymphony/xwork2/util/LocalizedTextUtil.java index d69300f5c1..1334cadf96 100644 --- a/core/src/main/java/com/opensymphony/xwork2/util/LocalizedTextUtil.java +++ b/core/src/main/java/com/opensymphony/xwork2/util/LocalizedTextUtil.java @@ -113,7 +113,10 @@ public class LocalizedTextUtil { /** * Clears the internal list of resource bundles. + * + * @deprecated used only in tests */ + @Deprecated public static void clearDefaultResourceBundles() { ClassLoader ccl = getCurrentThreadContextClassLoader(); List bundles = new ArrayList<>(); @@ -121,17 +124,20 @@ public static void clearDefaultResourceBundles() { bundles.add(0, XWORK_MESSAGES_BUNDLE); } + public LocalizedTextUtil() { + } + /** * Should resorce bundles be reloaded. * * @param reloadBundles reload bundles? */ - @Inject(StrutsConstants.STRUTS_I18N_RELOAD) + @Inject(value = StrutsConstants.STRUTS_I18N_RELOAD, required = false) public void setReloadBundles(String reloadBundles) { this.reloadBundles = Boolean.parseBoolean(reloadBundles); } - @Inject(StrutsConstants.STRUTS_DEVMODE) + @Inject(value = StrutsConstants.STRUTS_DEVMODE, required = false) public void setDevMode(String devMode) { this.devMode = Boolean.parseBoolean(devMode); } @@ -937,8 +943,11 @@ private static void clearMap(Class cl, Object obj, String name) /** * Clears all the internal lists. + * + * @deprecated used only in tests */ - public static void reset() { + @Deprecated + public void reset() { clearDefaultResourceBundles(); bundlesMap.clear(); messageFormats.clear(); From 4ef641850539557ffbc9412ff1d6627a8e08fd32 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Wed, 8 Mar 2017 17:43:20 +0100 Subject: [PATCH 05/21] Injects instead of static reference --- .../xwork2/DefaultActionProxy.java | 13 ++++++--- .../xwork2/DefaultTextProvider.java | 16 ++++++++--- .../xwork2/TextProviderSupport.java | 27 +++++++++++-------- .../conversion/impl/XWorkConverter.java | 3 ++- .../xwork2/interceptor/AliasInterceptor.java | 14 +++++++--- .../interceptor/ParametersInterceptor.java | 19 ++++++++----- .../StaticParametersInterceptor.java | 11 ++++++-- .../org/apache/struts2/components/Date.java | 22 ++++++++------- .../org/apache/struts2/components/I18n.java | 2 +- .../apache/struts2/dispatcher/Dispatcher.java | 10 +------ .../multipart/JakartaMultiPartRequest.java | 6 +---- .../struts2/factory/StrutsActionProxy.java | 2 +- .../org/apache/struts2/util/TokenHelper.java | 3 ++- .../multipart/PellMultiPartRequest.java | 6 +---- 14 files changed, 90 insertions(+), 64 deletions(-) diff --git a/core/src/main/java/com/opensymphony/xwork2/DefaultActionProxy.java b/core/src/main/java/com/opensymphony/xwork2/DefaultActionProxy.java index 2d8bc38ae4..39a484d7d7 100644 --- a/core/src/main/java/com/opensymphony/xwork2/DefaultActionProxy.java +++ b/core/src/main/java/com/opensymphony/xwork2/DefaultActionProxy.java @@ -53,6 +53,8 @@ public class DefaultActionProxy implements ActionProxy, Serializable { protected ActionConfig config; protected ActionInvocation invocation; protected UnknownHandlerManager unknownHandlerManager; + protected LocalizedTextUtil localizedTextUtil; + protected String actionName; protected String namespace; protected String method; @@ -113,6 +115,11 @@ public void setActionEventListener(ActionEventListener listener) { this.actionEventListener = listener; } + @Inject + public void setLocalizedTextUtil(LocalizedTextUtil localizedTextUtil) { + this.localizedTextUtil = localizedTextUtil; + } + public Object getAction() { return invocation.getAction(); } @@ -205,7 +212,7 @@ protected void prepare() { } protected String prepareNotAllowedErrorMessage() { - return LocalizedTextUtil.findDefaultText( + return localizedTextUtil.findDefaultText( "struts.exception.method-not-allowed", Locale.getDefault(), new String[]{method, actionName} @@ -214,12 +221,12 @@ protected String prepareNotAllowedErrorMessage() { protected String getErrorMessage() { if ((namespace != null) && (namespace.trim().length() > 0)) { - return LocalizedTextUtil.findDefaultText( + return localizedTextUtil.findDefaultText( "xwork.exception.missing-package-action", Locale.getDefault(), new String[]{namespace, actionName}); } else { - return LocalizedTextUtil.findDefaultText( + return localizedTextUtil.findDefaultText( "xwork.exception.missing-action", Locale.getDefault(), new String[]{actionName}); diff --git a/core/src/main/java/com/opensymphony/xwork2/DefaultTextProvider.java b/core/src/main/java/com/opensymphony/xwork2/DefaultTextProvider.java index 1d72161684..0e3f5b17b9 100644 --- a/core/src/main/java/com/opensymphony/xwork2/DefaultTextProvider.java +++ b/core/src/main/java/com/opensymphony/xwork2/DefaultTextProvider.java @@ -15,6 +15,7 @@ */ package com.opensymphony.xwork2; +import com.opensymphony.xwork2.inject.Inject; import com.opensymphony.xwork2.util.LocalizedTextUtil; import com.opensymphony.xwork2.util.ValueStack; @@ -37,15 +38,22 @@ public class DefaultTextProvider implements TextProvider, Serializable, Unchaina private static final Object[] EMPTY_ARGS = new Object[0]; + protected LocalizedTextUtil localizedTextUtil; + public DefaultTextProvider() { } + @Inject + public void setLocalizedTextUtil(LocalizedTextUtil localizedTextUtil) { + this.localizedTextUtil = localizedTextUtil; + } + public boolean hasKey(String key) { return getText(key) != null; } public String getText(String key) { - return LocalizedTextUtil.findDefaultText(key, ActionContext.getContext().getLocale()); + return localizedTextUtil.findDefaultText(key, ActionContext.getContext().getLocale()); } public String getText(String key, String defaultValue) { @@ -64,7 +72,7 @@ public String getText(String key, List args) { params = EMPTY_ARGS; } - return LocalizedTextUtil.findDefaultText(key, ActionContext.getContext().getLocale(), params); + return localizedTextUtil.findDefaultText(key, ActionContext.getContext().getLocale(), params); } public String getText(String key, String[] args) { @@ -75,7 +83,7 @@ public String getText(String key, String[] args) { params = EMPTY_ARGS; } - return LocalizedTextUtil.findDefaultText(key, ActionContext.getContext().getLocale(), params); + return localizedTextUtil.findDefaultText(key, ActionContext.getContext().getLocale(), params); } public String getText(String key, String defaultValue, List args) { @@ -136,7 +144,7 @@ public String getText(String key, String defaultValue, String[] args, ValueStack } public ResourceBundle getTexts(String bundleName) { - return LocalizedTextUtil.findResourceBundle(bundleName, ActionContext.getContext().getLocale()); + return localizedTextUtil.findResourceBundle(bundleName, ActionContext.getContext().getLocale()); } public ResourceBundle getTexts() { diff --git a/core/src/main/java/com/opensymphony/xwork2/TextProviderSupport.java b/core/src/main/java/com/opensymphony/xwork2/TextProviderSupport.java index 3f2090274d..ab37e9233d 100644 --- a/core/src/main/java/com/opensymphony/xwork2/TextProviderSupport.java +++ b/core/src/main/java/com/opensymphony/xwork2/TextProviderSupport.java @@ -33,6 +33,7 @@ public class TextProviderSupport implements ResourceBundleTextProvider { private Class clazz; private LocaleProvider localeProvider; private ResourceBundle bundle; + private LocalizedTextUtil localizedTextUtil; /** * Default constructor @@ -85,6 +86,10 @@ public void setLocaleProvider(LocaleProvider localeProvider) { this.localeProvider = localeProvider; } + @Inject + public void setLocalizedTextUtil(LocalizedTextUtil localizedTextUtil) { + this.localizedTextUtil = localizedTextUtil; + } /** * Checks if a key is available in the resource bundles associated with this action. @@ -97,9 +102,9 @@ public void setLocaleProvider(LocaleProvider localeProvider) { public boolean hasKey(String key) { String message; if (clazz != null) { - message = LocalizedTextUtil.findText(clazz, key, getLocale(), null, new Object[0] ); + message = localizedTextUtil.findText(clazz, key, getLocale(), null, new Object[0] ); } else { - message = LocalizedTextUtil.findText(bundle, key, getLocale(), null, new Object[0]); + message = localizedTextUtil.findText(bundle, key, getLocale(), null, new Object[0]); } return message != null; } @@ -201,9 +206,9 @@ public String getText(String key, String[] args) { public String getText(String key, String defaultValue, List args) { Object[] argsArray = ((args != null && !args.equals(Collections.emptyList())) ? args.toArray() : null); if (clazz != null) { - return LocalizedTextUtil.findText(clazz, key, getLocale(), defaultValue, argsArray); + return localizedTextUtil.findText(clazz, key, getLocale(), defaultValue, argsArray); } else { - return LocalizedTextUtil.findText(bundle, key, getLocale(), defaultValue, argsArray); + return localizedTextUtil.findText(bundle, key, getLocale(), defaultValue, argsArray); } } @@ -222,9 +227,9 @@ public String getText(String key, String defaultValue, List args) { */ public String getText(String key, String defaultValue, String[] args) { if (clazz != null) { - return LocalizedTextUtil.findText(clazz, key, getLocale(), defaultValue, args); + return localizedTextUtil.findText(clazz, key, getLocale(), defaultValue, args); } else { - return LocalizedTextUtil.findText(bundle, key, getLocale(), defaultValue, args); + return localizedTextUtil.findText(bundle, key, getLocale(), defaultValue, args); } } @@ -252,9 +257,9 @@ public String getText(String key, String defaultValue, List args, ValueStack locale = getLocale(); } if (clazz != null) { - return LocalizedTextUtil.findText(clazz, key, locale, defaultValue, argsArray, stack); + return localizedTextUtil.findText(clazz, key, locale, defaultValue, argsArray, stack); } else { - return LocalizedTextUtil.findText(bundle, key, locale, defaultValue, argsArray, stack); + return localizedTextUtil.findText(bundle, key, locale, defaultValue, argsArray, stack); } } @@ -282,9 +287,9 @@ public String getText(String key, String defaultValue, String[] args, ValueStack locale = getLocale(); } if (clazz != null) { - return LocalizedTextUtil.findText(clazz, key, locale, defaultValue, args, stack); + return localizedTextUtil.findText(clazz, key, locale, defaultValue, args, stack); } else { - return LocalizedTextUtil.findText(bundle, key, locale, defaultValue, args, stack); + return localizedTextUtil.findText(bundle, key, locale, defaultValue, args, stack); } } @@ -304,7 +309,7 @@ public String getText(String key, String defaultValue, String[] args, ValueStack * @return a resource bundle */ public ResourceBundle getTexts(String aBundleName) { - return LocalizedTextUtil.findResourceBundle(aBundleName, getLocale()); + return localizedTextUtil.findResourceBundle(aBundleName, getLocale()); } /** diff --git a/core/src/main/java/com/opensymphony/xwork2/conversion/impl/XWorkConverter.java b/core/src/main/java/com/opensymphony/xwork2/conversion/impl/XWorkConverter.java index 9dfcd4d7ad..771fc367bf 100644 --- a/core/src/main/java/com/opensymphony/xwork2/conversion/impl/XWorkConverter.java +++ b/core/src/main/java/com/opensymphony/xwork2/conversion/impl/XWorkConverter.java @@ -194,7 +194,8 @@ public void setTypeConverterHolder(TypeConverterHolder converterHolder) { } public static String getConversionErrorMessage(String propertyName, ValueStack stack) { - String defaultMessage = LocalizedTextUtil.findDefaultText("xwork.default.invalid.fieldvalue", + LocalizedTextUtil localizedTextUtil = ActionContext.getContext().getContainer().getInstance(LocalizedTextUtil.class); + String defaultMessage = localizedTextUtil.findDefaultText("xwork.default.invalid.fieldvalue", ActionContext.getContext().getLocale(), new Object[]{ propertyName diff --git a/core/src/main/java/com/opensymphony/xwork2/interceptor/AliasInterceptor.java b/core/src/main/java/com/opensymphony/xwork2/interceptor/AliasInterceptor.java index a956aeac2f..9d260c18d1 100644 --- a/core/src/main/java/com/opensymphony/xwork2/interceptor/AliasInterceptor.java +++ b/core/src/main/java/com/opensymphony/xwork2/interceptor/AliasInterceptor.java @@ -94,11 +94,12 @@ public class AliasInterceptor extends AbstractInterceptor { protected String aliasesKey = DEFAULT_ALIAS_KEY; protected ValueStackFactory valueStackFactory; - static boolean devMode = false; + protected LocalizedTextUtil localizedTextUtil; + protected boolean devMode = false; @Inject(XWorkConstants.DEV_MODE) - public static void setDevMode(String mode) { - devMode = "true".equals(mode); + public void setDevMode(String mode) { + this.devMode = Boolean.parseBoolean(mode); } @Inject @@ -106,6 +107,11 @@ public void setValueStackFactory(ValueStackFactory valueStackFactory) { this.valueStackFactory = valueStackFactory; } + @Inject + public void setLocalizedTextUtil(LocalizedTextUtil localizedTextUtil) { + this.localizedTextUtil = localizedTextUtil; + } + /** *

* Sets the name of the action parameter to look for the alias map. @@ -173,7 +179,7 @@ public void setAliasesKey(String aliasesKey) { newStack.setValue(alias, value.get()); } catch (RuntimeException e) { if (devMode) { - String developerNotification = LocalizedTextUtil.findText(ParametersInterceptor.class, "devmode.notification", ActionContext.getContext().getLocale(), "Developer Notification:\n{0}", new Object[]{ + String developerNotification = localizedTextUtil.findText(ParametersInterceptor.class, "devmode.notification", ActionContext.getContext().getLocale(), "Developer Notification:\n{0}", new Object[]{ "Unexpected Exception caught setting '" + entry.getKey() + "' on '" + action.getClass() + ": " + e.getMessage() }); LOG.error(developerNotification); diff --git a/core/src/main/java/com/opensymphony/xwork2/interceptor/ParametersInterceptor.java b/core/src/main/java/com/opensymphony/xwork2/interceptor/ParametersInterceptor.java index c1c52d926c..5eba95d719 100644 --- a/core/src/main/java/com/opensymphony/xwork2/interceptor/ParametersInterceptor.java +++ b/core/src/main/java/com/opensymphony/xwork2/interceptor/ParametersInterceptor.java @@ -17,6 +17,7 @@ import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; +import com.opensymphony.xwork2.TextProvider; import com.opensymphony.xwork2.XWorkConstants; import com.opensymphony.xwork2.inject.Inject; import com.opensymphony.xwork2.security.AcceptedPatternsChecker; @@ -218,15 +219,19 @@ protected void setParameters(final Object action, ValueStack stack, HttpParamete } protected void notifyDeveloperParameterException(Object action, String property, String message) { - String developerNotification = LocalizedTextUtil.findText(ParametersInterceptor.class, "devmode.notification", - ActionContext.getContext().getLocale(), "Developer Notification:\n{0}", - new Object[]{ - "Unexpected Exception caught setting '" + property + "' on '" + action.getClass() + ": " + message - } - ); + String developerNotification = "Unexpected Exception caught setting '" + property + "' on '" + action.getClass() + ": " + message; + if (action instanceof TextProvider) { + TextProvider tp = (TextProvider) action; + developerNotification = tp.getText("devmode.notification", + "Developer Notification:\n{0}", + new String[]{ developerNotification } + ); + } + LOG.error(developerNotification); - // see https://issues.apache.org/jira/browse/WW-4066 + if (action instanceof ValidationAware) { + // see https://issues.apache.org/jira/browse/WW-4066 Collection messages = ((ValidationAware) action).getActionMessages(); messages.add(message); ((ValidationAware) action).setActionMessages(messages); diff --git a/core/src/main/java/com/opensymphony/xwork2/interceptor/StaticParametersInterceptor.java b/core/src/main/java/com/opensymphony/xwork2/interceptor/StaticParametersInterceptor.java index 8aab3827cd..b697a648da 100644 --- a/core/src/main/java/com/opensymphony/xwork2/interceptor/StaticParametersInterceptor.java +++ b/core/src/main/java/com/opensymphony/xwork2/interceptor/StaticParametersInterceptor.java @@ -93,6 +93,7 @@ public class StaticParametersInterceptor extends AbstractInterceptor { private static final Logger LOG = LogManager.getLogger(StaticParametersInterceptor.class); private ValueStackFactory valueStackFactory; + private LocalizedTextUtil localizedTextUtil; @Inject public void setValueStackFactory(ValueStackFactory valueStackFactory) { @@ -102,7 +103,12 @@ public void setValueStackFactory(ValueStackFactory valueStackFactory) { @Inject(XWorkConstants.DEV_MODE) public void setDevMode(String mode) { devMode = BooleanUtils.toBoolean(mode); - } + } + + @Inject + public void setLocalizedTextUtil(LocalizedTextUtil localizedTextUtil) { + this.localizedTextUtil = localizedTextUtil; + } public void setParse(String value) { this.parse = BooleanUtils.toBoolean(value); @@ -168,7 +174,8 @@ public String intercept(ActionInvocation invocation) throws Exception { newStack.setValue(entry.getKey(), val); } catch (RuntimeException e) { if (devMode) { - String developerNotification = LocalizedTextUtil.findText(ParametersInterceptor.class, "devmode.notification", ActionContext.getContext().getLocale(), "Developer Notification:\n{0}", new Object[]{ + + String developerNotification = localizedTextUtil.findText(ParametersInterceptor.class, "devmode.notification", ActionContext.getContext().getLocale(), "Developer Notification:\n{0}", new Object[]{ "Unexpected Exception caught setting '" + entry.getKey() + "' on '" + action.getClass() + ": " + e.getMessage() }); LOG.error(developerNotification); diff --git a/core/src/main/java/org/apache/struts2/components/Date.java b/core/src/main/java/org/apache/struts2/components/Date.java index ac3d68bf20..46c193d8bd 100644 --- a/core/src/main/java/org/apache/struts2/components/Date.java +++ b/core/src/main/java/org/apache/struts2/components/Date.java @@ -294,16 +294,18 @@ public boolean end(Writer writer, String body) { date = new java.util.Date((long) dateObject); } else { if (devMode) { - String developerNotification = LocalizedTextUtil.findText( - Date.class, - "devmode.notification", - ActionContext.getContext().getLocale(), - "Developer Notification:\n{0}", - new Object[]{ - "Expression [" + name + "] passed to tag which was evaluated to [" + dateObject + "](" - + (dateObject != null ? dateObject.getClass() : "null") + ") isn't instance of java.util.Date nor java.util.Calendar nor long!" - } - ); + TextProvider tp = findProviderInStack(); + String developerNotification = ""; + if (tp != null) { + developerNotification = findProviderInStack().getText( + "devmode.notification", + "Developer Notification:\n{0}", + new String[]{ + "Expression [" + name + "] passed to tag which was evaluated to [" + dateObject + "](" + + (dateObject != null ? dateObject.getClass() : "null") + ") isn't instance of java.util.Date nor java.util.Calendar nor long!" + } + ); + } LOG.warn(developerNotification); } else { LOG.debug("Expression [{}] passed to tag which was evaluated to [{}]({}) isn't instance of java.util.Date nor java.util.Calendar nor long!", diff --git a/core/src/main/java/org/apache/struts2/components/I18n.java b/core/src/main/java/org/apache/struts2/components/I18n.java index a04840fc13..7a538b158d 100644 --- a/core/src/main/java/org/apache/struts2/components/I18n.java +++ b/core/src/main/java/org/apache/struts2/components/I18n.java @@ -121,7 +121,7 @@ public boolean start(Writer writer) { ResourceBundle bundle = defaultTextProvider.getTexts(name); if (bundle == null) { - bundle = LocalizedTextUtil.findResourceBundle(name, localeProvider.getLocale()); + bundle = container.getInstance(LocalizedTextUtil.class).findResourceBundle(name, localeProvider.getLocale()); } if (bundle != null) { diff --git a/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java b/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java index 909e802e8c..226ecfce30 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java @@ -442,15 +442,7 @@ private void init_AliasStandardObjects() { } private Container init_PreloadConfiguration() { - Container container = getContainer(); - - boolean reloadi18n = Boolean.valueOf(container.getInstance(String.class, StrutsConstants.STRUTS_I18N_RELOAD)); - LocalizedTextUtil.setReloadBundles(reloadi18n); - - boolean devMode = Boolean.valueOf(container.getInstance(String.class, StrutsConstants.STRUTS_DEVMODE)); - LocalizedTextUtil.setDevMode(devMode); - - return container; + return getContainer(); } private void init_CheckWebLogicWorkaround(Container container) { diff --git a/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaMultiPartRequest.java b/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaMultiPartRequest.java index 02de7f251a..f12f1b5c1f 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaMultiPartRequest.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaMultiPartRequest.java @@ -337,11 +337,7 @@ public void cleanUp() { for (String name : names) { List items = files.get(name); for (FileItem item : items) { - if (LOG.isDebugEnabled()) { - String msg = LocalizedTextUtil.findText(this.getClass(), "struts.messages.removing.file", - Locale.ENGLISH, "no.message.found", new Object[]{name, item}); - LOG.debug(msg); - } + LOG.debug("Removing file {} {}", name, item ); if (!item.isInMemory()) { item.delete(); } diff --git a/core/src/main/java/org/apache/struts2/factory/StrutsActionProxy.java b/core/src/main/java/org/apache/struts2/factory/StrutsActionProxy.java index 52f2efbf0e..64323c30a7 100644 --- a/core/src/main/java/org/apache/struts2/factory/StrutsActionProxy.java +++ b/core/src/main/java/org/apache/struts2/factory/StrutsActionProxy.java @@ -67,7 +67,7 @@ protected void prepare() { protected String getErrorMessage() { if ((namespace != null) && (namespace.trim().length() > 0)) { String contextPath = ServletActionContext.getRequest().getContextPath(); - return LocalizedTextUtil.findDefaultText( + return localizedTextUtil.findDefaultText( "struts.exception.missing-package-action.with-context", Locale.getDefault(), new String[]{namespace, actionName, contextPath} diff --git a/core/src/main/java/org/apache/struts2/util/TokenHelper.java b/core/src/main/java/org/apache/struts2/util/TokenHelper.java index d4ae8aa5f9..c6d0f0fe7a 100644 --- a/core/src/main/java/org/apache/struts2/util/TokenHelper.java +++ b/core/src/main/java/org/apache/struts2/util/TokenHelper.java @@ -188,7 +188,8 @@ public static boolean validToken() { if (!token.equals(sessionToken)) { if (LOG.isWarnEnabled()) { - LOG.warn(LocalizedTextUtil.findText(TokenHelper.class, "struts.internal.invalid.token", ActionContext.getContext().getLocale(), "Form token {0} does not match the session token {1}.", new Object[]{ + LocalizedTextUtil localizedTextUtil = ActionContext.getContext().getContainer().getInstance(LocalizedTextUtil.class); + LOG.warn(localizedTextUtil.findText(TokenHelper.class, "struts.internal.invalid.token", ActionContext.getContext().getLocale(), "Form token {0} does not match the session token {1}.", new Object[]{ token, sessionToken })); } diff --git a/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellMultiPartRequest.java b/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellMultiPartRequest.java index 3c733c6ba4..c91c52e8bc 100644 --- a/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellMultiPartRequest.java +++ b/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellMultiPartRequest.java @@ -154,11 +154,7 @@ public void cleanUp() { String inputValue = (String) fileParameterNames.nextElement(); UploadedFile[] files = getFile(inputValue); for (UploadedFile currentFile : files) { - if (LOG.isInfoEnabled()) { - String msg = LocalizedTextUtil.findText(this.getClass(), "struts.messages.removing.file", Locale.ENGLISH, - "no.message.found", new Object[]{inputValue, currentFile}); - LOG.info(msg); - } + LOG.debug("Removing file {} {}", inputValue, currentFile); if ((currentFile != null) && currentFile.isFile()) { if (!currentFile.delete()) { LOG.warn("Resource Leaking: Could not remove uploaded file [{}]", currentFile.getAbsolutePath()); From 2733f158d892efb2febdd99fc1772ed6564ea7be Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Wed, 8 Mar 2017 17:43:28 +0100 Subject: [PATCH 06/21] Updates test --- .../xwork2/util/XWorkTestCaseHelper.java | 2 +- .../xwork2/util/LocalizedTextUtilTest.java | 54 ++++++++++--------- .../DefaultBeanSelectionProviderTest.java | 10 ++-- .../apache/struts2/config/SettingsTest.java | 6 ++- .../struts2/dispatcher/DispatcherTest.java | 8 +-- 5 files changed, 45 insertions(+), 35 deletions(-) diff --git a/core/src/main/java/com/opensymphony/xwork2/util/XWorkTestCaseHelper.java b/core/src/main/java/com/opensymphony/xwork2/util/XWorkTestCaseHelper.java index d81b84ec9d..717a3ef12c 100644 --- a/core/src/main/java/com/opensymphony/xwork2/util/XWorkTestCaseHelper.java +++ b/core/src/main/java/com/opensymphony/xwork2/util/XWorkTestCaseHelper.java @@ -40,7 +40,7 @@ public static ConfigurationManager setUp() throws Exception { ActionContext.setContext(new ActionContext(stack.getContext())); // clear out localization - LocalizedTextUtil.reset(); + container.getInstance(LocalizedTextUtil.class).reset(); //ObjectFactory.setObjectFactory(container.getInstance(ObjectFactory.class)); diff --git a/core/src/test/java/com/opensymphony/xwork2/util/LocalizedTextUtilTest.java b/core/src/test/java/com/opensymphony/xwork2/util/LocalizedTextUtilTest.java index c14d52955b..e8dc982ba5 100644 --- a/core/src/test/java/com/opensymphony/xwork2/util/LocalizedTextUtilTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/util/LocalizedTextUtilTest.java @@ -39,10 +39,12 @@ */ public class LocalizedTextUtilTest extends XWorkTestCase { + private LocalizedTextUtil localizedTextUtil; + public void testNpeWhenClassIsPrimitive() throws Exception { ValueStack stack = ActionContext.getContext().getValueStack(); stack.push(new MyObject()); - String result = LocalizedTextUtil.findText(MyObject.class, "someObj.someI18nKey", Locale.ENGLISH, "default message", null, stack); + String result = localizedTextUtil.findText(MyObject.class, "someObj.someI18nKey", Locale.ENGLISH, "default message", null, stack); System.out.println(result); } @@ -96,7 +98,7 @@ public void testActionGetText() throws Exception { } public void testNullKeys() { - LocalizedTextUtil.findText(this.getClass(), null, Locale.getDefault()); + localizedTextUtil.findText(this.getClass(), null, Locale.getDefault()); } public void testActionGetTextXXX() throws Exception { @@ -118,12 +120,12 @@ public void testActionGetTextXXX() throws Exception { } public void testAddDefaultResourceBundle() { - String text = LocalizedTextUtil.findDefaultText("foo.range", Locale.getDefault()); + String text = localizedTextUtil.findDefaultText("foo.range", Locale.getDefault()); assertNull("Found message when it should not be available.", text); LocalizedTextUtil.addDefaultResourceBundle("com/opensymphony/xwork2/SimpleAction"); - String message = LocalizedTextUtil.findDefaultText("foo.range", Locale.US); + String message = localizedTextUtil.findDefaultText("foo.range", Locale.US); assertEquals("Foo Range Message", message); } @@ -135,17 +137,17 @@ public void testAddDefaultResourceBundle2() throws Exception { } public void testDefaultMessage() throws Exception { - String message = LocalizedTextUtil.findDefaultText("xwork.error.action.execution", Locale.getDefault()); + String message = localizedTextUtil.findDefaultText("xwork.error.action.execution", Locale.getDefault()); assertEquals("Error during Action invocation", message); } public void testDefaultMessageOverride() throws Exception { - String message = LocalizedTextUtil.findDefaultText("xwork.error.action.execution", Locale.getDefault()); + String message = localizedTextUtil.findDefaultText("xwork.error.action.execution", Locale.getDefault()); assertEquals("Error during Action invocation", message); LocalizedTextUtil.addDefaultResourceBundle("com/opensymphony/xwork2/test"); - message = LocalizedTextUtil.findDefaultText("xwork.error.action.execution", Locale.getDefault()); + message = localizedTextUtil.findDefaultText("xwork.error.action.execution", Locale.getDefault()); assertEquals("Testing resource bundle override", message); } @@ -162,7 +164,7 @@ public void testFindTextInChildProperty() throws Exception { ActionContext.getContext().getValueStack().push(action); ActionContext.getContext().getValueStack().push(action.getModel()); - String message = LocalizedTextUtil.findText(ModelDrivenAction2.class, "invalid.fieldvalue.barObj.title", Locale.getDefault()); + String message = localizedTextUtil.findText(ModelDrivenAction2.class, "invalid.fieldvalue.barObj.title", Locale.getDefault()); assertEquals("Title is invalid!", message); } @@ -172,7 +174,7 @@ public void testFindTextInInterface() throws Exception { mockActionInvocation.expectAndReturn("getAction", action); ActionContext.getContext().setActionInvocation((ActionInvocation) mockActionInvocation.proxy()); - String message = LocalizedTextUtil.findText(ModelDrivenAction2.class, "test.foo", Locale.getDefault()); + String message = localizedTextUtil.findText(ModelDrivenAction2.class, "test.foo", Locale.getDefault()); assertEquals("Foo!", message); } @@ -183,46 +185,46 @@ public void testFindTextInPackage() throws Exception { mockActionInvocation.expectAndReturn("getAction", action); ActionContext.getContext().setActionInvocation((ActionInvocation) mockActionInvocation.proxy()); - String message = LocalizedTextUtil.findText(ModelDrivenAction2.class, "package.properties", Locale.getDefault()); + String message = localizedTextUtil.findText(ModelDrivenAction2.class, "package.properties", Locale.getDefault()); assertEquals("It works!", message); } public void testParameterizedDefaultMessage() throws Exception { - String message = LocalizedTextUtil.findDefaultText("xwork.exception.missing-action", Locale.getDefault(), new String[]{"AddUser"}); + String message = localizedTextUtil.findDefaultText("xwork.exception.missing-action", Locale.getDefault(), new String[]{"AddUser"}); assertEquals("There is no Action mapped for action name AddUser.", message); } public void testParameterizedDefaultMessageWithPackage() throws Exception { - String message = LocalizedTextUtil.findDefaultText("xwork.exception.missing-package-action", Locale.getDefault(), new String[]{"blah", "AddUser"}); + String message = localizedTextUtil.findDefaultText("xwork.exception.missing-package-action", Locale.getDefault(), new String[]{"blah", "AddUser"}); assertEquals("There is no Action mapped for namespace blah and action name AddUser.", message); } public void testLocalizedDateFormatIsUsed() throws ParseException { - LocalizedTextUtil.addDefaultResourceBundle("com/opensymphony/xwork2/util/LocalizedTextUtilTest"); + localizedTextUtil.addDefaultResourceBundle("com/opensymphony/xwork2/util/localizedTextUtilTest"); Date date = DateFormat.getDateInstance(DateFormat.SHORT, Locale.US).parse("01/01/2015"); Object[] params = new Object[]{ date }; - String usDate = LocalizedTextUtil.findDefaultText("test.format.date", Locale.US, params); - String germanDate = LocalizedTextUtil.findDefaultText("test.format.date", Locale.GERMANY, params); + String usDate = localizedTextUtil.findDefaultText("test.format.date", Locale.US, params); + String germanDate = localizedTextUtil.findDefaultText("test.format.date", Locale.GERMANY, params); assertEquals(usDate, "1/1/15"); assertEquals(germanDate, "01.01.15"); } public void testXW377() { - LocalizedTextUtil.addDefaultResourceBundle("com/opensymphony/xwork2/util/LocalizedTextUtilTest"); + localizedTextUtil.addDefaultResourceBundle("com/opensymphony/xwork2/util/localizedTextUtilTest"); - String text = LocalizedTextUtil.findText(Bar.class, "xw377", ActionContext.getContext().getLocale(), "xw377", null, ActionContext.getContext().getValueStack()); + String text = localizedTextUtil.findText(Bar.class, "xw377", ActionContext.getContext().getLocale(), "xw377", null, ActionContext.getContext().getValueStack()); assertEquals("xw377", text); // should not log - String text2 = LocalizedTextUtil.findText(LocalizedTextUtilTest.class, "notinbundle", ActionContext.getContext().getLocale(), "hello", null, ActionContext.getContext().getValueStack()); + String text2 = localizedTextUtil.findText(LocalizedTextUtilTest.class, "notinbundle", ActionContext.getContext().getLocale(), "hello", null, ActionContext.getContext().getValueStack()); assertEquals("hello", text2); // should log WARN - String text3 = LocalizedTextUtil.findText(LocalizedTextUtilTest.class, "notinbundle.key", ActionContext.getContext().getLocale(), "notinbundle.key", null, ActionContext.getContext().getValueStack()); + String text3 = localizedTextUtil.findText(LocalizedTextUtilTest.class, "notinbundle.key", ActionContext.getContext().getLocale(), "notinbundle.key", null, ActionContext.getContext().getValueStack()); assertEquals("notinbundle.key", text3); // should log WARN - String text4 = LocalizedTextUtil.findText(LocalizedTextUtilTest.class, "xw377", ActionContext.getContext().getLocale(), "hello", null, ActionContext.getContext().getValueStack()); + String text4 = localizedTextUtil.findText(LocalizedTextUtilTest.class, "xw377", ActionContext.getContext().getLocale(), "hello", null, ActionContext.getContext().getValueStack()); assertEquals("xw377", text4); // should not log - String text5 = LocalizedTextUtil.findText(LocalizedTextUtilTest.class, "username", ActionContext.getContext().getLocale(), null, null, ActionContext.getContext().getValueStack()); + String text5 = localizedTextUtil.findText(LocalizedTextUtilTest.class, "username", ActionContext.getContext().getLocale(), null, null, ActionContext.getContext().getValueStack()); assertEquals("Santa", text5); // should not log } @@ -231,9 +233,9 @@ public void testXW404() { // Before this fix loading the bundle for Germany failed since Italy have previously failed and thus the misses cache // contained a false entry - ResourceBundle rbFrance = LocalizedTextUtil.findResourceBundle("com/opensymphony/xwork2/util/XW404", Locale.FRANCE); - ResourceBundle rbItaly = LocalizedTextUtil.findResourceBundle("com/opensymphony/xwork2/util/XW404", Locale.ITALY); - ResourceBundle rbGermany = LocalizedTextUtil.findResourceBundle("com/opensymphony/xwork2/util/XW404", Locale.GERMANY); + ResourceBundle rbFrance = localizedTextUtil.findResourceBundle("com/opensymphony/xwork2/util/XW404", Locale.FRANCE); + ResourceBundle rbItaly = localizedTextUtil.findResourceBundle("com/opensymphony/xwork2/util/XW404", Locale.ITALY); + ResourceBundle rbGermany = localizedTextUtil.findResourceBundle("com/opensymphony/xwork2/util/XW404", Locale.GERMANY); assertNotNull(rbFrance); assertEquals("Bonjour", rbFrance.getString("hello")); @@ -251,13 +253,15 @@ protected void setUp() throws Exception { container.inject(provider); loadConfigurationProviders(provider); + this.localizedTextUtil = container.inject(LocalizedTextUtil.class); + ActionContext.getContext().setLocale(Locale.US); } @Override protected void tearDown() throws Exception { super.tearDown(); - LocalizedTextUtil.clearDefaultResourceBundles(); + localizedTextUtil.clearDefaultResourceBundles(); } } diff --git a/core/src/test/java/org/apache/struts2/config/DefaultBeanSelectionProviderTest.java b/core/src/test/java/org/apache/struts2/config/DefaultBeanSelectionProviderTest.java index f7c406619d..6b4d29ad8b 100644 --- a/core/src/test/java/org/apache/struts2/config/DefaultBeanSelectionProviderTest.java +++ b/core/src/test/java/org/apache/struts2/config/DefaultBeanSelectionProviderTest.java @@ -23,6 +23,7 @@ import java.util.Locale; +import com.opensymphony.xwork2.XWorkTestCase; import org.apache.struts2.StrutsConstants; import com.opensymphony.xwork2.inject.ContainerBuilder; @@ -31,12 +32,15 @@ import junit.framework.TestCase; -public class DefaultBeanSelectionProviderTest extends TestCase { +public class DefaultBeanSelectionProviderTest extends XWorkTestCase { public void testRegister() { LocalizedTextUtil.clearDefaultResourceBundles(); LocalizedTextUtil.addDefaultResourceBundle("org/apache/struts2/struts-messages"); - assertEquals("The form has already been processed or no token was supplied, please try again.", LocalizedTextUtil.findDefaultText("struts.messages.invalid.token", Locale.getDefault())); + + LocalizedTextUtil localizedTextUtil = container.inject(LocalizedTextUtil.class); + + assertEquals("The form has already been processed or no token was supplied, please try again.", localizedTextUtil.findDefaultText("struts.messages.invalid.token", Locale.getDefault())); LocatableProperties props = new LocatableProperties(); props.setProperty(StrutsConstants.STRUTS_CUSTOM_I18N_RESOURCES, "testmessages,testmessages2"); @@ -44,7 +48,7 @@ public void testRegister() { new DefaultBeanSelectionProvider().register(new ContainerBuilder(), props); - assertEquals("Replaced message for token tag", LocalizedTextUtil.findDefaultText("struts.messages.invalid.token", Locale.getDefault())); + assertEquals("Replaced message for token tag", localizedTextUtil.findDefaultText("struts.messages.invalid.token", Locale.getDefault())); } } diff --git a/core/src/test/java/org/apache/struts2/config/SettingsTest.java b/core/src/test/java/org/apache/struts2/config/SettingsTest.java index 6c775f7c59..a5af5f7387 100644 --- a/core/src/test/java/org/apache/struts2/config/SettingsTest.java +++ b/core/src/test/java/org/apache/struts2/config/SettingsTest.java @@ -52,9 +52,11 @@ public void testSettings() { public void testDefaultResourceBundlesLoaded() { Settings settings = new DefaultSettings(); + LocalizedTextUtil localizedTextUtil = container.inject(LocalizedTextUtil.class); + assertEquals("testmessages,testmessages2", settings.get(StrutsConstants.STRUTS_CUSTOM_I18N_RESOURCES)); - assertEquals("This is a test message", LocalizedTextUtil.findDefaultText("default.testmessage", Locale.getDefault())); - assertEquals("This is another test message", LocalizedTextUtil.findDefaultText("default.testmessage2", Locale.getDefault())); + assertEquals("This is a test message", localizedTextUtil.findDefaultText("default.testmessage", Locale.getDefault())); + assertEquals("This is another test message", localizedTextUtil.findDefaultText("default.testmessage2", Locale.getDefault())); } public void testSetSettings() { diff --git a/core/src/test/java/org/apache/struts2/dispatcher/DispatcherTest.java b/core/src/test/java/org/apache/struts2/dispatcher/DispatcherTest.java index edcf987105..c0994a5ef1 100644 --- a/core/src/test/java/org/apache/struts2/dispatcher/DispatcherTest.java +++ b/core/src/test/java/org/apache/struts2/dispatcher/DispatcherTest.java @@ -55,14 +55,14 @@ public class DispatcherTest extends StrutsInternalTestCase { public void testDefaultResurceBundlePropertyLoaded() throws Exception { + LocalizedTextUtil localizedTextUtil = container.inject(LocalizedTextUtil.class); + // some i18n messages from xwork-messages.properties - assertEquals( - LocalizedTextUtil.findDefaultText("xwork.error.action.execution", Locale.US), + assertEquals(localizedTextUtil.findDefaultText("xwork.error.action.execution", Locale.US), "Error during Action invocation"); // some i18n messages from struts-messages.properties - assertEquals( - LocalizedTextUtil.findDefaultText("struts.messages.error.uploading", Locale.US, + assertEquals(localizedTextUtil.findDefaultText("struts.messages.error.uploading", Locale.US, new Object[] { "some error messages" }), "Error uploading: some error messages"); } From 524343c3cf79faad15e49fc26221de308853cbfc Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Wed, 8 Mar 2017 17:45:32 +0100 Subject: [PATCH 07/21] Moves default bean name to common place --- .../xwork2/config/impl/DefaultConfiguration.java | 4 +++- .../struts2/config/AbstractBeanSelectionProvider.java | 7 +++---- .../java/org/apache/struts2/dispatcher/Dispatcher.java | 3 ++- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java b/core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java index 31bf283a7c..9830d92ee5 100644 --- a/core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java +++ b/core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java @@ -51,6 +51,8 @@ */ public class DefaultConfiguration implements Configuration { + public static final String DEFAULT_BEAN_NAME = "struts"; + protected static final Logger LOG = LogManager.getLogger(DefaultConfiguration.class); @@ -66,7 +68,7 @@ public class DefaultConfiguration implements Configuration { ObjectFactory objectFactory; public DefaultConfiguration() { - this("xwork"); + this(DEFAULT_BEAN_NAME); } public DefaultConfiguration(String defaultBeanName) { diff --git a/core/src/main/java/org/apache/struts2/config/AbstractBeanSelectionProvider.java b/core/src/main/java/org/apache/struts2/config/AbstractBeanSelectionProvider.java index 34e340bb04..f0c691f733 100644 --- a/core/src/main/java/org/apache/struts2/config/AbstractBeanSelectionProvider.java +++ b/core/src/main/java/org/apache/struts2/config/AbstractBeanSelectionProvider.java @@ -4,6 +4,7 @@ import com.opensymphony.xwork2.config.BeanSelectionProvider; import com.opensymphony.xwork2.config.Configuration; import com.opensymphony.xwork2.config.ConfigurationException; +import com.opensymphony.xwork2.config.impl.DefaultConfiguration; import com.opensymphony.xwork2.inject.*; import com.opensymphony.xwork2.util.ClassLoaderUtil; import com.opensymphony.xwork2.util.location.LocatableProperties; @@ -19,8 +20,6 @@ public abstract class AbstractBeanSelectionProvider implements BeanSelectionProv private static final Logger LOG = LogManager.getLogger(AbstractBeanSelectionProvider.class); - public static final String DEFAULT_BEAN_NAME = "struts"; - public void destroy() { // NO-OP } @@ -43,7 +42,7 @@ protected void alias(Class type, String key, ContainerBuilder builder, Propertie protected void alias(Class type, String key, ContainerBuilder builder, Properties props, Scope scope) { if (!builder.contains(type)) { - String foundName = props.getProperty(key, DEFAULT_BEAN_NAME); + String foundName = props.getProperty(key, DefaultConfiguration.DEFAULT_BEAN_NAME); if (builder.contains(type, foundName)) { LOG.trace("Choosing bean ({}) for ({})", foundName, type.getName()); builder.alias(type, foundName, Container.DEFAULT_NAME); @@ -55,7 +54,7 @@ protected void alias(Class type, String key, ContainerBuilder builder, Propertie } catch (ClassNotFoundException ex) { // Perhaps a spring bean id, so we'll delegate to the object factory at runtime LOG.trace("Choosing bean ({}) for ({}) to be loaded from the ObjectFactory", foundName, type.getName()); - if (DEFAULT_BEAN_NAME.equals(foundName)) { + if (DefaultConfiguration.DEFAULT_BEAN_NAME.equals(foundName)) { // Probably an optional bean, will ignore } else { if (ObjectFactory.class != type) { diff --git a/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java b/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java index 226ecfce30..d0431f45b9 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java @@ -26,6 +26,7 @@ import com.opensymphony.xwork2.config.entities.InterceptorMapping; import com.opensymphony.xwork2.config.entities.InterceptorStackConfig; import com.opensymphony.xwork2.config.entities.PackageConfig; +import com.opensymphony.xwork2.config.impl.DefaultConfiguration; import com.opensymphony.xwork2.config.providers.XmlConfigurationProvider; import com.opensymphony.xwork2.inject.Container; import com.opensymphony.xwork2.inject.ContainerBuilder; @@ -463,7 +464,7 @@ private void init_CheckWebLogicWorkaround(Container container) { public void init() { if (configurationManager == null) { - configurationManager = createConfigurationManager(DefaultBeanSelectionProvider.DEFAULT_BEAN_NAME); + configurationManager = createConfigurationManager(DefaultConfiguration.DEFAULT_BEAN_NAME); } try { From 741f3fa107eee331209e52477c1a007bfc5db755 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Wed, 8 Mar 2017 17:52:01 +0100 Subject: [PATCH 08/21] Marks param as a deprecated --- .../apache/struts2/config/StrutsXmlConfigurationProvider.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/apache/struts2/config/StrutsXmlConfigurationProvider.java b/core/src/main/java/org/apache/struts2/config/StrutsXmlConfigurationProvider.java index e39e475490..75b8f64f84 100644 --- a/core/src/main/java/org/apache/struts2/config/StrutsXmlConfigurationProvider.java +++ b/core/src/main/java/org/apache/struts2/config/StrutsXmlConfigurationProvider.java @@ -62,10 +62,10 @@ public StrutsXmlConfigurationProvider(boolean errorIfMissing) { * Constructs the configuration provider * * @param filename The filename to look for - * @param errorIfMissing If we should throw an exception if the file can't be found + * @param errorIfMissing If we should throw an exception if the file can't be found, @deprecated and should be dropped * @param ctx Our ServletContext */ - public StrutsXmlConfigurationProvider(String filename, boolean errorIfMissing, ServletContext ctx) { + public StrutsXmlConfigurationProvider(String filename, @Deprecated boolean errorIfMissing, ServletContext ctx) { super(filename, errorIfMissing); this.servletContext = ctx; this.filename = filename; From 0b16543d6f5d48c3b2739871b7af609bf7b658b5 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Wed, 8 Mar 2017 17:52:24 +0100 Subject: [PATCH 09/21] Drops support for Xwork xml configuration --- .../java/org/apache/struts2/dispatcher/Dispatcher.java | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java b/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java index d0431f45b9..98ad701efd 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java @@ -375,21 +375,13 @@ private void init_TraditionalXmlConfigurations() { String[] files = configPaths.split("\\s*[,]\\s*"); for (String file : files) { if (file.endsWith(".xml")) { - if ("xwork.xml".equals(file)) { - configurationManager.addContainerProvider(createXmlConfigurationProvider(file, false)); - } else { - configurationManager.addContainerProvider(createStrutsXmlConfigurationProvider(file, false, servletContext)); - } + configurationManager.addContainerProvider(createStrutsXmlConfigurationProvider(file, false, servletContext)); } else { throw new IllegalArgumentException("Invalid configuration file name"); } } } - protected XmlConfigurationProvider createXmlConfigurationProvider(String filename, boolean errorIfMissing) { - return new XmlConfigurationProvider(filename, errorIfMissing); - } - protected XmlConfigurationProvider createStrutsXmlConfigurationProvider(String filename, boolean errorIfMissing, ServletContext ctx) { return new StrutsXmlConfigurationProvider(filename, errorIfMissing, ctx); } From 442a52fe48745bc03b3d6b15e74a01cdf0c9f6a1 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Thu, 9 Mar 2017 09:43:38 +0100 Subject: [PATCH 10/21] Marks deprecated constructor --- .../xwork2/validator/DelegatingValidatorContext.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/src/main/java/com/opensymphony/xwork2/validator/DelegatingValidatorContext.java b/core/src/main/java/com/opensymphony/xwork2/validator/DelegatingValidatorContext.java index abaa7616e5..e35d7a86d2 100644 --- a/core/src/main/java/com/opensymphony/xwork2/validator/DelegatingValidatorContext.java +++ b/core/src/main/java/com/opensymphony/xwork2/validator/DelegatingValidatorContext.java @@ -56,7 +56,10 @@ public DelegatingValidatorContext(ValidationAware validationAware, TextProvider * (validation aware instance and a locale and text provider) are created based on the given action. * * @param object the object to use for validation (usually an Action). + * + * @deprecated will be removed, do not use! */ + @Deprecated public DelegatingValidatorContext(Object object) { this.localeProvider = makeLocaleProvider(object); this.validationAware = makeValidationAware(object); @@ -68,7 +71,10 @@ public DelegatingValidatorContext(Object object) { * the validation context are created based on the class. * * @param clazz the class to initialize the context with. + * + * @deprecated will be removed, do not use! */ + @Deprecated public DelegatingValidatorContext(Class clazz) { localeProvider = new ActionContextLocaleProvider(); textProvider = new TextProviderFactory().createInstance(clazz, localeProvider); From 1ab616b10b2c43052bd8806e6e08fc0772de8b8a Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Thu, 9 Mar 2017 09:44:07 +0100 Subject: [PATCH 11/21] Marks deprecated constructor --- .../xwork2/validator/GenericValidatorContext.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/src/test/java/com/opensymphony/xwork2/validator/GenericValidatorContext.java b/core/src/test/java/com/opensymphony/xwork2/validator/GenericValidatorContext.java index 6273259f8c..0c7e0679d2 100644 --- a/core/src/test/java/com/opensymphony/xwork2/validator/GenericValidatorContext.java +++ b/core/src/test/java/com/opensymphony/xwork2/validator/GenericValidatorContext.java @@ -31,11 +31,14 @@ public class GenericValidatorContext extends DelegatingValidatorContext { private Map> fieldErrors; + /** + * @deprecated Is used only in tests and will be removed + */ + @Deprecated public GenericValidatorContext(Object object) { super(object); } - @Override public synchronized void setActionErrors(Collection errorMessages) { this.actionErrors = errorMessages; From 6c19875c786c03a33658f633d5c6a3425bbd5aaf Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Thu, 9 Mar 2017 10:19:12 +0100 Subject: [PATCH 12/21] Puts back the default bean name to allow alias beans --- .../java/com/opensymphony/xwork2/XWork.java | 79 ------------------- .../xwork2/config/ConfigurationManager.java | 4 - .../config/impl/DefaultConfiguration.java | 7 +- .../xwork2/util/XWorkTestCaseHelper.java | 4 +- .../org/apache/struts2/StrutsConstants.java | 2 + .../config/AbstractBeanSelectionProvider.java | 9 ++- .../config/DefaultBeanSelectionProvider.java | 3 +- .../apache/struts2/dispatcher/Dispatcher.java | 2 +- .../config/ConfigurationManagerTest.java | 3 +- ...onProviderGlobalResultInheritenceTest.java | 3 +- .../struts2/dispatcher/DispatcherTest.java | 14 ++-- .../mapper/CompositeActionMapperTest.java | 4 +- .../mapper/DefaultActionMapperTest.java | 5 +- .../mapper/Restful2ActionMapperTest.java | 3 +- .../struts2/rest/RestActionMapperTest.java | 3 +- .../sitegraph/StrutsConfigRetriever.java | 3 +- 16 files changed, 39 insertions(+), 109 deletions(-) delete mode 100644 core/src/main/java/com/opensymphony/xwork2/XWork.java diff --git a/core/src/main/java/com/opensymphony/xwork2/XWork.java b/core/src/main/java/com/opensymphony/xwork2/XWork.java deleted file mode 100644 index 1619a93446..0000000000 --- a/core/src/main/java/com/opensymphony/xwork2/XWork.java +++ /dev/null @@ -1,79 +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; - -import com.opensymphony.xwork2.config.Configuration; -import com.opensymphony.xwork2.config.ConfigurationManager; -import com.opensymphony.xwork2.util.logging.LoggerFactory; - -import java.util.Collections; -import java.util.Map; - -/** - * Simple facade to make using XWork standalone easier - */ -public class XWork { - - ConfigurationManager configurationManager; - - public XWork() { - this(new ConfigurationManager()); - } - - public XWork(ConfigurationManager mgr) { - this.configurationManager = mgr; - } - - public void setLoggerFactory(LoggerFactory factory) { - LoggerFactory.setLoggerFactory(factory); - } - - /** - * Executes an action - * - * @param namespace The namespace - * @param name The action name - * @param method The method name - * @throws XWorkException If anything goes wrong - */ - public void executeAction(String namespace, String name, String method) throws XWorkException { - Map extraContext = Collections.emptyMap(); - executeAction(namespace, name, method, extraContext); - } - - /** - * Executes an action with extra context information - * - * @param namespace The namespace - * @param name The action name - * @param method The method name - * @param extraContext A map of extra context information - * @throws XWorkException If anything goes wrong - */ - public void executeAction(String namespace, String name, String method, Map extraContext) throws XWorkException { - Configuration config = configurationManager.getConfiguration(); - try { - ActionProxy proxy = config.getContainer().getInstance(ActionProxyFactory.class).createActionProxy( - namespace, name, method, extraContext, true, false); - - proxy.execute(); - } catch (Exception e) { - throw new XWorkException(e); - } finally { - ActionContext.setContext(null); - } - } -} diff --git a/core/src/main/java/com/opensymphony/xwork2/config/ConfigurationManager.java b/core/src/main/java/com/opensymphony/xwork2/config/ConfigurationManager.java index ea51c63368..f937e9d668 100644 --- a/core/src/main/java/com/opensymphony/xwork2/config/ConfigurationManager.java +++ b/core/src/main/java/com/opensymphony/xwork2/config/ConfigurationManager.java @@ -47,10 +47,6 @@ public class ConfigurationManager { private boolean providersChanged = false; private boolean reloadConfigs = true; // for the first time - public ConfigurationManager() { - this("xwork"); - } - public ConfigurationManager(String name) { this.defaultFrameworkBeanName = name; } diff --git a/core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java b/core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java index 9830d92ee5..89be0fa80a 100644 --- a/core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java +++ b/core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java @@ -51,11 +51,8 @@ */ public class DefaultConfiguration implements Configuration { - public static final String DEFAULT_BEAN_NAME = "struts"; - protected static final Logger LOG = LogManager.getLogger(DefaultConfiguration.class); - // Programmatic Action Configurations protected Map packageContexts = new LinkedHashMap<>(); protected RuntimeConfiguration runtimeConfiguration; @@ -68,7 +65,7 @@ public class DefaultConfiguration implements Configuration { ObjectFactory objectFactory; public DefaultConfiguration() { - this(DEFAULT_BEAN_NAME); + this(Container.DEFAULT_NAME); } public DefaultConfiguration(String defaultBeanName) { @@ -266,6 +263,8 @@ protected Container createBootstrapContainer(List providers) builder.factory(TextParser.class, OgnlTextParser.class, Scope.SINGLETON); builder.factory(TextProvider.class, "system", DefaultTextProvider.class, Scope.SINGLETON); + builder.factory(TextProvider.class, TextProviderSupport.class, Scope.SINGLETON); + builder.factory(LocaleProvider.class, DefaultLocaleProvider.class, Scope.SINGLETON); builder.factory(ObjectTypeDeterminer.class, DefaultObjectTypeDeterminer.class, Scope.SINGLETON); builder.factory(PropertyAccessor.class, CompoundRoot.class.getName(), CompoundRootAccessor.class, Scope.SINGLETON); diff --git a/core/src/main/java/com/opensymphony/xwork2/util/XWorkTestCaseHelper.java b/core/src/main/java/com/opensymphony/xwork2/util/XWorkTestCaseHelper.java index 717a3ef12c..0cabd0f9e5 100644 --- a/core/src/main/java/com/opensymphony/xwork2/util/XWorkTestCaseHelper.java +++ b/core/src/main/java/com/opensymphony/xwork2/util/XWorkTestCaseHelper.java @@ -29,7 +29,7 @@ public class XWorkTestCaseHelper { public static ConfigurationManager setUp() throws Exception { - ConfigurationManager configurationManager = new ConfigurationManager(); + ConfigurationManager configurationManager = new ConfigurationManager(Container.DEFAULT_NAME); configurationManager.addContainerProvider(new XWorkConfigurationProvider()); Configuration config = configurationManager.getConfiguration(); Container container = config.getContainer(); @@ -54,7 +54,7 @@ public static ConfigurationManager loadConfigurationProviders(ConfigurationManag } catch (Exception e) { throw new RuntimeException("Cannot clean old configuration", e); } - configurationManager = new ConfigurationManager(); + configurationManager = new ConfigurationManager(Container.DEFAULT_NAME); configurationManager.addContainerProvider(new ContainerProvider() { public void destroy() {} public void init(Configuration configuration) throws ConfigurationException {} diff --git a/core/src/main/java/org/apache/struts2/StrutsConstants.java b/core/src/main/java/org/apache/struts2/StrutsConstants.java index c41d542775..99eb18e607 100644 --- a/core/src/main/java/org/apache/struts2/StrutsConstants.java +++ b/core/src/main/java/org/apache/struts2/StrutsConstants.java @@ -306,4 +306,6 @@ public final class StrutsConstants { public static final String STRUTS_CONTENT_TYPE_MATCHER = "struts.contentTypeMatcher"; public static final String STRUTS_SMI_METHOD_REGEX = "struts.strictMethodInvocation.methodRegex"; + + public static final String STRUTS_LOCALIZED_TEXT_PROVIDER = "struts.localizedTextProvider"; } diff --git a/core/src/main/java/org/apache/struts2/config/AbstractBeanSelectionProvider.java b/core/src/main/java/org/apache/struts2/config/AbstractBeanSelectionProvider.java index f0c691f733..664c6f41a1 100644 --- a/core/src/main/java/org/apache/struts2/config/AbstractBeanSelectionProvider.java +++ b/core/src/main/java/org/apache/struts2/config/AbstractBeanSelectionProvider.java @@ -4,7 +4,6 @@ import com.opensymphony.xwork2.config.BeanSelectionProvider; import com.opensymphony.xwork2.config.Configuration; import com.opensymphony.xwork2.config.ConfigurationException; -import com.opensymphony.xwork2.config.impl.DefaultConfiguration; import com.opensymphony.xwork2.inject.*; import com.opensymphony.xwork2.util.ClassLoaderUtil; import com.opensymphony.xwork2.util.location.LocatableProperties; @@ -20,6 +19,8 @@ public abstract class AbstractBeanSelectionProvider implements BeanSelectionProv private static final Logger LOG = LogManager.getLogger(AbstractBeanSelectionProvider.class); + public static final String DEFAULT_BEAN_NAME = "struts"; + public void destroy() { // NO-OP } @@ -41,8 +42,8 @@ protected void alias(Class type, String key, ContainerBuilder builder, Propertie } protected void alias(Class type, String key, ContainerBuilder builder, Properties props, Scope scope) { - if (!builder.contains(type)) { - String foundName = props.getProperty(key, DefaultConfiguration.DEFAULT_BEAN_NAME); + if (!builder.contains(type, Container.DEFAULT_NAME)) { + String foundName = props.getProperty(key, DEFAULT_BEAN_NAME); if (builder.contains(type, foundName)) { LOG.trace("Choosing bean ({}) for ({})", foundName, type.getName()); builder.alias(type, foundName, Container.DEFAULT_NAME); @@ -54,7 +55,7 @@ protected void alias(Class type, String key, ContainerBuilder builder, Propertie } catch (ClassNotFoundException ex) { // Perhaps a spring bean id, so we'll delegate to the object factory at runtime LOG.trace("Choosing bean ({}) for ({}) to be loaded from the ObjectFactory", foundName, type.getName()); - if (DefaultConfiguration.DEFAULT_BEAN_NAME.equals(foundName)) { + if (DEFAULT_BEAN_NAME.equals(foundName)) { // Probably an optional bean, will ignore } else { if (ObjectFactory.class != type) { diff --git a/core/src/main/java/org/apache/struts2/config/DefaultBeanSelectionProvider.java b/core/src/main/java/org/apache/struts2/config/DefaultBeanSelectionProvider.java index 20b0f9949c..b417333720 100644 --- a/core/src/main/java/org/apache/struts2/config/DefaultBeanSelectionProvider.java +++ b/core/src/main/java/org/apache/struts2/config/DefaultBeanSelectionProvider.java @@ -387,8 +387,9 @@ public void register(ContainerBuilder builder, LocatableProperties props) { alias(TypeConverterHolder.class, StrutsConstants.STRUTS_CONVERTER_HOLDER, builder, props); alias(TextProvider.class, StrutsConstants.STRUTS_XWORKTEXTPROVIDER, builder, props, Scope.PROTOTYPE); - alias(LocaleProvider.class, StrutsConstants.STRUTS_LOCALE_PROVIDER, builder, props); + alias(LocalizedTextUtil.class, StrutsConstants.STRUTS_LOCALIZED_TEXT_PROVIDER, builder, props); + alias(ActionProxyFactory.class, StrutsConstants.STRUTS_ACTIONPROXYFACTORY, builder, props); alias(ObjectTypeDeterminer.class, StrutsConstants.STRUTS_OBJECTTYPEDETERMINER, builder, props); alias(ActionMapper.class, StrutsConstants.STRUTS_MAPPER_CLASS, builder, props); diff --git a/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java b/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java index 98ad701efd..7b28117060 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java @@ -456,7 +456,7 @@ private void init_CheckWebLogicWorkaround(Container container) { public void init() { if (configurationManager == null) { - configurationManager = createConfigurationManager(DefaultConfiguration.DEFAULT_BEAN_NAME); + configurationManager = createConfigurationManager(Container.DEFAULT_NAME); } try { diff --git a/core/src/test/java/com/opensymphony/xwork2/config/ConfigurationManagerTest.java b/core/src/test/java/com/opensymphony/xwork2/config/ConfigurationManagerTest.java index e1d81bd7ec..7804f7ea6d 100644 --- a/core/src/test/java/com/opensymphony/xwork2/config/ConfigurationManagerTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/config/ConfigurationManagerTest.java @@ -22,6 +22,7 @@ import com.opensymphony.xwork2.FileManagerFactory; import com.opensymphony.xwork2.XWorkTestCase; import com.opensymphony.xwork2.config.providers.XWorkConfigurationProvider; +import com.opensymphony.xwork2.inject.Container; import com.opensymphony.xwork2.inject.ContainerBuilder; import com.opensymphony.xwork2.util.location.LocatableProperties; @@ -73,7 +74,7 @@ class State { } final State state = new State(); - ConfigurationManager configurationManager = new ConfigurationManager(); + ConfigurationManager configurationManager = new ConfigurationManager(Container.DEFAULT_NAME); configurationManager.addContainerProvider(new ConfigurationProvider() { public void destroy() { throw new RuntimeException("testing testing 123"); diff --git a/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderGlobalResultInheritenceTest.java b/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderGlobalResultInheritenceTest.java index e4553df881..6a083495a7 100644 --- a/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderGlobalResultInheritenceTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/config/providers/XmlConfigurationProviderGlobalResultInheritenceTest.java @@ -6,6 +6,7 @@ import com.opensymphony.xwork2.config.ConfigurationProvider; import com.opensymphony.xwork2.config.entities.ActionConfig; import com.opensymphony.xwork2.config.entities.ResultConfig; +import com.opensymphony.xwork2.inject.Container; /** * XmlConfigurationProviderGlobalResultInheritenceTest @@ -19,7 +20,7 @@ public class XmlConfigurationProviderGlobalResultInheritenceTest extends Configu public void testGlobalResultInheritenceTest() throws Exception { ConfigurationProvider provider = buildConfigurationProvider("com/opensymphony/xwork2/config/providers/xwork-test-global-result-inheritence.xml"); - ConfigurationManager configurationManager = new ConfigurationManager(); + ConfigurationManager configurationManager = new ConfigurationManager(Container.DEFAULT_NAME); configurationManager.addContainerProvider(new XWorkConfigurationProvider()); configurationManager.addContainerProvider(provider); Configuration configuration = configurationManager.getConfiguration(); diff --git a/core/src/test/java/org/apache/struts2/dispatcher/DispatcherTest.java b/core/src/test/java/org/apache/struts2/dispatcher/DispatcherTest.java index c0994a5ef1..91b0ebf95a 100644 --- a/core/src/test/java/org/apache/struts2/dispatcher/DispatcherTest.java +++ b/core/src/test/java/org/apache/struts2/dispatcher/DispatcherTest.java @@ -175,7 +175,7 @@ public void dispatcherInitialized(Dispatcher du) { public void testConfigurationManager() { Dispatcher du; - final InternalConfigurationManager configurationManager = new InternalConfigurationManager(); + final InternalConfigurationManager configurationManager = new InternalConfigurationManager(Container.DEFAULT_NAME); try { du = new MockDispatcher(new MockServletContext(), new HashMap(), configurationManager); du.init(); @@ -196,7 +196,7 @@ public void testConfigurationManager() { public void testObjectFactoryDestroy() throws Exception { final InnerDestroyableObjectFactory destroyedObjectFactory = new InnerDestroyableObjectFactory(); - ConfigurationManager cm = new ConfigurationManager(); + ConfigurationManager cm = new ConfigurationManager(Container.DEFAULT_NAME); Dispatcher du = new MockDispatcher(new MockServletContext(), new HashMap(), cm); Mock mockConfiguration = new Mock(Configuration.class); cm.setConfiguration((Configuration)mockConfiguration.proxy()); @@ -245,7 +245,7 @@ public void testInterceptorDestroy() throws Exception { mockConfiguration.matchAndReturn("getContainer", mockContainer.proxy()); mockConfiguration.expect("destroy"); - ConfigurationManager configurationManager = new ConfigurationManager(); + ConfigurationManager configurationManager = new ConfigurationManager(Container.DEFAULT_NAME); configurationManager.setConfiguration((Configuration) mockConfiguration.proxy()); Dispatcher dispatcher = new MockDispatcher(new MockServletContext(), new HashMap(), configurationManager); @@ -259,8 +259,12 @@ public void testInterceptorDestroy() throws Exception { class InternalConfigurationManager extends ConfigurationManager { public boolean destroyConfiguration = false; - - @Override + + public InternalConfigurationManager(String name) { + super(name); + } + + @Override public synchronized void destroyConfiguration() { super.destroyConfiguration(); destroyConfiguration = true; diff --git a/core/src/test/java/org/apache/struts2/dispatcher/mapper/CompositeActionMapperTest.java b/core/src/test/java/org/apache/struts2/dispatcher/mapper/CompositeActionMapperTest.java index acd18bb17b..558ba67185 100644 --- a/core/src/test/java/org/apache/struts2/dispatcher/mapper/CompositeActionMapperTest.java +++ b/core/src/test/java/org/apache/struts2/dispatcher/mapper/CompositeActionMapperTest.java @@ -51,7 +51,7 @@ public void testGetActionMappingAndUri1() throws Exception { mockContainer.expectAndReturn("getInstance", C.args(C.eq(ActionMapper.class), C.eq("mapper3")), mapper2); CompositeActionMapper compositeActionMapper = new CompositeActionMapper((Container) mockContainer.proxy(), "mapper1,mapper2,mapper3"); - ActionMapping actionMapping = compositeActionMapper.getMapping(new MockHttpServletRequest(), new ConfigurationManager()); + ActionMapping actionMapping = compositeActionMapper.getMapping(new MockHttpServletRequest(), new ConfigurationManager(Container.DEFAULT_NAME)); String uri = compositeActionMapper.getUriFromActionMapping(new ActionMapping()); mockContainer.verify(); @@ -69,7 +69,7 @@ public void testGetActionMappingAndUri2() throws Exception { mockContainer.expectAndReturn("getInstance", C.args(C.eq(ActionMapper.class), C.eq("mapper2")), mapper2); CompositeActionMapper compositeActionMapper = new CompositeActionMapper((Container) mockContainer.proxy(), "mapper1,mapper2"); - ActionMapping actionMapping = compositeActionMapper.getMapping(new MockHttpServletRequest(), new ConfigurationManager()); + ActionMapping actionMapping = compositeActionMapper.getMapping(new MockHttpServletRequest(), new ConfigurationManager(Container.DEFAULT_NAME)); String uri = compositeActionMapper.getUriFromActionMapping(new ActionMapping()); mockContainer.verify(); diff --git a/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java b/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java index 2008e389ac..45bd6a2f4d 100644 --- a/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java +++ b/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java @@ -29,6 +29,7 @@ import com.opensymphony.xwork2.config.ConfigurationManager; import com.opensymphony.xwork2.config.entities.PackageConfig; import com.opensymphony.xwork2.config.impl.DefaultConfiguration; +import com.opensymphony.xwork2.inject.Container; import org.apache.struts2.ServletActionContext; import org.apache.struts2.StrutsException; import org.apache.struts2.StrutsInternalTestCase; @@ -61,7 +62,7 @@ protected void setUp() throws Exception { PackageConfig pkg2 = new PackageConfig.Builder("my").namespace("/my").build(); config.addPackageConfig("mvns", pkg); config.addPackageConfig("my", pkg2); - configManager = new ConfigurationManager() { + configManager = new ConfigurationManager(Container.DEFAULT_NAME) { public Configuration getConfiguration() { return config; } @@ -139,7 +140,7 @@ public void testGetMappingWithSlashedNameAtRoot() throws Exception { config.addPackageConfig("mvns", pkg); config.addPackageConfig("my", pkg2); config.addPackageConfig("root", pkg3); - configManager = new ConfigurationManager() { + configManager = new ConfigurationManager(Container.DEFAULT_NAME) { public Configuration getConfiguration() { return config; } diff --git a/core/src/test/java/org/apache/struts2/dispatcher/mapper/Restful2ActionMapperTest.java b/core/src/test/java/org/apache/struts2/dispatcher/mapper/Restful2ActionMapperTest.java index 140ad64dae..42b95a3e05 100644 --- a/core/src/test/java/org/apache/struts2/dispatcher/mapper/Restful2ActionMapperTest.java +++ b/core/src/test/java/org/apache/struts2/dispatcher/mapper/Restful2ActionMapperTest.java @@ -21,6 +21,7 @@ package org.apache.struts2.dispatcher.mapper; +import com.opensymphony.xwork2.inject.Container; import org.apache.struts2.StrutsInternalTestCase; import com.mockobjects.servlet.MockHttpServletRequest; import com.opensymphony.xwork2.config.ConfigurationManager; @@ -53,7 +54,7 @@ protected void setUp() throws Exception { .namespace("/my").build(); config.addPackageConfig("mvns", pkg); config.addPackageConfig("my", pkg2); - configManager = new ConfigurationManager() { + configManager = new ConfigurationManager(Container.DEFAULT_NAME) { public Configuration getConfiguration() { return config; } diff --git a/plugins/rest/src/test/java/org/apache/struts2/rest/RestActionMapperTest.java b/plugins/rest/src/test/java/org/apache/struts2/rest/RestActionMapperTest.java index 54928165e4..8bfe15991a 100644 --- a/plugins/rest/src/test/java/org/apache/struts2/rest/RestActionMapperTest.java +++ b/plugins/rest/src/test/java/org/apache/struts2/rest/RestActionMapperTest.java @@ -25,6 +25,7 @@ import com.opensymphony.xwork2.config.ConfigurationManager; import com.opensymphony.xwork2.config.entities.PackageConfig; import com.opensymphony.xwork2.config.impl.DefaultConfiguration; +import com.opensymphony.xwork2.inject.Container; import junit.framework.TestCase; import org.apache.struts2.dispatcher.mapper.ActionMapping; import org.springframework.mock.web.MockHttpServletRequest; @@ -50,7 +51,7 @@ protected void setUp() throws Exception { PackageConfig pkg2 = new PackageConfig.Builder("my").namespace("/my").build(); config.addPackageConfig("mvns", pkg); config.addPackageConfig("my", pkg2); - configManager = new ConfigurationManager() { + configManager = new ConfigurationManager(Container.DEFAULT_NAME) { public Configuration getConfiguration() { return config; } diff --git a/plugins/sitegraph/src/main/java/org/apache/struts2/sitegraph/StrutsConfigRetriever.java b/plugins/sitegraph/src/main/java/org/apache/struts2/sitegraph/StrutsConfigRetriever.java index 1e6b245b19..8e701091fa 100644 --- a/plugins/sitegraph/src/main/java/org/apache/struts2/sitegraph/StrutsConfigRetriever.java +++ b/plugins/sitegraph/src/main/java/org/apache/struts2/sitegraph/StrutsConfigRetriever.java @@ -25,6 +25,7 @@ import com.opensymphony.xwork2.config.ConfigurationProvider; import com.opensymphony.xwork2.config.entities.ActionConfig; import com.opensymphony.xwork2.config.entities.ResultConfig; +import com.opensymphony.xwork2.inject.Container; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; import org.apache.struts2.config.DefaultBeanSelectionProvider; @@ -71,7 +72,7 @@ private static void initXWork() { File configFile = new File(configFilePath); try { ConfigurationProvider configProvider = new StrutsXmlConfigurationProvider(configFile.getCanonicalPath(), true, null); - cm = new ConfigurationManager(); + cm = new ConfigurationManager(Container.DEFAULT_NAME); cm.addContainerProvider(new DefaultPropertiesProvider()); cm.addContainerProvider(new StrutsXmlConfigurationProvider("struts-default.xml", false, null)); cm.addContainerProvider(configProvider); From f1a963b323d0dfe434742c7a049fe0966a659861 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Mon, 13 Mar 2017 09:09:45 +0100 Subject: [PATCH 13/21] Makes class serializable --- .../java/com/opensymphony/xwork2/util/LocalizedTextUtil.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/opensymphony/xwork2/util/LocalizedTextUtil.java b/core/src/main/java/com/opensymphony/xwork2/util/LocalizedTextUtil.java index 1334cadf96..7e870fd853 100644 --- a/core/src/main/java/com/opensymphony/xwork2/util/LocalizedTextUtil.java +++ b/core/src/main/java/com/opensymphony/xwork2/util/LocalizedTextUtil.java @@ -33,6 +33,7 @@ import org.apache.struts2.StrutsConstants; import java.beans.PropertyDescriptor; +import java.io.Serializable; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -87,7 +88,7 @@ * @author Rainer Hermanns * @author tm_jee */ -public class LocalizedTextUtil { +public class LocalizedTextUtil implements Serializable { private static final Logger LOG = LogManager.getLogger(LocalizedTextUtil.class); From ca0f62925ab6338823f454799f521208ed0dd6e7 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Mon, 13 Mar 2017 09:10:19 +0100 Subject: [PATCH 14/21] Extends constructors to inject LocalizedTextUtil --- .../com/opensymphony/xwork2/TextProviderFactory.java | 11 +++++++++-- .../com/opensymphony/xwork2/TextProviderSupport.java | 6 ++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/com/opensymphony/xwork2/TextProviderFactory.java b/core/src/main/java/com/opensymphony/xwork2/TextProviderFactory.java index b00f451acf..43c679294e 100644 --- a/core/src/main/java/com/opensymphony/xwork2/TextProviderFactory.java +++ b/core/src/main/java/com/opensymphony/xwork2/TextProviderFactory.java @@ -16,6 +16,7 @@ package com.opensymphony.xwork2; import com.opensymphony.xwork2.inject.Inject; +import com.opensymphony.xwork2.util.LocalizedTextUtil; import java.util.ResourceBundle; @@ -29,6 +30,7 @@ public class TextProviderFactory { private TextProvider textProvider; private LocaleProvider localeProvider; + private LocalizedTextUtil localizedTextUtil; @Inject public void setTextProvider(TextProvider textProvider) { @@ -40,6 +42,11 @@ public void setLocaleProvider(LocaleProvider localeProvider) { this.localeProvider = localeProvider; } + @Inject + public void setLocalizedTextUtil(LocalizedTextUtil localizedTextUtil) { + this.localizedTextUtil = localizedTextUtil; + } + public TextProvider createInstance(Class clazz) { TextProvider instance = getTextProvider(clazz); if (instance instanceof ResourceBundleTextProvider) { @@ -60,7 +67,7 @@ public TextProvider createInstance(ResourceBundle bundle) { protected TextProvider getTextProvider(Class clazz) { if (this.textProvider == null) { - return new TextProviderSupport(clazz, localeProvider); + return new TextProviderSupport(clazz, localeProvider, localizedTextUtil); } else { return textProvider; } @@ -68,7 +75,7 @@ protected TextProvider getTextProvider(Class clazz) { private TextProvider getTextProvider(ResourceBundle bundle) { if (this.textProvider == null) { - textProvider = new TextProviderSupport(bundle, localeProvider); + return new TextProviderSupport(bundle, localeProvider, localizedTextUtil); } return textProvider; } diff --git a/core/src/main/java/com/opensymphony/xwork2/TextProviderSupport.java b/core/src/main/java/com/opensymphony/xwork2/TextProviderSupport.java index ab37e9233d..98dd3d2f7c 100644 --- a/core/src/main/java/com/opensymphony/xwork2/TextProviderSupport.java +++ b/core/src/main/java/com/opensymphony/xwork2/TextProviderSupport.java @@ -47,9 +47,10 @@ public TextProviderSupport() { * @param clazz a clazz to use for reading the resource bundle. * @param provider a locale provider. */ - public TextProviderSupport(Class clazz, LocaleProvider provider) { + public TextProviderSupport(Class clazz, LocaleProvider provider, LocalizedTextUtil localizedTextUtil) { this.clazz = clazz; this.localeProvider = provider; + this.localizedTextUtil = localizedTextUtil; } /** @@ -58,9 +59,10 @@ public TextProviderSupport(Class clazz, LocaleProvider provider) { * @param bundle the resource bundle. * @param provider a locale provider. */ - public TextProviderSupport(ResourceBundle bundle, LocaleProvider provider) { + public TextProviderSupport(ResourceBundle bundle, LocaleProvider provider, LocalizedTextUtil localizedTextUtil) { this.bundle = bundle; this.localeProvider = provider; + this.localizedTextUtil = localizedTextUtil; } /** From f784a16cb7f6515bf15f93173453326286e33ff0 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Mon, 13 Mar 2017 09:10:26 +0100 Subject: [PATCH 15/21] Adjusts tests --- .../xwork2/CompositeTextProviderTest.java | 41 ++++--------------- .../xwork2/DefaultTextProviderTest.java | 7 ++-- .../xwork2/TextProviderSupportTest.java | 7 +++- 3 files changed, 18 insertions(+), 37 deletions(-) diff --git a/core/src/test/java/com/opensymphony/xwork2/CompositeTextProviderTest.java b/core/src/test/java/com/opensymphony/xwork2/CompositeTextProviderTest.java index 2dcfa8be2a..729090298d 100644 --- a/core/src/test/java/com/opensymphony/xwork2/CompositeTextProviderTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/CompositeTextProviderTest.java @@ -76,40 +76,15 @@ public void testGetResourceBundle() throws Exception { @Override protected void setUp() throws Exception { super.setUp(); - textProvider = new CompositeTextProvider(new TextProvider[] { - new TextProviderSupport(ResourceBundle.getBundle("com.opensymphony.xwork2.validator.CompositeTextProviderTestResourceBundle1"), - new LocaleProvider() { - public Locale getLocale() { - return Locale.ENGLISH; - } - - @Override - public boolean isValidLocaleString(String localeStr) { - return true; - } - - @Override - public boolean isValidLocale(Locale locale) { - return true; - } - }), - new TextProviderSupport(ResourceBundle.getBundle("com.opensymphony.xwork2.validator.CompositeTextProviderTestResourceBundle2"), - new LocaleProvider() { - public Locale getLocale() { - return Locale.ENGLISH; - } - - @Override - public boolean isValidLocaleString(String localeStr) { - return true; - } - - @Override - public boolean isValidLocale(Locale locale) { - return true; - } - }) + TextProviderFactory tpf = container.getInstance(TextProviderFactory.class); + tpf.setTextProvider(null); + + ActionContext.getContext().setLocale(Locale.ENGLISH); + + textProvider = new CompositeTextProvider(new TextProvider[]{ + tpf.createInstance(ResourceBundle.getBundle("com.opensymphony.xwork2.validator.CompositeTextProviderTestResourceBundle1")), + tpf.createInstance(ResourceBundle.getBundle("com.opensymphony.xwork2.validator.CompositeTextProviderTestResourceBundle2")) }); } diff --git a/core/src/test/java/com/opensymphony/xwork2/DefaultTextProviderTest.java b/core/src/test/java/com/opensymphony/xwork2/DefaultTextProviderTest.java index 37d6dcef5b..7b6b212e20 100644 --- a/core/src/test/java/com/opensymphony/xwork2/DefaultTextProviderTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/DefaultTextProviderTest.java @@ -16,7 +16,6 @@ package com.opensymphony.xwork2; import com.opensymphony.xwork2.util.LocalizedTextUtil; -import junit.framework.TestCase; import java.util.*; @@ -25,7 +24,7 @@ * * @author Claus Ibsen */ -public class DefaultTextProviderTest extends TestCase { +public class DefaultTextProviderTest extends XWorkTestCase { private DefaultTextProvider tp; @@ -127,6 +126,8 @@ public void testGetBundle() throws Exception { @Override protected void setUp() throws Exception { + super.setUp(); + ActionContext ctx = new ActionContext(new HashMap()); ActionContext.setContext(ctx); ctx.setLocale(Locale.CANADA); @@ -134,7 +135,7 @@ protected void setUp() throws Exception { LocalizedTextUtil.clearDefaultResourceBundles(); LocalizedTextUtil.addDefaultResourceBundle(DefaultTextProviderTest.class.getName()); - tp = new DefaultTextProvider(); + tp = container.inject(DefaultTextProvider.class); } @Override diff --git a/core/src/test/java/com/opensymphony/xwork2/TextProviderSupportTest.java b/core/src/test/java/com/opensymphony/xwork2/TextProviderSupportTest.java index 6769d0e8e8..a36b43718f 100644 --- a/core/src/test/java/com/opensymphony/xwork2/TextProviderSupportTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/TextProviderSupportTest.java @@ -16,6 +16,8 @@ package com.opensymphony.xwork2; +import com.opensymphony.xwork2.util.LocalizedTextUtil; + import java.util.ArrayList; import java.util.List; import java.util.Locale; @@ -108,6 +110,9 @@ public void testDifficultSymbols2() { protected void setUp() throws Exception { super.setUp(); rb = ResourceBundle.getBundle(TextProviderSupportTest.class.getName(), Locale.ENGLISH); + + LocalizedTextUtil ltu = container.getInstance(LocalizedTextUtil.class); + tp = new TextProviderSupport(rb, new LocaleProvider() { public Locale getLocale() { return Locale.ENGLISH; @@ -122,7 +127,7 @@ public boolean isValidLocaleString(String localeStr) { public boolean isValidLocale(Locale locale) { return true; } - }); + }, ltu); } @Override From 31ddb8b6020b2d67c0e5a7ad11d9d3a8b0fbdbf9 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Mon, 13 Mar 2017 09:24:55 +0100 Subject: [PATCH 16/21] Fixes small typos --- .../com/opensymphony/xwork2/util/LocalizedTextUtilTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/test/java/com/opensymphony/xwork2/util/LocalizedTextUtilTest.java b/core/src/test/java/com/opensymphony/xwork2/util/LocalizedTextUtilTest.java index e8dc982ba5..663181586f 100644 --- a/core/src/test/java/com/opensymphony/xwork2/util/LocalizedTextUtilTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/util/LocalizedTextUtilTest.java @@ -200,7 +200,7 @@ public void testParameterizedDefaultMessageWithPackage() throws Exception { } public void testLocalizedDateFormatIsUsed() throws ParseException { - localizedTextUtil.addDefaultResourceBundle("com/opensymphony/xwork2/util/localizedTextUtilTest"); + LocalizedTextUtil.addDefaultResourceBundle("com/opensymphony/xwork2/util/LocalizedTextUtilTest"); Date date = DateFormat.getDateInstance(DateFormat.SHORT, Locale.US).parse("01/01/2015"); Object[] params = new Object[]{ date }; String usDate = localizedTextUtil.findDefaultText("test.format.date", Locale.US, params); @@ -210,7 +210,7 @@ public void testLocalizedDateFormatIsUsed() throws ParseException { } public void testXW377() { - localizedTextUtil.addDefaultResourceBundle("com/opensymphony/xwork2/util/localizedTextUtilTest"); + LocalizedTextUtil.addDefaultResourceBundle("com/opensymphony/xwork2/util/LocalizedTextUtilTest"); String text = localizedTextUtil.findText(Bar.class, "xw377", ActionContext.getContext().getLocale(), "xw377", null, ActionContext.getContext().getValueStack()); assertEquals("xw377", text); // should not log @@ -261,7 +261,7 @@ protected void setUp() throws Exception { @Override protected void tearDown() throws Exception { super.tearDown(); - localizedTextUtil.clearDefaultResourceBundles(); + LocalizedTextUtil.clearDefaultResourceBundles(); } } From 6e89179eb2c5f0a7b71b7d7fdd7b0e8966f68f52 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Tue, 14 Mar 2017 09:39:02 +0100 Subject: [PATCH 17/21] Extracts common interface for LocalizedTextProvider --- .../xwork2/DefaultActionProxy.java | 13 ++-- .../xwork2/DefaultTextProvider.java | 14 ++-- .../xwork2/LocalizedTextProvider.java | 33 ++++++++ .../xwork2/TextProviderFactory.java | 11 ++- .../xwork2/TextProviderSupport.java | 37 +++++---- .../config/impl/DefaultConfiguration.java | 2 +- .../providers/XWorkConfigurationProvider.java | 3 +- .../conversion/impl/XWorkConverter.java | 4 +- .../xwork2/interceptor/AliasInterceptor.java | 10 +-- .../StaticParametersInterceptor.java | 10 +-- .../xwork2/util/LocalizedTextUtil.java | 75 ++++++++++++------- .../xwork2/util/XWorkTestCaseHelper.java | 2 +- .../config/DefaultBeanSelectionProvider.java | 23 +----- .../struts2/factory/StrutsActionProxy.java | 2 +- .../org/apache/struts2/util/TokenHelper.java | 5 +- core/src/main/resources/struts-default.xml | 2 +- .../xwork2/DefaultTextProviderTest.java | 5 +- .../xwork2/TextProviderSupportTest.java | 2 +- .../xwork2/util/LocalizedTextUtilTest.java | 62 +++++++-------- .../struts2/components/ComponentTest.java | 3 +- .../DefaultBeanSelectionProviderTest.java | 30 ++++---- .../apache/struts2/config/SettingsTest.java | 7 +- .../struts2/dispatcher/DispatcherTest.java | 8 +- .../portlet/dispatcher/Jsr168Dispatcher.java | 1 - 24 files changed, 199 insertions(+), 165 deletions(-) create mode 100644 core/src/main/java/com/opensymphony/xwork2/LocalizedTextProvider.java diff --git a/core/src/main/java/com/opensymphony/xwork2/DefaultActionProxy.java b/core/src/main/java/com/opensymphony/xwork2/DefaultActionProxy.java index 39a484d7d7..1ab012cc2e 100644 --- a/core/src/main/java/com/opensymphony/xwork2/DefaultActionProxy.java +++ b/core/src/main/java/com/opensymphony/xwork2/DefaultActionProxy.java @@ -24,7 +24,6 @@ import com.opensymphony.xwork2.config.ConfigurationException; import com.opensymphony.xwork2.config.entities.ActionConfig; import com.opensymphony.xwork2.inject.Inject; -import com.opensymphony.xwork2.util.LocalizedTextUtil; import com.opensymphony.xwork2.util.profiling.UtilTimerStack; import org.apache.commons.lang3.StringEscapeUtils; import org.apache.commons.lang3.StringUtils; @@ -53,7 +52,7 @@ public class DefaultActionProxy implements ActionProxy, Serializable { protected ActionConfig config; protected ActionInvocation invocation; protected UnknownHandlerManager unknownHandlerManager; - protected LocalizedTextUtil localizedTextUtil; + protected LocalizedTextProvider localizedTextProvider; protected String actionName; protected String namespace; @@ -116,8 +115,8 @@ public void setActionEventListener(ActionEventListener listener) { } @Inject - public void setLocalizedTextUtil(LocalizedTextUtil localizedTextUtil) { - this.localizedTextUtil = localizedTextUtil; + public void setLocalizedTextUtil(LocalizedTextProvider localizedTextProvider) { + this.localizedTextProvider = localizedTextProvider; } public Object getAction() { @@ -212,7 +211,7 @@ protected void prepare() { } protected String prepareNotAllowedErrorMessage() { - return localizedTextUtil.findDefaultText( + return localizedTextProvider.findDefaultText( "struts.exception.method-not-allowed", Locale.getDefault(), new String[]{method, actionName} @@ -221,12 +220,12 @@ protected String prepareNotAllowedErrorMessage() { protected String getErrorMessage() { if ((namespace != null) && (namespace.trim().length() > 0)) { - return localizedTextUtil.findDefaultText( + return localizedTextProvider.findDefaultText( "xwork.exception.missing-package-action", Locale.getDefault(), new String[]{namespace, actionName}); } else { - return localizedTextUtil.findDefaultText( + return localizedTextProvider.findDefaultText( "xwork.exception.missing-action", Locale.getDefault(), new String[]{actionName}); diff --git a/core/src/main/java/com/opensymphony/xwork2/DefaultTextProvider.java b/core/src/main/java/com/opensymphony/xwork2/DefaultTextProvider.java index 0e3f5b17b9..b82c42a93f 100644 --- a/core/src/main/java/com/opensymphony/xwork2/DefaultTextProvider.java +++ b/core/src/main/java/com/opensymphony/xwork2/DefaultTextProvider.java @@ -38,14 +38,14 @@ public class DefaultTextProvider implements TextProvider, Serializable, Unchaina private static final Object[] EMPTY_ARGS = new Object[0]; - protected LocalizedTextUtil localizedTextUtil; + protected LocalizedTextProvider localizedTextProvider; public DefaultTextProvider() { } @Inject - public void setLocalizedTextUtil(LocalizedTextUtil localizedTextUtil) { - this.localizedTextUtil = localizedTextUtil; + public void setLocalizedTextUtil(LocalizedTextProvider localizedTextProvider) { + this.localizedTextProvider = localizedTextProvider; } public boolean hasKey(String key) { @@ -53,7 +53,7 @@ public boolean hasKey(String key) { } public String getText(String key) { - return localizedTextUtil.findDefaultText(key, ActionContext.getContext().getLocale()); + return localizedTextProvider.findDefaultText(key, ActionContext.getContext().getLocale()); } public String getText(String key, String defaultValue) { @@ -72,7 +72,7 @@ public String getText(String key, List args) { params = EMPTY_ARGS; } - return localizedTextUtil.findDefaultText(key, ActionContext.getContext().getLocale(), params); + return localizedTextProvider.findDefaultText(key, ActionContext.getContext().getLocale(), params); } public String getText(String key, String[] args) { @@ -83,7 +83,7 @@ public String getText(String key, String[] args) { params = EMPTY_ARGS; } - return localizedTextUtil.findDefaultText(key, ActionContext.getContext().getLocale(), params); + return localizedTextProvider.findDefaultText(key, ActionContext.getContext().getLocale(), params); } public String getText(String key, String defaultValue, List args) { @@ -144,7 +144,7 @@ public String getText(String key, String defaultValue, String[] args, ValueStack } public ResourceBundle getTexts(String bundleName) { - return localizedTextUtil.findResourceBundle(bundleName, ActionContext.getContext().getLocale()); + return localizedTextProvider.findResourceBundle(bundleName, ActionContext.getContext().getLocale()); } public ResourceBundle getTexts() { diff --git a/core/src/main/java/com/opensymphony/xwork2/LocalizedTextProvider.java b/core/src/main/java/com/opensymphony/xwork2/LocalizedTextProvider.java new file mode 100644 index 0000000000..f6175ea1cf --- /dev/null +++ b/core/src/main/java/com/opensymphony/xwork2/LocalizedTextProvider.java @@ -0,0 +1,33 @@ +package com.opensymphony.xwork2; + +import com.opensymphony.xwork2.util.ValueStack; + +import java.io.Serializable; +import java.util.Locale; +import java.util.ResourceBundle; + +public interface LocalizedTextProvider extends Serializable { + + String findDefaultText(String aTextName, Locale locale); + + String findDefaultText(String aTextName, Locale locale, Object[] params); + + ResourceBundle findResourceBundle(String aBundleName, Locale locale); + + String findText(Class aClass, String aTextName, Locale locale); + + String findText(Class aClass, String aTextName, Locale locale, String defaultMessage, Object[] args); + + String findText(Class aClass, String aTextName, Locale locale, String defaultMessage, Object[] args, ValueStack valueStack); + + String findText(ResourceBundle bundle, String aTextName, Locale locale); + + String findText(ResourceBundle bundle, String aTextName, Locale locale, String defaultMessage, Object[] args); + + String findText(ResourceBundle bundle, String aTextName, Locale locale, String defaultMessage, Object[] args, ValueStack valueStack); + + void addDefaultResourceBundle(String resourceBundleName); + + @Deprecated + void reset(); +} diff --git a/core/src/main/java/com/opensymphony/xwork2/TextProviderFactory.java b/core/src/main/java/com/opensymphony/xwork2/TextProviderFactory.java index 43c679294e..91b110c367 100644 --- a/core/src/main/java/com/opensymphony/xwork2/TextProviderFactory.java +++ b/core/src/main/java/com/opensymphony/xwork2/TextProviderFactory.java @@ -16,7 +16,6 @@ package com.opensymphony.xwork2; import com.opensymphony.xwork2.inject.Inject; -import com.opensymphony.xwork2.util.LocalizedTextUtil; import java.util.ResourceBundle; @@ -30,7 +29,7 @@ public class TextProviderFactory { private TextProvider textProvider; private LocaleProvider localeProvider; - private LocalizedTextUtil localizedTextUtil; + private LocalizedTextProvider localizedTextProvider; @Inject public void setTextProvider(TextProvider textProvider) { @@ -43,8 +42,8 @@ public void setLocaleProvider(LocaleProvider localeProvider) { } @Inject - public void setLocalizedTextUtil(LocalizedTextUtil localizedTextUtil) { - this.localizedTextUtil = localizedTextUtil; + public void setLocalizedTextUtil(LocalizedTextProvider localizedTextProvider) { + this.localizedTextProvider = localizedTextProvider; } public TextProvider createInstance(Class clazz) { @@ -67,7 +66,7 @@ public TextProvider createInstance(ResourceBundle bundle) { protected TextProvider getTextProvider(Class clazz) { if (this.textProvider == null) { - return new TextProviderSupport(clazz, localeProvider, localizedTextUtil); + return new TextProviderSupport(clazz, localeProvider, localizedTextProvider); } else { return textProvider; } @@ -75,7 +74,7 @@ protected TextProvider getTextProvider(Class clazz) { private TextProvider getTextProvider(ResourceBundle bundle) { if (this.textProvider == null) { - return new TextProviderSupport(bundle, localeProvider, localizedTextUtil); + return new TextProviderSupport(bundle, localeProvider, localizedTextProvider); } return textProvider; } diff --git a/core/src/main/java/com/opensymphony/xwork2/TextProviderSupport.java b/core/src/main/java/com/opensymphony/xwork2/TextProviderSupport.java index 98dd3d2f7c..b576751357 100644 --- a/core/src/main/java/com/opensymphony/xwork2/TextProviderSupport.java +++ b/core/src/main/java/com/opensymphony/xwork2/TextProviderSupport.java @@ -16,7 +16,6 @@ package com.opensymphony.xwork2; import com.opensymphony.xwork2.inject.Inject; -import com.opensymphony.xwork2.util.LocalizedTextUtil; import com.opensymphony.xwork2.util.ValueStack; import java.util.*; @@ -33,7 +32,7 @@ public class TextProviderSupport implements ResourceBundleTextProvider { private Class clazz; private LocaleProvider localeProvider; private ResourceBundle bundle; - private LocalizedTextUtil localizedTextUtil; + private LocalizedTextProvider localizedTextProvider; /** * Default constructor @@ -47,10 +46,10 @@ public TextProviderSupport() { * @param clazz a clazz to use for reading the resource bundle. * @param provider a locale provider. */ - public TextProviderSupport(Class clazz, LocaleProvider provider, LocalizedTextUtil localizedTextUtil) { + public TextProviderSupport(Class clazz, LocaleProvider provider, LocalizedTextProvider localizedTextProvider) { this.clazz = clazz; this.localeProvider = provider; - this.localizedTextUtil = localizedTextUtil; + this.localizedTextProvider = localizedTextProvider; } /** @@ -59,10 +58,10 @@ public TextProviderSupport(Class clazz, LocaleProvider provider, LocalizedTextUt * @param bundle the resource bundle. * @param provider a locale provider. */ - public TextProviderSupport(ResourceBundle bundle, LocaleProvider provider, LocalizedTextUtil localizedTextUtil) { + public TextProviderSupport(ResourceBundle bundle, LocaleProvider provider, LocalizedTextProvider localizedTextProvider) { this.bundle = bundle; this.localeProvider = provider; - this.localizedTextUtil = localizedTextUtil; + this.localizedTextProvider = localizedTextProvider; } /** @@ -89,8 +88,8 @@ public void setLocaleProvider(LocaleProvider localeProvider) { } @Inject - public void setLocalizedTextUtil(LocalizedTextUtil localizedTextUtil) { - this.localizedTextUtil = localizedTextUtil; + public void setLocalizedTextUtil(LocalizedTextProvider localizedTextProvider) { + this.localizedTextProvider = localizedTextProvider; } /** @@ -104,9 +103,9 @@ public void setLocalizedTextUtil(LocalizedTextUtil localizedTextUtil) { public boolean hasKey(String key) { String message; if (clazz != null) { - message = localizedTextUtil.findText(clazz, key, getLocale(), null, new Object[0] ); + message = localizedTextProvider.findText(clazz, key, getLocale(), null, new Object[0] ); } else { - message = localizedTextUtil.findText(bundle, key, getLocale(), null, new Object[0]); + message = localizedTextProvider.findText(bundle, key, getLocale(), null, new Object[0]); } return message != null; } @@ -208,9 +207,9 @@ public String getText(String key, String[] args) { public String getText(String key, String defaultValue, List args) { Object[] argsArray = ((args != null && !args.equals(Collections.emptyList())) ? args.toArray() : null); if (clazz != null) { - return localizedTextUtil.findText(clazz, key, getLocale(), defaultValue, argsArray); + return localizedTextProvider.findText(clazz, key, getLocale(), defaultValue, argsArray); } else { - return localizedTextUtil.findText(bundle, key, getLocale(), defaultValue, argsArray); + return localizedTextProvider.findText(bundle, key, getLocale(), defaultValue, argsArray); } } @@ -229,9 +228,9 @@ public String getText(String key, String defaultValue, List args) { */ public String getText(String key, String defaultValue, String[] args) { if (clazz != null) { - return localizedTextUtil.findText(clazz, key, getLocale(), defaultValue, args); + return localizedTextProvider.findText(clazz, key, getLocale(), defaultValue, args); } else { - return localizedTextUtil.findText(bundle, key, getLocale(), defaultValue, args); + return localizedTextProvider.findText(bundle, key, getLocale(), defaultValue, args); } } @@ -259,9 +258,9 @@ public String getText(String key, String defaultValue, List args, ValueStack locale = getLocale(); } if (clazz != null) { - return localizedTextUtil.findText(clazz, key, locale, defaultValue, argsArray, stack); + return localizedTextProvider.findText(clazz, key, locale, defaultValue, argsArray, stack); } else { - return localizedTextUtil.findText(bundle, key, locale, defaultValue, argsArray, stack); + return localizedTextProvider.findText(bundle, key, locale, defaultValue, argsArray, stack); } } @@ -289,9 +288,9 @@ public String getText(String key, String defaultValue, String[] args, ValueStack locale = getLocale(); } if (clazz != null) { - return localizedTextUtil.findText(clazz, key, locale, defaultValue, args, stack); + return localizedTextProvider.findText(clazz, key, locale, defaultValue, args, stack); } else { - return localizedTextUtil.findText(bundle, key, locale, defaultValue, args, stack); + return localizedTextProvider.findText(bundle, key, locale, defaultValue, args, stack); } } @@ -311,7 +310,7 @@ public String getText(String key, String defaultValue, String[] args, ValueStack * @return a resource bundle */ public ResourceBundle getTexts(String aBundleName) { - return localizedTextUtil.findResourceBundle(aBundleName, getLocale()); + return localizedTextProvider.findResourceBundle(aBundleName, getLocale()); } /** diff --git a/core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java b/core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java index 89be0fa80a..937a5614e4 100644 --- a/core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java +++ b/core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java @@ -245,7 +245,7 @@ protected Container createBootstrapContainer(List providers) builder.factory(ReflectionProvider.class, OgnlReflectionProvider.class, Scope.SINGLETON); builder.factory(ValueStackFactory.class, OgnlValueStackFactory.class, Scope.SINGLETON); - builder.factory(LocalizedTextUtil.class, LocalizedTextUtil.class, Scope.SINGLETON); + builder.factory(LocalizedTextProvider.class, LocalizedTextUtil.class, Scope.SINGLETON); builder.factory(XWorkConverter.class, Scope.SINGLETON); builder.factory(ConversionPropertiesProcessor.class, DefaultConversionPropertiesProcessor.class, Scope.SINGLETON); diff --git a/core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java b/core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java index 2adab778ec..407a96d19e 100644 --- a/core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java +++ b/core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java @@ -71,6 +71,7 @@ import com.opensymphony.xwork2.ognl.accessor.XWorkMapPropertyAccessor; import com.opensymphony.xwork2.ognl.accessor.XWorkMethodAccessor; import com.opensymphony.xwork2.util.CompoundRoot; +import com.opensymphony.xwork2.LocalizedTextProvider; import com.opensymphony.xwork2.util.LocalizedTextUtil; import com.opensymphony.xwork2.util.OgnlTextParser; import com.opensymphony.xwork2.util.PatternMatcher; @@ -181,7 +182,7 @@ public void register(ContainerBuilder builder, LocatableProperties props) .factory(ActionValidatorManager.class, "no-annotations", DefaultActionValidatorManager.class, Scope.SINGLETON) .factory(TextProviderFactory.class, Scope.SINGLETON) - .factory(LocalizedTextUtil.class, LocalizedTextUtil.class, Scope.SINGLETON) + .factory(LocalizedTextProvider.class, LocalizedTextUtil.class, Scope.SINGLETON) .factory(TextProvider.class, "system", DefaultTextProvider.class, Scope.SINGLETON) .factory(TextProvider.class, TextProviderSupport.class, Scope.SINGLETON) diff --git a/core/src/main/java/com/opensymphony/xwork2/conversion/impl/XWorkConverter.java b/core/src/main/java/com/opensymphony/xwork2/conversion/impl/XWorkConverter.java index 771fc367bf..bdf74c220d 100644 --- a/core/src/main/java/com/opensymphony/xwork2/conversion/impl/XWorkConverter.java +++ b/core/src/main/java/com/opensymphony/xwork2/conversion/impl/XWorkConverter.java @@ -194,8 +194,8 @@ public void setTypeConverterHolder(TypeConverterHolder converterHolder) { } public static String getConversionErrorMessage(String propertyName, ValueStack stack) { - LocalizedTextUtil localizedTextUtil = ActionContext.getContext().getContainer().getInstance(LocalizedTextUtil.class); - String defaultMessage = localizedTextUtil.findDefaultText("xwork.default.invalid.fieldvalue", + LocalizedTextProvider localizedTextProvider = ActionContext.getContext().getContainer().getInstance(LocalizedTextProvider.class); + String defaultMessage = localizedTextProvider.findDefaultText("xwork.default.invalid.fieldvalue", ActionContext.getContext().getLocale(), new Object[]{ propertyName diff --git a/core/src/main/java/com/opensymphony/xwork2/interceptor/AliasInterceptor.java b/core/src/main/java/com/opensymphony/xwork2/interceptor/AliasInterceptor.java index 9d260c18d1..f3f9c00feb 100644 --- a/core/src/main/java/com/opensymphony/xwork2/interceptor/AliasInterceptor.java +++ b/core/src/main/java/com/opensymphony/xwork2/interceptor/AliasInterceptor.java @@ -23,7 +23,7 @@ import com.opensymphony.xwork2.inject.Inject; import com.opensymphony.xwork2.util.ClearableValueStack; import com.opensymphony.xwork2.util.Evaluated; -import com.opensymphony.xwork2.util.LocalizedTextUtil; +import com.opensymphony.xwork2.LocalizedTextProvider; import com.opensymphony.xwork2.util.ValueStack; import com.opensymphony.xwork2.util.ValueStackFactory; import com.opensymphony.xwork2.util.reflection.ReflectionContextState; @@ -94,7 +94,7 @@ public class AliasInterceptor extends AbstractInterceptor { protected String aliasesKey = DEFAULT_ALIAS_KEY; protected ValueStackFactory valueStackFactory; - protected LocalizedTextUtil localizedTextUtil; + protected LocalizedTextProvider localizedTextProvider; protected boolean devMode = false; @Inject(XWorkConstants.DEV_MODE) @@ -108,8 +108,8 @@ public void setValueStackFactory(ValueStackFactory valueStackFactory) { } @Inject - public void setLocalizedTextUtil(LocalizedTextUtil localizedTextUtil) { - this.localizedTextUtil = localizedTextUtil; + public void setLocalizedTextUtil(LocalizedTextProvider localizedTextProvider) { + this.localizedTextProvider = localizedTextProvider; } /** @@ -179,7 +179,7 @@ public void setAliasesKey(String aliasesKey) { newStack.setValue(alias, value.get()); } catch (RuntimeException e) { if (devMode) { - String developerNotification = localizedTextUtil.findText(ParametersInterceptor.class, "devmode.notification", ActionContext.getContext().getLocale(), "Developer Notification:\n{0}", new Object[]{ + String developerNotification = localizedTextProvider.findText(ParametersInterceptor.class, "devmode.notification", ActionContext.getContext().getLocale(), "Developer Notification:\n{0}", new Object[]{ "Unexpected Exception caught setting '" + entry.getKey() + "' on '" + action.getClass() + ": " + e.getMessage() }); LOG.error(developerNotification); diff --git a/core/src/main/java/com/opensymphony/xwork2/interceptor/StaticParametersInterceptor.java b/core/src/main/java/com/opensymphony/xwork2/interceptor/StaticParametersInterceptor.java index b697a648da..1453583db0 100644 --- a/core/src/main/java/com/opensymphony/xwork2/interceptor/StaticParametersInterceptor.java +++ b/core/src/main/java/com/opensymphony/xwork2/interceptor/StaticParametersInterceptor.java @@ -22,7 +22,7 @@ import com.opensymphony.xwork2.config.entities.Parameterizable; import com.opensymphony.xwork2.inject.Inject; import com.opensymphony.xwork2.util.ClearableValueStack; -import com.opensymphony.xwork2.util.LocalizedTextUtil; +import com.opensymphony.xwork2.LocalizedTextProvider; import com.opensymphony.xwork2.util.TextParseUtil; import com.opensymphony.xwork2.util.ValueStack; import com.opensymphony.xwork2.util.ValueStackFactory; @@ -93,7 +93,7 @@ public class StaticParametersInterceptor extends AbstractInterceptor { private static final Logger LOG = LogManager.getLogger(StaticParametersInterceptor.class); private ValueStackFactory valueStackFactory; - private LocalizedTextUtil localizedTextUtil; + private LocalizedTextProvider localizedTextProvider; @Inject public void setValueStackFactory(ValueStackFactory valueStackFactory) { @@ -106,8 +106,8 @@ public void setDevMode(String mode) { } @Inject - public void setLocalizedTextUtil(LocalizedTextUtil localizedTextUtil) { - this.localizedTextUtil = localizedTextUtil; + public void setLocalizedTextUtil(LocalizedTextProvider localizedTextProvider) { + this.localizedTextProvider = localizedTextProvider; } public void setParse(String value) { @@ -175,7 +175,7 @@ public String intercept(ActionInvocation invocation) throws Exception { } catch (RuntimeException e) { if (devMode) { - String developerNotification = localizedTextUtil.findText(ParametersInterceptor.class, "devmode.notification", ActionContext.getContext().getLocale(), "Developer Notification:\n{0}", new Object[]{ + String developerNotification = localizedTextProvider.findText(ParametersInterceptor.class, "devmode.notification", ActionContext.getContext().getLocale(), "Developer Notification:\n{0}", new Object[]{ "Unexpected Exception caught setting '" + entry.getKey() + "' on '" + action.getClass() + ": " + e.getMessage() }); LOG.error(developerNotification); diff --git a/core/src/main/java/com/opensymphony/xwork2/util/LocalizedTextUtil.java b/core/src/main/java/com/opensymphony/xwork2/util/LocalizedTextUtil.java index 7e870fd853..8fb9e00f8d 100644 --- a/core/src/main/java/com/opensymphony/xwork2/util/LocalizedTextUtil.java +++ b/core/src/main/java/com/opensymphony/xwork2/util/LocalizedTextUtil.java @@ -23,6 +23,7 @@ import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; +import com.opensymphony.xwork2.LocalizedTextProvider; import com.opensymphony.xwork2.ModelDriven; import com.opensymphony.xwork2.conversion.impl.XWorkConverter; import com.opensymphony.xwork2.inject.Inject; @@ -33,7 +34,6 @@ import org.apache.struts2.StrutsConstants; import java.beans.PropertyDescriptor; -import java.io.Serializable; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -88,29 +88,24 @@ * @author Rainer Hermanns * @author tm_jee */ -public class LocalizedTextUtil implements Serializable { +public class LocalizedTextUtil implements LocalizedTextProvider { private static final Logger LOG = LogManager.getLogger(LocalizedTextUtil.class); private static final String TOMCAT_RESOURCE_ENTRIES_FIELD = "resourceEntries"; - private static final ConcurrentMap> classLoaderMap = new ConcurrentHashMap<>(); + private final ConcurrentMap> classLoaderMap = new ConcurrentHashMap<>(); private boolean reloadBundles = false; private boolean devMode = false; - private static final ConcurrentMap bundlesMap = new ConcurrentHashMap<>(); - private static final ConcurrentMap messageFormats = new ConcurrentHashMap<>(); - private static final ConcurrentMap delegatedClassLoaderMap = new ConcurrentHashMap<>(); - private static final Set missingBundles = Collections.synchronizedSet(new HashSet()); - - private static final String RELOADED = "com.opensymphony.xwork2.util.LocalizedTextUtil.reloaded"; - private static final String XWORK_MESSAGES_BUNDLE = "com/opensymphony/xwork2/xwork-messages"; - - static { - clearDefaultResourceBundles(); - } + private final ConcurrentMap bundlesMap = new ConcurrentHashMap<>(); + private final ConcurrentMap messageFormats = new ConcurrentHashMap<>(); + private final ConcurrentMap delegatedClassLoaderMap = new ConcurrentHashMap<>(); + private final Set missingBundles = Collections.synchronizedSet(new HashSet()); + private final String RELOADED = "com.opensymphony.xwork2.util.LocalizedTextUtil.reloaded"; + private final String XWORK_MESSAGES_BUNDLE = "com/opensymphony/xwork2/xwork-messages"; /** * Clears the internal list of resource bundles. @@ -119,13 +114,11 @@ public class LocalizedTextUtil implements Serializable { */ @Deprecated public static void clearDefaultResourceBundles() { - ClassLoader ccl = getCurrentThreadContextClassLoader(); - List bundles = new ArrayList<>(); - classLoaderMap.put(ccl.hashCode(), bundles); - bundles.add(0, XWORK_MESSAGES_BUNDLE); + // no-op } public LocalizedTextUtil() { + addDefaultResourceBundle("org/apache/struts2/struts-messages"); } /** @@ -143,6 +136,23 @@ public void setDevMode(String devMode) { this.devMode = Boolean.parseBoolean(devMode); } + @Inject(value = StrutsConstants.STRUTS_CUSTOM_I18N_RESOURCES, required = false) + public void setCustomI18NBundles(String bundles) { + if (bundles != null && bundles.length() > 0) { + StringTokenizer customBundles = new StringTokenizer(bundles, ", "); + + while (customBundles.hasMoreTokens()) { + String name = customBundles.nextToken(); + try { + LOG.trace("Loading global messages from [{}]", name); + addDefaultResourceBundle(name); + } catch (Exception e) { + LOG.error("Could not find messages file {}.properties. Skipping", name); + } + } + } + } + /** * Add's the bundle to the internal list of default bundles. *

@@ -151,7 +161,8 @@ public void setDevMode(String devMode) { * * @param resourceBundleName the name of the bundle to add. */ - public static void addDefaultResourceBundle(String resourceBundleName) { + @Override + public void addDefaultResourceBundle(String resourceBundleName) { //make sure this doesn't get added more than once final ClassLoader ccl = getCurrentThreadContextClassLoader(); synchronized (XWORK_MESSAGES_BUNDLE) { @@ -220,6 +231,7 @@ public static Locale localeFromString(String localeStr, Locale defaultLocale) { * @param locale the locale the message should be for * @return a localized message based on the specified key, or null if no localized message can be found for it */ + @Override public String findDefaultText(String aTextName, Locale locale) { List localList = classLoaderMap.get(Thread.currentThread().getContextClassLoader().hashCode()); @@ -253,6 +265,7 @@ public String findDefaultText(String aTextName, Locale locale) { * @param params an array of objects to be substituted into the message text * @return A formatted message based on the specified key, or null if no localized message can be found for it */ + @Override public String findDefaultText(String aTextName, Locale locale, Object[] params) { String defaultText = findDefaultText(aTextName, locale); if (defaultText != null) { @@ -272,6 +285,7 @@ public String findDefaultText(String aTextName, Locale locale, Object[] params) * @param locale the locale. * @return the bundle, null if not found. */ + @Override public ResourceBundle findResourceBundle(String aBundleName, Locale locale) { ClassLoader classLoader = getCurrentThreadContextClassLoader(); String key = createMissesKey(String.valueOf(classLoader.hashCode()), aBundleName, locale); @@ -312,7 +326,7 @@ public ResourceBundle findResourceBundle(String aBundleName, Locale locale) { /** * @param classLoader a {@link ClassLoader} to look up the bundle from if none can be found on the current thread's classloader */ - public static void setDelegatedClassLoader(final ClassLoader classLoader) { + public void setDelegatedClassLoader(final ClassLoader classLoader) { synchronized (bundlesMap) { delegatedClassLoaderMap.put(getCurrentThreadContextClassLoader().hashCode(), classLoader); } @@ -321,7 +335,7 @@ public static void setDelegatedClassLoader(final ClassLoader classLoader) { /** * @param bundleName Removes the bundle from any cached "misses" */ - public static void clearBundle(final String bundleName) { + public void clearBundle(final String bundleName) { bundlesMap.remove(getCurrentThreadContextClassLoader().hashCode() + bundleName); } @@ -349,6 +363,7 @@ private String createMissesKey(String prefix, String aBundleName, Locale locale) * @return the localized text, or null if none can be found and no defaultMessage is provided * @see #findText(Class aClass, String aTextName, Locale locale, String defaultMessage, Object[] args) */ + @Override public String findText(Class aClass, String aTextName, Locale locale) { return findText(aClass, aTextName, locale, aTextName, new Object[0]); } @@ -399,6 +414,7 @@ public String findText(Class aClass, String aTextName, Locale locale) { * resource bundle * @return the localized text, or null if none can be found and no defaultMessage is provided */ + @Override public String findText(Class aClass, String aTextName, Locale locale, String defaultMessage, Object[] args) { ValueStack valueStack = ActionContext.getContext().getValueStack(); return findText(aClass, aTextName, locale, defaultMessage, args, valueStack); @@ -456,8 +472,9 @@ public String findText(Class aClass, String aTextName, Locale locale, String def * one in the ActionContext ThreadLocal * @return the localized text, or null if none can be found and no defaultMessage is provided */ + @Override public String findText(Class aClass, String aTextName, Locale locale, String defaultMessage, Object[] args, - ValueStack valueStack) { + ValueStack valueStack) { String indexedTextName = null; if (aTextName == null) { LOG.warn("Trying to find text with null key!"); @@ -641,6 +658,7 @@ private static boolean unableToFindTextForKey(GetDefaultMessageReturnArg result) * @return the localized text, or null if none can be found and no defaultMessage is provided * @see #findText(java.util.ResourceBundle, String, java.util.Locale, String, Object[]) */ + @Override public String findText(ResourceBundle bundle, String aTextName, Locale locale) { return findText(bundle, aTextName, locale, aTextName, new Object[0]); } @@ -667,6 +685,7 @@ public String findText(ResourceBundle bundle, String aTextName, Locale locale) { * @param args arguments for the message formatter. * @return the localized text, or null if none can be found and no defaultMessage is provided */ + @Override public String findText(ResourceBundle bundle, String aTextName, Locale locale, String defaultMessage, Object[] args) { ValueStack valueStack = ActionContext.getContext().getValueStack(); return findText(bundle, aTextName, locale, defaultMessage, args, valueStack); @@ -695,8 +714,9 @@ public String findText(ResourceBundle bundle, String aTextName, Locale locale, S * @param valueStack the OGNL value stack. * @return the localized text, or null if none can be found and no defaultMessage is provided */ + @Override public String findText(ResourceBundle bundle, String aTextName, Locale locale, String defaultMessage, Object[] args, - ValueStack valueStack) { + ValueStack valueStack) { try { reloadBundles(valueStack.getContext()); @@ -773,7 +793,7 @@ private String getMessage(String bundleName, Locale locale, String key, ValueSta } } - private static String formatWithNullDetection(MessageFormat mf, Object[] args) { + private String formatWithNullDetection(MessageFormat mf, Object[] args) { String message = mf.format(args); if ("null".equals(message)) { return null; @@ -782,7 +802,7 @@ private static String formatWithNullDetection(MessageFormat mf, Object[] args) { } } - private static MessageFormat buildMessageFormat(String pattern, Locale locale) { + private MessageFormat buildMessageFormat(String pattern, Locale locale) { MessageFormatKey key = new MessageFormatKey(pattern, locale); MessageFormat format = messageFormats.get(key); if (format == null) { @@ -947,11 +967,10 @@ private static void clearMap(Class cl, Object obj, String name) * * @deprecated used only in tests */ + @Override @Deprecated public void reset() { - clearDefaultResourceBundles(); - bundlesMap.clear(); - messageFormats.clear(); + // no-op } static class MessageFormatKey { diff --git a/core/src/main/java/com/opensymphony/xwork2/util/XWorkTestCaseHelper.java b/core/src/main/java/com/opensymphony/xwork2/util/XWorkTestCaseHelper.java index 0cabd0f9e5..4d0183c484 100644 --- a/core/src/main/java/com/opensymphony/xwork2/util/XWorkTestCaseHelper.java +++ b/core/src/main/java/com/opensymphony/xwork2/util/XWorkTestCaseHelper.java @@ -40,7 +40,7 @@ public static ConfigurationManager setUp() throws Exception { ActionContext.setContext(new ActionContext(stack.getContext())); // clear out localization - container.getInstance(LocalizedTextUtil.class).reset(); + //container.getInstance(LocalizedTextUtil.class).reset(); //ObjectFactory.setObjectFactory(container.getInstance(ObjectFactory.class)); diff --git a/core/src/main/java/org/apache/struts2/config/DefaultBeanSelectionProvider.java b/core/src/main/java/org/apache/struts2/config/DefaultBeanSelectionProvider.java index d048f5f6f4..b21376ecc5 100644 --- a/core/src/main/java/org/apache/struts2/config/DefaultBeanSelectionProvider.java +++ b/core/src/main/java/org/apache/struts2/config/DefaultBeanSelectionProvider.java @@ -22,6 +22,7 @@ package org.apache.struts2.config; import com.opensymphony.xwork2.ActionProxyFactory; +import com.opensymphony.xwork2.LocalizedTextProvider; import com.opensymphony.xwork2.TextProviderFactory; import com.opensymphony.xwork2.factory.UnknownHandlerFactory; import com.opensymphony.xwork2.security.AcceptedPatternsChecker; @@ -390,7 +391,7 @@ public void register(ContainerBuilder builder, LocatableProperties props) { alias(TextProvider.class, StrutsConstants.STRUTS_XWORKTEXTPROVIDER, builder, props, Scope.PROTOTYPE); alias(TextProviderFactory.class, StrutsConstants.STRUTS_TEXT_PROVIDER_FACTORY, builder, props, Scope.PROTOTYPE); alias(LocaleProvider.class, StrutsConstants.STRUTS_LOCALE_PROVIDER, builder, props); - alias(LocalizedTextUtil.class, StrutsConstants.STRUTS_LOCALIZED_TEXT_PROVIDER, builder, props); + alias(LocalizedTextProvider.class, StrutsConstants.STRUTS_LOCALIZED_TEXT_PROVIDER, builder, props); alias(ActionProxyFactory.class, StrutsConstants.STRUTS_ACTIONPROXYFACTORY, builder, props); alias(ObjectTypeDeterminer.class, StrutsConstants.STRUTS_OBJECTTYPEDETERMINER, builder, props); @@ -434,9 +435,6 @@ public void register(ContainerBuilder builder, LocatableProperties props) { convertIfExist(props, StrutsConstants.STRUTS_ADDITIONAL_ACCEPTED_PATTERNS, XWorkConstants.ADDITIONAL_ACCEPTED_PATTERNS); convertIfExist(props, StrutsConstants.STRUTS_OVERRIDE_EXCLUDED_PATTERNS, XWorkConstants.OVERRIDE_EXCLUDED_PATTERNS); convertIfExist(props, StrutsConstants.STRUTS_OVERRIDE_ACCEPTED_PATTERNS, XWorkConstants.OVERRIDE_ACCEPTED_PATTERNS); - - LocalizedTextUtil.addDefaultResourceBundle("org/apache/struts2/struts-messages"); - loadCustomResourceBundles(props); } /** @@ -462,21 +460,4 @@ private void switchDevMode(LocatableProperties props) { } } - private void loadCustomResourceBundles(LocatableProperties props) { - String bundles = props.getProperty(StrutsConstants.STRUTS_CUSTOM_I18N_RESOURCES); - if (bundles != null && bundles.length() > 0) { - StringTokenizer customBundles = new StringTokenizer(bundles, ", "); - - while (customBundles.hasMoreTokens()) { - String name = customBundles.nextToken(); - try { - LOG.trace("Loading global messages from [{}]", name); - LocalizedTextUtil.addDefaultResourceBundle(name); - } catch (Exception e) { - LOG.error("Could not find messages file {}.properties. Skipping", name); - } - } - } - } - } diff --git a/core/src/main/java/org/apache/struts2/factory/StrutsActionProxy.java b/core/src/main/java/org/apache/struts2/factory/StrutsActionProxy.java index 64323c30a7..9b8e6811e1 100644 --- a/core/src/main/java/org/apache/struts2/factory/StrutsActionProxy.java +++ b/core/src/main/java/org/apache/struts2/factory/StrutsActionProxy.java @@ -67,7 +67,7 @@ protected void prepare() { protected String getErrorMessage() { if ((namespace != null) && (namespace.trim().length() > 0)) { String contextPath = ServletActionContext.getRequest().getContextPath(); - return localizedTextUtil.findDefaultText( + return localizedTextProvider.findDefaultText( "struts.exception.missing-package-action.with-context", Locale.getDefault(), new String[]{namespace, actionName, contextPath} diff --git a/core/src/main/java/org/apache/struts2/util/TokenHelper.java b/core/src/main/java/org/apache/struts2/util/TokenHelper.java index c6d0f0fe7a..a5affaacd3 100644 --- a/core/src/main/java/org/apache/struts2/util/TokenHelper.java +++ b/core/src/main/java/org/apache/struts2/util/TokenHelper.java @@ -22,6 +22,7 @@ package org.apache.struts2.util; import com.opensymphony.xwork2.ActionContext; +import com.opensymphony.xwork2.LocalizedTextProvider; import com.opensymphony.xwork2.util.LocalizedTextUtil; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -188,8 +189,8 @@ public static boolean validToken() { if (!token.equals(sessionToken)) { if (LOG.isWarnEnabled()) { - LocalizedTextUtil localizedTextUtil = ActionContext.getContext().getContainer().getInstance(LocalizedTextUtil.class); - LOG.warn(localizedTextUtil.findText(TokenHelper.class, "struts.internal.invalid.token", ActionContext.getContext().getLocale(), "Form token {0} does not match the session token {1}.", new Object[]{ + LocalizedTextProvider localizedTextProvider = ActionContext.getContext().getContainer().getInstance(LocalizedTextProvider.class); + LOG.warn(localizedTextProvider.findText(TokenHelper.class, "struts.internal.invalid.token", ActionContext.getContext().getLocale(), "Form token {0} does not match the session token {1}.", new Object[]{ token, sessionToken })); } diff --git a/core/src/main/resources/struts-default.xml b/core/src/main/resources/struts-default.xml index 0efdfba098..4a20ac96e0 100644 --- a/core/src/main/resources/struts-default.xml +++ b/core/src/main/resources/struts-default.xml @@ -131,7 +131,7 @@ - + diff --git a/core/src/test/java/com/opensymphony/xwork2/DefaultTextProviderTest.java b/core/src/test/java/com/opensymphony/xwork2/DefaultTextProviderTest.java index 7b6b212e20..2b4ac0fd03 100644 --- a/core/src/test/java/com/opensymphony/xwork2/DefaultTextProviderTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/DefaultTextProviderTest.java @@ -15,8 +15,6 @@ */ package com.opensymphony.xwork2; -import com.opensymphony.xwork2.util.LocalizedTextUtil; - import java.util.*; /** @@ -132,8 +130,7 @@ protected void setUp() throws Exception { ActionContext.setContext(ctx); ctx.setLocale(Locale.CANADA); - LocalizedTextUtil.clearDefaultResourceBundles(); - LocalizedTextUtil.addDefaultResourceBundle(DefaultTextProviderTest.class.getName()); + container.getInstance(LocalizedTextProvider.class).addDefaultResourceBundle(DefaultTextProviderTest.class.getName()); tp = container.inject(DefaultTextProvider.class); } diff --git a/core/src/test/java/com/opensymphony/xwork2/TextProviderSupportTest.java b/core/src/test/java/com/opensymphony/xwork2/TextProviderSupportTest.java index a36b43718f..c0ea23d58c 100644 --- a/core/src/test/java/com/opensymphony/xwork2/TextProviderSupportTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/TextProviderSupportTest.java @@ -111,7 +111,7 @@ protected void setUp() throws Exception { super.setUp(); rb = ResourceBundle.getBundle(TextProviderSupportTest.class.getName(), Locale.ENGLISH); - LocalizedTextUtil ltu = container.getInstance(LocalizedTextUtil.class); + LocalizedTextProvider ltu = container.getInstance(LocalizedTextProvider.class); tp = new TextProviderSupport(rb, new LocaleProvider() { public Locale getLocale() { diff --git a/core/src/test/java/com/opensymphony/xwork2/util/LocalizedTextUtilTest.java b/core/src/test/java/com/opensymphony/xwork2/util/LocalizedTextUtilTest.java index 663181586f..75e5569093 100644 --- a/core/src/test/java/com/opensymphony/xwork2/util/LocalizedTextUtilTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/util/LocalizedTextUtilTest.java @@ -39,12 +39,12 @@ */ public class LocalizedTextUtilTest extends XWorkTestCase { - private LocalizedTextUtil localizedTextUtil; + private LocalizedTextProvider localizedTextProvider; public void testNpeWhenClassIsPrimitive() throws Exception { ValueStack stack = ActionContext.getContext().getValueStack(); stack.push(new MyObject()); - String result = localizedTextUtil.findText(MyObject.class, "someObj.someI18nKey", Locale.ENGLISH, "default message", null, stack); + String result = localizedTextProvider.findText(MyObject.class, "someObj.someI18nKey", Locale.ENGLISH, "default message", null, stack); System.out.println(result); } @@ -98,11 +98,11 @@ public void testActionGetText() throws Exception { } public void testNullKeys() { - localizedTextUtil.findText(this.getClass(), null, Locale.getDefault()); + localizedTextProvider.findText(this.getClass(), null, Locale.getDefault()); } public void testActionGetTextXXX() throws Exception { - LocalizedTextUtil.addDefaultResourceBundle("com/opensymphony/xwork2/util/FindMe"); + localizedTextProvider.addDefaultResourceBundle("com/opensymphony/xwork2/util/FindMe"); SimpleAction action = new SimpleAction(); container.inject(action); @@ -120,34 +120,34 @@ public void testActionGetTextXXX() throws Exception { } public void testAddDefaultResourceBundle() { - String text = localizedTextUtil.findDefaultText("foo.range", Locale.getDefault()); + String text = localizedTextProvider.findDefaultText("foo.range", Locale.getDefault()); assertNull("Found message when it should not be available.", text); - LocalizedTextUtil.addDefaultResourceBundle("com/opensymphony/xwork2/SimpleAction"); + localizedTextProvider.addDefaultResourceBundle("com/opensymphony/xwork2/SimpleAction"); - String message = localizedTextUtil.findDefaultText("foo.range", Locale.US); + String message = localizedTextProvider.findDefaultText("foo.range", Locale.US); assertEquals("Foo Range Message", message); } public void testAddDefaultResourceBundle2() throws Exception { - LocalizedTextUtil.addDefaultResourceBundle("com/opensymphony/xwork2/SimpleAction"); + localizedTextProvider.addDefaultResourceBundle("com/opensymphony/xwork2/SimpleAction"); ActionProxy proxy = actionProxyFactory.createActionProxy("/", "packagelessAction", null, new HashMap(), false, true); proxy.execute(); } public void testDefaultMessage() throws Exception { - String message = localizedTextUtil.findDefaultText("xwork.error.action.execution", Locale.getDefault()); + String message = localizedTextProvider.findDefaultText("xwork.error.action.execution", Locale.getDefault()); assertEquals("Error during Action invocation", message); } public void testDefaultMessageOverride() throws Exception { - String message = localizedTextUtil.findDefaultText("xwork.error.action.execution", Locale.getDefault()); + String message = localizedTextProvider.findDefaultText("xwork.error.action.execution", Locale.getDefault()); assertEquals("Error during Action invocation", message); - LocalizedTextUtil.addDefaultResourceBundle("com/opensymphony/xwork2/test"); + localizedTextProvider.addDefaultResourceBundle("com/opensymphony/xwork2/test"); - message = localizedTextUtil.findDefaultText("xwork.error.action.execution", Locale.getDefault()); + message = localizedTextProvider.findDefaultText("xwork.error.action.execution", Locale.getDefault()); assertEquals("Testing resource bundle override", message); } @@ -164,7 +164,7 @@ public void testFindTextInChildProperty() throws Exception { ActionContext.getContext().getValueStack().push(action); ActionContext.getContext().getValueStack().push(action.getModel()); - String message = localizedTextUtil.findText(ModelDrivenAction2.class, "invalid.fieldvalue.barObj.title", Locale.getDefault()); + String message = localizedTextProvider.findText(ModelDrivenAction2.class, "invalid.fieldvalue.barObj.title", Locale.getDefault()); assertEquals("Title is invalid!", message); } @@ -174,7 +174,7 @@ public void testFindTextInInterface() throws Exception { mockActionInvocation.expectAndReturn("getAction", action); ActionContext.getContext().setActionInvocation((ActionInvocation) mockActionInvocation.proxy()); - String message = localizedTextUtil.findText(ModelDrivenAction2.class, "test.foo", Locale.getDefault()); + String message = localizedTextProvider.findText(ModelDrivenAction2.class, "test.foo", Locale.getDefault()); assertEquals("Foo!", message); } @@ -185,46 +185,46 @@ public void testFindTextInPackage() throws Exception { mockActionInvocation.expectAndReturn("getAction", action); ActionContext.getContext().setActionInvocation((ActionInvocation) mockActionInvocation.proxy()); - String message = localizedTextUtil.findText(ModelDrivenAction2.class, "package.properties", Locale.getDefault()); + String message = localizedTextProvider.findText(ModelDrivenAction2.class, "package.properties", Locale.getDefault()); assertEquals("It works!", message); } public void testParameterizedDefaultMessage() throws Exception { - String message = localizedTextUtil.findDefaultText("xwork.exception.missing-action", Locale.getDefault(), new String[]{"AddUser"}); + String message = localizedTextProvider.findDefaultText("xwork.exception.missing-action", Locale.getDefault(), new String[]{"AddUser"}); assertEquals("There is no Action mapped for action name AddUser.", message); } public void testParameterizedDefaultMessageWithPackage() throws Exception { - String message = localizedTextUtil.findDefaultText("xwork.exception.missing-package-action", Locale.getDefault(), new String[]{"blah", "AddUser"}); + String message = localizedTextProvider.findDefaultText("xwork.exception.missing-package-action", Locale.getDefault(), new String[]{"blah", "AddUser"}); assertEquals("There is no Action mapped for namespace blah and action name AddUser.", message); } public void testLocalizedDateFormatIsUsed() throws ParseException { - LocalizedTextUtil.addDefaultResourceBundle("com/opensymphony/xwork2/util/LocalizedTextUtilTest"); + localizedTextProvider.addDefaultResourceBundle("com/opensymphony/xwork2/util/LocalizedTextUtilTest"); Date date = DateFormat.getDateInstance(DateFormat.SHORT, Locale.US).parse("01/01/2015"); Object[] params = new Object[]{ date }; - String usDate = localizedTextUtil.findDefaultText("test.format.date", Locale.US, params); - String germanDate = localizedTextUtil.findDefaultText("test.format.date", Locale.GERMANY, params); + String usDate = localizedTextProvider.findDefaultText("test.format.date", Locale.US, params); + String germanDate = localizedTextProvider.findDefaultText("test.format.date", Locale.GERMANY, params); assertEquals(usDate, "1/1/15"); assertEquals(germanDate, "01.01.15"); } public void testXW377() { - LocalizedTextUtil.addDefaultResourceBundle("com/opensymphony/xwork2/util/LocalizedTextUtilTest"); + localizedTextProvider.addDefaultResourceBundle("com/opensymphony/xwork2/util/LocalizedTextUtilTest"); - String text = localizedTextUtil.findText(Bar.class, "xw377", ActionContext.getContext().getLocale(), "xw377", null, ActionContext.getContext().getValueStack()); + String text = localizedTextProvider.findText(Bar.class, "xw377", ActionContext.getContext().getLocale(), "xw377", null, ActionContext.getContext().getValueStack()); assertEquals("xw377", text); // should not log - String text2 = localizedTextUtil.findText(LocalizedTextUtilTest.class, "notinbundle", ActionContext.getContext().getLocale(), "hello", null, ActionContext.getContext().getValueStack()); + String text2 = localizedTextProvider.findText(LocalizedTextUtilTest.class, "notinbundle", ActionContext.getContext().getLocale(), "hello", null, ActionContext.getContext().getValueStack()); assertEquals("hello", text2); // should log WARN - String text3 = localizedTextUtil.findText(LocalizedTextUtilTest.class, "notinbundle.key", ActionContext.getContext().getLocale(), "notinbundle.key", null, ActionContext.getContext().getValueStack()); + String text3 = localizedTextProvider.findText(LocalizedTextUtilTest.class, "notinbundle.key", ActionContext.getContext().getLocale(), "notinbundle.key", null, ActionContext.getContext().getValueStack()); assertEquals("notinbundle.key", text3); // should log WARN - String text4 = localizedTextUtil.findText(LocalizedTextUtilTest.class, "xw377", ActionContext.getContext().getLocale(), "hello", null, ActionContext.getContext().getValueStack()); + String text4 = localizedTextProvider.findText(LocalizedTextUtilTest.class, "xw377", ActionContext.getContext().getLocale(), "hello", null, ActionContext.getContext().getValueStack()); assertEquals("xw377", text4); // should not log - String text5 = localizedTextUtil.findText(LocalizedTextUtilTest.class, "username", ActionContext.getContext().getLocale(), null, null, ActionContext.getContext().getValueStack()); + String text5 = localizedTextProvider.findText(LocalizedTextUtilTest.class, "username", ActionContext.getContext().getLocale(), null, null, ActionContext.getContext().getValueStack()); assertEquals("Santa", text5); // should not log } @@ -233,9 +233,9 @@ public void testXW404() { // Before this fix loading the bundle for Germany failed since Italy have previously failed and thus the misses cache // contained a false entry - ResourceBundle rbFrance = localizedTextUtil.findResourceBundle("com/opensymphony/xwork2/util/XW404", Locale.FRANCE); - ResourceBundle rbItaly = localizedTextUtil.findResourceBundle("com/opensymphony/xwork2/util/XW404", Locale.ITALY); - ResourceBundle rbGermany = localizedTextUtil.findResourceBundle("com/opensymphony/xwork2/util/XW404", Locale.GERMANY); + ResourceBundle rbFrance = localizedTextProvider.findResourceBundle("com/opensymphony/xwork2/util/XW404", Locale.FRANCE); + ResourceBundle rbItaly = localizedTextProvider.findResourceBundle("com/opensymphony/xwork2/util/XW404", Locale.ITALY); + ResourceBundle rbGermany = localizedTextProvider.findResourceBundle("com/opensymphony/xwork2/util/XW404", Locale.GERMANY); assertNotNull(rbFrance); assertEquals("Bonjour", rbFrance.getString("hello")); @@ -253,7 +253,7 @@ protected void setUp() throws Exception { container.inject(provider); loadConfigurationProviders(provider); - this.localizedTextUtil = container.inject(LocalizedTextUtil.class); + localizedTextProvider = container.getInstance(LocalizedTextProvider.class); ActionContext.getContext().setLocale(Locale.US); } @@ -261,7 +261,7 @@ protected void setUp() throws Exception { @Override protected void tearDown() throws Exception { super.tearDown(); - LocalizedTextUtil.clearDefaultResourceBundles(); + localizedTextProvider = null; } } diff --git a/core/src/test/java/org/apache/struts2/components/ComponentTest.java b/core/src/test/java/org/apache/struts2/components/ComponentTest.java index a7897129cd..80cf82b5ee 100644 --- a/core/src/test/java/org/apache/struts2/components/ComponentTest.java +++ b/core/src/test/java/org/apache/struts2/components/ComponentTest.java @@ -27,6 +27,7 @@ import javax.servlet.jsp.tagext.TagSupport; +import com.opensymphony.xwork2.LocalizedTextProvider; import org.apache.struts2.views.jsp.AbstractTagTest; import org.apache.struts2.views.jsp.BeanTag; import org.apache.struts2.views.jsp.ElseIfTag; @@ -439,7 +440,7 @@ public void testI18nComponentDisposeItselfFromComponentStack() throws Exception t.setPageContext(pageContext); t.setName("textFieldName"); - LocalizedTextUtil.addDefaultResourceBundle("org.apache.struts2.components.temp"); + container.getInstance(LocalizedTextProvider.class).addDefaultResourceBundle("org.apache.struts2.components.temp"); I18nTag tag = new I18nTag(); tag.setName("org.apache.struts2.components.tempo"); diff --git a/core/src/test/java/org/apache/struts2/config/DefaultBeanSelectionProviderTest.java b/core/src/test/java/org/apache/struts2/config/DefaultBeanSelectionProviderTest.java index 6b4d29ad8b..771c0565c6 100644 --- a/core/src/test/java/org/apache/struts2/config/DefaultBeanSelectionProviderTest.java +++ b/core/src/test/java/org/apache/struts2/config/DefaultBeanSelectionProviderTest.java @@ -24,31 +24,35 @@ import java.util.Locale; import com.opensymphony.xwork2.XWorkTestCase; +import com.opensymphony.xwork2.LocalizedTextProvider; +import com.opensymphony.xwork2.config.Configuration; +import com.opensymphony.xwork2.config.ConfigurationException; +import com.opensymphony.xwork2.config.ConfigurationProvider; +import com.opensymphony.xwork2.test.StubConfigurationProvider; import org.apache.struts2.StrutsConstants; import com.opensymphony.xwork2.inject.ContainerBuilder; import com.opensymphony.xwork2.util.LocalizedTextUtil; import com.opensymphony.xwork2.util.location.LocatableProperties; -import junit.framework.TestCase; - public class DefaultBeanSelectionProviderTest extends XWorkTestCase { public void testRegister() { - LocalizedTextUtil.clearDefaultResourceBundles(); - LocalizedTextUtil.addDefaultResourceBundle("org/apache/struts2/struts-messages"); - - LocalizedTextUtil localizedTextUtil = container.inject(LocalizedTextUtil.class); + LocalizedTextProvider localizedTextProvider = container.getInstance(LocalizedTextProvider.class); - assertEquals("The form has already been processed or no token was supplied, please try again.", localizedTextUtil.findDefaultText("struts.messages.invalid.token", Locale.getDefault())); + assertEquals("The form has already been processed or no token was supplied, please try again.", localizedTextProvider.findDefaultText("struts.messages.invalid.token", Locale.getDefault())); - LocatableProperties props = new LocatableProperties(); - props.setProperty(StrutsConstants.STRUTS_CUSTOM_I18N_RESOURCES, "testmessages,testmessages2"); - props.setProperty(StrutsConstants.STRUTS_LOCALE, "US"); - - new DefaultBeanSelectionProvider().register(new ContainerBuilder(), props); + loadConfigurationProviders(new StubConfigurationProvider() { + @Override + public void register(ContainerBuilder builder, LocatableProperties props) throws ConfigurationException { + props.setProperty(StrutsConstants.STRUTS_CUSTOM_I18N_RESOURCES, "testmessages,testmessages2"); + props.setProperty(StrutsConstants.STRUTS_LOCALE, "US"); + } + }); + + localizedTextProvider = container.getInstance(LocalizedTextProvider.class); - assertEquals("Replaced message for token tag", localizedTextUtil.findDefaultText("struts.messages.invalid.token", Locale.getDefault())); + assertEquals("Replaced message for token tag", localizedTextProvider.findDefaultText("struts.messages.invalid.token", Locale.getDefault())); } } diff --git a/core/src/test/java/org/apache/struts2/config/SettingsTest.java b/core/src/test/java/org/apache/struts2/config/SettingsTest.java index a5af5f7387..9f92f7df9e 100644 --- a/core/src/test/java/org/apache/struts2/config/SettingsTest.java +++ b/core/src/test/java/org/apache/struts2/config/SettingsTest.java @@ -21,6 +21,7 @@ package org.apache.struts2.config; +import com.opensymphony.xwork2.LocalizedTextProvider; import com.opensymphony.xwork2.util.LocalizedTextUtil; import org.apache.struts2.StrutsConstants; import org.apache.struts2.StrutsInternalTestCase; @@ -52,11 +53,11 @@ public void testSettings() { public void testDefaultResourceBundlesLoaded() { Settings settings = new DefaultSettings(); - LocalizedTextUtil localizedTextUtil = container.inject(LocalizedTextUtil.class); + LocalizedTextProvider localizedTextProvider = container.getInstance(LocalizedTextProvider.class); assertEquals("testmessages,testmessages2", settings.get(StrutsConstants.STRUTS_CUSTOM_I18N_RESOURCES)); - assertEquals("This is a test message", localizedTextUtil.findDefaultText("default.testmessage", Locale.getDefault())); - assertEquals("This is another test message", localizedTextUtil.findDefaultText("default.testmessage2", Locale.getDefault())); + assertEquals("This is a test message", localizedTextProvider.findDefaultText("default.testmessage", Locale.getDefault())); + assertEquals("This is another test message", localizedTextProvider.findDefaultText("default.testmessage2", Locale.getDefault())); } public void testSetSettings() { diff --git a/core/src/test/java/org/apache/struts2/dispatcher/DispatcherTest.java b/core/src/test/java/org/apache/struts2/dispatcher/DispatcherTest.java index 91b0ebf95a..d8f10ccbe0 100644 --- a/core/src/test/java/org/apache/struts2/dispatcher/DispatcherTest.java +++ b/core/src/test/java/org/apache/struts2/dispatcher/DispatcherTest.java @@ -32,7 +32,7 @@ import com.opensymphony.xwork2.config.entities.PackageConfig; import com.opensymphony.xwork2.inject.Container; import com.opensymphony.xwork2.interceptor.Interceptor; -import com.opensymphony.xwork2.util.LocalizedTextUtil; +import com.opensymphony.xwork2.LocalizedTextProvider; import org.apache.struts2.StrutsConstants; import org.apache.struts2.StrutsInternalTestCase; import org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper; @@ -55,14 +55,14 @@ public class DispatcherTest extends StrutsInternalTestCase { public void testDefaultResurceBundlePropertyLoaded() throws Exception { - LocalizedTextUtil localizedTextUtil = container.inject(LocalizedTextUtil.class); + LocalizedTextProvider localizedTextProvider = container.getInstance(LocalizedTextProvider.class); // some i18n messages from xwork-messages.properties - assertEquals(localizedTextUtil.findDefaultText("xwork.error.action.execution", Locale.US), + assertEquals(localizedTextProvider.findDefaultText("xwork.error.action.execution", Locale.US), "Error during Action invocation"); // some i18n messages from struts-messages.properties - assertEquals(localizedTextUtil.findDefaultText("struts.messages.error.uploading", Locale.US, + assertEquals(localizedTextProvider.findDefaultText("struts.messages.error.uploading", Locale.US, new Object[] { "some error messages" }), "Error uploading: some error messages"); } diff --git a/plugins/portlet/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java b/plugins/portlet/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java index 9f70560e13..42d7e306b2 100644 --- a/plugins/portlet/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java +++ b/plugins/portlet/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java @@ -235,7 +235,6 @@ public void init(PortletConfig cfg) throws PortletException { if (StringUtils.isEmpty(portletNamespace)) { portletNamespace = ""; } - LocalizedTextUtil.addDefaultResourceBundle("org/apache/struts2/struts-messages"); container = dispatcherUtils.getContainer(); actionMapper = container.getInstance(ActionMapper.class); From c3416e8ea00c0dbf5023eadd6c066c04bdbd472c Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Tue, 14 Mar 2017 09:49:54 +0100 Subject: [PATCH 18/21] Adds missing header --- .../xwork2/LocalizedTextProvider.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/core/src/main/java/com/opensymphony/xwork2/LocalizedTextProvider.java b/core/src/main/java/com/opensymphony/xwork2/LocalizedTextProvider.java index f6175ea1cf..ecd037d2d7 100644 --- a/core/src/main/java/com/opensymphony/xwork2/LocalizedTextProvider.java +++ b/core/src/main/java/com/opensymphony/xwork2/LocalizedTextProvider.java @@ -1,3 +1,22 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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; import com.opensymphony.xwork2.util.ValueStack; From 008c28ac67cbd477abe4761de34610d6de7cfda0 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Tue, 14 Mar 2017 09:50:13 +0100 Subject: [PATCH 19/21] Renames LocalizedTextUtil into DefaultLocalizedTextProvider --- .../xwork2/DefaultLocaleProvider.java | 4 ++-- .../xwork2/DefaultTextProvider.java | 4 ++-- .../config/impl/DefaultConfiguration.java | 2 +- .../providers/XWorkConfigurationProvider.java | 4 ++-- ...java => DefaultLocalizedTextProvider.java} | 21 ++++++++++++------- .../org/apache/struts2/components/Date.java | 1 - .../org/apache/struts2/components/I18n.java | 4 ++-- .../config/DefaultBeanSelectionProvider.java | 3 --- .../apache/struts2/dispatcher/Dispatcher.java | 7 +++---- .../multipart/JakartaMultiPartRequest.java | 1 - .../multipart/MultiPartRequestWrapper.java | 2 -- .../struts2/factory/StrutsActionProxy.java | 1 - .../struts2/interceptor/I18nInterceptor.java | 4 ++-- .../struts2/util/StrutsTestCaseHelper.java | 4 ++-- .../org/apache/struts2/util/TokenHelper.java | 1 - core/src/main/resources/struts-default.xml | 2 +- .../xwork2/TextProviderSupportTest.java | 2 -- ... => DefaultLocalizedTextProviderTest.java} | 12 +++++------ .../struts2/components/ComponentTest.java | 1 - .../DefaultBeanSelectionProviderTest.java | 3 --- .../PropertiesConfigurationProviderTest.java | 6 +++--- .../apache/struts2/config/SettingsTest.java | 1 - .../multipart/PellMultiPartRequest.java | 2 -- .../portlet/dispatcher/Jsr168Dispatcher.java | 5 ++--- 24 files changed, 41 insertions(+), 56 deletions(-) rename core/src/main/java/com/opensymphony/xwork2/util/{LocalizedTextUtil.java => DefaultLocalizedTextProvider.java} (98%) rename core/src/test/java/com/opensymphony/xwork2/util/{LocalizedTextUtilTest.java => DefaultLocalizedTextProviderTest.java} (91%) diff --git a/core/src/main/java/com/opensymphony/xwork2/DefaultLocaleProvider.java b/core/src/main/java/com/opensymphony/xwork2/DefaultLocaleProvider.java index 1d687bc5c9..f28ef03ecc 100644 --- a/core/src/main/java/com/opensymphony/xwork2/DefaultLocaleProvider.java +++ b/core/src/main/java/com/opensymphony/xwork2/DefaultLocaleProvider.java @@ -1,6 +1,6 @@ package com.opensymphony.xwork2; -import com.opensymphony.xwork2.util.LocalizedTextUtil; +import com.opensymphony.xwork2.util.DefaultLocalizedTextProvider; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -26,7 +26,7 @@ public Locale getLocale() { @Override public boolean isValidLocaleString(String localeStr) { - return isValidLocale(LocalizedTextUtil.localeFromString(localeStr, getLocale())); + return isValidLocale(DefaultLocalizedTextProvider.localeFromString(localeStr, getLocale())); } @Override diff --git a/core/src/main/java/com/opensymphony/xwork2/DefaultTextProvider.java b/core/src/main/java/com/opensymphony/xwork2/DefaultTextProvider.java index b82c42a93f..2c885a1f01 100644 --- a/core/src/main/java/com/opensymphony/xwork2/DefaultTextProvider.java +++ b/core/src/main/java/com/opensymphony/xwork2/DefaultTextProvider.java @@ -16,7 +16,7 @@ package com.opensymphony.xwork2; import com.opensymphony.xwork2.inject.Inject; -import com.opensymphony.xwork2.util.LocalizedTextUtil; +import com.opensymphony.xwork2.util.DefaultLocalizedTextProvider; import com.opensymphony.xwork2.util.ValueStack; import java.io.Serializable; @@ -32,7 +32,7 @@ * * @author Jason Carreira jcarreira@gmail.com * @author Rainer Hermanns - * @see LocalizedTextUtil#addDefaultResourceBundle(String) + * @see DefaultLocalizedTextProvider#addDefaultResourceBundle(String) */ public class DefaultTextProvider implements TextProvider, Serializable, Unchainable { diff --git a/core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java b/core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java index 937a5614e4..358eb5c59a 100644 --- a/core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java +++ b/core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java @@ -245,7 +245,7 @@ protected Container createBootstrapContainer(List providers) builder.factory(ReflectionProvider.class, OgnlReflectionProvider.class, Scope.SINGLETON); builder.factory(ValueStackFactory.class, OgnlValueStackFactory.class, Scope.SINGLETON); - builder.factory(LocalizedTextProvider.class, LocalizedTextUtil.class, Scope.SINGLETON); + builder.factory(LocalizedTextProvider.class, DefaultLocalizedTextProvider.class, Scope.SINGLETON); builder.factory(XWorkConverter.class, Scope.SINGLETON); builder.factory(ConversionPropertiesProcessor.class, DefaultConversionPropertiesProcessor.class, Scope.SINGLETON); diff --git a/core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java b/core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java index 407a96d19e..853f50ed03 100644 --- a/core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java +++ b/core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java @@ -72,7 +72,7 @@ import com.opensymphony.xwork2.ognl.accessor.XWorkMethodAccessor; import com.opensymphony.xwork2.util.CompoundRoot; import com.opensymphony.xwork2.LocalizedTextProvider; -import com.opensymphony.xwork2.util.LocalizedTextUtil; +import com.opensymphony.xwork2.util.DefaultLocalizedTextProvider; import com.opensymphony.xwork2.util.OgnlTextParser; import com.opensymphony.xwork2.util.PatternMatcher; import com.opensymphony.xwork2.util.TextParser; @@ -182,7 +182,7 @@ public void register(ContainerBuilder builder, LocatableProperties props) .factory(ActionValidatorManager.class, "no-annotations", DefaultActionValidatorManager.class, Scope.SINGLETON) .factory(TextProviderFactory.class, Scope.SINGLETON) - .factory(LocalizedTextProvider.class, LocalizedTextUtil.class, Scope.SINGLETON) + .factory(LocalizedTextProvider.class, DefaultLocalizedTextProvider.class, Scope.SINGLETON) .factory(TextProvider.class, "system", DefaultTextProvider.class, Scope.SINGLETON) .factory(TextProvider.class, TextProviderSupport.class, Scope.SINGLETON) diff --git a/core/src/main/java/com/opensymphony/xwork2/util/LocalizedTextUtil.java b/core/src/main/java/com/opensymphony/xwork2/util/DefaultLocalizedTextProvider.java similarity index 98% rename from core/src/main/java/com/opensymphony/xwork2/util/LocalizedTextUtil.java rename to core/src/main/java/com/opensymphony/xwork2/util/DefaultLocalizedTextProvider.java index 8fb9e00f8d..1e55fdd7cb 100644 --- a/core/src/main/java/com/opensymphony/xwork2/util/LocalizedTextUtil.java +++ b/core/src/main/java/com/opensymphony/xwork2/util/DefaultLocalizedTextProvider.java @@ -31,6 +31,7 @@ import org.apache.commons.lang3.ObjectUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.message.ParameterizedMessage; import org.apache.struts2.StrutsConstants; import java.beans.PropertyDescriptor; @@ -88,9 +89,12 @@ * @author Rainer Hermanns * @author tm_jee */ -public class LocalizedTextUtil implements LocalizedTextProvider { +public class DefaultLocalizedTextProvider implements LocalizedTextProvider { - private static final Logger LOG = LogManager.getLogger(LocalizedTextUtil.class); + private static final Logger LOG = LogManager.getLogger(DefaultLocalizedTextProvider.class); + + public static final String XWORK_MESSAGES_BUNDLE = "com/opensymphony/xwork2/xwork-messages"; + public static final String STRUTS_MESSAGES_BUNDLE = "org/apache/struts2/struts-messages"; private static final String TOMCAT_RESOURCE_ENTRIES_FIELD = "resourceEntries"; @@ -105,7 +109,7 @@ public class LocalizedTextUtil implements LocalizedTextProvider { private final Set missingBundles = Collections.synchronizedSet(new HashSet()); private final String RELOADED = "com.opensymphony.xwork2.util.LocalizedTextUtil.reloaded"; - private final String XWORK_MESSAGES_BUNDLE = "com/opensymphony/xwork2/xwork-messages"; + /** * Clears the internal list of resource bundles. @@ -117,8 +121,10 @@ public static void clearDefaultResourceBundles() { // no-op } - public LocalizedTextUtil() { - addDefaultResourceBundle("org/apache/struts2/struts-messages"); + public DefaultLocalizedTextProvider() { + + addDefaultResourceBundle(XWORK_MESSAGES_BUNDLE); + addDefaultResourceBundle(STRUTS_MESSAGES_BUNDLE); } /** @@ -137,7 +143,7 @@ public void setDevMode(String devMode) { } @Inject(value = StrutsConstants.STRUTS_CUSTOM_I18N_RESOURCES, required = false) - public void setCustomI18NBundles(String bundles) { + public void setCustomI18NResources(String bundles) { if (bundles != null && bundles.length() > 0) { StringTokenizer customBundles = new StringTokenizer(bundles, ", "); @@ -147,7 +153,7 @@ public void setCustomI18NBundles(String bundles) { LOG.trace("Loading global messages from [{}]", name); addDefaultResourceBundle(name); } catch (Exception e) { - LOG.error("Could not find messages file {}.properties. Skipping", name); + LOG.error(new ParameterizedMessage("Could not find messages file {}.properties. Skipping", name), e); } } } @@ -169,7 +175,6 @@ public void addDefaultResourceBundle(String resourceBundleName) { List bundles = classLoaderMap.get(ccl.hashCode()); if (bundles == null) { bundles = new CopyOnWriteArrayList<>(); - bundles.add(XWORK_MESSAGES_BUNDLE); classLoaderMap.put(ccl.hashCode(), bundles); } bundles.remove(resourceBundleName); diff --git a/core/src/main/java/org/apache/struts2/components/Date.java b/core/src/main/java/org/apache/struts2/components/Date.java index 46c193d8bd..f1a3c978cb 100644 --- a/core/src/main/java/org/apache/struts2/components/Date.java +++ b/core/src/main/java/org/apache/struts2/components/Date.java @@ -23,7 +23,6 @@ import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.TextProvider; -import com.opensymphony.xwork2.util.LocalizedTextUtil; import com.opensymphony.xwork2.util.ValueStack; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; diff --git a/core/src/main/java/org/apache/struts2/components/I18n.java b/core/src/main/java/org/apache/struts2/components/I18n.java index 7065c4b142..f934a3e6d1 100644 --- a/core/src/main/java/org/apache/struts2/components/I18n.java +++ b/core/src/main/java/org/apache/struts2/components/I18n.java @@ -33,7 +33,7 @@ import com.opensymphony.xwork2.TextProviderFactory; import com.opensymphony.xwork2.inject.Container; import com.opensymphony.xwork2.inject.Inject; -import com.opensymphony.xwork2.util.LocalizedTextUtil; +import com.opensymphony.xwork2.util.DefaultLocalizedTextProvider; import com.opensymphony.xwork2.util.ValueStack; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -121,7 +121,7 @@ public boolean start(Writer writer) { ResourceBundle bundle = defaultTextProvider.getTexts(name); if (bundle == null) { - bundle = container.getInstance(LocalizedTextUtil.class).findResourceBundle(name, localeProvider.getLocale()); + bundle = container.getInstance(DefaultLocalizedTextProvider.class).findResourceBundle(name, localeProvider.getLocale()); } if (bundle != null) { diff --git a/core/src/main/java/org/apache/struts2/config/DefaultBeanSelectionProvider.java b/core/src/main/java/org/apache/struts2/config/DefaultBeanSelectionProvider.java index b21376ecc5..6e5bf8b54e 100644 --- a/core/src/main/java/org/apache/struts2/config/DefaultBeanSelectionProvider.java +++ b/core/src/main/java/org/apache/struts2/config/DefaultBeanSelectionProvider.java @@ -53,7 +53,6 @@ import com.opensymphony.xwork2.factory.ValidatorFactory; import com.opensymphony.xwork2.inject.ContainerBuilder; import com.opensymphony.xwork2.inject.Scope; -import com.opensymphony.xwork2.util.LocalizedTextUtil; import com.opensymphony.xwork2.util.PatternMatcher; import com.opensymphony.xwork2.util.TextParser; import com.opensymphony.xwork2.util.ValueStackFactory; @@ -74,8 +73,6 @@ import org.apache.struts2.views.util.UrlHelper; import org.apache.struts2.views.velocity.VelocityManager; -import java.util.StringTokenizer; - /** * Selects the implementations of key framework extension points, using the loaded * property constants. The implementations are selected from the container builder diff --git a/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java b/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java index 7b28117060..047238fd5b 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java @@ -26,14 +26,13 @@ import com.opensymphony.xwork2.config.entities.InterceptorMapping; import com.opensymphony.xwork2.config.entities.InterceptorStackConfig; import com.opensymphony.xwork2.config.entities.PackageConfig; -import com.opensymphony.xwork2.config.impl.DefaultConfiguration; import com.opensymphony.xwork2.config.providers.XmlConfigurationProvider; import com.opensymphony.xwork2.inject.Container; import com.opensymphony.xwork2.inject.ContainerBuilder; import com.opensymphony.xwork2.inject.Inject; import com.opensymphony.xwork2.interceptor.Interceptor; import com.opensymphony.xwork2.util.ClassLoaderUtil; -import com.opensymphony.xwork2.util.LocalizedTextUtil; +import com.opensymphony.xwork2.util.DefaultLocalizedTextProvider; import com.opensymphony.xwork2.util.ValueStack; import com.opensymphony.xwork2.util.ValueStackFactory; import com.opensymphony.xwork2.util.location.LocatableProperties; @@ -647,7 +646,7 @@ public HashMap createContextMap(Map requestMap, Locale locale; if (defaultLocale != null) { - locale = LocalizedTextUtil.localeFromString(defaultLocale, request.getLocale()); + locale = DefaultLocalizedTextProvider.localeFromString(defaultLocale, request.getLocale()); } else { locale = request.getLocale(); } @@ -729,7 +728,7 @@ public void prepare(HttpServletRequest request, HttpServletResponse response) { Locale locale = null; if (defaultLocale != null) { - locale = LocalizedTextUtil.localeFromString(defaultLocale, request.getLocale()); + locale = DefaultLocalizedTextProvider.localeFromString(defaultLocale, request.getLocale()); } if (encoding != null) { diff --git a/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaMultiPartRequest.java b/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaMultiPartRequest.java index f12f1b5c1f..e6fab1e76e 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaMultiPartRequest.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaMultiPartRequest.java @@ -21,7 +21,6 @@ package org.apache.struts2.dispatcher.multipart; -import com.opensymphony.xwork2.util.LocalizedTextUtil; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadBase; import org.apache.commons.fileupload.FileUploadException; diff --git a/core/src/main/java/org/apache/struts2/dispatcher/multipart/MultiPartRequestWrapper.java b/core/src/main/java/org/apache/struts2/dispatcher/multipart/MultiPartRequestWrapper.java index 4f5562114e..571f5c3d36 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/multipart/MultiPartRequestWrapper.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/multipart/MultiPartRequestWrapper.java @@ -22,14 +22,12 @@ package org.apache.struts2.dispatcher.multipart; import com.opensymphony.xwork2.LocaleProvider; -import com.opensymphony.xwork2.util.LocalizedTextUtil; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.struts2.dispatcher.LocalizedMessage; import org.apache.struts2.dispatcher.StrutsRequestWrapper; import javax.servlet.http.HttpServletRequest; -import java.io.File; import java.io.IOException; import java.util.*; diff --git a/core/src/main/java/org/apache/struts2/factory/StrutsActionProxy.java b/core/src/main/java/org/apache/struts2/factory/StrutsActionProxy.java index 9b8e6811e1..a444953a11 100644 --- a/core/src/main/java/org/apache/struts2/factory/StrutsActionProxy.java +++ b/core/src/main/java/org/apache/struts2/factory/StrutsActionProxy.java @@ -26,7 +26,6 @@ import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.DefaultActionProxy; -import com.opensymphony.xwork2.util.LocalizedTextUtil; import org.apache.struts2.ServletActionContext; import java.util.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 9060d6982c..4b6c8f559c 100644 --- a/core/src/main/java/org/apache/struts2/interceptor/I18nInterceptor.java +++ b/core/src/main/java/org/apache/struts2/interceptor/I18nInterceptor.java @@ -24,7 +24,7 @@ import com.opensymphony.xwork2.LocaleProvider; import com.opensymphony.xwork2.inject.Inject; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; -import com.opensymphony.xwork2.util.LocalizedTextUtil; +import com.opensymphony.xwork2.util.DefaultLocalizedTextProvider; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.message.ParameterizedMessage; @@ -163,7 +163,7 @@ protected Locale getLocaleFromParam(Object requestedLocale) { } else { String localeStr = requestedLocale.toString(); if (localeProvider.isValidLocaleString(localeStr)) { - locale = LocalizedTextUtil.localeFromString(requestedLocale.toString(), null); + locale = DefaultLocalizedTextProvider.localeFromString(requestedLocale.toString(), null); } } if (locale != null) { diff --git a/core/src/main/java/org/apache/struts2/util/StrutsTestCaseHelper.java b/core/src/main/java/org/apache/struts2/util/StrutsTestCaseHelper.java index f778e4cb14..9c449f502b 100644 --- a/core/src/main/java/org/apache/struts2/util/StrutsTestCaseHelper.java +++ b/core/src/main/java/org/apache/struts2/util/StrutsTestCaseHelper.java @@ -23,7 +23,7 @@ import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.inject.Container; -import com.opensymphony.xwork2.util.LocalizedTextUtil; +import com.opensymphony.xwork2.util.DefaultLocalizedTextProvider; import com.opensymphony.xwork2.util.ValueStack; import com.opensymphony.xwork2.util.ValueStackFactory; import org.apache.struts2.dispatcher.Dispatcher; @@ -47,7 +47,7 @@ public class StrutsTestCaseHelper { * @throws Exception in case of any error */ public static void setUp() throws Exception { - LocalizedTextUtil.clearDefaultResourceBundles(); + DefaultLocalizedTextProvider.clearDefaultResourceBundles(); } public static Dispatcher initDispatcher(ServletContext ctx, Map params) { diff --git a/core/src/main/java/org/apache/struts2/util/TokenHelper.java b/core/src/main/java/org/apache/struts2/util/TokenHelper.java index a5affaacd3..28f42f6376 100644 --- a/core/src/main/java/org/apache/struts2/util/TokenHelper.java +++ b/core/src/main/java/org/apache/struts2/util/TokenHelper.java @@ -23,7 +23,6 @@ import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.LocalizedTextProvider; -import com.opensymphony.xwork2.util.LocalizedTextUtil; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.struts2.dispatcher.Parameter; diff --git a/core/src/main/resources/struts-default.xml b/core/src/main/resources/struts-default.xml index 4a20ac96e0..1f516b7cb9 100644 --- a/core/src/main/resources/struts-default.xml +++ b/core/src/main/resources/struts-default.xml @@ -131,7 +131,7 @@ - + diff --git a/core/src/test/java/com/opensymphony/xwork2/TextProviderSupportTest.java b/core/src/test/java/com/opensymphony/xwork2/TextProviderSupportTest.java index c0ea23d58c..118c419f15 100644 --- a/core/src/test/java/com/opensymphony/xwork2/TextProviderSupportTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/TextProviderSupportTest.java @@ -16,8 +16,6 @@ package com.opensymphony.xwork2; -import com.opensymphony.xwork2.util.LocalizedTextUtil; - import java.util.ArrayList; import java.util.List; import java.util.Locale; diff --git a/core/src/test/java/com/opensymphony/xwork2/util/LocalizedTextUtilTest.java b/core/src/test/java/com/opensymphony/xwork2/util/DefaultLocalizedTextProviderTest.java similarity index 91% rename from core/src/test/java/com/opensymphony/xwork2/util/LocalizedTextUtilTest.java rename to core/src/test/java/com/opensymphony/xwork2/util/DefaultLocalizedTextProviderTest.java index 75e5569093..a9dca08b01 100644 --- a/core/src/test/java/com/opensymphony/xwork2/util/LocalizedTextUtilTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/util/DefaultLocalizedTextProviderTest.java @@ -30,14 +30,14 @@ /** - * Unit test for {@link LocalizedTextUtil}. + * Unit test for {@link DefaultLocalizedTextProvider}. * * @author jcarreira * @author tm_jee * * @version $Date$ $Id$ */ -public class LocalizedTextUtilTest extends XWorkTestCase { +public class DefaultLocalizedTextProviderTest extends XWorkTestCase { private LocalizedTextProvider localizedTextProvider; @@ -215,16 +215,16 @@ public void testXW377() { String text = localizedTextProvider.findText(Bar.class, "xw377", ActionContext.getContext().getLocale(), "xw377", null, ActionContext.getContext().getValueStack()); assertEquals("xw377", text); // should not log - String text2 = localizedTextProvider.findText(LocalizedTextUtilTest.class, "notinbundle", ActionContext.getContext().getLocale(), "hello", null, ActionContext.getContext().getValueStack()); + String text2 = localizedTextProvider.findText(DefaultLocalizedTextProviderTest.class, "notinbundle", ActionContext.getContext().getLocale(), "hello", null, ActionContext.getContext().getValueStack()); assertEquals("hello", text2); // should log WARN - String text3 = localizedTextProvider.findText(LocalizedTextUtilTest.class, "notinbundle.key", ActionContext.getContext().getLocale(), "notinbundle.key", null, ActionContext.getContext().getValueStack()); + String text3 = localizedTextProvider.findText(DefaultLocalizedTextProviderTest.class, "notinbundle.key", ActionContext.getContext().getLocale(), "notinbundle.key", null, ActionContext.getContext().getValueStack()); assertEquals("notinbundle.key", text3); // should log WARN - String text4 = localizedTextProvider.findText(LocalizedTextUtilTest.class, "xw377", ActionContext.getContext().getLocale(), "hello", null, ActionContext.getContext().getValueStack()); + String text4 = localizedTextProvider.findText(DefaultLocalizedTextProviderTest.class, "xw377", ActionContext.getContext().getLocale(), "hello", null, ActionContext.getContext().getValueStack()); assertEquals("xw377", text4); // should not log - String text5 = localizedTextProvider.findText(LocalizedTextUtilTest.class, "username", ActionContext.getContext().getLocale(), null, null, ActionContext.getContext().getValueStack()); + String text5 = localizedTextProvider.findText(DefaultLocalizedTextProviderTest.class, "username", ActionContext.getContext().getLocale(), null, null, ActionContext.getContext().getValueStack()); assertEquals("Santa", text5); // should not log } diff --git a/core/src/test/java/org/apache/struts2/components/ComponentTest.java b/core/src/test/java/org/apache/struts2/components/ComponentTest.java index 80cf82b5ee..dffa5d7781 100644 --- a/core/src/test/java/org/apache/struts2/components/ComponentTest.java +++ b/core/src/test/java/org/apache/struts2/components/ComponentTest.java @@ -46,7 +46,6 @@ import org.apache.struts2.views.jsp.ui.UpDownSelectTag; import com.opensymphony.xwork2.ActionContext; -import com.opensymphony.xwork2.util.LocalizedTextUtil; /** * Test case for method findAncestor(Class) in Component and some commons diff --git a/core/src/test/java/org/apache/struts2/config/DefaultBeanSelectionProviderTest.java b/core/src/test/java/org/apache/struts2/config/DefaultBeanSelectionProviderTest.java index 771c0565c6..ab7ee0dbf4 100644 --- a/core/src/test/java/org/apache/struts2/config/DefaultBeanSelectionProviderTest.java +++ b/core/src/test/java/org/apache/struts2/config/DefaultBeanSelectionProviderTest.java @@ -25,14 +25,11 @@ import com.opensymphony.xwork2.XWorkTestCase; import com.opensymphony.xwork2.LocalizedTextProvider; -import com.opensymphony.xwork2.config.Configuration; import com.opensymphony.xwork2.config.ConfigurationException; -import com.opensymphony.xwork2.config.ConfigurationProvider; import com.opensymphony.xwork2.test.StubConfigurationProvider; import org.apache.struts2.StrutsConstants; import com.opensymphony.xwork2.inject.ContainerBuilder; -import com.opensymphony.xwork2.util.LocalizedTextUtil; import com.opensymphony.xwork2.util.location.LocatableProperties; public class DefaultBeanSelectionProviderTest extends XWorkTestCase { diff --git a/core/src/test/java/org/apache/struts2/config/PropertiesConfigurationProviderTest.java b/core/src/test/java/org/apache/struts2/config/PropertiesConfigurationProviderTest.java index 123f8eb655..05606ce883 100644 --- a/core/src/test/java/org/apache/struts2/config/PropertiesConfigurationProviderTest.java +++ b/core/src/test/java/org/apache/struts2/config/PropertiesConfigurationProviderTest.java @@ -23,7 +23,7 @@ import com.opensymphony.xwork2.inject.Container; import com.opensymphony.xwork2.inject.ContainerBuilder; -import com.opensymphony.xwork2.util.LocalizedTextUtil; +import com.opensymphony.xwork2.util.DefaultLocalizedTextProvider; import com.opensymphony.xwork2.util.location.LocatableProperties; import junit.framework.TestCase; import org.apache.struts2.StrutsConstants; @@ -49,7 +49,7 @@ public void testRegister_DifferentLocale() { Container container = builder.create(true); String localeStr = container.getInstance(String.class, StrutsConstants.STRUTS_LOCALE); - Locale locale = LocalizedTextUtil.localeFromString(localeStr, Locale.FRANCE); + Locale locale = DefaultLocalizedTextProvider.localeFromString(localeStr, Locale.FRANCE); assertNotNull(locale); assertEquals("DE", locale.getCountry()); @@ -68,7 +68,7 @@ public void testRegister_NoLocale() { Container container = builder.create(true); String localeStr = container.getInstance(String.class, StrutsConstants.STRUTS_LOCALE); - Locale locale = LocalizedTextUtil.localeFromString(localeStr, Locale.getDefault()); + Locale locale = DefaultLocalizedTextProvider.localeFromString(localeStr, Locale.getDefault()); assertNotNull(locale); Locale vmLocale = Locale.getDefault(); diff --git a/core/src/test/java/org/apache/struts2/config/SettingsTest.java b/core/src/test/java/org/apache/struts2/config/SettingsTest.java index 9f92f7df9e..11aacfca18 100644 --- a/core/src/test/java/org/apache/struts2/config/SettingsTest.java +++ b/core/src/test/java/org/apache/struts2/config/SettingsTest.java @@ -22,7 +22,6 @@ package org.apache.struts2.config; import com.opensymphony.xwork2.LocalizedTextProvider; -import com.opensymphony.xwork2.util.LocalizedTextUtil; import org.apache.struts2.StrutsConstants; import org.apache.struts2.StrutsInternalTestCase; diff --git a/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellMultiPartRequest.java b/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellMultiPartRequest.java index c91c52e8bc..9dba92e4da 100644 --- a/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellMultiPartRequest.java +++ b/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellMultiPartRequest.java @@ -21,7 +21,6 @@ package org.apache.struts2.dispatcher.multipart; -import com.opensymphony.xwork2.util.LocalizedTextUtil; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; import http.utils.multipartrequest.ServletMultipartRequest; @@ -32,7 +31,6 @@ import java.util.ArrayList; import java.util.Enumeration; import java.util.List; -import java.util.Locale; /** diff --git a/plugins/portlet/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java b/plugins/portlet/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java index 42d7e306b2..9a15b8784d 100644 --- a/plugins/portlet/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java +++ b/plugins/portlet/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java @@ -26,8 +26,7 @@ import com.opensymphony.xwork2.ActionProxyFactory; import com.opensymphony.xwork2.config.ConfigurationException; import com.opensymphony.xwork2.inject.Container; -import com.opensymphony.xwork2.util.LocalizedTextUtil; -import com.sun.net.httpserver.HttpsParameters; +import com.opensymphony.xwork2.util.DefaultLocalizedTextProvider; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; import org.apache.commons.lang3.StringUtils; @@ -397,7 +396,7 @@ public HashMap createContextMap(Map requestMap, String defaultLocale = container.getInstance(String.class, StrutsConstants.STRUTS_LOCALE); Locale locale; if (defaultLocale != null) { - locale = LocalizedTextUtil.localeFromString(defaultLocale, request.getLocale()); + locale = DefaultLocalizedTextProvider.localeFromString(defaultLocale, request.getLocale()); } else { locale = request.getLocale(); } From 3a84a626f964056428fd4ca2b006610d25136e19 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Tue, 14 Mar 2017 10:03:07 +0100 Subject: [PATCH 20/21] Drops unused function --- .../java/com/opensymphony/xwork2/LocalizedTextProvider.java | 2 -- .../opensymphony/xwork2/util/DefaultLocalizedTextProvider.java | 1 - 2 files changed, 3 deletions(-) diff --git a/core/src/main/java/com/opensymphony/xwork2/LocalizedTextProvider.java b/core/src/main/java/com/opensymphony/xwork2/LocalizedTextProvider.java index ecd037d2d7..85c5458e3b 100644 --- a/core/src/main/java/com/opensymphony/xwork2/LocalizedTextProvider.java +++ b/core/src/main/java/com/opensymphony/xwork2/LocalizedTextProvider.java @@ -47,6 +47,4 @@ public interface LocalizedTextProvider extends Serializable { void addDefaultResourceBundle(String resourceBundleName); - @Deprecated - void reset(); } diff --git a/core/src/main/java/com/opensymphony/xwork2/util/DefaultLocalizedTextProvider.java b/core/src/main/java/com/opensymphony/xwork2/util/DefaultLocalizedTextProvider.java index 1e55fdd7cb..c51521902f 100644 --- a/core/src/main/java/com/opensymphony/xwork2/util/DefaultLocalizedTextProvider.java +++ b/core/src/main/java/com/opensymphony/xwork2/util/DefaultLocalizedTextProvider.java @@ -972,7 +972,6 @@ private static void clearMap(Class cl, Object obj, String name) * * @deprecated used only in tests */ - @Override @Deprecated public void reset() { // no-op From fefb91fe118bc4518196c4086a63960558454ed5 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Tue, 14 Mar 2017 10:11:23 +0100 Subject: [PATCH 21/21] Adds info about new extension point --- .../apache/struts2/config/DefaultBeanSelectionProvider.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/src/main/java/org/apache/struts2/config/DefaultBeanSelectionProvider.java b/core/src/main/java/org/apache/struts2/config/DefaultBeanSelectionProvider.java index 6e5bf8b54e..a89ae9a378 100644 --- a/core/src/main/java/org/apache/struts2/config/DefaultBeanSelectionProvider.java +++ b/core/src/main/java/org/apache/struts2/config/DefaultBeanSelectionProvider.java @@ -333,6 +333,12 @@ * singleton * Matches content type of uploaded files (since 2.3.22) * + * + * com.opensymphony.xwork2.LocalizedTextProvider + * struts.localizedTextProvider + * singleton + * Provides access to resource bundles used to localise messages (since 2.5.11) + * * * *