From b42b9f16c4598505e0b1cfef78e6639237b2d712 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Wed, 15 Mar 2017 08:46:09 +0100 Subject: [PATCH 01/12] Defines new interface for factory --- .../xwork2/LocaleProviderFactory.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 core/src/main/java/com/opensymphony/xwork2/LocaleProviderFactory.java diff --git a/core/src/main/java/com/opensymphony/xwork2/LocaleProviderFactory.java b/core/src/main/java/com/opensymphony/xwork2/LocaleProviderFactory.java new file mode 100644 index 0000000000..dc2e7dda63 --- /dev/null +++ b/core/src/main/java/com/opensymphony/xwork2/LocaleProviderFactory.java @@ -0,0 +1,32 @@ +/* + * 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; + +/** + * Allows delegate creation of {@link LocaleProvider} to another implementation provided + * by a user. It also allows avoid problems with too many dependencies as {@link LocaleProvider} + * is implemented by the {@link ActionSupport} which can be defined as a bean in Spring. + */ +public interface LocaleProviderFactory { + + /** + * Gets the provided locale. + * + * @return the locale. + */ + LocaleProvider createLocaleProvider(); + +} From 636821aa2dfc32a4531b6e65717c38625bb5b4cc Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Wed, 15 Mar 2017 08:46:37 +0100 Subject: [PATCH 02/12] Adds default implementation of the factory --- .../xwork2/DefaultLocaleProviderFactory.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 core/src/main/java/com/opensymphony/xwork2/DefaultLocaleProviderFactory.java diff --git a/core/src/main/java/com/opensymphony/xwork2/DefaultLocaleProviderFactory.java b/core/src/main/java/com/opensymphony/xwork2/DefaultLocaleProviderFactory.java new file mode 100644 index 0000000000..7abb64f25c --- /dev/null +++ b/core/src/main/java/com/opensymphony/xwork2/DefaultLocaleProviderFactory.java @@ -0,0 +1,10 @@ +package com.opensymphony.xwork2; + +public class DefaultLocaleProviderFactory implements LocaleProviderFactory { + + @Override + public LocaleProvider createLocaleProvider() { + return new DefaultLocaleProvider(); + } + +} From 09be1b9b773f164d59114b0a73d3a4fde366b673 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Wed, 15 Mar 2017 08:50:05 +0100 Subject: [PATCH 03/12] Replaces LocaleProvider with LocaleProviderFactory --- .../opensymphony/xwork2/TextProviderFactory.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/com/opensymphony/xwork2/TextProviderFactory.java b/core/src/main/java/com/opensymphony/xwork2/TextProviderFactory.java index 349d876504..4d55d6c0ae 100644 --- a/core/src/main/java/com/opensymphony/xwork2/TextProviderFactory.java +++ b/core/src/main/java/com/opensymphony/xwork2/TextProviderFactory.java @@ -28,7 +28,7 @@ public class TextProviderFactory { private TextProvider textProvider; - private LocaleProvider localeProvider; + private LocaleProviderFactory localeProviderFactory; private LocalizedTextProvider localizedTextProvider; @Inject @@ -37,8 +37,8 @@ public void setTextProvider(TextProvider textProvider) { } @Inject - public void setLocaleProvider(LocaleProvider localeProvider) { - this.localeProvider = localeProvider; + public void setLocaleProviderFactory(LocaleProviderFactory localeProviderFactory) { + this.localeProviderFactory = localeProviderFactory; } @Inject @@ -50,7 +50,7 @@ public TextProvider createInstance(Class clazz) { TextProvider instance = getTextProvider(clazz); if (instance instanceof ResourceBundleTextProvider) { ((ResourceBundleTextProvider) instance).setClazz(clazz); - ((ResourceBundleTextProvider) instance).setLocaleProvider(localeProvider); + ((ResourceBundleTextProvider) instance).setLocaleProvider(localeProviderFactory.createLocaleProvider()); } return instance; } @@ -59,14 +59,14 @@ public TextProvider createInstance(ResourceBundle bundle) { TextProvider instance = getTextProvider(bundle); if (instance instanceof ResourceBundleTextProvider) { ((ResourceBundleTextProvider) instance).setBundle(bundle); - ((ResourceBundleTextProvider) instance).setLocaleProvider(localeProvider); + ((ResourceBundleTextProvider) instance).setLocaleProvider(localeProviderFactory.createLocaleProvider()); } return instance; } protected TextProvider getTextProvider(Class clazz) { if (this.textProvider == null) { - return new TextProviderSupport(clazz, localeProvider, localizedTextProvider); + return new TextProviderSupport(clazz, localeProviderFactory.createLocaleProvider(), localizedTextProvider); } else { return textProvider; } @@ -74,7 +74,7 @@ protected TextProvider getTextProvider(Class clazz) { private TextProvider getTextProvider(ResourceBundle bundle) { if (this.textProvider == null) { - return new TextProviderSupport(bundle, localeProvider, localizedTextProvider); + return new TextProviderSupport(bundle, localeProviderFactory.createLocaleProvider(), localizedTextProvider); } return textProvider; } From 3b738ad3ef01c434dbd673d5dca4659aa5779e7d Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Wed, 15 Mar 2017 08:53:35 +0100 Subject: [PATCH 04/12] Injects factory instead of the provider --- .../com/opensymphony/xwork2/TextProviderSupport.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/com/opensymphony/xwork2/TextProviderSupport.java b/core/src/main/java/com/opensymphony/xwork2/TextProviderSupport.java index cf177d3b4e..528a91000f 100644 --- a/core/src/main/java/com/opensymphony/xwork2/TextProviderSupport.java +++ b/core/src/main/java/com/opensymphony/xwork2/TextProviderSupport.java @@ -67,6 +67,7 @@ public TextProviderSupport(ResourceBundle bundle, LocaleProvider provider, Local /** * @param bundle the resource bundle. */ + @Override public void setBundle(ResourceBundle bundle) { this.bundle = bundle; } @@ -74,19 +75,24 @@ public void setBundle(ResourceBundle bundle) { /** * @param clazz a clazz to use for reading the resource bundle. */ + @Override public void setClazz(Class clazz) { this.clazz = clazz; } - /** * @param localeProvider a locale provider. */ - @Inject + @Override public void setLocaleProvider(LocaleProvider localeProvider) { this.localeProvider = localeProvider; } + @Inject + public void setLocaleProviderFactory(LocaleProviderFactory localeProviderFactory) { + this.localeProvider = localeProviderFactory.createLocaleProvider(); + } + @Inject public void setLocalizedTextProvider(LocalizedTextProvider localizedTextProvider) { this.localizedTextProvider = localizedTextProvider; From 4b022bfbe5f575908e61d84de885ca171fcca7f3 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Wed, 15 Mar 2017 09:11:31 +0100 Subject: [PATCH 05/12] Replaces LocaleProvider with LocaleProviderFactory --- .../com/opensymphony/xwork2/ActionSupport.java | 18 ++++++++++++++---- .../config/impl/DefaultConfiguration.java | 2 +- .../providers/XWorkConfigurationProvider.java | 4 +++- .../conversion/impl/DefaultTypeConverter.java | 4 +++- .../validator/DelegatingValidatorContext.java | 18 +++++++++++++++--- .../org/apache/struts2/StrutsConstants.java | 4 ++++ .../org/apache/struts2/components/I18n.java | 5 +++-- .../config/DefaultBeanSelectionProvider.java | 12 +++++++++--- .../apache/struts2/dispatcher/Dispatcher.java | 13 ++++++++++--- .../multipart/AbstractMultiPartRequest.java | 8 +++----- .../interceptor/FileUploadInterceptor.java | 3 ++- .../struts2/interceptor/I18nInterceptor.java | 5 +++-- core/src/main/resources/struts-default.xml | 2 +- .../tiles/StrutsTilesLocaleResolver.java | 5 +++-- 14 files changed, 74 insertions(+), 29 deletions(-) diff --git a/core/src/main/java/com/opensymphony/xwork2/ActionSupport.java b/core/src/main/java/com/opensymphony/xwork2/ActionSupport.java index bb7048f0e8..ea4be0d4f1 100644 --- a/core/src/main/java/com/opensymphony/xwork2/ActionSupport.java +++ b/core/src/main/java/com/opensymphony/xwork2/ActionSupport.java @@ -19,6 +19,7 @@ import com.opensymphony.xwork2.inject.Inject; import com.opensymphony.xwork2.interceptor.ValidationAware; import com.opensymphony.xwork2.util.ValueStack; +import net.sf.cglib.core.Local; import java.io.Serializable; import java.util.*; @@ -32,6 +33,7 @@ public class ActionSupport implements Action, Validateable, ValidationAware, Tex private final ValidationAwareSupport validationAware = new ValidationAwareSupport(); private transient TextProvider textProvider; + private transient LocaleProvider localeProvider; protected Container container; @@ -61,17 +63,17 @@ public Map> getFieldErrors() { @Override public Locale getLocale() { - return container.getInstance(LocaleProvider.class).getLocale(); + return getLocaleProvider().getLocale(); } @Override public boolean isValidLocaleString(String localeStr) { - return container.getInstance(LocaleProvider.class).isValidLocaleString(localeStr); + return getLocaleProvider().isValidLocaleString(localeStr); } @Override public boolean isValidLocale(Locale locale) { - return container.getInstance(LocaleProvider.class).isValidLocale(locale); + return getLocaleProvider().isValidLocale(locale); } public boolean hasKey(String key) { @@ -272,7 +274,7 @@ public void pause(String result) { * * @return reference to field with TextProvider */ - private TextProvider getTextProvider() { + protected TextProvider getTextProvider() { if (textProvider == null) { TextProviderFactory tpf = container.inject(TextProviderFactory.class); textProvider = tpf.createInstance(getClass()); @@ -280,6 +282,14 @@ private TextProvider getTextProvider() { return textProvider; } + protected LocaleProvider getLocaleProvider() { + if (localeProvider == null) { + LocaleProviderFactory localeProviderFactory = container.getInstance(LocaleProviderFactory.class); + localeProvider = localeProviderFactory.createLocaleProvider(); + } + return localeProvider; + } + @Inject public void setContainer(Container container) { this.container = container; 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 358eb5c59a..c7c5a92775 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 @@ -264,7 +264,7 @@ 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(LocaleProviderFactory.class, DefaultLocaleProviderFactory.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/config/providers/XWorkConfigurationProvider.java b/core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java index 853f50ed03..5c912e1fce 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 @@ -2,6 +2,8 @@ import com.opensymphony.xwork2.ActionProxyFactory; import com.opensymphony.xwork2.DefaultActionProxyFactory; +import com.opensymphony.xwork2.DefaultLocaleProviderFactory; +import com.opensymphony.xwork2.LocaleProviderFactory; import com.opensymphony.xwork2.TextProviderFactory; import com.opensymphony.xwork2.factory.DefaultUnknownHandlerFactory; import com.opensymphony.xwork2.factory.UnknownHandlerFactory; @@ -186,7 +188,7 @@ public void register(ContainerBuilder builder, LocatableProperties props) .factory(TextProvider.class, "system", DefaultTextProvider.class, Scope.SINGLETON) .factory(TextProvider.class, TextProviderSupport.class, Scope.SINGLETON) - .factory(LocaleProvider.class, DefaultLocaleProvider.class, Scope.SINGLETON) + .factory(LocaleProviderFactory.class, DefaultLocaleProviderFactory.class, Scope.SINGLETON) .factory(OgnlUtil.class, Scope.SINGLETON) .factory(CollectionConverter.class, Scope.SINGLETON) .factory(ArrayConverter.class, Scope.SINGLETON) diff --git a/core/src/main/java/com/opensymphony/xwork2/conversion/impl/DefaultTypeConverter.java b/core/src/main/java/com/opensymphony/xwork2/conversion/impl/DefaultTypeConverter.java index 8b3a9a6af1..f191680c58 100644 --- a/core/src/main/java/com/opensymphony/xwork2/conversion/impl/DefaultTypeConverter.java +++ b/core/src/main/java/com/opensymphony/xwork2/conversion/impl/DefaultTypeConverter.java @@ -32,6 +32,7 @@ import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.LocaleProvider; +import com.opensymphony.xwork2.LocaleProviderFactory; import com.opensymphony.xwork2.conversion.TypeConverter; import com.opensymphony.xwork2.inject.Container; import com.opensymphony.xwork2.inject.Inject; @@ -349,7 +350,8 @@ protected Locale getLocale(Map context) { locale = (Locale) context.get(ActionContext.LOCALE); } if (locale == null) { - locale = container.getInstance(LocaleProvider.class).getLocale(); + LocaleProviderFactory localeProviderFactory = container.getInstance(LocaleProviderFactory.class); + locale = localeProviderFactory.createLocaleProvider().getLocale(); } return locale; } 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 90812bdc86..b8921e9162 100644 --- a/core/src/main/java/com/opensymphony/xwork2/validator/DelegatingValidatorContext.java +++ b/core/src/main/java/com/opensymphony/xwork2/validator/DelegatingValidatorContext.java @@ -253,18 +253,30 @@ protected ValidationAware getValidationAware() { * An implementation of LocaleProvider which gets the locale from the action context. */ private static class ActionContextLocaleProvider implements LocaleProvider { + + private LocaleProvider localeProvider; + + private LocaleProvider getLocaleProvider() { + if (localeProvider == null) { + LocaleProviderFactory localeProviderFactory = ActionContext.getContext().getInstance(LocaleProviderFactory.class); + localeProvider = localeProviderFactory.createLocaleProvider(); + } + return localeProvider; + } + + @Override public Locale getLocale() { - return ActionContext.getContext().getInstance(LocaleProvider.class).getLocale(); + return getLocaleProvider().getLocale(); } @Override public boolean isValidLocaleString(String localeStr) { - return ActionContext.getContext().getInstance(LocaleProvider.class).isValidLocaleString(localeStr); + return getLocaleProvider().isValidLocaleString(localeStr); } @Override public boolean isValidLocale(Locale locale) { - return ActionContext.getContext().getInstance(LocaleProvider.class).isValidLocale(locale); + return getLocaleProvider().isValidLocale(locale); } } diff --git a/core/src/main/java/org/apache/struts2/StrutsConstants.java b/core/src/main/java/org/apache/struts2/StrutsConstants.java index 3d898ce9f5..1160d8899f 100644 --- a/core/src/main/java/org/apache/struts2/StrutsConstants.java +++ b/core/src/main/java/org/apache/struts2/StrutsConstants.java @@ -201,8 +201,12 @@ public final class StrutsConstants { public static final String STRUTS_XWORKTEXTPROVIDER = "struts.xworkTextProvider"; /** The {@link com.opensymphony.xwork2.LocaleProvider} implementation class */ + @Deprecated public static final String STRUTS_LOCALE_PROVIDER = "struts.localeProvider"; + /** The {@link com.opensymphony.xwork2.LocaleProviderFactory} implementation class */ + public static final String STRUTS_LOCALE_PROVIDER_FACTORY = "struts.localeProviderFactory"; + /** The name of the parameter to create when mapping an id (used by some action mappers) */ public static final String STRUTS_ID_PARAMETER_NAME = "struts.mapper.idParameterName"; 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 f934a3e6d1..89e38bb886 100644 --- a/core/src/main/java/org/apache/struts2/components/I18n.java +++ b/core/src/main/java/org/apache/struts2/components/I18n.java @@ -24,6 +24,7 @@ import java.io.Writer; import java.util.ResourceBundle; +import com.opensymphony.xwork2.LocaleProviderFactory; import org.apache.struts2.views.annotations.StrutsTag; import org.apache.struts2.views.annotations.StrutsTagAttribute; import org.apache.struts2.StrutsException; @@ -109,8 +110,8 @@ public void setTextProvider(TextProvider textProvider) { } @Inject - public void setLocaleProvider(LocaleProvider localeProvider) { - this.localeProvider = localeProvider; + public void setLocaleProviderFactory(LocaleProviderFactory localeProviderFactory) { + this.localeProvider = localeProviderFactory.createLocaleProvider(); } public boolean start(Writer writer) { 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 a89ae9a378..a72bd11a64 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.LocaleProviderFactory; import com.opensymphony.xwork2.LocalizedTextProvider; import com.opensymphony.xwork2.TextProviderFactory; import com.opensymphony.xwork2.factory.UnknownHandlerFactory; @@ -29,7 +30,6 @@ import com.opensymphony.xwork2.security.ExcludedPatternsChecker; import com.opensymphony.xwork2.FileManager; import com.opensymphony.xwork2.FileManagerFactory; -import com.opensymphony.xwork2.LocaleProvider; import com.opensymphony.xwork2.ObjectFactory; import com.opensymphony.xwork2.TextProvider; import com.opensymphony.xwork2.UnknownHandlerManager; @@ -221,7 +221,13 @@ * com.opensymphony.xwork2.LocaleProvider * struts.localeProvider * singleton - * Allows provide custom TextProvider for whole application + * DEPRECATED! Allows provide custom TextProvider for whole application + * + * + * com.opensymphony.xwork2.LocaleProviderFactory + * struts.localeProviderFactory + * singleton + * Allows provide custom LocaleProvider for whole application * * * org.apache.struts2.components.UrlRenderer @@ -393,7 +399,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(LocaleProviderFactory.class, StrutsConstants.STRUTS_LOCALE_PROVIDER_FACTORY, builder, props); alias(LocalizedTextProvider.class, StrutsConstants.STRUTS_LOCALIZED_TEXT_PROVIDER, builder, props); alias(ActionProxyFactory.class, StrutsConstants.STRUTS_ACTIONPROXYFACTORY, 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 047238fd5b..b7714be72c 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java @@ -783,9 +783,16 @@ public HttpServletRequest wrapRequest(HttpServletRequest request) throws IOExcep String content_type = request.getContentType(); if (content_type != null && content_type.contains("multipart/form-data")) { - MultiPartRequest mpr = getMultiPartRequest(); - LocaleProvider provider = getContainer().getInstance(LocaleProvider.class); - request = new MultiPartRequestWrapper(mpr, request, getSaveDir(), provider, disableRequestAttributeValueStackLookup); + MultiPartRequest multiPartRequest = getMultiPartRequest(); + LocaleProviderFactory localeProviderFactory = getContainer().getInstance(LocaleProviderFactory.class); + + request = new MultiPartRequestWrapper( + multiPartRequest, + request, + getSaveDir(), + localeProviderFactory.createLocaleProvider(), + disableRequestAttributeValueStackLookup + ); } else { request = new StrutsRequestWrapper(request, disableRequestAttributeValueStackLookup); } diff --git a/core/src/main/java/org/apache/struts2/dispatcher/multipart/AbstractMultiPartRequest.java b/core/src/main/java/org/apache/struts2/dispatcher/multipart/AbstractMultiPartRequest.java index 6c3f1f3053..cc205232c3 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/multipart/AbstractMultiPartRequest.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/multipart/AbstractMultiPartRequest.java @@ -1,6 +1,7 @@ package org.apache.struts2.dispatcher.multipart; import com.opensymphony.xwork2.LocaleProvider; +import com.opensymphony.xwork2.LocaleProviderFactory; import com.opensymphony.xwork2.inject.Inject; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -70,12 +71,9 @@ public void setMaxSize(String maxSize) { this.maxSize = Long.parseLong(maxSize); } - /** - * @param provider Injects the Struts locale provider. - */ @Inject - public void setLocaleProvider(LocaleProvider provider) { - defaultLocale = provider.getLocale(); + public void setLocaleProviderFactory(LocaleProviderFactory localeProviderFactory) { + defaultLocale = localeProviderFactory.createLocaleProvider().getLocale(); } /** diff --git a/core/src/main/java/org/apache/struts2/interceptor/FileUploadInterceptor.java b/core/src/main/java/org/apache/struts2/interceptor/FileUploadInterceptor.java index a428b53c8e..b00f2e3a24 100644 --- a/core/src/main/java/org/apache/struts2/interceptor/FileUploadInterceptor.java +++ b/core/src/main/java/org/apache/struts2/interceptor/FileUploadInterceptor.java @@ -455,7 +455,8 @@ private LocaleProvider getLocaleProvider(Object action) { if (action instanceof LocaleProvider) { localeProvider = (LocaleProvider) action; } else { - localeProvider = container.getInstance(LocaleProvider.class); + LocaleProviderFactory localeProviderFactory = container.getInstance(LocaleProviderFactory.class); + localeProvider = localeProviderFactory.createLocaleProvider(); } return localeProvider; } 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 4b6c8f559c..f97176f84a 100644 --- a/core/src/main/java/org/apache/struts2/interceptor/I18nInterceptor.java +++ b/core/src/main/java/org/apache/struts2/interceptor/I18nInterceptor.java @@ -22,6 +22,7 @@ import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.LocaleProvider; +import com.opensymphony.xwork2.LocaleProviderFactory; import com.opensymphony.xwork2.inject.Inject; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; import com.opensymphony.xwork2.util.DefaultLocalizedTextProvider; @@ -93,8 +94,8 @@ public void setLocaleStorage(String storageName) { } @Inject - public void setLocaleProvider(LocaleProvider localeProvider) { - this.localeProvider = localeProvider; + public void setLocaleProviderFactory(LocaleProviderFactory localeProviderFactory) { + this.localeProvider = localeProviderFactory.createLocaleProvider(); } @Override diff --git a/core/src/main/resources/struts-default.xml b/core/src/main/resources/struts-default.xml index 1f516b7cb9..3a4f6ee9a7 100644 --- a/core/src/main/resources/struts-default.xml +++ b/core/src/main/resources/struts-default.xml @@ -133,7 +133,7 @@ - + diff --git a/plugins/tiles/src/main/java/org/apache/struts2/tiles/StrutsTilesLocaleResolver.java b/plugins/tiles/src/main/java/org/apache/struts2/tiles/StrutsTilesLocaleResolver.java index 2c0ef9d669..e75cd48411 100644 --- a/plugins/tiles/src/main/java/org/apache/struts2/tiles/StrutsTilesLocaleResolver.java +++ b/plugins/tiles/src/main/java/org/apache/struts2/tiles/StrutsTilesLocaleResolver.java @@ -21,6 +21,7 @@ import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.LocaleProvider; +import com.opensymphony.xwork2.LocaleProviderFactory; import com.opensymphony.xwork2.config.ConfigurationException; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -46,9 +47,9 @@ public Locale resolveLocale(Request request) { throw new ConfigurationException("There is no ActionContext for current request!"); } - LocaleProvider provider = ctx.getInstance(LocaleProvider.class); + LocaleProviderFactory localeProviderFactory = ctx.getInstance(LocaleProviderFactory.class); - return provider.getLocale(); + return localeProviderFactory.createLocaleProvider().getLocale(); } } From f912dab8f3c77ef9667370c57cf8d35cf0cf4a32 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Wed, 15 Mar 2017 09:18:24 +0100 Subject: [PATCH 06/12] Fixes test --- .../org/apache/struts2/interceptor/I18nInterceptorTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/test/java/org/apache/struts2/interceptor/I18nInterceptorTest.java b/core/src/test/java/org/apache/struts2/interceptor/I18nInterceptorTest.java index d8c5944d05..4bbaa466db 100644 --- a/core/src/test/java/org/apache/struts2/interceptor/I18nInterceptorTest.java +++ b/core/src/test/java/org/apache/struts2/interceptor/I18nInterceptorTest.java @@ -24,6 +24,7 @@ import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.DefaultLocaleProvider; +import com.opensymphony.xwork2.DefaultLocaleProviderFactory; import com.opensymphony.xwork2.mock.MockActionInvocation; import com.opensymphony.xwork2.mock.MockActionProxy; import junit.framework.TestCase; @@ -217,7 +218,7 @@ private void prepare(String key, Serializable value) { public void setUp() throws Exception { interceptor = new I18nInterceptor(); - interceptor.setLocaleProvider(new DefaultLocaleProvider()); + interceptor.setLocaleProviderFactory(new DefaultLocaleProviderFactory()); interceptor.init(); session = new HashMap(); From 47382411d79cddd65bc7c755b60f01fa1cf057ea Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Wed, 15 Mar 2017 18:55:26 +0100 Subject: [PATCH 07/12] Drops unused import --- core/src/main/java/com/opensymphony/xwork2/ActionSupport.java | 1 - 1 file changed, 1 deletion(-) diff --git a/core/src/main/java/com/opensymphony/xwork2/ActionSupport.java b/core/src/main/java/com/opensymphony/xwork2/ActionSupport.java index ea4be0d4f1..0434469dd9 100644 --- a/core/src/main/java/com/opensymphony/xwork2/ActionSupport.java +++ b/core/src/main/java/com/opensymphony/xwork2/ActionSupport.java @@ -19,7 +19,6 @@ import com.opensymphony.xwork2.inject.Inject; import com.opensymphony.xwork2.interceptor.ValidationAware; import com.opensymphony.xwork2.util.ValueStack; -import net.sf.cglib.core.Local; import java.io.Serializable; import java.util.*; From c815f5c54d8ba163b860ec70d3c6de44c8f6c4d8 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Wed, 15 Mar 2017 18:56:31 +0100 Subject: [PATCH 08/12] Updates JavaDoc --- .../java/com/opensymphony/xwork2/LocaleProviderFactory.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/com/opensymphony/xwork2/LocaleProviderFactory.java b/core/src/main/java/com/opensymphony/xwork2/LocaleProviderFactory.java index dc2e7dda63..930418d9f5 100644 --- a/core/src/main/java/com/opensymphony/xwork2/LocaleProviderFactory.java +++ b/core/src/main/java/com/opensymphony/xwork2/LocaleProviderFactory.java @@ -23,9 +23,9 @@ public interface LocaleProviderFactory { /** - * Gets the provided locale. + * Create a new instance of {@link LocaleProvider}. * - * @return the locale. + * @return the localeProvider. */ LocaleProvider createLocaleProvider(); From 5452f5664876981dcb537d1dc18db8b2b5781757 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Wed, 15 Mar 2017 18:58:42 +0100 Subject: [PATCH 09/12] Adds proper deprecation explanation --- core/src/main/java/org/apache/struts2/StrutsConstants.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/apache/struts2/StrutsConstants.java b/core/src/main/java/org/apache/struts2/StrutsConstants.java index 1160d8899f..a868eddcf6 100644 --- a/core/src/main/java/org/apache/struts2/StrutsConstants.java +++ b/core/src/main/java/org/apache/struts2/StrutsConstants.java @@ -200,7 +200,10 @@ public final class StrutsConstants { /** XWork default text provider */ public static final String STRUTS_XWORKTEXTPROVIDER = "struts.xworkTextProvider"; - /** The {@link com.opensymphony.xwork2.LocaleProvider} implementation class */ + /** + * The {@link com.opensymphony.xwork2.LocaleProvider} implementation class + * @deprecated use {@link StrutsConstants#STRUTS_LOCALE_PROVIDER_FACTORY} instead + */ @Deprecated public static final String STRUTS_LOCALE_PROVIDER = "struts.localeProvider"; From 82983713aee8cb64cac06fde41a9ed72bf5b46e6 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Wed, 15 Mar 2017 18:59:55 +0100 Subject: [PATCH 10/12] Adds info about what other extension point to use --- .../org/apache/struts2/config/DefaultBeanSelectionProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 a72bd11a64..f77f8aedc9 100644 --- a/core/src/main/java/org/apache/struts2/config/DefaultBeanSelectionProvider.java +++ b/core/src/main/java/org/apache/struts2/config/DefaultBeanSelectionProvider.java @@ -221,7 +221,7 @@ * com.opensymphony.xwork2.LocaleProvider * struts.localeProvider * singleton - * DEPRECATED! Allows provide custom TextProvider for whole application + * DEPRECATED! Allows provide custom TextProvider for whole application - instead this endpoint use struts.localeProviderFactory * * * com.opensymphony.xwork2.LocaleProviderFactory From 4eb22020a474ffaa69484c8e3dd0711dc517d6e8 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Thu, 16 Mar 2017 08:15:04 +0100 Subject: [PATCH 11/12] Decouples LocaleProvider instance from long living interceptor state --- .../org/apache/struts2/interceptor/I18nInterceptor.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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 f97176f84a..722beb0a74 100644 --- a/core/src/main/java/org/apache/struts2/interceptor/I18nInterceptor.java +++ b/core/src/main/java/org/apache/struts2/interceptor/I18nInterceptor.java @@ -59,7 +59,7 @@ public class I18nInterceptor extends AbstractInterceptor { protected String requestCookieParameterName = DEFAULT_COOKIE_PARAMETER; protected Storage storage = Storage.SESSION; - protected LocaleProvider localeProvider; + protected LocaleProviderFactory localeProviderFactory; // Request-Only = None protected enum Storage { COOKIE, SESSION, NONE } @@ -95,7 +95,7 @@ public void setLocaleStorage(String storageName) { @Inject public void setLocaleProviderFactory(LocaleProviderFactory localeProviderFactory) { - this.localeProvider = localeProviderFactory.createLocaleProvider(); + this.localeProviderFactory = localeProviderFactory; } @Override @@ -157,6 +157,8 @@ protected LocaleHandler getLocaleHandler(ActionInvocation invocation) { * @return the Locale */ protected Locale getLocaleFromParam(Object requestedLocale) { + LocaleProvider localeProvider = localeProviderFactory.createLocaleProvider(); + Locale locale = null; if (requestedLocale != null) { if (requestedLocale instanceof Locale) { From 9d60f5bbc69b87628ac271e380355b2094deb0f3 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Thu, 16 Mar 2017 08:15:48 +0100 Subject: [PATCH 12/12] Adds missing annotation --- .../main/java/com/opensymphony/xwork2/DefaultLocaleProvider.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/main/java/com/opensymphony/xwork2/DefaultLocaleProvider.java b/core/src/main/java/com/opensymphony/xwork2/DefaultLocaleProvider.java index f28ef03ecc..19c8f5dc2c 100644 --- a/core/src/main/java/com/opensymphony/xwork2/DefaultLocaleProvider.java +++ b/core/src/main/java/com/opensymphony/xwork2/DefaultLocaleProvider.java @@ -14,6 +14,7 @@ public class DefaultLocaleProvider implements LocaleProvider { private final static Logger LOG = LogManager.getLogger(DefaultLocaleProvider.class); + @Override public Locale getLocale() { ActionContext ctx = ActionContext.getContext(); if (ctx != null) {