Merge branch 'injectable-context' into localized-bean
Project: http://git-wip-us.apache.org/repos/asf/struts/repo Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/d1fbf6a8 Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/d1fbf6a8 Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/d1fbf6a8 Branch: refs/heads/master Commit: d1fbf6a8972908fac3a41ec0e2756fe4eec1afb6 Parents: 6c19875 8852e3d Author: Lukasz Lenart <lukaszlen...@apache.org> Authored: Mon Mar 13 08:20:42 2017 +0100 Committer: Lukasz Lenart <lukaszlen...@apache.org> Committed: Mon Mar 13 08:20:42 2017 +0100 ---------------------------------------------------------------------- .../com/opensymphony/xwork2/ActionSupport.java | 7 +- .../xwork2/TextProviderFactory.java | 29 ++-- .../providers/XWorkConfigurationProvider.java | 4 + .../AnnotationActionValidatorManager.java | 8 +- .../DefaultActionValidatorManager.java | 13 +- .../validator/DelegatingValidatorContext.java | 33 +---- .../validator/validators/ValidatorSupport.java | 10 +- .../validators/VisitorFieldValidator.java | 25 +++- .../org/apache/struts2/StrutsConstants.java | 2 + .../org/apache/struts2/components/I18n.java | 5 +- .../config/DefaultBeanSelectionProvider.java | 2 + .../interceptor/FileUploadInterceptor.java | 8 +- core/src/main/resources/struts-default.xml | 1 + .../opensymphony/xwork2/ActionSupportTest.java | 6 +- .../validator/ActionValidatorManagerTest.java | 34 +++-- .../AnnotationActionValidatorManagerTest.java | 20 ++- .../ConversionErrorFieldValidatorTest.java | 5 +- .../validator/DoubleRangeValidatorTest.java | 12 +- .../xwork2/validator/DummyValidatorContext.java | 144 ++++++++++++++++++ .../xwork2/validator/EmailValidatorTest.java | 13 +- .../validator/ExpressionValidatorTest.java | 10 +- .../validator/GenericValidatorContext.java | 146 ------------------- .../validator/RegexFieldValidatorTest.java | 20 ++- ...onversionErrorFieldValidatorSupportTest.java | 11 +- .../validator/SimpleActionValidationTest.java | 2 +- .../StringLengthFieldValidatorTest.java | 3 +- .../xwork2/validator/StringValidatorTest.java | 21 ++- .../xwork2/validator/URLValidatorTest.java | 15 +- .../validator/VisitorFieldValidatorTest.java | 7 +- .../AppendingValidatorContextTest.java | 25 +++- .../validators/DateRangeFieldValidatorTest.java | 12 +- .../validators/IntRangeFieldValidatorTest.java | 16 +- .../validators/LongRangeFieldValidatorTest.java | 16 +- .../validators/RequiredStringValidatorTest.java | 14 +- .../ShortRangeFieldValidatorTest.java | 16 +- .../apache/struts2/views/jsp/TextTagTest.java | 4 +- .../struts2/views/jsp/ui/TooltipTest.java | 9 +- .../com/opensymphony/xwork2/TestBean.properties | 2 +- .../interceptor/BeanValidationInterceptor.java | 10 +- .../interceptor/OValValidationInterceptor.java | 11 +- .../struts2/tiles/I18NAttributeEvaluator.java | 7 +- 41 files changed, 442 insertions(+), 316 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/struts/blob/d1fbf6a8/core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java ---------------------------------------------------------------------- diff --cc core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java index de0b963,ff27731..2adab77 --- a/core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java +++ b/core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java @@@ -178,9 -178,11 +179,12 @@@ public class XWorkConfigurationProvide .factory(NullHandler.class, Object.class.getName(), InstantiatingNullHandler.class, Scope.SINGLETON) .factory(ActionValidatorManager.class, AnnotationActionValidatorManager.class, Scope.SINGLETON) .factory(ActionValidatorManager.class, "no-annotations", DefaultActionValidatorManager.class, Scope.SINGLETON) + + .factory(TextProviderFactory.class, Scope.SINGLETON) + .factory(LocalizedTextUtil.class, LocalizedTextUtil.class, Scope.SINGLETON) .factory(TextProvider.class, "system", DefaultTextProvider.class, Scope.SINGLETON) .factory(TextProvider.class, TextProviderSupport.class, Scope.SINGLETON) + .factory(LocaleProvider.class, DefaultLocaleProvider.class, Scope.SINGLETON) .factory(OgnlUtil.class, Scope.SINGLETON) .factory(CollectionConverter.class, Scope.SINGLETON) http://git-wip-us.apache.org/repos/asf/struts/blob/d1fbf6a8/core/src/main/java/com/opensymphony/xwork2/validator/DelegatingValidatorContext.java ---------------------------------------------------------------------- diff --cc core/src/main/java/com/opensymphony/xwork2/validator/DelegatingValidatorContext.java index e35d7a8,79507bb..90812bd --- a/core/src/main/java/com/opensymphony/xwork2/validator/DelegatingValidatorContext.java +++ b/core/src/main/java/com/opensymphony/xwork2/validator/DelegatingValidatorContext.java @@@ -71,13 -68,10 +68,13 @@@ public class DelegatingValidatorContex * the validation context are created based on the class. * * @param clazz the class to initialize the context with. + * + * @deprecated will be removed, do not use! */ + @Deprecated public DelegatingValidatorContext(Class clazz) { localeProvider = new ActionContextLocaleProvider(); - textProvider = new TextProviderFactory().createInstance(clazz, localeProvider); + textProvider = new TextProviderFactory().createInstance(clazz); validationAware = new LoggingValidationAware(clazz); } http://git-wip-us.apache.org/repos/asf/struts/blob/d1fbf6a8/core/src/main/java/org/apache/struts2/StrutsConstants.java ---------------------------------------------------------------------- diff --cc core/src/main/java/org/apache/struts2/StrutsConstants.java index 99eb18e,7ae2a5f..3d898ce --- a/core/src/main/java/org/apache/struts2/StrutsConstants.java +++ b/core/src/main/java/org/apache/struts2/StrutsConstants.java @@@ -307,5 -307,5 +307,7 @@@ public final class StrutsConstants public static final String STRUTS_SMI_METHOD_REGEX = "struts.strictMethodInvocation.methodRegex"; + public static final String STRUTS_TEXT_PROVIDER_FACTORY = "struts.textProviderFactory"; ++ + public static final String STRUTS_LOCALIZED_TEXT_PROVIDER = "struts.localizedTextProvider"; } http://git-wip-us.apache.org/repos/asf/struts/blob/d1fbf6a8/core/src/main/java/org/apache/struts2/components/I18n.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/struts/blob/d1fbf6a8/core/src/main/java/org/apache/struts2/config/DefaultBeanSelectionProvider.java ---------------------------------------------------------------------- diff --cc core/src/main/java/org/apache/struts2/config/DefaultBeanSelectionProvider.java index b417333,7835185..d048f5f --- a/core/src/main/java/org/apache/struts2/config/DefaultBeanSelectionProvider.java +++ b/core/src/main/java/org/apache/struts2/config/DefaultBeanSelectionProvider.java @@@ -387,9 -388,9 +388,10 @@@ public class DefaultBeanSelectionProvid alias(TypeConverterHolder.class, StrutsConstants.STRUTS_CONVERTER_HOLDER, builder, props); alias(TextProvider.class, StrutsConstants.STRUTS_XWORKTEXTPROVIDER, builder, props, Scope.PROTOTYPE); + alias(TextProviderFactory.class, StrutsConstants.STRUTS_TEXT_PROVIDER_FACTORY, builder, props, Scope.PROTOTYPE); - alias(LocaleProvider.class, StrutsConstants.STRUTS_LOCALE_PROVIDER, builder, props); + alias(LocalizedTextUtil.class, StrutsConstants.STRUTS_LOCALIZED_TEXT_PROVIDER, builder, props); + alias(ActionProxyFactory.class, StrutsConstants.STRUTS_ACTIONPROXYFACTORY, builder, props); alias(ObjectTypeDeterminer.class, StrutsConstants.STRUTS_OBJECTTYPEDETERMINER, builder, props); alias(ActionMapper.class, StrutsConstants.STRUTS_MAPPER_CLASS, builder, props); http://git-wip-us.apache.org/repos/asf/struts/blob/d1fbf6a8/core/src/main/resources/struts-default.xml ---------------------------------------------------------------------- diff --cc core/src/main/resources/struts-default.xml index d8e80f1,a870c4c..0efdfba --- a/core/src/main/resources/struts-default.xml +++ b/core/src/main/resources/struts-default.xml @@@ -130,7 -130,7 +130,8 @@@ <bean type="com.opensymphony.xwork2.conversion.impl.NumberConverter" name="struts" class="com.opensymphony.xwork2.conversion.impl.NumberConverter" scope="singleton"/> <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.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/d1fbf6a8/core/src/test/java/com/opensymphony/xwork2/validator/DummyValidatorContext.java ---------------------------------------------------------------------- diff --cc core/src/test/java/com/opensymphony/xwork2/validator/DummyValidatorContext.java index 0000000,9d3400f..e0f5f33 mode 000000,100644..100644 --- a/core/src/test/java/com/opensymphony/xwork2/validator/DummyValidatorContext.java +++ b/core/src/test/java/com/opensymphony/xwork2/validator/DummyValidatorContext.java @@@ -1,0 -1,145 +1,144 @@@ + /* + * Copyright 2002-2003,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.validator; + + import com.opensymphony.xwork2.TextProviderFactory; + + import java.util.*; + + + /** + * Dummy validator context to use to capture error messages. + * + * @author Mark Woon + * @author Matthew Payne + */ + public class DummyValidatorContext extends DelegatingValidatorContext { + + private Collection<String> actionErrors; + private Collection<String> actionMessages; + private Map<String, List<String>> fieldErrors; + + + public DummyValidatorContext(Object object, TextProviderFactory tpf) { + super(object, tpf); + } + - + @Override + public synchronized void setActionErrors(Collection<String> errorMessages) { + this.actionErrors = errorMessages; + } + + @Override + public synchronized Collection<String> getActionErrors() { + return new ArrayList<>(internalGetActionErrors()); + } + + @Override + public synchronized void setActionMessages(Collection<String> messages) { + this.actionMessages = messages; + } + + @Override + public synchronized Collection<String> getActionMessages() { + return new ArrayList<String>(internalGetActionMessages()); + } + + @Override + public synchronized void setFieldErrors(Map<String, List<String>> errorMap) { + this.fieldErrors = errorMap; + } + + /** + * Get the field specific errors. + * + * @return an unmodifiable Map with errors mapped from fieldname (String) to Collection of String error messages + */ + @Override + public synchronized Map<String, List<String>> getFieldErrors() { + return new HashMap<String, List<String>>(internalGetFieldErrors()); + } + + @Override + public synchronized void addActionError(String anErrorMessage) { + internalGetActionErrors().add(anErrorMessage); + } + + /** + * Add an Action level message to this Action + */ + @Override + public void addActionMessage(String aMessage) { + internalGetActionMessages().add(aMessage); + } + + @Override + public synchronized void addFieldError(String fieldName, String errorMessage) { + final Map<String, List<String>> errors = internalGetFieldErrors(); + List<String> thisFieldErrors = errors.get(fieldName); + + if (thisFieldErrors == null) { + thisFieldErrors = new ArrayList<>(); + errors.put(fieldName, thisFieldErrors); + } + + thisFieldErrors.add(errorMessage); + } + + @Override + public synchronized boolean hasActionErrors() { + return (actionErrors != null) && !actionErrors.isEmpty(); + } + + /** + * Note that this does not have the same meaning as in WW 1.x + * + * @return (hasActionErrors() || hasFieldErrors()) + */ + @Override + public synchronized boolean hasErrors() { + return (hasActionErrors() || hasFieldErrors()); + } + + @Override + public synchronized boolean hasFieldErrors() { + return (fieldErrors != null) && !fieldErrors.isEmpty(); + } + + private Collection<String> internalGetActionErrors() { + if (actionErrors == null) { + actionErrors = new ArrayList<>(); + } + + return actionErrors; + } + + private Collection<String> internalGetActionMessages() { + if (actionMessages == null) { + actionMessages = new ArrayList<>(); + } + + return actionMessages; + } + + private Map<String, List<String>> internalGetFieldErrors() { + if (fieldErrors == null) { + fieldErrors = new HashMap<>(); + } + + return fieldErrors; + } + }