Author: lukaszlenart Date: Sat Jul 21 11:15:34 2012 New Revision: 1364066 URL: http://svn.apache.org/viewvc?rev=1364066&view=rev Log: WW-3552 adds usage of TextProvider to allow provide user's implementation
Added: struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/DefaultLocaleProvider.java Removed: struts/struts2/trunk/core/src/test/resources/org/apache/struts2/interceptor/ Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/StrutsConstants.java struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/BeanSelectionProvider.java struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/FileUploadInterceptor.java struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/TokenInterceptor.java struts/struts2/trunk/core/src/main/resources/org/apache/struts2/struts-messages.properties struts/struts2/trunk/core/src/main/resources/struts-default.xml struts/struts2/trunk/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/TextProviderFactory.java struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/TextProviderSupport.java struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/StrutsConstants.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/StrutsConstants.java?rev=1364066&r1=1364065&r2=1364066&view=diff ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/StrutsConstants.java (original) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/StrutsConstants.java Sat Jul 21 11:15:34 2012 @@ -194,6 +194,9 @@ public final class StrutsConstants { /** XWork default text provider */ public static final String STRUTS_XWORKTEXTPROVIDER = "struts.xworkTextProvider"; + /** The {@link com.opensymphony.xwork2.LocaleProvider} implementation class */ + public static final String STRUTS_LOCALE_PROVIDER = "struts.localeProvider"; + /** 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"; @@ -239,4 +242,5 @@ public final class StrutsConstants { public static final String STRUTS_CONVERTER_DATE = "struts.converter.date"; public static final String STRUTS_CONVERTER_NUMBER = "struts.converter.number"; public static final String STRUTS_CONVERTER_STRING = "struts.converter.string"; + } Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/BeanSelectionProvider.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/BeanSelectionProvider.java?rev=1364066&r1=1364065&r2=1364066&view=diff ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/BeanSelectionProvider.java (original) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/BeanSelectionProvider.java Sat Jul 21 11:15:34 2012 @@ -24,6 +24,7 @@ package org.apache.struts2.config; import com.opensymphony.xwork2.ActionProxyFactory; 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; @@ -180,6 +181,12 @@ import java.util.StringTokenizer; * <td>Allows provide custom TextProvider for whole application</td> * </tr> * <tr> + * <td>com.opensymphony.xwork2.LocaleProvider</td> + * <td>struts.localeProvider</td> + * <td>singleton</td> + * <td>Allows provide custom TextProvider for whole application</td> + * </tr> + * <tr> * <td>org.apache.struts2.components.UrlRenderer</td> * <td>struts.urlRenderer</td> * <td>singleton</td> @@ -282,6 +289,7 @@ public class BeanSelectionProvider imple alias(FileManagerFactory.class, StrutsConstants.STRUTS_FILE_MANAGER_FACTORY, builder, props); alias(XWorkConverter.class, StrutsConstants.STRUTS_XWORKCONVERTER, builder, props); alias(TextProvider.class, StrutsConstants.STRUTS_XWORKTEXTPROVIDER, builder, props, Scope.DEFAULT); + alias(LocaleProvider.class, StrutsConstants.STRUTS_LOCALE_PROVIDER, builder, props); alias(ActionProxyFactory.class, StrutsConstants.STRUTS_ACTIONPROXYFACTORY, builder, props); alias(ObjectTypeDeterminer.class, StrutsConstants.STRUTS_OBJECTTYPEDETERMINER, builder, props); alias(ActionMapper.class, StrutsConstants.STRUTS_MAPPER_CLASS, builder, props); Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/FileUploadInterceptor.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/FileUploadInterceptor.java?rev=1364066&r1=1364065&r2=1364066&view=diff ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/FileUploadInterceptor.java (original) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/FileUploadInterceptor.java Sat Jul 21 11:15:34 2012 @@ -24,10 +24,13 @@ package org.apache.struts2.interceptor; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.ActionProxy; +import com.opensymphony.xwork2.LocaleProvider; +import com.opensymphony.xwork2.TextProvider; +import com.opensymphony.xwork2.TextProviderFactory; import com.opensymphony.xwork2.ValidationAware; +import com.opensymphony.xwork2.inject.Container; import com.opensymphony.xwork2.inject.Inject; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; -import com.opensymphony.xwork2.util.LocalizedTextUtil; import com.opensymphony.xwork2.util.PatternMatcher; import com.opensymphony.xwork2.util.TextParseUtil; import com.opensymphony.xwork2.util.logging.Logger; @@ -37,7 +40,14 @@ import org.apache.struts2.dispatcher.mul import javax.servlet.http.HttpServletRequest; import java.io.File; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; /** * <!-- START SNIPPET: description --> @@ -145,27 +155,27 @@ import java.util.*; * <pre> * <!-- START SNIPPET: example-action --> * package com.example; - * <p/> + * * import java.io.File; * import com.opensymphony.xwork2.ActionSupport; - * <p/> + * * public UploadAction extends ActionSupport { * private File file; * private String contentType; * private String filename; - * <p/> + * * public void setUpload(File file) { * this.file = file; * } - * <p/> + * * public void setUploadContentType(String contentType) { * this.contentType = contentType; * } - * <p/> + * * public void setUploadFileName(String filename) { * this.filename = filename; * } - * <p/> + * * public String execute() { * //... * return SUCCESS; @@ -179,23 +189,22 @@ public class FileUploadInterceptor exten private static final long serialVersionUID = -4764627478894962478L; protected static final Logger LOG = LoggerFactory.getLogger(FileUploadInterceptor.class); - private static final String DEFAULT_MESSAGE = "no.message.found"; - - protected boolean useActionMessageBundle; protected Long maximumSize; protected Set<String> allowedTypesSet = Collections.emptySet(); protected Set<String> allowedExtensionsSet = Collections.emptySet(); private PatternMatcher matcher; + private Container container; @Inject public void setMatcher(PatternMatcher matcher) { this.matcher = matcher; } - public void setUseActionMessageBundle(String value) { - this.useActionMessageBundle = Boolean.valueOf(value); + @Inject + public void setContainer(Container container) { + this.container = container; } /** @@ -237,7 +246,7 @@ public class FileUploadInterceptor exten if (!(request instanceof MultiPartRequestWrapper)) { if (LOG.isDebugEnabled()) { ActionProxy proxy = invocation.getProxy(); - LOG.debug(getTextMessage("struts.messages.bypass.request", new Object[]{proxy.getNamespace(), proxy.getActionName()}, ac.getLocale())); + LOG.debug(getTextMessage("struts.messages.bypass.request", new String[]{proxy.getNamespace(), proxy.getActionName()})); } return invocation.invoke(); @@ -289,7 +298,7 @@ public class FileUploadInterceptor exten String fileNameName = inputName + "FileName"; for (int index = 0; index < files.length; index++) { - if (acceptFile(action, files[index], fileName[index], contentType[index], inputName, validation, ac.getLocale())) { + if (acceptFile(action, files[index], fileName[index], contentType[index], inputName, validation)) { acceptedFiles.add(files[index]); acceptedContentTypes.add(contentType[index]); acceptedFileNames.add(fileName[index]); @@ -306,12 +315,12 @@ public class FileUploadInterceptor exten } } else { if (LOG.isWarnEnabled()) { - LOG.warn(getTextMessage(action, "struts.messages.invalid.file", new Object[]{inputName}, ac.getLocale())); + LOG.warn(getTextMessage(action, "struts.messages.invalid.file", new String[]{inputName})); } } } else { if (LOG.isWarnEnabled()) { - LOG.warn(getTextMessage(action, "struts.messages.invalid.content.type", new Object[]{inputName}, ac.getLocale())); + LOG.warn(getTextMessage(action, "struts.messages.invalid.content.type", new String[]{inputName})); } } } @@ -329,48 +338,47 @@ public class FileUploadInterceptor exten * @param inputName - inputName of the file. * @param validation - Non-null ValidationAware if the action implements ValidationAware, allowing for better * logging. - * @param locale * @return true if the proposed file is acceptable by contentType and size. */ - protected boolean acceptFile(Object action, File file, String filename, String contentType, String inputName, ValidationAware validation, Locale locale) { + protected boolean acceptFile(Object action, File file, String filename, String contentType, String inputName, ValidationAware validation) { boolean fileIsAcceptable = false; // If it's null the upload failed if (file == null) { - String errMsg = getTextMessage(action, "struts.messages.error.uploading", new Object[]{inputName}, locale); + String errMsg = getTextMessage(action, "struts.messages.error.uploading", new String[]{inputName}); if (validation != null) { validation.addFieldError(inputName, errMsg); } if (LOG.isWarnEnabled()) { - LOG.warn(errMsg); + LOG.warn(errMsg); } } else if (maximumSize != null && maximumSize < file.length()) { - String errMsg = getTextMessage(action, "struts.messages.error.file.too.large", new Object[]{inputName, filename, file.getName(), "" + file.length()}, locale); + String errMsg = getTextMessage(action, "struts.messages.error.file.too.large", new String[]{inputName, filename, file.getName(), "" + file.length()}); if (validation != null) { validation.addFieldError(inputName, errMsg); } if (LOG.isWarnEnabled()) { - LOG.warn(errMsg); + LOG.warn(errMsg); } } else if ((!allowedTypesSet.isEmpty()) && (!containsItem(allowedTypesSet, contentType))) { - String errMsg = getTextMessage(action, "struts.messages.error.content.type.not.allowed", new Object[]{inputName, filename, file.getName(), contentType}, locale); + String errMsg = getTextMessage(action, "struts.messages.error.content.type.not.allowed", new String[]{inputName, filename, file.getName(), contentType}); if (validation != null) { validation.addFieldError(inputName, errMsg); } if (LOG.isWarnEnabled()) { - LOG.warn(errMsg); + LOG.warn(errMsg); } } else if ((!allowedExtensionsSet.isEmpty()) && (!hasAllowedExtension(allowedExtensionsSet, filename))) { - String errMsg = getTextMessage(action, "struts.messages.error.file.extension.not.allowed", new Object[]{inputName, filename, file.getName(), contentType}, locale); + String errMsg = getTextMessage(action, "struts.messages.error.file.extension.not.allowed", new String[]{inputName, filename, file.getName(), contentType}); if (validation != null) { validation.addFieldError(inputName, errMsg); } if (LOG.isWarnEnabled()) { - LOG.warn(errMsg); + LOG.warn(errMsg); } } else { fileIsAcceptable = true; @@ -426,21 +434,34 @@ public class FileUploadInterceptor exten return result; } - private String getTextMessage(String messageKey, Object[] args, Locale locale) { - return getTextMessage(null, messageKey, args, locale); + protected String getTextMessage(String messageKey, String[] args) { + return getTextMessage(this, messageKey, args); } - private String getTextMessage(Object action, String messageKey, Object[] args, Locale locale) { - if (args == null || args.length == 0) { - if (action != null && useActionMessageBundle) { - return LocalizedTextUtil.findText(action.getClass(), messageKey, locale); - } - return LocalizedTextUtil.findText(this.getClass(), messageKey, locale); + protected String getTextMessage(Object action, String messageKey, String[] args) { + if (action instanceof TextProvider) { + return ((TextProvider) action).getText(messageKey, args); + } + return getTextProvider(action).getText(messageKey, args); + } + + private TextProvider getTextProvider(Object action) { + TextProviderFactory tpf = new TextProviderFactory(); + if (container != null) { + container.inject(tpf); + } + LocaleProvider localeProvider = getLocaleProvider(action); + return tpf.createInstance(action.getClass(), localeProvider); + } + + private LocaleProvider getLocaleProvider(Object action) { + LocaleProvider localeProvider; + if (action instanceof LocaleProvider) { + localeProvider = (LocaleProvider) action; } else { - if (action != null && useActionMessageBundle) { - return LocalizedTextUtil.findText(action.getClass(), messageKey, locale, DEFAULT_MESSAGE, args); - } - return LocalizedTextUtil.findText(this.getClass(), messageKey, locale, DEFAULT_MESSAGE, args); + localeProvider = container.getInstance(LocaleProvider.class); } + return localeProvider; } + } Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/TokenInterceptor.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/TokenInterceptor.java?rev=1364066&r1=1364065&r2=1364066&view=diff ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/TokenInterceptor.java (original) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/TokenInterceptor.java Sat Jul 21 11:15:34 2012 @@ -22,9 +22,10 @@ package org.apache.struts2.interceptor; import com.opensymphony.xwork2.ActionInvocation; +import com.opensymphony.xwork2.TextProvider; import com.opensymphony.xwork2.ValidationAware; +import com.opensymphony.xwork2.inject.Inject; import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor; -import com.opensymphony.xwork2.util.LocalizedTextUtil; import org.apache.struts2.ServletActionContext; import org.apache.struts2.util.TokenHelper; @@ -120,6 +121,16 @@ public class TokenInterceptor extends Me public static final String INVALID_TOKEN_CODE = "invalid.token"; + private static final String INVALID_TOKEN_MESSAGE_KEY = "struts.messages.invalid.token"; + private static final String DEFAULT_ERROR_MESSAGE = "The form has already been processed or no token was supplied, please try again."; + + private TextProvider textProvider; + + @Inject + public void setTextProvider(TextProvider textProvider) { + this.textProvider = textProvider; + } + /** * @see com.opensymphony.xwork2.interceptor.MethodFilterInterceptor#doIntercept(com.opensymphony.xwork2.ActionInvocation) */ @@ -149,9 +160,7 @@ public class TokenInterceptor extends Me */ protected String handleInvalidToken(ActionInvocation invocation) throws Exception { Object action = invocation.getAction(); - String errorMessage = LocalizedTextUtil.findText(this.getClass(), "struts.messages.invalid.token", - invocation.getInvocationContext().getLocale(), - "The form has already been processed or no token was supplied, please try again.", new Object[0]); + String errorMessage = getErrorMessage(invocation); if (action instanceof ValidationAware) { ((ValidationAware) action).addActionError(errorMessage); @@ -162,6 +171,14 @@ public class TokenInterceptor extends Me return INVALID_TOKEN_CODE; } + protected String getErrorMessage(ActionInvocation invocation) { + Object action = invocation.getAction(); + if (action instanceof TextProvider) { + return ((TextProvider) action).getText(INVALID_TOKEN_MESSAGE_KEY, DEFAULT_ERROR_MESSAGE); + } + return textProvider.getText(INVALID_TOKEN_MESSAGE_KEY, DEFAULT_ERROR_MESSAGE); + } + /** * Called when a valid token is found. This method invokes the action by can be changed to do something more * interesting. Modified: struts/struts2/trunk/core/src/main/resources/org/apache/struts2/struts-messages.properties URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/resources/org/apache/struts2/struts-messages.properties?rev=1364066&r1=1364065&r2=1364066&view=diff ============================================================================== --- struts/struts2/trunk/core/src/main/resources/org/apache/struts2/struts-messages.properties (original) +++ struts/struts2/trunk/core/src/main/resources/org/apache/struts2/struts-messages.properties Sat Jul 21 11:15:34 2012 @@ -27,7 +27,7 @@ struts.messages.invalid.file=Could not f struts.messages.invalid.content.type=Could not find a Content-Type for {0}. Verify that a valid file was submitted. struts.messages.removing.file=Removing file {0} {1} struts.messages.error.uploading=Error uploading: {0} -struts.messages.error.file.too.large=File too large: {0} "{1}" "{2}" {3} +struts.messages.error.file.too.large=The file is to large to be uploaded: {0} "{1}" "{2}" {3} struts.messages.error.content.type.not.allowed=Content-Type not allowed: {0} "{1}" "{2}" {3} struts.messages.error.file.extension.not.allowed=File extension not allowed: {0} "{1}" "{2}" {3} Modified: struts/struts2/trunk/core/src/main/resources/struts-default.xml URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/resources/struts-default.xml?rev=1364066&r1=1364065&r2=1364066&view=diff ============================================================================== --- struts/struts2/trunk/core/src/main/resources/struts-default.xml (original) +++ struts/struts2/trunk/core/src/main/resources/struts-default.xml Sat Jul 21 11:15:34 2012 @@ -74,6 +74,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.TextProvider" name="struts" class="com.opensymphony.xwork2.TextProviderSupport" scope="default" /> + <bean type="com.opensymphony.xwork2.LocaleProvider" name="struts" class="com.opensymphony.xwork2.DefaultLocaleProvider" scope="singleton" /> <bean type="org.apache.struts2.components.UrlRenderer" name="struts" class="org.apache.struts2.components.ServletUrlRenderer"/> <bean type="org.apache.struts2.views.util.UrlHelper" name="struts" class="org.apache.struts2.views.util.DefaultUrlHelper"/> Modified: struts/struts2/trunk/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java?rev=1364066&r1=1364065&r2=1364066&view=diff ============================================================================== --- struts/struts2/trunk/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java (original) +++ struts/struts2/trunk/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java Sat Jul 21 11:15:34 2012 @@ -29,6 +29,7 @@ import com.opensymphony.xwork2.util.Clas import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.struts2.ServletActionContext; import org.apache.struts2.StrutsTestCase; +import org.apache.struts2.TestAction; import org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest; import org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper; import org.springframework.mock.web.MockHttpServletRequest; @@ -40,7 +41,6 @@ import java.net.URI; import java.net.URL; import java.util.HashMap; import java.util.List; -import java.util.Locale; import java.util.Map; @@ -51,11 +51,12 @@ public class FileUploadInterceptorTest e private FileUploadInterceptor interceptor; private File tempDir; + private TestAction action; public void testAcceptFileWithEmptyAllowedTypesAndExtensions() throws Exception { // when allowed type is empty ValidationAwareSupport validation = new ValidationAwareSupport(); - boolean ok = interceptor.acceptFile(null, new File(""), "filename", "text/plain", "inputName", validation, Locale.getDefault()); + boolean ok = interceptor.acceptFile(action, new File(""), "filename", "text/plain", "inputName", validation); assertTrue(ok); assertTrue(validation.getFieldErrors().isEmpty()); @@ -67,7 +68,7 @@ public class FileUploadInterceptorTest e // when file is of allowed types ValidationAwareSupport validation = new ValidationAwareSupport(); - boolean ok = interceptor.acceptFile(null, new File(""), "filename.txt", "text/plain", "inputName", validation, Locale.getDefault()); + boolean ok = interceptor.acceptFile(action, new File(""), "filename.txt", "text/plain", "inputName", validation); assertTrue(ok); assertTrue(validation.getFieldErrors().isEmpty()); @@ -75,7 +76,7 @@ public class FileUploadInterceptorTest e // when file is not of allowed types validation = new ValidationAwareSupport(); - boolean notOk = interceptor.acceptFile(null, new File(""), "filename.html", "text/html", "inputName", validation, Locale.getDefault()); + boolean notOk = interceptor.acceptFile(action, new File(""), "filename.html", "text/html", "inputName", validation); assertFalse(notOk); assertFalse(validation.getFieldErrors().isEmpty()); @@ -87,7 +88,7 @@ public class FileUploadInterceptorTest e interceptor.setAllowedTypes("text/*"); ValidationAwareSupport validation = new ValidationAwareSupport(); - boolean ok = interceptor.acceptFile(null, new File(""), "filename.txt", "text/plain", "inputName", validation, Locale.getDefault()); + boolean ok = interceptor.acceptFile(action, new File(""), "filename.txt", "text/plain", "inputName", validation); assertTrue(ok); assertTrue(validation.getFieldErrors().isEmpty()); @@ -95,7 +96,7 @@ public class FileUploadInterceptorTest e interceptor.setAllowedTypes("text/h*"); validation = new ValidationAwareSupport(); - boolean notOk = interceptor.acceptFile(null, new File(""), "filename.html", "text/plain", "inputName", validation, Locale.getDefault()); + boolean notOk = interceptor.acceptFile(action, new File(""), "filename.html", "text/plain", "inputName", validation); assertFalse(notOk); assertFalse(validation.getFieldErrors().isEmpty()); @@ -107,7 +108,7 @@ public class FileUploadInterceptorTest e // when file is of allowed extensions ValidationAwareSupport validation = new ValidationAwareSupport(); - boolean ok = interceptor.acceptFile(null, new File(""), "filename.txt", "text/plain", "inputName", validation, Locale.getDefault()); + boolean ok = interceptor.acceptFile(action, new File(""), "filename.txt", "text/plain", "inputName", validation); assertTrue(ok); assertTrue(validation.getFieldErrors().isEmpty()); @@ -115,7 +116,7 @@ public class FileUploadInterceptorTest e // when file is not of allowed extensions validation = new ValidationAwareSupport(); - boolean notOk = interceptor.acceptFile(null, new File(""), "filename.html", "text/html", "inputName", validation, Locale.getDefault()); + boolean notOk = interceptor.acceptFile(action, new File(""), "filename.html", "text/html", "inputName", validation); assertFalse(notOk); assertFalse(validation.getFieldErrors().isEmpty()); @@ -124,7 +125,7 @@ public class FileUploadInterceptorTest e //test with multiple extensions interceptor.setAllowedExtensions(".txt,.lol"); validation = new ValidationAwareSupport(); - ok = interceptor.acceptFile(null, new File(""), "filename.lol", "text/plain", "inputName", validation, Locale.getDefault()); + ok = interceptor.acceptFile(action, new File(""), "filename.lol", "text/plain", "inputName", validation); assertTrue(ok); assertTrue(validation.getFieldErrors().isEmpty()); @@ -137,7 +138,7 @@ public class FileUploadInterceptorTest e // when file is not of allowed types ValidationAwareSupport validation = new ValidationAwareSupport(); - boolean notOk = interceptor.acceptFile(null, null, "filename.html", "text/html", "inputName", validation, Locale.getDefault()); + boolean notOk = interceptor.acceptFile(action, null, "filename.html", "text/html", "inputName", validation); assertFalse(notOk); assertFalse(validation.getFieldErrors().isEmpty()); @@ -159,7 +160,7 @@ public class FileUploadInterceptorTest e URL url = ClassLoaderUtil.getResource("log4j.properties", FileUploadInterceptorTest.class); File file = new File(new URI(url.toString())); assertTrue("log4j.properties should be in src/test folder", file.exists()); - boolean notOk = interceptor.acceptFile(null, file, "filename", "text/html", "inputName", validation, Locale.getDefault()); + boolean notOk = interceptor.acceptFile(action, file, "filename", "text/html", "inputName", validation); assertFalse(notOk); assertFalse(validation.getFieldErrors().isEmpty()); @@ -361,6 +362,7 @@ public class FileUploadInterceptorTest e protected void setUp() throws Exception { super.setUp(); + action = new TestAction(); interceptor = new FileUploadInterceptor(); container.inject(interceptor); tempDir = File.createTempFile("struts", "fileupload"); Added: struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/DefaultLocaleProvider.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/DefaultLocaleProvider.java?rev=1364066&view=auto ============================================================================== --- struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/DefaultLocaleProvider.java (added) +++ struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/DefaultLocaleProvider.java Sat Jul 21 11:15:34 2012 @@ -0,0 +1,27 @@ +package com.opensymphony.xwork2; + +import com.opensymphony.xwork2.util.logging.Logger; +import com.opensymphony.xwork2.util.logging.LoggerFactory; + +import java.util.Locale; + +/** + * Default implementation of {@link LocaleProvider} + */ +public class DefaultLocaleProvider implements LocaleProvider { + + private final static Logger LOG = LoggerFactory.getLogger(DefaultLocaleProvider.class); + + public Locale getLocale() { + ActionContext ctx = ActionContext.getContext(); + if (ctx != null) { + return ctx.getLocale(); + } else { + if (LOG.isDebugEnabled()) { + LOG.debug("Action context not initialized"); + } + return null; + } + } + +} Modified: struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/TextProviderFactory.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/TextProviderFactory.java?rev=1364066&r1=1364065&r2=1364066&view=diff ============================================================================== --- struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/TextProviderFactory.java (original) +++ struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/TextProviderFactory.java Sat Jul 21 11:15:34 2012 @@ -34,16 +34,8 @@ public class TextProviderFactory { this.textProvider = textProvider; } - protected TextProvider getTextProvider() { - if (this.textProvider == null) { - return new TextProviderSupport(); - } else { - return textProvider; - } - } - public TextProvider createInstance(Class clazz, LocaleProvider provider) { - TextProvider instance = getTextProvider(); + TextProvider instance = getTextProvider(clazz, provider); if (instance instanceof ResourceBundleTextProvider) { ((ResourceBundleTextProvider) instance).setClazz(clazz); ((ResourceBundleTextProvider) instance).setLocaleProvider(provider); @@ -52,11 +44,28 @@ public class TextProviderFactory { } public TextProvider createInstance(ResourceBundle bundle, LocaleProvider provider) { - TextProvider instance = getTextProvider(); + TextProvider instance = getTextProvider(bundle, provider); if (instance instanceof ResourceBundleTextProvider) { ((ResourceBundleTextProvider) instance).setBundle(bundle); ((ResourceBundleTextProvider) instance).setLocaleProvider(provider); } return instance; } + + protected TextProvider getTextProvider(Class clazz, LocaleProvider provider) { + if (this.textProvider == null) { + return new TextProviderSupport(clazz, provider); + } else { + return textProvider; + } + } + + private TextProvider getTextProvider(ResourceBundle bundle, LocaleProvider provider) { + if (this.textProvider == null) { + return new TextProviderSupport(bundle, provider); + } else { + return textProvider; + } + } + } Modified: struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/TextProviderSupport.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/TextProviderSupport.java?rev=1364066&r1=1364065&r2=1364066&view=diff ============================================================================== --- struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/TextProviderSupport.java (original) +++ struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/TextProviderSupport.java Sat Jul 21 11:15:34 2012 @@ -15,10 +15,15 @@ */ 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.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Locale; +import java.util.ResourceBundle; /** @@ -79,6 +84,7 @@ public class TextProviderSupport impleme /** * @param localeProvider a locale provider. */ + @Inject public void setLocaleProvider(LocaleProvider localeProvider) { this.localeProvider = localeProvider; } Modified: struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java?rev=1364066&r1=1364065&r2=1364066&view=diff ============================================================================== --- struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java (original) +++ struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java Sat Jul 21 11:15:34 2012 @@ -2,10 +2,12 @@ package com.opensymphony.xwork2.config.p import com.opensymphony.xwork2.ActionProxyFactory; import com.opensymphony.xwork2.DefaultActionProxyFactory; +import com.opensymphony.xwork2.DefaultLocaleProvider; import com.opensymphony.xwork2.DefaultTextProvider; import com.opensymphony.xwork2.DefaultUnknownHandlerManager; import com.opensymphony.xwork2.FileManager; import com.opensymphony.xwork2.FileManagerFactory; +import com.opensymphony.xwork2.LocaleProvider; import com.opensymphony.xwork2.TextProvider; import com.opensymphony.xwork2.TextProviderSupport; import com.opensymphony.xwork2.UnknownHandlerManager; @@ -122,6 +124,7 @@ public class XWorkConfigurationProvider .factory(ActionValidatorManager.class, "no-annotations", DefaultActionValidatorManager.class, Scope.SINGLETON) .factory(TextProvider.class, "system", DefaultTextProvider.class, Scope.SINGLETON) .factory(TextProvider.class, TextProviderSupport.class, Scope.SINGLETON) + .factory(LocaleProvider.class, DefaultLocaleProvider.class, Scope.SINGLETON) .factory(OgnlUtil.class, Scope.SINGLETON) .factory(XWorkBasicConverter.class, Scope.SINGLETON) .factory(CollectionConverter.class, Scope.SINGLETON)