diff --git a/core/src/main/java/com/opensymphony/xwork2/ActionSupport.java b/core/src/main/java/com/opensymphony/xwork2/ActionSupport.java index d2b551a41..bb7048f0e 100644 --- a/core/src/main/java/com/opensymphony/xwork2/ActionSupport.java +++ b/core/src/main/java/com/opensymphony/xwork2/ActionSupport.java @@ -274,11 +274,8 @@ public class ActionSupport implements Action, Validateable, ValidationAware, Tex */ private TextProvider getTextProvider() { if (textProvider == null) { - TextProviderFactory tpf = new TextProviderFactory(); - if (container != null) { - container.inject(tpf); - } - textProvider = tpf.createInstance(getClass(), this); + TextProviderFactory tpf = container.inject(TextProviderFactory.class); + textProvider = tpf.createInstance(getClass()); } return textProvider; } diff --git a/core/src/main/java/com/opensymphony/xwork2/TextProviderFactory.java b/core/src/main/java/com/opensymphony/xwork2/TextProviderFactory.java index 331d5342d..b00f451ac 100644 --- a/core/src/main/java/com/opensymphony/xwork2/TextProviderFactory.java +++ b/core/src/main/java/com/opensymphony/xwork2/TextProviderFactory.java @@ -28,44 +28,49 @@ import java.util.ResourceBundle; public class TextProviderFactory { private TextProvider textProvider; + private LocaleProvider localeProvider; @Inject public void setTextProvider(TextProvider textProvider) { this.textProvider = textProvider; } - public TextProvider createInstance(Class clazz, LocaleProvider provider) { - TextProvider instance = getTextProvider(clazz, provider); + @Inject + public void setLocaleProvider(LocaleProvider localeProvider) { + this.localeProvider = localeProvider; + } + + public TextProvider createInstance(Class clazz) { + TextProvider instance = getTextProvider(clazz); if (instance instanceof ResourceBundleTextProvider) { ((ResourceBundleTextProvider) instance).setClazz(clazz); - ((ResourceBundleTextProvider) instance).setLocaleProvider(provider); + ((ResourceBundleTextProvider) instance).setLocaleProvider(localeProvider); } return instance; } - public TextProvider createInstance(ResourceBundle bundle, LocaleProvider provider) { - TextProvider instance = getTextProvider(bundle, provider); + public TextProvider createInstance(ResourceBundle bundle) { + TextProvider instance = getTextProvider(bundle); if (instance instanceof ResourceBundleTextProvider) { ((ResourceBundleTextProvider) instance).setBundle(bundle); - ((ResourceBundleTextProvider) instance).setLocaleProvider(provider); + ((ResourceBundleTextProvider) instance).setLocaleProvider(localeProvider); } return instance; } - protected TextProvider getTextProvider(Class clazz, LocaleProvider provider) { + protected TextProvider getTextProvider(Class clazz) { if (this.textProvider == null) { - return new TextProviderSupport(clazz, provider); + return new TextProviderSupport(clazz, localeProvider); } else { return textProvider; } } - private TextProvider getTextProvider(ResourceBundle bundle, LocaleProvider provider) { + private TextProvider getTextProvider(ResourceBundle bundle) { if (this.textProvider == null) { - return new TextProviderSupport(bundle, provider); - } else { - return textProvider; + textProvider = new TextProviderSupport(bundle, localeProvider); } + return textProvider; } } 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 de0b9635e..2adab778e 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,7 @@ package com.opensymphony.xwork2.config.providers; import com.opensymphony.xwork2.ActionProxyFactory; import com.opensymphony.xwork2.DefaultActionProxyFactory; +import com.opensymphony.xwork2.TextProviderFactory; import com.opensymphony.xwork2.factory.DefaultUnknownHandlerFactory; import com.opensymphony.xwork2.factory.UnknownHandlerFactory; import com.opensymphony.xwork2.ognl.accessor.HttpParametersPropertyAccessor; @@ -178,9 +179,12 @@ public class XWorkConfigurationProvider implements ConfigurationProvider { .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) diff --git a/core/src/main/java/com/opensymphony/xwork2/validator/AnnotationActionValidatorManager.java b/core/src/main/java/com/opensymphony/xwork2/validator/AnnotationActionValidatorManager.java index 641bc438e..cd6fa4e85 100644 --- a/core/src/main/java/com/opensymphony/xwork2/validator/AnnotationActionValidatorManager.java +++ b/core/src/main/java/com/opensymphony/xwork2/validator/AnnotationActionValidatorManager.java @@ -52,6 +52,7 @@ public class AnnotationActionValidatorManager implements ActionValidatorManager private ValidatorFileParser validatorFileParser; private FileManager fileManager; private boolean reloadingConfigs; + private TextProviderFactory textProviderFactory; @Inject public void setValidatorFactory(ValidatorFactory fac) { @@ -73,6 +74,11 @@ public class AnnotationActionValidatorManager implements ActionValidatorManager this.reloadingConfigs = Boolean.parseBoolean(reloadingConfigs); } + @Inject + public void setTextProviderFactory(TextProviderFactory textProviderFactory) { + this.textProviderFactory = textProviderFactory; + } + public List getValidators(Class clazz, String context) { return getValidators(clazz, context, null); } @@ -116,7 +122,7 @@ public class AnnotationActionValidatorManager implements ActionValidatorManager } public void validate(Object object, String context, String method) throws ValidationException { - ValidatorContext validatorContext = new DelegatingValidatorContext(object); + ValidatorContext validatorContext = new DelegatingValidatorContext(object, textProviderFactory); validate(object, context, validatorContext, method); } diff --git a/core/src/main/java/com/opensymphony/xwork2/validator/DefaultActionValidatorManager.java b/core/src/main/java/com/opensymphony/xwork2/validator/DefaultActionValidatorManager.java index d16afcd02..48d552a01 100644 --- a/core/src/main/java/com/opensymphony/xwork2/validator/DefaultActionValidatorManager.java +++ b/core/src/main/java/com/opensymphony/xwork2/validator/DefaultActionValidatorManager.java @@ -18,6 +18,7 @@ package com.opensymphony.xwork2.validator; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.FileManager; import com.opensymphony.xwork2.FileManagerFactory; +import com.opensymphony.xwork2.TextProviderFactory; import com.opensymphony.xwork2.XWorkConstants; import com.opensymphony.xwork2.inject.Inject; import com.opensymphony.xwork2.util.ClassLoaderUtil; @@ -50,16 +51,19 @@ import java.util.*; */ public class DefaultActionValidatorManager implements ActionValidatorManager { + private final static Logger LOG = LogManager.getLogger(DefaultActionValidatorManager.class); + /** The file suffix for any validation file. */ protected static final String VALIDATION_CONFIG_SUFFIX = "-validation.xml"; private final Map> validatorCache = Collections.synchronizedMap(new HashMap>()); private final Map> validatorFileCache = Collections.synchronizedMap(new HashMap>()); - private final Logger LOG = LogManager.getLogger(DefaultActionValidatorManager.class); + private ValidatorFactory validatorFactory; private ValidatorFileParser validatorFileParser; private FileManager fileManager; private boolean reloadingConfigs; + private TextProviderFactory textProviderFactory; @Inject public void setValidatorFileParser(ValidatorFileParser parser) { @@ -81,6 +85,11 @@ public class DefaultActionValidatorManager implements ActionValidatorManager { this.reloadingConfigs = Boolean.parseBoolean(reloadingConfigs); } + @Inject + public void setTextProviderFactory(TextProviderFactory textProviderFactory) { + this.textProviderFactory = textProviderFactory; + } + public synchronized List getValidators(Class clazz, String context) { return getValidators(clazz, context, null); } @@ -118,7 +127,7 @@ public class DefaultActionValidatorManager implements ActionValidatorManager { } public void validate(Object object, String context, String method) throws ValidationException { - ValidatorContext validatorContext = new DelegatingValidatorContext(object); + ValidatorContext validatorContext = new DelegatingValidatorContext(object, textProviderFactory); validate(object, context, validatorContext, method); } 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 e35d7a86d..90812bdc8 100644 --- a/core/src/main/java/com/opensymphony/xwork2/validator/DelegatingValidatorContext.java +++ b/core/src/main/java/com/opensymphony/xwork2/validator/DelegatingValidatorContext.java @@ -56,14 +56,11 @@ public class DelegatingValidatorContext implements ValidatorContext { * (validation aware instance and a locale and text provider) are created based on the given action. * * @param object the object to use for validation (usually an Action). - * - * @deprecated will be removed, do not use! */ - @Deprecated - public DelegatingValidatorContext(Object object) { + public DelegatingValidatorContext(Object object, TextProviderFactory textProviderFactory) { this.localeProvider = makeLocaleProvider(object); this.validationAware = makeValidationAware(object); - this.textProvider = makeTextProvider(object, localeProvider); + this.textProvider = makeTextProvider(object, textProviderFactory); } /** @@ -77,7 +74,7 @@ public class DelegatingValidatorContext implements ValidatorContext { @Deprecated public DelegatingValidatorContext(Class clazz) { localeProvider = new ActionContextLocaleProvider(); - textProvider = new TextProviderFactory().createInstance(clazz, localeProvider); + textProvider = new TextProviderFactory().createInstance(clazz); validationAware = new LoggingValidationAware(clazz); } @@ -199,18 +196,11 @@ public class DelegatingValidatorContext implements ValidatorContext { return validationAware.hasFieldErrors(); } - public static TextProvider makeTextProvider(Object object, LocaleProvider localeProvider) { + public TextProvider makeTextProvider(Object object, TextProviderFactory textProviderFactory) { // the object argument passed through here will most probably be an ActionSupport descendant which does // implements TextProvider. if (object != null && object instanceof DelegatingValidatorContext) { return ((DelegatingValidatorContext) object).getTextProvider(); - } else if (object != null && localeProvider != null && localeProvider instanceof DelegatingValidatorContext) { - return new CompositeTextProvider(new TextProvider[]{ - new TextProviderFactory().createInstance(object.getClass(), localeProvider), - ((DelegatingValidatorContext)localeProvider).getTextProvider() - }); - } else if (localeProvider != null && localeProvider instanceof DelegatingValidatorContext) { - return ((DelegatingValidatorContext)localeProvider).getTextProvider(); } if ((object != null) && (object instanceof TextProvider)) { @@ -219,20 +209,11 @@ public class DelegatingValidatorContext implements ValidatorContext { } return new CompositeTextProvider(new TextProvider[]{ ((TextProvider) object), - new TextProviderSupport(object.getClass(), localeProvider) - }); - } else if (localeProvider != null && localeProvider instanceof TextProvider) { - if (localeProvider instanceof CompositeTextProvider) { - return (CompositeTextProvider) localeProvider; - } - return new CompositeTextProvider(new TextProvider[]{ - ((TextProvider) localeProvider), - new TextProviderSupport(localeProvider.getClass(), localeProvider) + textProviderFactory.createInstance(object.getClass()) }); } else { - return new TextProviderFactory().createInstance( - object != null ? object.getClass() : DelegatingValidatorContext.class, - localeProvider); + return textProviderFactory.createInstance( + object != null ? object.getClass() : DelegatingValidatorContext.class); } } diff --git a/core/src/main/java/com/opensymphony/xwork2/validator/validators/ValidatorSupport.java b/core/src/main/java/com/opensymphony/xwork2/validator/validators/ValidatorSupport.java index 1df94501d..3cfdb4bad 100644 --- a/core/src/main/java/com/opensymphony/xwork2/validator/validators/ValidatorSupport.java +++ b/core/src/main/java/com/opensymphony/xwork2/validator/validators/ValidatorSupport.java @@ -15,6 +15,8 @@ */ package com.opensymphony.xwork2.validator.validators; +import com.opensymphony.xwork2.TextProviderFactory; +import com.opensymphony.xwork2.inject.Inject; import com.opensymphony.xwork2.util.TextParseUtil; import com.opensymphony.xwork2.util.ValueStack; import com.opensymphony.xwork2.validator.*; @@ -45,6 +47,12 @@ public abstract class ValidatorSupport implements Validator, ShortCircuitableVal private String[] messageParameters; protected ValueStack stack; + protected TextProviderFactory textProviderFactory; + + @Inject + public void setTextProviderFactory(TextProviderFactory textProviderFactory) { + this.textProviderFactory = textProviderFactory; + } public void setValueStack(ValueStack stack) { this.stack = stack; @@ -76,7 +84,7 @@ public abstract class ValidatorSupport implements Validator, ShortCircuitableVal defaultMessage = messageKey; } if (validatorContext == null) { - validatorContext = new DelegatingValidatorContext(object); + validatorContext = new DelegatingValidatorContext(object, textProviderFactory); } List parsedMessageParameters = null; if (messageParameters != null) { diff --git a/core/src/main/java/com/opensymphony/xwork2/validator/validators/VisitorFieldValidator.java b/core/src/main/java/com/opensymphony/xwork2/validator/validators/VisitorFieldValidator.java index 9f8e67da6..8fd62a63a 100644 --- a/core/src/main/java/com/opensymphony/xwork2/validator/validators/VisitorFieldValidator.java +++ b/core/src/main/java/com/opensymphony/xwork2/validator/validators/VisitorFieldValidator.java @@ -16,6 +16,8 @@ package com.opensymphony.xwork2.validator.validators; import com.opensymphony.xwork2.ActionContext; +import com.opensymphony.xwork2.CompositeTextProvider; +import com.opensymphony.xwork2.TextProvider; import com.opensymphony.xwork2.inject.Inject; import com.opensymphony.xwork2.util.ValueStack; import com.opensymphony.xwork2.validator.ActionValidatorManager; @@ -24,6 +26,8 @@ import com.opensymphony.xwork2.validator.ValidationException; import com.opensymphony.xwork2.validator.ValidatorContext; import java.util.Collection; +import java.util.LinkedList; +import java.util.List; /** @@ -166,24 +170,37 @@ public class VisitorFieldValidator extends FieldValidatorSupport { ValidatorContext validatorContext; if (appendPrefix) { - validatorContext = new AppendingValidatorContext(getValidatorContext(), o, fieldName, getMessage(o)); + ValidatorContext parent = getValidatorContext(); + validatorContext = new AppendingValidatorContext(parent, createTextProvider(o, parent), fieldName, getMessage(o)); } else { ValidatorContext parent = getValidatorContext(); - validatorContext = new DelegatingValidatorContext(parent, DelegatingValidatorContext.makeTextProvider(o, parent), parent); + CompositeTextProvider textProvider = createTextProvider(o, parent); + validatorContext = new DelegatingValidatorContext(parent, textProvider, parent); } actionValidatorManager.validate(o, visitorContext, validatorContext); stack.pop(); } + private CompositeTextProvider createTextProvider(Object o, ValidatorContext parent) { + List textProviders = new LinkedList<>(); + if (o instanceof TextProvider) { + textProviders.add((TextProvider) o); + } else { + textProviders.add(textProviderFactory.createInstance(o.getClass())); + } + textProviders.add(parent); + + return new CompositeTextProvider(textProviders); + } public static class AppendingValidatorContext extends DelegatingValidatorContext { private String field; private String message; private ValidatorContext parent; - public AppendingValidatorContext(ValidatorContext parent, Object object, String field, String message) { - super(parent, makeTextProvider(object, parent), parent); + public AppendingValidatorContext(ValidatorContext parent, TextProvider textProvider, String field, String message) { + super(parent, textProvider, parent); this.field = field; this.message = message; diff --git a/core/src/main/java/org/apache/struts2/StrutsConstants.java b/core/src/main/java/org/apache/struts2/StrutsConstants.java index 99eb18e60..3d898ce9f 100644 --- a/core/src/main/java/org/apache/struts2/StrutsConstants.java +++ b/core/src/main/java/org/apache/struts2/StrutsConstants.java @@ -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"; } 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 7a538b158..7065c4b14 100644 --- a/core/src/main/java/org/apache/struts2/components/I18n.java +++ b/core/src/main/java/org/apache/struts2/components/I18n.java @@ -125,9 +125,8 @@ public class I18n extends Component { } if (bundle != null) { - TextProviderFactory tpf = new TextProviderFactory(); - container.inject(tpf); - textProvider = tpf.createInstance(bundle, localeProvider); + TextProviderFactory tpf = container.inject(TextProviderFactory.class); + textProvider = tpf.createInstance(bundle); getStack().push(textProvider); pushed = true; } 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 b41733372..d048f5f6f 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.TextProviderFactory; import com.opensymphony.xwork2.factory.UnknownHandlerFactory; import com.opensymphony.xwork2.security.AcceptedPatternsChecker; import com.opensymphony.xwork2.security.ExcludedPatternsChecker; @@ -387,6 +388,7 @@ public class DefaultBeanSelectionProvider extends AbstractBeanSelectionProvider 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); 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 aa7fe01d1..a428b53c8 100644 --- a/core/src/main/java/org/apache/struts2/interceptor/FileUploadInterceptor.java +++ b/core/src/main/java/org/apache/struts2/interceptor/FileUploadInterceptor.java @@ -446,12 +446,8 @@ public class FileUploadInterceptor extends AbstractInterceptor { } 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); + TextProviderFactory tpf = container.inject(TextProviderFactory.class); + return tpf.createInstance(action.getClass()); } private LocaleProvider getLocaleProvider(Object action) { diff --git a/core/src/main/resources/struts-default.xml b/core/src/main/resources/struts-default.xml index d8e80f140..0efdfba09 100644 --- a/core/src/main/resources/struts-default.xml +++ b/core/src/main/resources/struts-default.xml @@ -130,6 +130,7 @@ + diff --git a/core/src/test/java/com/opensymphony/xwork2/ActionSupportTest.java b/core/src/test/java/com/opensymphony/xwork2/ActionSupportTest.java index bd47c1c5a..d5422a1b5 100644 --- a/core/src/test/java/com/opensymphony/xwork2/ActionSupportTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/ActionSupportTest.java @@ -252,7 +252,7 @@ public class ActionSupportTest extends XWorkTestCase { public void testGetTextsWithListAndStack() throws Exception { ActionContext.getContext().setLocale(new Locale("da")); - MyActionSupport mas = new MyActionSupport(); + MyActionSupport mas = container.inject(MyActionSupport.class); ValueStack stack = ActionContext.getContext().getValueStack(); @@ -270,7 +270,7 @@ public class ActionSupportTest extends XWorkTestCase { public void testGetTextsWithArrayAndStack() throws Exception { ActionContext.getContext().setLocale(new Locale("da")); - MyActionSupport mas = new MyActionSupport(); + MyActionSupport mas = container.inject(MyActionSupport.class); ValueStack stack = ActionContext.getContext().getValueStack(); @@ -313,7 +313,7 @@ public class ActionSupportTest extends XWorkTestCase { assertEquals("4567def", formatted); } - private class MyActionSupport extends ActionSupport { + public static class MyActionSupport extends ActionSupport { private Double val; diff --git a/core/src/test/java/com/opensymphony/xwork2/validator/ActionValidatorManagerTest.java b/core/src/test/java/com/opensymphony/xwork2/validator/ActionValidatorManagerTest.java index 6d7eeeb69..872711a76 100644 --- a/core/src/test/java/com/opensymphony/xwork2/validator/ActionValidatorManagerTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/validator/ActionValidatorManagerTest.java @@ -26,47 +26,47 @@ public class ActionValidatorManagerTest extends XWorkTestCase { /* MockAction.class */ // reference number ValueStack stack = container.getInstance(ValueStackFactory.class).createValueStack(); - final RequiredStringValidator referenceNumberRequiredStringValidator = new RequiredStringValidator(); + final RequiredStringValidator referenceNumberRequiredStringValidator = container.inject(RequiredStringValidator.class); referenceNumberRequiredStringValidator.setFieldName("referenceNumber"); referenceNumberRequiredStringValidator.setDefaultMessage("Reference number is required"); referenceNumberRequiredStringValidator.setValueStack(stack); // order - final RequiredFieldValidator orderRequiredValidator = new RequiredFieldValidator(); + final RequiredFieldValidator orderRequiredValidator = container.inject(RequiredFieldValidator.class); orderRequiredValidator.setFieldName("order"); orderRequiredValidator.setDefaultMessage("Order is required"); orderRequiredValidator.setValueStack(stack); // customer - final RequiredFieldValidator customerRequiredValidator = new RequiredFieldValidator(); + final RequiredFieldValidator customerRequiredValidator = container.inject(RequiredFieldValidator.class); customerRequiredValidator.setFieldName("customer"); customerRequiredValidator.setDefaultMessage("Customer is required"); customerRequiredValidator.setValueStack(stack); - final VisitorFieldValidator customerVisitorValidator = new VisitorFieldValidator(); + final VisitorFieldValidator customerVisitorValidator = container.inject(VisitorFieldValidator.class); customerVisitorValidator.setAppendPrefix(true); customerVisitorValidator.setFieldName("customer"); customerVisitorValidator.setValueStack(stack); /* Customer.class */ // customer -> name - final RequiredStringValidator customerNameRequiredStringValidator = new RequiredStringValidator(); + final RequiredStringValidator customerNameRequiredStringValidator = container.inject(RequiredStringValidator.class); customerNameRequiredStringValidator.setFieldName("name"); customerNameRequiredStringValidator.setDefaultMessage("Name is required"); customerNameRequiredStringValidator.setValueStack(stack); // customer -> age - final RequiredFieldValidator customerAgeRequiredValidator = new RequiredFieldValidator(); + final RequiredFieldValidator customerAgeRequiredValidator = container.inject(RequiredFieldValidator.class); customerAgeRequiredValidator.setFieldName("age"); customerAgeRequiredValidator.setDefaultMessage("Age is required"); customerAgeRequiredValidator.setValueStack(stack); // customer -> Address - final RequiredFieldValidator customerAddressRequiredFieldValidator = new RequiredFieldValidator(); + final RequiredFieldValidator customerAddressRequiredFieldValidator = container.inject(RequiredFieldValidator.class); customerAddressRequiredFieldValidator.setFieldName("address"); customerAddressRequiredFieldValidator.setDefaultMessage("Address is required"); customerAddressRequiredFieldValidator.setValueStack(stack); - final VisitorFieldValidator customerAddressVisitorFieldValidator = new VisitorFieldValidator(); + final VisitorFieldValidator customerAddressVisitorFieldValidator = container.inject(VisitorFieldValidator.class); customerAddressVisitorFieldValidator.setFieldName("address"); customerAddressVisitorFieldValidator.setAppendPrefix(true); //customerAddressVisitorFieldValidator.setDefaultMessage(""); @@ -76,26 +76,26 @@ public class ActionValidatorManagerTest extends XWorkTestCase { /* Address.class */ // customer -> Address -> street - final RequiredStringValidator customerAddressStreetRequiredFieldValidator = new RequiredStringValidator(); + final RequiredStringValidator customerAddressStreetRequiredFieldValidator = container.inject(RequiredStringValidator.class); customerAddressStreetRequiredFieldValidator.setFieldName("street"); customerAddressStreetRequiredFieldValidator.setDefaultMessage("Street is required"); customerAddressStreetRequiredFieldValidator.setShortCircuit(true); customerAddressStreetRequiredFieldValidator.setValueStack(stack); - final RequiredStringValidator customerAddressStreetRequiredFieldValidator2 = new RequiredStringValidator(); + final RequiredStringValidator customerAddressStreetRequiredFieldValidator2 = container.inject(RequiredStringValidator.class); customerAddressStreetRequiredFieldValidator2.setFieldName("street"); customerAddressStreetRequiredFieldValidator2.setDefaultMessage("Street is required 2"); customerAddressStreetRequiredFieldValidator2.setShortCircuit(true); customerAddressStreetRequiredFieldValidator2.setValueStack(stack); // customer -> Address -> pobox - final RequiredStringValidator customerAddressPoboxRequiredFieldValidator = new RequiredStringValidator(); + final RequiredStringValidator customerAddressPoboxRequiredFieldValidator = container.inject(RequiredStringValidator.class); customerAddressPoboxRequiredFieldValidator.setFieldName("pobox"); customerAddressPoboxRequiredFieldValidator.setDefaultMessage("PO Box is required"); customerAddressPoboxRequiredFieldValidator.setShortCircuit(false); customerAddressPoboxRequiredFieldValidator.setValueStack(stack); - final RequiredStringValidator customerAddressPoboxRequiredFieldValidator2 = new RequiredStringValidator(); + final RequiredStringValidator customerAddressPoboxRequiredFieldValidator2 = container.inject(RequiredStringValidator.class); customerAddressPoboxRequiredFieldValidator2.setFieldName("pobox"); customerAddressPoboxRequiredFieldValidator2.setDefaultMessage("PO Box is required 2"); customerAddressPoboxRequiredFieldValidator2.setShortCircuit(false); @@ -146,10 +146,12 @@ public class ActionValidatorManagerTest extends XWorkTestCase { return Collections.emptyList(); } }; + container.inject(validatorManager); + customerVisitorValidator.setActionValidatorManager(validatorManager); customerAddressVisitorFieldValidator.setActionValidatorManager(validatorManager); - MockAction action = new MockAction(); + MockAction action = container.inject(MockAction.class); stack.push(action); validatorManager.validate(action, "ctx"); @@ -170,7 +172,7 @@ public class ActionValidatorManagerTest extends XWorkTestCase { assertEquals((action.getFieldErrors().get("customer.address.pobox")).size(), 2); } - private class MockAction extends ActionSupport { + public static class MockAction extends ActionSupport { private String referenceNumber; private Integer order; @@ -188,7 +190,7 @@ public class ActionValidatorManagerTest extends XWorkTestCase { } - private class Customer { + public static class Customer { private String name; private Integer age; private Address address = new Address(); @@ -203,7 +205,7 @@ public class ActionValidatorManagerTest extends XWorkTestCase { public void setAddress(Address address) { this.address = address; } } - private class Address { + public static class Address { private String street; private String pobox; diff --git a/core/src/test/java/com/opensymphony/xwork2/validator/AnnotationActionValidatorManagerTest.java b/core/src/test/java/com/opensymphony/xwork2/validator/AnnotationActionValidatorManagerTest.java index 71111500f..89c21e391 100644 --- a/core/src/test/java/com/opensymphony/xwork2/validator/AnnotationActionValidatorManagerTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/validator/AnnotationActionValidatorManagerTest.java @@ -24,6 +24,7 @@ import com.opensymphony.xwork2.FileManager; import com.opensymphony.xwork2.FileManagerFactory; import com.opensymphony.xwork2.SimpleAction; import com.opensymphony.xwork2.SimpleAnnotationAction; +import com.opensymphony.xwork2.TextProviderFactory; import com.opensymphony.xwork2.XWorkTestCase; import com.opensymphony.xwork2.config.entities.ActionConfig; import com.opensymphony.xwork2.test.AnnotationDataAware2; @@ -58,6 +59,7 @@ public class AnnotationActionValidatorManagerTest extends XWorkTestCase { protected final String alias = "annotationValidationAlias"; AnnotationActionValidatorManager annotationActionValidatorManager; + private TextProviderFactory tpf; @Override protected void setUp() throws Exception { super.setUp(); @@ -78,6 +80,8 @@ public class AnnotationActionValidatorManagerTest extends XWorkTestCase { EasyMock.replay(proxy); ActionContext.getContext().setActionInvocation(invocation); + + tpf = container.getInstance(TextProviderFactory.class); } @Override protected void tearDown() throws Exception { @@ -124,7 +128,7 @@ public class AnnotationActionValidatorManagerTest extends XWorkTestCase { bean.setName("foo"); bean.setCount(99); - ValidatorContext context = new GenericValidatorContext(bean); + ValidatorContext context = new DummyValidatorContext(bean, tpf); annotationActionValidatorManager.validate(bean, "beanMessageBundle", context); assertTrue(context.hasErrors()); assertTrue(context.hasFieldErrors()); @@ -252,7 +256,7 @@ public class AnnotationActionValidatorManagerTest extends XWorkTestCase { bean.setName("foo"); bean.setCount(150); - ValidatorContext context = new GenericValidatorContext(bean); + ValidatorContext context = new DummyValidatorContext(bean, tpf); annotationActionValidatorManager.validate(bean, "beanMessageBundle", context); assertTrue(context.hasErrors()); assertTrue(context.hasFieldErrors()); @@ -290,7 +294,7 @@ public class AnnotationActionValidatorManagerTest extends XWorkTestCase { user.setEmail("bad_email"); user.setEmail2("bad_email"); - ValidatorContext context = new GenericValidatorContext(user); + ValidatorContext context = new DummyValidatorContext(user, tpf); annotationActionValidatorManager.validate(user, null, context); assertTrue(context.hasFieldErrors()); @@ -332,13 +336,13 @@ public class AnnotationActionValidatorManagerTest extends XWorkTestCase { user.setEmail("mark_bad_email_for_field_val@foo.com"); user.setEmail2("mark_bad_email_for_field_val@foo.com"); - ValidatorContext context = new GenericValidatorContext(user); + ValidatorContext context = new DummyValidatorContext(user, tpf); annotationActionValidatorManager.validate(user, null, context); assertTrue(context.hasFieldErrors()); // check field errors // we have an error in this field level, email does not ends with mycompany.com - List l = (List) context.getFieldErrors().get("email"); + List l = context.getFieldErrors().get("email"); assertNotNull(l); assertEquals(1, l.size()); // because email-field-val is short-circuit assertEquals("Email not from the right company.", l.get(0)); @@ -370,12 +374,12 @@ public class AnnotationActionValidatorManagerTest extends XWorkTestCase { user.setEmail("rainer_h(at)example.com"); - ValidatorContext context = new GenericValidatorContext(user); + ValidatorContext context = new DummyValidatorContext(user, tpf); annotationActionValidatorManager.validate(user, null, context); // check field level errors // shouldn't have any because action error prevents validation of anything else - List l = (List) context.getFieldErrors().get("email2"); + List l = context.getFieldErrors().get("email2"); assertNull(l); @@ -401,7 +405,7 @@ public class AnnotationActionValidatorManagerTest extends XWorkTestCase { user.setEmail("mark@mycompany.com"); user.setEmail2("mark@mycompany.com"); - ValidatorContext context = new GenericValidatorContext(user); + ValidatorContext context = new DummyValidatorContext(user, tpf); annotationActionValidatorManager.validate(user, null, context); assertFalse(context.hasErrors()); } catch (ValidationException ex) { diff --git a/core/src/test/java/com/opensymphony/xwork2/validator/ConversionErrorFieldValidatorTest.java b/core/src/test/java/com/opensymphony/xwork2/validator/ConversionErrorFieldValidatorTest.java index d68613136..8182d779a 100644 --- a/core/src/test/java/com/opensymphony/xwork2/validator/ConversionErrorFieldValidatorTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/validator/ConversionErrorFieldValidatorTest.java @@ -16,6 +16,7 @@ package com.opensymphony.xwork2.validator; import com.opensymphony.xwork2.ActionContext; +import com.opensymphony.xwork2.TextProviderFactory; import com.opensymphony.xwork2.interceptor.ValidationAware; import com.opensymphony.xwork2.ValidationAwareSupport; import com.opensymphony.xwork2.XWorkTestCase; @@ -37,11 +38,9 @@ public class ConversionErrorFieldValidatorTest extends XWorkTestCase { private static final String defaultFooMessage = "Invalid field value for field \"foo\"."; - private ConversionErrorFieldValidator validator; private ValidationAware validationAware; - @Override public void setUp() throws Exception { super.setUp(); @@ -54,7 +53,7 @@ public class ConversionErrorFieldValidatorTest extends XWorkTestCase { validator = new ConversionErrorFieldValidator(); validationAware = new ValidationAwareSupport(); - DelegatingValidatorContext validatorContext = new DelegatingValidatorContext(validationAware); + DelegatingValidatorContext validatorContext = new DelegatingValidatorContext(validationAware, container.inject(TextProviderFactory.class)); stack.push(validatorContext); validator.setValidatorContext(validatorContext); validator.setFieldName("foo"); diff --git a/core/src/test/java/com/opensymphony/xwork2/validator/DoubleRangeValidatorTest.java b/core/src/test/java/com/opensymphony/xwork2/validator/DoubleRangeValidatorTest.java index 64e4c2c73..3f75a1455 100644 --- a/core/src/test/java/com/opensymphony/xwork2/validator/DoubleRangeValidatorTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/validator/DoubleRangeValidatorTest.java @@ -21,6 +21,7 @@ import java.util.Map; */ public class DoubleRangeValidatorTest extends XWorkTestCase { private DoubleRangeFieldValidator val; + private TextProviderFactory tpf; public void testRangeValidationWithError() throws Exception { //Explicitly set an out-of-range double for DoubleRangeValidatorTest @@ -107,7 +108,7 @@ public class DoubleRangeValidatorTest extends XWorkTestCase { val.setMaxInclusive(10d); val.setFieldName("name"); - DelegatingValidatorContext context = new DelegatingValidatorContext(new ValidationAwareSupport()); + DelegatingValidatorContext context = new DelegatingValidatorContext(new ValidationAwareSupport(), tpf); val.setValidatorContext(context); val.validate(prod); @@ -127,7 +128,7 @@ public class DoubleRangeValidatorTest extends XWorkTestCase { val.setFieldName("price"); - DelegatingValidatorContext context = new DelegatingValidatorContext(new ValidationAwareSupport()); + DelegatingValidatorContext context = new DelegatingValidatorContext(new ValidationAwareSupport(), tpf); val.setValidatorContext(context); val.setMaxInclusive(9.95d); @@ -152,7 +153,7 @@ public class DoubleRangeValidatorTest extends XWorkTestCase { val.setFieldName("price"); - DelegatingValidatorContext context = new DelegatingValidatorContext(new ValidationAwareSupport()); + DelegatingValidatorContext context = new DelegatingValidatorContext(new ValidationAwareSupport(), tpf); val.setValidatorContext(context); val.setMinInclusive(9.95d); @@ -170,7 +171,7 @@ public class DoubleRangeValidatorTest extends XWorkTestCase { val.setFieldName("price"); - DelegatingValidatorContext context = new DelegatingValidatorContext(new ValidationAwareSupport()); + DelegatingValidatorContext context = new DelegatingValidatorContext(new ValidationAwareSupport(), tpf); val.setValidatorContext(context); val.setMinInclusive(9.95d); @@ -220,7 +221,7 @@ public class DoubleRangeValidatorTest extends XWorkTestCase { val.setFieldName("price"); val.setDefaultMessage("Price is wrong!"); - DelegatingValidatorContext context = new DelegatingValidatorContext(action); + DelegatingValidatorContext context = new DelegatingValidatorContext(action, tpf); val.setValidatorContext(context); val.validate(action); @@ -236,6 +237,7 @@ public class DoubleRangeValidatorTest extends XWorkTestCase { val = new DoubleRangeFieldValidator(); val.setValueStack(ActionContext.getContext().getValueStack()); ActionContext.getContext().setParameters(HttpParameters.create().build()); + tpf = container.inject(TextProviderFactory.class); } @Override diff --git a/core/src/test/java/com/opensymphony/xwork2/validator/GenericValidatorContext.java b/core/src/test/java/com/opensymphony/xwork2/validator/DummyValidatorContext.java similarity index 94% rename from core/src/test/java/com/opensymphony/xwork2/validator/GenericValidatorContext.java rename to core/src/test/java/com/opensymphony/xwork2/validator/DummyValidatorContext.java index 0c7e0679d..e0f5f33e4 100644 --- a/core/src/test/java/com/opensymphony/xwork2/validator/GenericValidatorContext.java +++ b/core/src/test/java/com/opensymphony/xwork2/validator/DummyValidatorContext.java @@ -15,6 +15,8 @@ */ package com.opensymphony.xwork2.validator; +import com.opensymphony.xwork2.TextProviderFactory; + import java.util.*; @@ -24,19 +26,15 @@ import java.util.*; * @author Mark Woon * @author Matthew Payne */ -public class GenericValidatorContext extends DelegatingValidatorContext { +public class DummyValidatorContext extends DelegatingValidatorContext { private Collection actionErrors; private Collection actionMessages; private Map> fieldErrors; - /** - * @deprecated Is used only in tests and will be removed - */ - @Deprecated - public GenericValidatorContext(Object object) { - super(object); + public DummyValidatorContext(Object object, TextProviderFactory tpf) { + super(object, tpf); } @Override diff --git a/core/src/test/java/com/opensymphony/xwork2/validator/EmailValidatorTest.java b/core/src/test/java/com/opensymphony/xwork2/validator/EmailValidatorTest.java index 721ce08fc..ae8c036f3 100644 --- a/core/src/test/java/com/opensymphony/xwork2/validator/EmailValidatorTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/validator/EmailValidatorTest.java @@ -17,6 +17,7 @@ package com.opensymphony.xwork2.validator; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; +import com.opensymphony.xwork2.TextProviderFactory; import com.opensymphony.xwork2.XWorkTestCase; import com.opensymphony.xwork2.util.ValueStack; import com.opensymphony.xwork2.validator.validators.EmailValidator; @@ -29,6 +30,8 @@ import com.opensymphony.xwork2.validator.validators.EmailValidator; */ public class EmailValidatorTest extends XWorkTestCase { + private TextProviderFactory tpf; + public void testEmailValidity() throws Exception { assertTrue(verifyEmailValidity("TmJee@Yahoo.com")); assertTrue(verifyEmailValidity("tmjee@yahoo.com")); @@ -70,7 +73,7 @@ public class EmailValidatorTest extends XWorkTestCase { }; EmailValidator validator = new EmailValidator(); - validator.setValidatorContext(new DelegatingValidatorContext(action)); + validator.setValidatorContext(new DelegatingValidatorContext(action, tpf)); validator.setFieldName("myEmail"); validator.setDefaultMessage("invalid email"); validator.setValueStack(ActionContext.getContext().getValueStack()); @@ -95,7 +98,7 @@ public class EmailValidatorTest extends XWorkTestCase { valueStack.push(action); validator.setValueStack(valueStack); - validator.setValidatorContext(new DelegatingValidatorContext(action)); + validator.setValidatorContext(new DelegatingValidatorContext(action, tpf)); validator.setFieldName("myEmail"); validator.setDefaultMessage("invalid email"); validator.setRegexExpression("${emailExpression}"); @@ -155,4 +158,10 @@ public class EmailValidatorTest extends XWorkTestCase { return validator; } + @Override + public void setUp() throws Exception { + super.setUp(); + + tpf = container.inject(TextProviderFactory.class); + } } diff --git a/core/src/test/java/com/opensymphony/xwork2/validator/ExpressionValidatorTest.java b/core/src/test/java/com/opensymphony/xwork2/validator/ExpressionValidatorTest.java index 3ae80764c..30613a40f 100644 --- a/core/src/test/java/com/opensymphony/xwork2/validator/ExpressionValidatorTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/validator/ExpressionValidatorTest.java @@ -38,12 +38,14 @@ import java.util.Map; */ public class ExpressionValidatorTest extends XWorkTestCase { + private TextProviderFactory tpf; + public void testExpressionValidationOfStringLength() throws ValidationException { TestBean bean = new TestBean(); bean.setName("abc"); ActionContext.getContext().getValueStack().push(bean); - DelegatingValidatorContext context = new DelegatingValidatorContext(new ValidationAwareSupport()); + DelegatingValidatorContext context = new DelegatingValidatorContext(new ValidationAwareSupport(), tpf); container.getInstance(ActionValidatorManager.class).validate(bean, "expressionValidation", context); assertTrue(context.hasFieldErrors()); @@ -55,7 +57,7 @@ public class ExpressionValidatorTest extends XWorkTestCase { assertEquals("Name must be greater than 5 characters, it is currently 'abc'", nameErrors.get(0)); bean.setName("abcdefg"); - context = new DelegatingValidatorContext(new ValidationAwareSupport()); + context = new DelegatingValidatorContext(new ValidationAwareSupport(), tpf); container.getInstance(ActionValidatorManager.class).validate(bean, "expressionValidation", context); assertFalse(context.hasFieldErrors()); } @@ -108,7 +110,7 @@ public class ExpressionValidatorTest extends XWorkTestCase { mock.expect("addActionError", C.ANY_ARGS); ExpressionValidator ev = new ExpressionValidator(); - ev.setValidatorContext(new DelegatingValidatorContext(mock.proxy())); + ev.setValidatorContext(new DelegatingValidatorContext(mock.proxy(), tpf)); ev.setExpression("{top}"); ev.setValueStack(ActionContext.getContext().getValueStack()); ev.validate("Hello"); // {top} will evaluate to Hello that is not a Boolean @@ -136,6 +138,8 @@ public class ExpressionValidatorTest extends XWorkTestCase { EasyMock.replay(proxy); ActionContext.getContext().setActionInvocation(invocation); + + tpf = container.inject(TextProviderFactory.class); } } diff --git a/core/src/test/java/com/opensymphony/xwork2/validator/RegexFieldValidatorTest.java b/core/src/test/java/com/opensymphony/xwork2/validator/RegexFieldValidatorTest.java index 6aa58732c..5c7e94b05 100644 --- a/core/src/test/java/com/opensymphony/xwork2/validator/RegexFieldValidatorTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/validator/RegexFieldValidatorTest.java @@ -16,6 +16,7 @@ package com.opensymphony.xwork2.validator; import com.opensymphony.xwork2.ActionContext; +import com.opensymphony.xwork2.TextProviderFactory; import com.opensymphony.xwork2.XWorkTestCase; import com.opensymphony.xwork2.util.ValueStack; import com.opensymphony.xwork2.validator.validators.RegexFieldValidator; @@ -36,6 +37,13 @@ import java.util.List; */ public class RegexFieldValidatorTest extends XWorkTestCase { + private TextProviderFactory tpf; + + public void setUp() throws Exception { + super.setUp(); + tpf = container.inject(TextProviderFactory.class); + } + public void testMatch() throws Exception { MyTestPerson testPerson = new MyTestPerson(); testPerson.setUsername("Secret"); @@ -45,7 +53,7 @@ public class RegexFieldValidatorTest extends XWorkTestCase { RegexFieldValidator validator = new RegexFieldValidator(); validator.setRegex("^Sec.*"); - validator.setValidatorContext(new GenericValidatorContext(new Object())); + validator.setValidatorContext(new DummyValidatorContext(new Object(), tpf)); validator.setFieldName("username"); validator.setValueStack(ActionContext.getContext().getValueStack()); validator.validate(testPerson); @@ -66,7 +74,7 @@ public class RegexFieldValidatorTest extends XWorkTestCase { RegexFieldValidator validator = new RegexFieldValidator(); validator.setTrim(false); validator.setRegex("^Sec.*\\s"); - validator.setValidatorContext(new GenericValidatorContext(new Object())); + validator.setValidatorContext(new DummyValidatorContext(new Object(), tpf)); validator.setFieldName("username"); validator.setValueStack(ActionContext.getContext().getValueStack()); validator.validate(testPerson); @@ -86,7 +94,7 @@ public class RegexFieldValidatorTest extends XWorkTestCase { RegexFieldValidator validator = new RegexFieldValidator(); validator.setRegex("^Sec.*"); - validator.setValidatorContext(new GenericValidatorContext(new Object())); + validator.setValidatorContext(new DummyValidatorContext(new Object(), tpf)); validator.setFieldName("username"); validator.setValueStack(ActionContext.getContext().getValueStack()); validator.validate(testPerson); @@ -111,7 +119,7 @@ public class RegexFieldValidatorTest extends XWorkTestCase { RegexFieldValidator validator = new RegexFieldValidator(); validator.setRegex("^Sec.*"); - validator.setValidatorContext(new GenericValidatorContext(new Object())); + validator.setValidatorContext(new DummyValidatorContext(new Object(), tpf)); validator.setFieldName(null); validator.setValueStack(ActionContext.getContext().getValueStack()); validator.validate(testPerson); @@ -144,7 +152,7 @@ public class RegexFieldValidatorTest extends XWorkTestCase { RegexFieldValidator validator = new RegexFieldValidator(); validator.setRegex("^Sec.*"); - validator.setValidatorContext(new GenericValidatorContext(new Object())); + validator.setValidatorContext(new DummyValidatorContext(new Object(), tpf)); validator.setFieldName("username"); validator.setValueStack(ActionContext.getContext().getValueStack()); validator.validate(testPerson); @@ -164,7 +172,7 @@ public class RegexFieldValidatorTest extends XWorkTestCase { RegexFieldValidator validator = new RegexFieldValidator(); validator.setRegex("[0-9][0-9]"); - validator.setValidatorContext(new GenericValidatorContext(new Object())); + validator.setValidatorContext(new DummyValidatorContext(new Object(), tpf)); validator.setFieldName("age"); validator.setValueStack(ActionContext.getContext().getValueStack()); validator.validate(testPerson); diff --git a/core/src/test/java/com/opensymphony/xwork2/validator/RepopulateConversionErrorFieldValidatorSupportTest.java b/core/src/test/java/com/opensymphony/xwork2/validator/RepopulateConversionErrorFieldValidatorSupportTest.java index 308ed2ac5..c4aa1783c 100644 --- a/core/src/test/java/com/opensymphony/xwork2/validator/RepopulateConversionErrorFieldValidatorSupportTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/validator/RepopulateConversionErrorFieldValidatorSupportTest.java @@ -17,6 +17,7 @@ package com.opensymphony.xwork2.validator; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; +import com.opensymphony.xwork2.TextProviderFactory; import com.opensymphony.xwork2.XWorkTestCase; import com.opensymphony.xwork2.mock.MockActionInvocation; import com.opensymphony.xwork2.util.ValueStack; @@ -90,17 +91,19 @@ public class RepopulateConversionErrorFieldValidatorSupportTest extends XWorkTes Map conversionErrors = ActionContext.getContext().getConversionErrors(); conversionErrors.put("someFieldName", conversionErrorValue); conversionErrors.put("xxxsomeFieldName", conversionErrorValue); - - action = new ActionSupport(); + + TextProviderFactory tpf = container.inject(TextProviderFactory.class); + + action = container.inject(ActionSupport.class); validator1 = new InternalRepopulateConversionErrorFieldValidatorSupport(); validator1.setFieldName("someFieldName"); - validator1.setValidatorContext(new DelegatingValidatorContext(action)); + validator1.setValidatorContext(new DelegatingValidatorContext(action, tpf)); validator2 = new InternalRepopulateConversionErrorFieldValidatorSupport(); validator2.setFieldName("someFieldName"); - validator2.setValidatorContext(new DelegatingValidatorContext(action) { + validator2.setValidatorContext(new DelegatingValidatorContext(action, tpf) { @Override public String getFullFieldName(String fieldName) { return "xxx"+fieldName; diff --git a/core/src/test/java/com/opensymphony/xwork2/validator/SimpleActionValidationTest.java b/core/src/test/java/com/opensymphony/xwork2/validator/SimpleActionValidationTest.java index 33657157d..991a75ead 100644 --- a/core/src/test/java/com/opensymphony/xwork2/validator/SimpleActionValidationTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/validator/SimpleActionValidationTest.java @@ -153,7 +153,7 @@ public class SimpleActionValidationTest extends XWorkTestCase { SimpleAction action = new SimpleAction(); container.inject(action); - ValidatorContext validatorContext = new DelegatingValidatorContext(action); + ValidatorContext validatorContext = new DelegatingValidatorContext(action, container.inject(TextProviderFactory.class)); validator.setValidatorContext(validatorContext); validator.validate(this); assertTrue(validatorContext.hasActionErrors()); diff --git a/core/src/test/java/com/opensymphony/xwork2/validator/StringLengthFieldValidatorTest.java b/core/src/test/java/com/opensymphony/xwork2/validator/StringLengthFieldValidatorTest.java index b8cf182c4..884d4951b 100644 --- a/core/src/test/java/com/opensymphony/xwork2/validator/StringLengthFieldValidatorTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/validator/StringLengthFieldValidatorTest.java @@ -17,6 +17,7 @@ package com.opensymphony.xwork2.validator; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; +import com.opensymphony.xwork2.TextProviderFactory; import com.opensymphony.xwork2.XWorkTestCase; import com.opensymphony.xwork2.util.ValueStack; import com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator; @@ -162,7 +163,7 @@ public class StringLengthFieldValidatorTest extends XWorkTestCase { validator = new StringLengthFieldValidator(); validator.setFieldName("myField"); validator.setMessageKey("error"); - validator.setValidatorContext(new DelegatingValidatorContext(action)); + validator.setValidatorContext(new DelegatingValidatorContext(action, container.inject(TextProviderFactory.class))); validator.setMaxLength(5); validator.setMinLength(2); validator.setValueStack(valueStack); diff --git a/core/src/test/java/com/opensymphony/xwork2/validator/StringValidatorTest.java b/core/src/test/java/com/opensymphony/xwork2/validator/StringValidatorTest.java index 9742b5a33..c737d972b 100644 --- a/core/src/test/java/com/opensymphony/xwork2/validator/StringValidatorTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/validator/StringValidatorTest.java @@ -19,6 +19,7 @@ import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.ActionProxy; +import com.opensymphony.xwork2.TextProviderFactory; import com.opensymphony.xwork2.ValidationAwareSupport; import com.opensymphony.xwork2.XWorkTestCase; import com.opensymphony.xwork2.config.entities.ActionConfig; @@ -36,11 +37,13 @@ import java.util.Map; */ public class StringValidatorTest extends XWorkTestCase { + private TextProviderFactory tpf; + public void testRequiredStringWithNullValue() throws Exception { Equidae equidae = new Equidae(); equidae.setHorse(null); - DelegatingValidatorContext context = new DelegatingValidatorContext(new ValidationAwareSupport()); + DelegatingValidatorContext context = new DelegatingValidatorContext(new ValidationAwareSupport(), tpf); container.getInstance(ActionValidatorManager.class).validate(equidae, null, context); assertTrue(context.hasFieldErrors()); @@ -54,7 +57,7 @@ public class StringValidatorTest extends XWorkTestCase { equidae.setHorse(""); ActionContext.getContext().getValueStack().push(equidae); - DelegatingValidatorContext context = new DelegatingValidatorContext(new ValidationAwareSupport()); + DelegatingValidatorContext context = new DelegatingValidatorContext(new ValidationAwareSupport(), tpf); container.getInstance(ActionValidatorManager.class).validate(equidae, null, context); assertTrue(context.hasFieldErrors()); @@ -66,7 +69,7 @@ public class StringValidatorTest extends XWorkTestCase { // trim = false should fail equidae.setHorse(" "); ActionContext.getContext().getValueStack().push(equidae); - context = new DelegatingValidatorContext(new ValidationAwareSupport()); + context = new DelegatingValidatorContext(new ValidationAwareSupport(), tpf); container.getInstance(ActionValidatorManager.class).validate(equidae, null, context); assertTrue(context.hasFieldErrors()); @@ -85,7 +88,7 @@ public class StringValidatorTest extends XWorkTestCase { equidae.setDonkey("asdf"); ActionContext.getContext().getValueStack().push(equidae); - DelegatingValidatorContext context = new DelegatingValidatorContext(new ValidationAwareSupport()); + DelegatingValidatorContext context = new DelegatingValidatorContext(new ValidationAwareSupport(), tpf); container.getInstance(ActionValidatorManager.class).validate(equidae, null, context); assertTrue(context.hasFieldErrors()); @@ -109,7 +112,7 @@ public class StringValidatorTest extends XWorkTestCase { equidae.setCow("asdf "); equidae.setDonkey("asdf "); ActionContext.getContext().getValueStack().push(equidae); - context = new DelegatingValidatorContext(new ValidationAwareSupport()); + context = new DelegatingValidatorContext(new ValidationAwareSupport(), tpf); container.getInstance(ActionValidatorManager.class).validate(equidae, null, context); assertTrue(context.hasFieldErrors()); @@ -128,7 +131,7 @@ public class StringValidatorTest extends XWorkTestCase { equidae.setCow("asdfasdf"); equidae.setDonkey("asdfasdf"); ActionContext.getContext().getValueStack().push(equidae); - context = new DelegatingValidatorContext(new ValidationAwareSupport()); + context = new DelegatingValidatorContext(new ValidationAwareSupport(), tpf); container.getInstance(ActionValidatorManager.class).validate(equidae, null, context); assertTrue(context.hasFieldErrors()); @@ -143,7 +146,7 @@ public class StringValidatorTest extends XWorkTestCase { equidae.setCow("asdfasdf "); equidae.setDonkey("asdfasdf "); ActionContext.getContext().getValueStack().push(equidae); - context = new DelegatingValidatorContext(new ValidationAwareSupport()); + context = new DelegatingValidatorContext(new ValidationAwareSupport(), tpf); container.getInstance(ActionValidatorManager.class).validate(equidae, null, context); assertTrue(context.hasFieldErrors()); @@ -162,7 +165,7 @@ public class StringValidatorTest extends XWorkTestCase { equidae.setCow("asdfasdfasdf"); equidae.setDonkey("asdfasdfasdf"); ActionContext.getContext().getValueStack().push(equidae); - context = new DelegatingValidatorContext(new ValidationAwareSupport()); + context = new DelegatingValidatorContext(new ValidationAwareSupport(), tpf); container.getInstance(ActionValidatorManager.class).validate(equidae, null, context); assertTrue(context.hasFieldErrors()); @@ -213,5 +216,7 @@ public class StringValidatorTest extends XWorkTestCase { EasyMock.replay(proxy); ActionContext.getContext().setActionInvocation(invocation); + + tpf = container.inject(TextProviderFactory.class); } } diff --git a/core/src/test/java/com/opensymphony/xwork2/validator/URLValidatorTest.java b/core/src/test/java/com/opensymphony/xwork2/validator/URLValidatorTest.java index 438173a99..ff9ab5041 100644 --- a/core/src/test/java/com/opensymphony/xwork2/validator/URLValidatorTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/validator/URLValidatorTest.java @@ -16,6 +16,7 @@ package com.opensymphony.xwork2.validator; import com.opensymphony.xwork2.ActionContext; +import com.opensymphony.xwork2.TextProviderFactory; import com.opensymphony.xwork2.XWorkTestCase; import com.opensymphony.xwork2.util.ValueStack; import com.opensymphony.xwork2.validator.validators.URLValidator; @@ -36,11 +37,12 @@ public class URLValidatorTest extends XWorkTestCase { ValueStack stack; ActionContext actionContext; - + private TextProviderFactory tpf; + public void testAcceptNullValueForMutualExclusionOfValidators() throws Exception { URLValidator validator = new URLValidator(); - validator.setValidatorContext(new GenericValidatorContext(new Object())); + validator.setValidatorContext(new DummyValidatorContext(new Object(), tpf)); validator.setFieldName("testingUrl1"); validator.setValueStack(ActionContext.getContext().getValueStack()); validator.validate(new MyObject()); @@ -54,7 +56,7 @@ public class URLValidatorTest extends XWorkTestCase { public void testInvalidEmptyValue() throws Exception { URLValidator validator = new URLValidator(); - validator.setValidatorContext(new GenericValidatorContext(new Object())); + validator.setValidatorContext(new DummyValidatorContext(new Object(), tpf)); validator.setFieldName("testingUrl2"); validator.setValueStack(ActionContext.getContext().getValueStack()); validator.validate(new MyObject()); @@ -68,7 +70,7 @@ public class URLValidatorTest extends XWorkTestCase { public void testInvalidValue() throws Exception { URLValidator validator = new URLValidator(); - validator.setValidatorContext(new GenericValidatorContext(new Object())); + validator.setValidatorContext(new DummyValidatorContext(new Object(), tpf)); validator.setFieldName("testingUrl3"); validator.setValueStack(ActionContext.getContext().getValueStack()); validator.validate(new MyObject()); @@ -83,7 +85,7 @@ public class URLValidatorTest extends XWorkTestCase { public void testValidUrl1() throws Exception { URLValidator validator = new URLValidator(); - validator.setValidatorContext(new GenericValidatorContext(new Object())); + validator.setValidatorContext(new DummyValidatorContext(new Object(), tpf)); validator.setFieldName("testingUrl4"); validator.setValueStack(ActionContext.getContext().getValueStack()); validator.validate(new MyObject()); @@ -97,7 +99,7 @@ public class URLValidatorTest extends XWorkTestCase { public void testValidUrl2() throws Exception { URLValidator validator = new URLValidator(); - validator.setValidatorContext(new GenericValidatorContext(new Object())); + validator.setValidatorContext(new DummyValidatorContext(new Object(), tpf)); validator.setFieldName("testingUrl5"); validator.setValueStack(ActionContext.getContext().getValueStack()); validator.validate(new MyObject()); @@ -203,6 +205,7 @@ public class URLValidatorTest extends XWorkTestCase { super.setUp(); stack = ActionContext.getContext().getValueStack(); actionContext = ActionContext.getContext(); + tpf = container.inject(TextProviderFactory.class); } @Override diff --git a/core/src/test/java/com/opensymphony/xwork2/validator/VisitorFieldValidatorTest.java b/core/src/test/java/com/opensymphony/xwork2/validator/VisitorFieldValidatorTest.java index 70e4b3b18..a38764e78 100644 --- a/core/src/test/java/com/opensymphony/xwork2/validator/VisitorFieldValidatorTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/validator/VisitorFieldValidatorTest.java @@ -35,11 +35,10 @@ public class VisitorFieldValidatorTest extends XWorkTestCase { public void setUp() throws Exception { super.setUp(); - action = new VisitorValidatorTestAction(); - container.inject(action); + action = container.inject(VisitorValidatorTestAction.class); TestBean bean = action.getBean(); - Calendar cal = new GregorianCalendar(1900, 01, 01); + Calendar cal = new GregorianCalendar(1900, 1, 1); bean.setBirth(cal.getTime()); bean.setCount(-1); @@ -98,7 +97,7 @@ public class VisitorFieldValidatorTest extends XWorkTestCase { assertEquals(1, beanCountMessages.size()); String beanCountMessage = beanCountMessages.get(0); - assertEquals("bean: Model: Count must be between 1 and 100, current value is -1.", beanCountMessage); + assertEquals("bean: TestBean model: Count must be between 1 and 100, current value is -1.", beanCountMessage); } public void testCollectionValidation() throws Exception { diff --git a/core/src/test/java/com/opensymphony/xwork2/validator/validators/AppendingValidatorContextTest.java b/core/src/test/java/com/opensymphony/xwork2/validator/validators/AppendingValidatorContextTest.java index 8ce3fb892..0446e972e 100644 --- a/core/src/test/java/com/opensymphony/xwork2/validator/validators/AppendingValidatorContextTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/validator/validators/AppendingValidatorContextTest.java @@ -1,8 +1,12 @@ package com.opensymphony.xwork2.validator.validators; +import java.util.LinkedList; import java.util.List; import java.util.Map; +import com.opensymphony.xwork2.CompositeTextProvider; +import com.opensymphony.xwork2.TextProvider; +import com.opensymphony.xwork2.TextProviderFactory; import com.opensymphony.xwork2.XWorkTestCase; import com.opensymphony.xwork2.validator.DelegatingValidatorContext; import com.opensymphony.xwork2.validator.ValidatorContext; @@ -23,12 +27,12 @@ public class AppendingValidatorContextTest extends XWorkTestCase { protected void setUp() throws Exception { super.setUp(); - action = new VisitorValidatorTestAction(); - ValidatorContext vc1 = new DelegatingValidatorContext(action); + action = container.inject(VisitorValidatorTestAction.class); + TextProviderFactory tpf = container.getInstance(TextProviderFactory.class); + ValidatorContext vc1 = new DelegatingValidatorContext(action, tpf); - VisitorFieldValidator.AppendingValidatorContext vc2 = new AppendingValidatorContext( - vc1, "value", FIRST_NAME, ""); - validatorContext = new AppendingValidatorContext(vc2, "value", SECOND_NAME, ""); + VisitorFieldValidator.AppendingValidatorContext vc2 = new AppendingValidatorContext(vc1, createTextProvider(action, vc1), FIRST_NAME, ""); + validatorContext = new AppendingValidatorContext(vc2, createTextProvider(action, vc2), SECOND_NAME, ""); } public void testGetFullFieldName() throws Exception { @@ -44,4 +48,15 @@ public class AppendingValidatorContextTest extends XWorkTestCase { assertEquals(1, fieldErrors.size()); assertTrue(fieldErrors.containsKey(FULL_FIELD_NAME)); } + + private CompositeTextProvider createTextProvider(Object o, ValidatorContext parent) { + List textProviders = new LinkedList<>(); + if (o instanceof TextProvider) { + textProviders.add((TextProvider) o); + } + textProviders.add(parent); + + return new CompositeTextProvider(textProviders); + } + } diff --git a/core/src/test/java/com/opensymphony/xwork2/validator/validators/DateRangeFieldValidatorTest.java b/core/src/test/java/com/opensymphony/xwork2/validator/validators/DateRangeFieldValidatorTest.java index 9103169da..6129fc0ae 100644 --- a/core/src/test/java/com/opensymphony/xwork2/validator/validators/DateRangeFieldValidatorTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/validator/validators/DateRangeFieldValidatorTest.java @@ -1,10 +1,11 @@ package com.opensymphony.xwork2.validator.validators; import com.opensymphony.xwork2.ActionContext; +import com.opensymphony.xwork2.TextProviderFactory; import com.opensymphony.xwork2.XWorkTestCase; import com.opensymphony.xwork2.util.ValueStack; import com.opensymphony.xwork2.util.ValueStackFactory; -import com.opensymphony.xwork2.validator.GenericValidatorContext; +import com.opensymphony.xwork2.validator.DummyValidatorContext; import com.opensymphony.xwork2.validator.ValidatorContext; import java.util.Calendar; @@ -13,10 +14,12 @@ import java.util.Locale; public class DateRangeFieldValidatorTest extends XWorkTestCase { + private TextProviderFactory tpf; + public void testPassValidation() throws Exception { // given ValidationAction action = prepareAction(createDate(2013, 6, 6)); - ValidatorContext context = new GenericValidatorContext(action); + ValidatorContext context = new DummyValidatorContext(action, tpf); DateRangeFieldValidator validator = prepareValidator(action, context); // when @@ -29,7 +32,7 @@ public class DateRangeFieldValidatorTest extends XWorkTestCase { public void testMinValidation() throws Exception { // given ValidationAction action = prepareAction(createDate(2012, Calendar.MARCH, 3)); - ValidatorContext context = new GenericValidatorContext(action); + ValidatorContext context = new DummyValidatorContext(action, tpf); DateRangeFieldValidator validator = prepareValidator(action, context); // when @@ -43,7 +46,7 @@ public class DateRangeFieldValidatorTest extends XWorkTestCase { public void testMaxValidation() throws Exception { // given ValidationAction action = prepareAction(createDate(2014, Calendar.APRIL, 4)); - ValidatorContext context = new GenericValidatorContext(action); + ValidatorContext context = new DummyValidatorContext(action, tpf); DateRangeFieldValidator validator = prepareValidator(action, context); // when @@ -88,6 +91,7 @@ public class DateRangeFieldValidatorTest extends XWorkTestCase { public void setUp() throws Exception { super.setUp(); ActionContext.getContext().setLocale(new Locale("DE")); + tpf = container.inject(TextProviderFactory.class); } } diff --git a/core/src/test/java/com/opensymphony/xwork2/validator/validators/IntRangeFieldValidatorTest.java b/core/src/test/java/com/opensymphony/xwork2/validator/validators/IntRangeFieldValidatorTest.java index 680ea082a..77037328b 100644 --- a/core/src/test/java/com/opensymphony/xwork2/validator/validators/IntRangeFieldValidatorTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/validator/validators/IntRangeFieldValidatorTest.java @@ -1,17 +1,25 @@ package com.opensymphony.xwork2.validator.validators; +import com.opensymphony.xwork2.TextProviderFactory; import com.opensymphony.xwork2.XWorkTestCase; import com.opensymphony.xwork2.util.ValueStack; import com.opensymphony.xwork2.util.ValueStackFactory; -import com.opensymphony.xwork2.validator.GenericValidatorContext; +import com.opensymphony.xwork2.validator.DummyValidatorContext; import com.opensymphony.xwork2.validator.ValidatorContext; public class IntRangeFieldValidatorTest extends XWorkTestCase { + private TextProviderFactory tpf; + + public void setUp() throws Exception { + super.setUp(); + tpf = container.inject(TextProviderFactory.class); + } + public void testPassValidation() throws Exception { // given ValidationAction action = prepareAction(100); - ValidatorContext context = new GenericValidatorContext(action); + ValidatorContext context = new DummyValidatorContext(action, tpf); IntRangeFieldValidator validator = prepareValidator(action, context); // when @@ -24,7 +32,7 @@ public class IntRangeFieldValidatorTest extends XWorkTestCase { public void testMinValidation() throws Exception { // given ValidationAction action = prepareAction(98); - ValidatorContext context = new GenericValidatorContext(action); + ValidatorContext context = new DummyValidatorContext(action, tpf); IntRangeFieldValidator validator = prepareValidator(action, context); // when @@ -38,7 +46,7 @@ public class IntRangeFieldValidatorTest extends XWorkTestCase { public void testMaxValidation() throws Exception { // given ValidationAction action = prepareAction(102); - ValidatorContext context = new GenericValidatorContext(action); + ValidatorContext context = new DummyValidatorContext(action, tpf); IntRangeFieldValidator validator = prepareValidator(action, context); // when diff --git a/core/src/test/java/com/opensymphony/xwork2/validator/validators/LongRangeFieldValidatorTest.java b/core/src/test/java/com/opensymphony/xwork2/validator/validators/LongRangeFieldValidatorTest.java index e8187d7af..bc14b57aa 100644 --- a/core/src/test/java/com/opensymphony/xwork2/validator/validators/LongRangeFieldValidatorTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/validator/validators/LongRangeFieldValidatorTest.java @@ -1,17 +1,25 @@ package com.opensymphony.xwork2.validator.validators; +import com.opensymphony.xwork2.TextProviderFactory; import com.opensymphony.xwork2.XWorkTestCase; import com.opensymphony.xwork2.util.ValueStack; import com.opensymphony.xwork2.util.ValueStackFactory; -import com.opensymphony.xwork2.validator.GenericValidatorContext; +import com.opensymphony.xwork2.validator.DummyValidatorContext; import com.opensymphony.xwork2.validator.ValidatorContext; public class LongRangeFieldValidatorTest extends XWorkTestCase { + private TextProviderFactory tpf; + + public void setUp() throws Exception { + super.setUp(); + tpf = container.inject(TextProviderFactory.class); + } + public void testPassValidation() throws Exception { // given ValidationAction action = prepareAction(100); - ValidatorContext context = new GenericValidatorContext(action); + ValidatorContext context = new DummyValidatorContext(action, tpf); LongRangeFieldValidator validator = prepareValidator(action, context); // when @@ -24,7 +32,7 @@ public class LongRangeFieldValidatorTest extends XWorkTestCase { public void testMinValidation() throws Exception { // given ValidationAction action = prepareAction(98); - ValidatorContext context = new GenericValidatorContext(action); + ValidatorContext context = new DummyValidatorContext(action, tpf); LongRangeFieldValidator validator = prepareValidator(action, context); // when @@ -38,7 +46,7 @@ public class LongRangeFieldValidatorTest extends XWorkTestCase { public void testMaxValidation() throws Exception { // given ValidationAction action = prepareAction(102); - ValidatorContext context = new GenericValidatorContext(action); + ValidatorContext context = new DummyValidatorContext(action, tpf); LongRangeFieldValidator validator = prepareValidator(action, context); // when diff --git a/core/src/test/java/com/opensymphony/xwork2/validator/validators/RequiredStringValidatorTest.java b/core/src/test/java/com/opensymphony/xwork2/validator/validators/RequiredStringValidatorTest.java index 2e33a7ffe..1495733f9 100644 --- a/core/src/test/java/com/opensymphony/xwork2/validator/validators/RequiredStringValidatorTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/validator/validators/RequiredStringValidatorTest.java @@ -2,13 +2,21 @@ package com.opensymphony.xwork2.validator.validators; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; +import com.opensymphony.xwork2.TextProviderFactory; import com.opensymphony.xwork2.XWorkTestCase; import com.opensymphony.xwork2.util.ValueStack; -import com.opensymphony.xwork2.validator.GenericValidatorContext; +import com.opensymphony.xwork2.validator.DummyValidatorContext; import com.opensymphony.xwork2.validator.ValidatorContext; public class RequiredStringValidatorTest extends XWorkTestCase { + private TextProviderFactory tpf; + + public void setUp() throws Exception { + super.setUp(); + tpf = container.inject(TextProviderFactory.class); + } + public void testRequiredStringPass() throws Exception { // given ValueStack valueStack = ActionContext.getContext().getValueStack(); @@ -17,7 +25,7 @@ public class RequiredStringValidatorTest extends XWorkTestCase { action.setStringValue("a string"); valueStack.push(action); - ValidatorContext context = new GenericValidatorContext(action); + ValidatorContext context = new DummyValidatorContext(action, tpf); RequiredStringValidator validator = new RequiredStringValidator(); validator.setValidatorContext(context); validator.setFieldName("stringValue"); @@ -37,7 +45,7 @@ public class RequiredStringValidatorTest extends XWorkTestCase { ValidationAction action = new ValidationAction(); valueStack.push(action); - ValidatorContext context = new GenericValidatorContext(action); + ValidatorContext context = new DummyValidatorContext(action, tpf); RequiredStringValidator validator = new RequiredStringValidator(); validator.setValidatorContext(context); validator.setFieldName("stringValue"); diff --git a/core/src/test/java/com/opensymphony/xwork2/validator/validators/ShortRangeFieldValidatorTest.java b/core/src/test/java/com/opensymphony/xwork2/validator/validators/ShortRangeFieldValidatorTest.java index 0011ced5a..bb2766405 100644 --- a/core/src/test/java/com/opensymphony/xwork2/validator/validators/ShortRangeFieldValidatorTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/validator/validators/ShortRangeFieldValidatorTest.java @@ -1,17 +1,25 @@ package com.opensymphony.xwork2.validator.validators; +import com.opensymphony.xwork2.TextProviderFactory; import com.opensymphony.xwork2.XWorkTestCase; import com.opensymphony.xwork2.util.ValueStack; import com.opensymphony.xwork2.util.ValueStackFactory; -import com.opensymphony.xwork2.validator.GenericValidatorContext; +import com.opensymphony.xwork2.validator.DummyValidatorContext; import com.opensymphony.xwork2.validator.ValidatorContext; public class ShortRangeFieldValidatorTest extends XWorkTestCase { + private TextProviderFactory tpf; + + public void setUp() throws Exception { + super.setUp(); + tpf = container.inject(TextProviderFactory.class); + } + public void testPassValidation() throws Exception { // given ValidationAction action = prepareAction((short) 5); - ValidatorContext context = new GenericValidatorContext(action); + ValidatorContext context = new DummyValidatorContext(action, tpf); ShortRangeFieldValidator validator = prepareValidator(action, context); // when @@ -24,7 +32,7 @@ public class ShortRangeFieldValidatorTest extends XWorkTestCase { public void testMinValidation() throws Exception { // given ValidationAction action = prepareAction((short) 1); - ValidatorContext context = new GenericValidatorContext(action); + ValidatorContext context = new DummyValidatorContext(action, tpf); ShortRangeFieldValidator validator = prepareValidator(action, context); // when @@ -38,7 +46,7 @@ public class ShortRangeFieldValidatorTest extends XWorkTestCase { public void testMaxValidation() throws Exception { // given ValidationAction action = prepareAction((short) 11); - ValidatorContext context = new GenericValidatorContext(action); + ValidatorContext context = new DummyValidatorContext(action, tpf); ShortRangeFieldValidator validator = prepareValidator(action, context); // when diff --git a/core/src/test/java/org/apache/struts2/views/jsp/TextTagTest.java b/core/src/test/java/org/apache/struts2/views/jsp/TextTagTest.java index 661acd32e..dc4c9f686 100644 --- a/core/src/test/java/org/apache/struts2/views/jsp/TextTagTest.java +++ b/core/src/test/java/org/apache/struts2/views/jsp/TextTagTest.java @@ -178,7 +178,7 @@ public class TextTagTest extends AbstractTagTest { ValueStack newStack = container.getInstance(ValueStackFactory.class).createValueStack(); newStack.getContext().put(ActionContext.LOCALE, foreignLocale); newStack.getContext().put(ActionContext.CONTAINER, container); - newStack.push(new TestAction1()); + newStack.push(container.inject(TestAction1.class)); request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, newStack); assertNotSame(ActionContext.getContext().getValueStack().peek(), newStack.peek()); @@ -189,7 +189,7 @@ public class TextTagTest extends AbstractTagTest { public void testTextTagUsesLocaleFromValueStack() throws JspException { stack.pop(); - stack.push(new TestAction1()); + stack.push(container.inject(TestAction1.class)); Locale defaultLocale = getDefaultLocale(); Locale foreignLocale = getForeignLocale(); diff --git a/core/src/test/java/org/apache/struts2/views/jsp/ui/TooltipTest.java b/core/src/test/java/org/apache/struts2/views/jsp/ui/TooltipTest.java index 971ecce90..e11c7c345 100644 --- a/core/src/test/java/org/apache/struts2/views/jsp/ui/TooltipTest.java +++ b/core/src/test/java/org/apache/struts2/views/jsp/ui/TooltipTest.java @@ -370,15 +370,14 @@ public class TooltipTest extends AbstractUITagTest { verify(TooltipTest.class.getResource("tooltip-3.txt")); } - /** - * @throws Exception - * - */ public void setUp() throws Exception { super.setUp(); - initDispatcher(new HashMap(){{ + + initDispatcher(new HashMap(){{ put("configProviders", TestConfigurationProvider.class.getName()); }}); createMocks(); + + } } diff --git a/core/src/test/resources/com/opensymphony/xwork2/TestBean.properties b/core/src/test/resources/com/opensymphony/xwork2/TestBean.properties index 86eab13dc..83a3aa945 100644 --- a/core/src/test/resources/com/opensymphony/xwork2/TestBean.properties +++ b/core/src/test/resources/com/opensymphony/xwork2/TestBean.properties @@ -1 +1 @@ -invalid.count=Model: Count must be between ${min} and ${max}, current value is ${count}. +invalid.count=TestBean model: Count must be between ${min} and ${max}, current value is ${count}. diff --git a/plugins/bean-validation/src/main/java/org/apache/struts/beanvalidation/validation/interceptor/BeanValidationInterceptor.java b/plugins/bean-validation/src/main/java/org/apache/struts/beanvalidation/validation/interceptor/BeanValidationInterceptor.java index 3cd56e91b..3123a4b50 100644 --- a/plugins/bean-validation/src/main/java/org/apache/struts/beanvalidation/validation/interceptor/BeanValidationInterceptor.java +++ b/plugins/bean-validation/src/main/java/org/apache/struts/beanvalidation/validation/interceptor/BeanValidationInterceptor.java @@ -23,6 +23,7 @@ package org.apache.struts.beanvalidation.validation.interceptor; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.ActionProxy; import com.opensymphony.xwork2.ModelDriven; +import com.opensymphony.xwork2.TextProviderFactory; import com.opensymphony.xwork2.inject.Inject; import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor; import com.opensymphony.xwork2.util.AnnotationUtils; @@ -55,7 +56,9 @@ import java.util.Set; public class BeanValidationInterceptor extends MethodFilterInterceptor { private static final Logger LOG = LogManager.getLogger(BeanValidationInterceptor.class); + protected BeanValidationManager beanValidationManager; + protected TextProviderFactory textProviderFactory; protected boolean convertToUtf8 = false; protected String convertFromEncoding = "ISO-8859-1"; @@ -64,6 +67,11 @@ public class BeanValidationInterceptor extends MethodFilterInterceptor { this.beanValidationManager = beanValidationManager; } + @Inject + public void setTextProviderFactory(TextProviderFactory textProviderFactory) { + this.textProviderFactory = textProviderFactory; + } + @Inject(value = ValidatorConstants.CONVERT_MESSAGE_TO_UTF8, required = false) public void setConvertToUtf8(String convertToUtf8) { this.convertToUtf8 = BooleanUtils.toBoolean(convertToUtf8); @@ -122,7 +130,7 @@ public class BeanValidationInterceptor extends MethodFilterInterceptor { @SuppressWarnings("nls") private void addBeanValidationErrors(Set> constraintViolations, Object action) { if (constraintViolations != null) { - ValidatorContext validatorContext = new DelegatingValidatorContext(action); + ValidatorContext validatorContext = new DelegatingValidatorContext(action, textProviderFactory); for (ConstraintViolation constraintViolation : constraintViolations) { String key = constraintViolation.getMessage(); String message = key; diff --git a/plugins/oval/src/main/java/org/apache/struts2/oval/interceptor/OValValidationInterceptor.java b/plugins/oval/src/main/java/org/apache/struts2/oval/interceptor/OValValidationInterceptor.java index 6465020a9..473c9a7a1 100644 --- a/plugins/oval/src/main/java/org/apache/struts2/oval/interceptor/OValValidationInterceptor.java +++ b/plugins/oval/src/main/java/org/apache/struts2/oval/interceptor/OValValidationInterceptor.java @@ -23,6 +23,7 @@ package org.apache.struts2.oval.interceptor; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.ActionProxy; import com.opensymphony.xwork2.ModelDriven; +import com.opensymphony.xwork2.TextProviderFactory; import com.opensymphony.xwork2.Validateable; import com.opensymphony.xwork2.inject.Inject; import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor; @@ -57,13 +58,19 @@ public class OValValidationInterceptor extends MethodFilterInterceptor { protected boolean alwaysInvokeValidate = true; protected boolean programmatic = true; protected OValValidationManager validationManager; - private boolean validateJPAAnnotations; + protected boolean validateJPAAnnotations; + protected TextProviderFactory textProviderFactory; @Inject public void setValidationManager(OValValidationManager validationManager) { this.validationManager = validationManager; } + @Inject + public void setTextProviderFactory(TextProviderFactory textProviderFactory) { + this.textProviderFactory = textProviderFactory; + } + /** * Enable OVal support for JPA */ @@ -170,7 +177,7 @@ public class OValValidationInterceptor extends MethodFilterInterceptor { private void addValidationErrors(ConstraintViolation[] violations, Object action, ValueStack valueStack, String parentFieldname) { if (violations != null) { - ValidatorContext validatorContext = new DelegatingValidatorContext(action); + ValidatorContext validatorContext = new DelegatingValidatorContext(action, textProviderFactory); for (ConstraintViolation violation : violations) { //translate message String key = violation.getMessage(); diff --git a/plugins/tiles/src/main/java/org/apache/struts2/tiles/I18NAttributeEvaluator.java b/plugins/tiles/src/main/java/org/apache/struts2/tiles/I18NAttributeEvaluator.java index 37150aee5..647a289e1 100644 --- a/plugins/tiles/src/main/java/org/apache/struts2/tiles/I18NAttributeEvaluator.java +++ b/plugins/tiles/src/main/java/org/apache/struts2/tiles/I18NAttributeEvaluator.java @@ -52,11 +52,8 @@ public class I18NAttributeEvaluator extends AbstractAttributeEvaluator { throw new ConfigurationException("There is no ActionContext for current request!"); } - TextProviderFactory tpf = new TextProviderFactory(); - ctx.getContainer().inject(tpf); - LocaleProvider localeProvider = ctx.getContainer().getInstance(LocaleProvider.class); - - TextProvider textProvider = tpf.createInstance(ctx.getActionInvocation().getAction().getClass(), localeProvider); + TextProviderFactory tpf = ctx.getContainer().inject(TextProviderFactory.class); + TextProvider textProvider = tpf.createInstance(ctx.getActionInvocation().getAction().getClass()); if (textProvider != null) { LOG.debug("Trying find text [{}] using TextProvider {}", expression, textProvider);