Merge branch 'injectable-context' into localized-bean

This commit is contained in:
Lukasz Lenart
2017-03-13 08:20:42 +01:00
40 changed files with 303 additions and 177 deletions
@@ -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;
}
@@ -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;
}
}
@@ -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)
@@ -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<Validator> 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);
}
@@ -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<String, List<ValidatorConfig>> validatorCache = Collections.synchronizedMap(new HashMap<String, List<ValidatorConfig>>());
private final Map<String, List<ValidatorConfig>> validatorFileCache = Collections.synchronizedMap(new HashMap<String, List<ValidatorConfig>>());
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<Validator> 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);
}
@@ -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);
}
}
@@ -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<Object> parsedMessageParameters = null;
if (messageParameters != null) {
@@ -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<TextProvider> 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;
@@ -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";
}
@@ -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;
}
@@ -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);
@@ -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) {
@@ -130,6 +130,7 @@
<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" />
@@ -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;
@@ -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;
@@ -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) {
@@ -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");
@@ -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
@@ -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<String> actionErrors;
private Collection<String> actionMessages;
private Map<String, List<String>> 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
@@ -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);
}
}
@@ -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);
}
}
@@ -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);
@@ -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<String, Object> 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;
@@ -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());
@@ -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);
@@ -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);
}
}
@@ -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
@@ -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 {
@@ -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<TextProvider> textProviders = new LinkedList<>();
if (o instanceof TextProvider) {
textProviders.add((TextProvider) o);
}
textProviders.add(parent);
return new CompositeTextProvider(textProviders);
}
}
@@ -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);
}
}
@@ -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
@@ -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
@@ -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");
@@ -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
@@ -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();
@@ -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<String,String>(){{
initDispatcher(new HashMap<String,String>(){{
put("configProviders", TestConfigurationProvider.class.getName());
}});
createMocks();
}
}
@@ -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}.
@@ -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<ConstraintViolation<Object>> constraintViolations, Object action) {
if (constraintViolations != null) {
ValidatorContext validatorContext = new DelegatingValidatorContext(action);
ValidatorContext validatorContext = new DelegatingValidatorContext(action, textProviderFactory);
for (ConstraintViolation<Object> constraintViolation : constraintViolations) {
String key = constraintViolation.getMessage();
String message = key;
@@ -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();
@@ -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);