You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by lu...@apache.org on 2017/03/14 18:36:11 UTC

[18/24] struts git commit: Extracts common interface for LocalizedTextProvider

Extracts common interface for LocalizedTextProvider


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/6e89179e
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/6e89179e
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/6e89179e

Branch: refs/heads/master
Commit: 6e89179eb2c5f0a7b71b7d7fdd7b0e8966f68f52
Parents: 31ddb8b
Author: Lukasz Lenart <lu...@apache.org>
Authored: Tue Mar 14 09:39:02 2017 +0100
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Tue Mar 14 09:39:02 2017 +0100

----------------------------------------------------------------------
 .../opensymphony/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 +-
 .../xwork2/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 ++++----
 .../org/apache/struts2/config/SettingsTest.java |  7 +-
 .../struts2/dispatcher/DispatcherTest.java      |  8 +--
 .../portlet/dispatcher/Jsr168Dispatcher.java    |  1 -
 24 files changed, 199 insertions(+), 165 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/6e89179e/core/src/main/java/com/opensymphony/xwork2/DefaultActionProxy.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/DefaultActionProxy.java b/core/src/main/java/com/opensymphony/xwork2/DefaultActionProxy.java
index 39a484d..1ab012c 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.Configuration;
 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 class DefaultActionProxy implements ActionProxy, Serializable {
     }
 
     @Inject
-    public void setLocalizedTextUtil(LocalizedTextUtil localizedTextUtil) {
-        this.localizedTextUtil = localizedTextUtil;
+    public void setLocalizedTextUtil(LocalizedTextProvider localizedTextProvider) {
+        this.localizedTextProvider = localizedTextProvider;
     }
 
     public Object getAction() {
@@ -212,7 +211,7 @@ public class DefaultActionProxy implements ActionProxy, Serializable {
     }
 
     protected String prepareNotAllowedErrorMessage() {
-        return localizedTextUtil.findDefaultText(
+        return localizedTextProvider.findDefaultText(
                 "struts.exception.method-not-allowed",
                 Locale.getDefault(),
                 new String[]{method, actionName}
@@ -221,12 +220,12 @@ public class DefaultActionProxy implements ActionProxy, Serializable {
 
     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});

http://git-wip-us.apache.org/repos/asf/struts/blob/6e89179e/core/src/main/java/com/opensymphony/xwork2/DefaultTextProvider.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/DefaultTextProvider.java b/core/src/main/java/com/opensymphony/xwork2/DefaultTextProvider.java
index 0e3f5b1..b82c42a 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 class DefaultTextProvider implements TextProvider, Serializable, Unchaina
     }
 
     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 class DefaultTextProvider implements TextProvider, Serializable, Unchaina
             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 class DefaultTextProvider implements TextProvider, Serializable, Unchaina
             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 class DefaultTextProvider implements TextProvider, Serializable, Unchaina
     }
 
     public ResourceBundle getTexts(String bundleName) {
-        return localizedTextUtil.findResourceBundle(bundleName, ActionContext.getContext().getLocale());
+        return localizedTextProvider.findResourceBundle(bundleName, ActionContext.getContext().getLocale());
     }
 
     public ResourceBundle getTexts() {

http://git-wip-us.apache.org/repos/asf/struts/blob/6e89179e/core/src/main/java/com/opensymphony/xwork2/LocalizedTextProvider.java
----------------------------------------------------------------------
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 0000000..f6175ea
--- /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();
+}

http://git-wip-us.apache.org/repos/asf/struts/blob/6e89179e/core/src/main/java/com/opensymphony/xwork2/TextProviderFactory.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/TextProviderFactory.java b/core/src/main/java/com/opensymphony/xwork2/TextProviderFactory.java
index 43c6792..91b110c 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 class TextProviderFactory {
     }
 
     @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 class TextProviderFactory {
 
     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 @@ public class TextProviderFactory {
 
     private TextProvider getTextProvider(ResourceBundle bundle) {
         if (this.textProvider == null) {
-            return new TextProviderSupport(bundle, localeProvider, localizedTextUtil);
+            return new TextProviderSupport(bundle, localeProvider, localizedTextProvider);
         }
         return textProvider;
     }

http://git-wip-us.apache.org/repos/asf/struts/blob/6e89179e/core/src/main/java/com/opensymphony/xwork2/TextProviderSupport.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/com/opensymphony/xwork2/TextProviderSupport.java b/core/src/main/java/com/opensymphony/xwork2/TextProviderSupport.java
index 98dd3d2..b576751 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 class TextProviderSupport implements ResourceBundleTextProvider {
      * @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 class TextProviderSupport implements ResourceBundleTextProvider {
      * @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 class TextProviderSupport implements ResourceBundleTextProvider {
     }
 
     @Inject
-    public void setLocalizedTextUtil(LocalizedTextUtil localizedTextUtil) {
-        this.localizedTextUtil = localizedTextUtil;
+    public void setLocalizedTextUtil(LocalizedTextProvider localizedTextProvider) {
+        this.localizedTextProvider = localizedTextProvider;
     }
 
     /**
@@ -104,9 +103,9 @@ public class TextProviderSupport implements ResourceBundleTextProvider {
     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 class TextProviderSupport implements ResourceBundleTextProvider {
     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 class TextProviderSupport implements ResourceBundleTextProvider {
      */
     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 class TextProviderSupport implements ResourceBundleTextProvider {
             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 class TextProviderSupport implements ResourceBundleTextProvider {
             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 class TextProviderSupport implements ResourceBundleTextProvider {
      * @return a resource bundle
      */
     public ResourceBundle getTexts(String aBundleName) {
-        return localizedTextUtil.findResourceBundle(aBundleName, getLocale());
+        return localizedTextProvider.findResourceBundle(aBundleName, getLocale());
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/struts/blob/6e89179e/core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java
----------------------------------------------------------------------
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 89be0fa..937a561 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 @@ public class DefaultConfiguration implements Configuration {
         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);

http://git-wip-us.apache.org/repos/asf/struts/blob/6e89179e/core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java
----------------------------------------------------------------------
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 2adab77..407a96d 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.XWorkListPropertyAccessor;
 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 class XWorkConfigurationProvider implements ConfigurationProvider {
                 .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)
 

http://git-wip-us.apache.org/repos/asf/struts/blob/6e89179e/core/src/main/java/com/opensymphony/xwork2/conversion/impl/XWorkConverter.java
----------------------------------------------------------------------
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 771fc36..bdf74c2 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 class XWorkConverter extends DefaultTypeConverter {
     }
 
     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

http://git-wip-us.apache.org/repos/asf/struts/blob/6e89179e/core/src/main/java/com/opensymphony/xwork2/interceptor/AliasInterceptor.java
----------------------------------------------------------------------
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 9d260c1..f3f9c00 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.config.entities.ActionConfig;
 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 class AliasInterceptor extends AbstractInterceptor {
     }
 
     @Inject
-    public void setLocalizedTextUtil(LocalizedTextUtil localizedTextUtil) {
-        this.localizedTextUtil = localizedTextUtil;
+    public void setLocalizedTextUtil(LocalizedTextProvider localizedTextProvider) {
+        this.localizedTextProvider = localizedTextProvider;
     }
 
     /**
@@ -179,7 +179,7 @@ public class AliasInterceptor extends AbstractInterceptor {
                             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);

http://git-wip-us.apache.org/repos/asf/struts/blob/6e89179e/core/src/main/java/com/opensymphony/xwork2/interceptor/StaticParametersInterceptor.java
----------------------------------------------------------------------
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 b697a64..1453583 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.ActionConfig;
 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 class StaticParametersInterceptor extends AbstractInterceptor {
     }
 
     @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 class StaticParametersInterceptor extends AbstractInterceptor {
                     } 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);

http://git-wip-us.apache.org/repos/asf/struts/blob/6e89179e/core/src/main/java/com/opensymphony/xwork2/util/LocalizedTextUtil.java
----------------------------------------------------------------------
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 7e870fd..8fb9e00 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 @@ package com.opensymphony.xwork2.util;
 
 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.logging.log4j.Logger;
 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 @@ import java.util.concurrent.CopyOnWriteArrayList;
  * @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<Integer, List<String>> classLoaderMap = new ConcurrentHashMap<>();
+    private final ConcurrentMap<Integer, List<String>> classLoaderMap = new ConcurrentHashMap<>();
 
     private boolean reloadBundles = false;
     private boolean devMode = false;
 
-    private static final ConcurrentMap<String, ResourceBundle> bundlesMap = new ConcurrentHashMap<>();
-    private static final ConcurrentMap<MessageFormatKey, MessageFormat> messageFormats = new ConcurrentHashMap<>();
-    private static final ConcurrentMap<Integer, ClassLoader> delegatedClassLoaderMap = new ConcurrentHashMap<>();
-    private static final Set<String> missingBundles = Collections.synchronizedSet(new HashSet<String>());
-
-    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<String, ResourceBundle> bundlesMap = new ConcurrentHashMap<>();
+    private final ConcurrentMap<MessageFormatKey, MessageFormat> messageFormats = new ConcurrentHashMap<>();
+    private final ConcurrentMap<Integer, ClassLoader> delegatedClassLoaderMap = new ConcurrentHashMap<>();
+    private final Set<String> missingBundles = Collections.synchronizedSet(new HashSet<String>());
 
+    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<String> 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 class LocalizedTextUtil implements Serializable {
         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.
      * <p>
@@ -151,7 +161,8 @@ public class LocalizedTextUtil implements Serializable {
      *
      * @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 class LocalizedTextUtil implements Serializable {
      * @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<String> localList = classLoaderMap.get(Thread.currentThread().getContextClassLoader().hashCode());
 
@@ -253,6 +265,7 @@ public class LocalizedTextUtil implements Serializable {
      * @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 class LocalizedTextUtil implements Serializable {
      * @param locale      the locale.
      * @return the bundle, <tt>null</tt> 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 class LocalizedTextUtil implements Serializable {
     /**
      * @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 class LocalizedTextUtil implements Serializable {
     /**
      * @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 @@ public class LocalizedTextUtil implements Serializable {
      * @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 class LocalizedTextUtil implements Serializable {
      *                       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 class LocalizedTextUtil implements Serializable {
      *                       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 @@ public class LocalizedTextUtil implements Serializable {
      * @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 class LocalizedTextUtil implements Serializable {
      * @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 class LocalizedTextUtil implements Serializable {
      * @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 @@ public class LocalizedTextUtil implements Serializable {
         }
     }
 
-    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 @@ public class LocalizedTextUtil implements Serializable {
         }
     }
 
-    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 @@ public class LocalizedTextUtil implements Serializable {
      *
      * @deprecated used only in tests
      */
+    @Override
     @Deprecated
     public void reset() {
-        clearDefaultResourceBundles();
-        bundlesMap.clear();
-        messageFormats.clear();
+        // no-op
     }
 
     static class MessageFormatKey {

http://git-wip-us.apache.org/repos/asf/struts/blob/6e89179e/core/src/main/java/com/opensymphony/xwork2/util/XWorkTestCaseHelper.java
----------------------------------------------------------------------
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 0cabd0f..4d0183c 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 class XWorkTestCaseHelper {
         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));

http://git-wip-us.apache.org/repos/asf/struts/blob/6e89179e/core/src/main/java/org/apache/struts2/config/DefaultBeanSelectionProvider.java
----------------------------------------------------------------------
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 d048f5f..b21376e 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 class DefaultBeanSelectionProvider extends AbstractBeanSelectionProvider
         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 class DefaultBeanSelectionProvider extends AbstractBeanSelectionProvider
         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 @@ public class DefaultBeanSelectionProvider extends AbstractBeanSelectionProvider
         }
     }
 
-    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);
-                }
-            }
-        }
-    }
-
 }

http://git-wip-us.apache.org/repos/asf/struts/blob/6e89179e/core/src/main/java/org/apache/struts2/factory/StrutsActionProxy.java
----------------------------------------------------------------------
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 64323c3..9b8e681 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 @@ public class StrutsActionProxy extends DefaultActionProxy {
     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}

http://git-wip-us.apache.org/repos/asf/struts/blob/6e89179e/core/src/main/java/org/apache/struts2/util/TokenHelper.java
----------------------------------------------------------------------
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 c6d0f0f..a5affaa 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 class TokenHelper {
 
         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
                 }));
             }

http://git-wip-us.apache.org/repos/asf/struts/blob/6e89179e/core/src/main/resources/struts-default.xml
----------------------------------------------------------------------
diff --git a/core/src/main/resources/struts-default.xml b/core/src/main/resources/struts-default.xml
index 0efdfba..4a20ac9 100644
--- a/core/src/main/resources/struts-default.xml
+++ b/core/src/main/resources/struts-default.xml
@@ -131,7 +131,7 @@
     <bean type="com.opensymphony.xwork2.conversion.impl.StringConverter" name="struts" class="com.opensymphony.xwork2.conversion.impl.StringConverter" scope="singleton"/>
 
     <bean type="com.opensymphony.xwork2.TextProviderFactory" name="struts" class="com.opensymphony.xwork2.TextProviderFactory" scope="prototype" />
-    <bean type="com.opensymphony.xwork2.util.LocalizedTextUtil" name="struts" class="com.opensymphony.xwork2.util.LocalizedTextUtil" scope="singleton" />
+    <bean type="com.opensymphony.xwork2.LocalizedTextProvider" name="struts" class="com.opensymphony.xwork2.util.LocalizedTextUtil" scope="singleton" />
     <bean type="com.opensymphony.xwork2.TextProvider" name="struts" class="com.opensymphony.xwork2.TextProviderSupport" scope="prototype" />
     <bean type="com.opensymphony.xwork2.LocaleProvider" name="struts" class="com.opensymphony.xwork2.DefaultLocaleProvider" scope="singleton" />
 

http://git-wip-us.apache.org/repos/asf/struts/blob/6e89179e/core/src/test/java/com/opensymphony/xwork2/DefaultTextProviderTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/com/opensymphony/xwork2/DefaultTextProviderTest.java b/core/src/test/java/com/opensymphony/xwork2/DefaultTextProviderTest.java
index 7b6b212..2b4ac0f 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 @@ public class DefaultTextProviderTest extends XWorkTestCase {
         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);
     }

http://git-wip-us.apache.org/repos/asf/struts/blob/6e89179e/core/src/test/java/com/opensymphony/xwork2/TextProviderSupportTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/com/opensymphony/xwork2/TextProviderSupportTest.java b/core/src/test/java/com/opensymphony/xwork2/TextProviderSupportTest.java
index a36b437..c0ea23d 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 @@ public class TextProviderSupportTest extends XWorkTestCase {
         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() {

http://git-wip-us.apache.org/repos/asf/struts/blob/6e89179e/core/src/test/java/com/opensymphony/xwork2/util/LocalizedTextUtilTest.java
----------------------------------------------------------------------
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 6631815..75e5569 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 @@ import java.util.ResourceBundle;
  */
 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 class LocalizedTextUtilTest extends XWorkTestCase {
     }
 
     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 class LocalizedTextUtilTest extends XWorkTestCase {
     }
 
     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<String, Object>(), 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 class LocalizedTextUtilTest extends XWorkTestCase {
         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 class LocalizedTextUtilTest extends XWorkTestCase {
         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 class LocalizedTextUtilTest extends XWorkTestCase {
         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 class LocalizedTextUtilTest extends XWorkTestCase {
         // 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 @@ public class LocalizedTextUtilTest extends XWorkTestCase {
         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 @@ public class LocalizedTextUtilTest extends XWorkTestCase {
     @Override
     protected void tearDown() throws Exception {
         super.tearDown();
-        LocalizedTextUtil.clearDefaultResourceBundles();
+        localizedTextProvider = null;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/struts/blob/6e89179e/core/src/test/java/org/apache/struts2/components/ComponentTest.java
----------------------------------------------------------------------
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 a789712..80cf82b 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 java.util.Stack;
 
 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 class ComponentTest extends AbstractTagTest {
         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");

http://git-wip-us.apache.org/repos/asf/struts/blob/6e89179e/core/src/test/java/org/apache/struts2/config/DefaultBeanSelectionProviderTest.java
----------------------------------------------------------------------
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 6b4d29a..771c056 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 @@ package org.apache.struts2.config;
 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()));
     }
 
 }

http://git-wip-us.apache.org/repos/asf/struts/blob/6e89179e/core/src/test/java/org/apache/struts2/config/SettingsTest.java
----------------------------------------------------------------------
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 a5af5f7..9f92f7d 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 class SettingsTest extends StrutsInternalTestCase {
     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() {

http://git-wip-us.apache.org/repos/asf/struts/blob/6e89179e/core/src/test/java/org/apache/struts2/dispatcher/DispatcherTest.java
----------------------------------------------------------------------
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 91b0ebf..d8f10cc 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.InterceptorStackConfig;
 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 @@ import java.util.Map;
 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");
     }

http://git-wip-us.apache.org/repos/asf/struts/blob/6e89179e/plugins/portlet/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java
----------------------------------------------------------------------
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 9f70560..42d7e30 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 class Jsr168Dispatcher extends GenericPortlet implements StrutsStatics {
         if (StringUtils.isEmpty(portletNamespace)) {
             portletNamespace = "";
         }
-        LocalizedTextUtil.addDefaultResourceBundle("org/apache/struts2/struts-messages");
 
         container = dispatcherUtils.getContainer();
         actionMapper = container.getInstance(ActionMapper.class);