mirror of
https://github.com/apache/struts.git
synced 2026-08-06 23:27:07 +00:00
[WW-5143] [WW-5142] Upgrades OVal to ver. 3.2.1 and upgrades XStream to ver 1.4.18 (#499)
* WW-5143 WW-5142 Upgrades OVal to ver. 3.2.1 and upgrades XStream to ver 1.4.18 * WW-5143 Improves test
This commit is contained in:
+16
-19
@@ -48,8 +48,8 @@ public class DefaultOValValidationManager implements OValValidationManager {
|
||||
private static final Logger LOG = LogManager.getLogger(DefaultOValValidationManager.class);
|
||||
|
||||
protected static final String VALIDATION_CONFIG_SUFFIX = "-validation.xml";
|
||||
protected final Map<String, List<Configurer>> validatorCache = new HashMap<String, List<Configurer>>();
|
||||
protected final Map<String, Configurer> validatorFileCache = new HashMap<String, Configurer>();
|
||||
protected final Map<String, List<Configurer>> validatorCache = new HashMap<>();
|
||||
protected final Map<String, Configurer> validatorFileCache = new HashMap<>();
|
||||
|
||||
protected boolean validateJPAAnnotations;
|
||||
|
||||
@@ -66,7 +66,7 @@ public class DefaultOValValidationManager implements OValValidationManager {
|
||||
this.fileManager = fileManagerFactory.getFileManager();
|
||||
}
|
||||
|
||||
public synchronized List<Configurer> getConfigurers(Class clazz, String context, boolean validateJPAAnnotations) {
|
||||
public synchronized List<Configurer> getConfigurers(Class<?> clazz, String context, boolean validateJPAAnnotations) {
|
||||
this.validateJPAAnnotations =validateJPAAnnotations;
|
||||
final String validatorKey = buildValidatorKey(clazz, context);
|
||||
|
||||
@@ -75,14 +75,14 @@ public class DefaultOValValidationManager implements OValValidationManager {
|
||||
List<Configurer> configurers = buildXMLConfigurers(clazz, context, true, null);
|
||||
|
||||
//add an annotation configurer
|
||||
addAditionalConfigurers(configurers);
|
||||
addAdditionalConfigurers(configurers);
|
||||
validatorCache.put(validatorKey, configurers);
|
||||
}
|
||||
} else {
|
||||
List<Configurer> configurers = buildXMLConfigurers(clazz, context, false, null);
|
||||
|
||||
//add an annotation configurer
|
||||
addAditionalConfigurers(configurers);
|
||||
addAdditionalConfigurers(configurers);
|
||||
validatorCache.put(validatorKey, configurers);
|
||||
}
|
||||
|
||||
@@ -90,7 +90,7 @@ public class DefaultOValValidationManager implements OValValidationManager {
|
||||
return validatorCache.get(validatorKey);
|
||||
}
|
||||
|
||||
private void addAditionalConfigurers(List<Configurer> configurers) {
|
||||
private void addAdditionalConfigurers(List<Configurer> configurers) {
|
||||
AnnotationsConfigurer annotationsConfigurer = new AnnotationsConfigurer();
|
||||
configurers.add(annotationsConfigurer);
|
||||
|
||||
@@ -102,24 +102,21 @@ public class DefaultOValValidationManager implements OValValidationManager {
|
||||
}
|
||||
}
|
||||
|
||||
protected static String buildValidatorKey(Class clazz, String context) {
|
||||
StringBuilder sb = new StringBuilder(clazz.getName());
|
||||
sb.append("/");
|
||||
sb.append(context);
|
||||
return sb.toString();
|
||||
protected static String buildValidatorKey(Class<?> clazz, String context) {
|
||||
return clazz.getName() + "/" + context;
|
||||
}
|
||||
|
||||
private List<Configurer> buildXMLConfigurers(Class clazz, String context, boolean checkFile, Set<String> checked) {
|
||||
List<Configurer> configurers = new ArrayList<Configurer>();
|
||||
private List<Configurer> buildXMLConfigurers(Class<?> clazz, String context, boolean checkFile, Set<String> checked) {
|
||||
List<Configurer> configurers = new ArrayList<>();
|
||||
|
||||
if (checked == null) {
|
||||
checked = new TreeSet<String>();
|
||||
checked = new TreeSet<>();
|
||||
} else if (checked.contains(clazz.getName())) {
|
||||
return configurers;
|
||||
}
|
||||
|
||||
if (clazz.isInterface()) {
|
||||
for (Class anInterface : clazz.getInterfaces()) {
|
||||
for (Class<?> anInterface : clazz.getInterfaces()) {
|
||||
configurers.addAll(buildXMLConfigurers(anInterface, context, checkFile, checked));
|
||||
}
|
||||
} else {
|
||||
@@ -129,7 +126,7 @@ public class DefaultOValValidationManager implements OValValidationManager {
|
||||
}
|
||||
|
||||
// look for validators for implemented interfaces
|
||||
for (Class anInterface1 : clazz.getInterfaces()) {
|
||||
for (Class<?> anInterface1 : clazz.getInterfaces()) {
|
||||
if (checked.contains(anInterface1.getName())) {
|
||||
continue;
|
||||
}
|
||||
@@ -160,19 +157,19 @@ public class DefaultOValValidationManager implements OValValidationManager {
|
||||
}
|
||||
|
||||
|
||||
protected XMLConfigurer buildAliasValidatorConfigs(Class aClass, String context, boolean checkFile) {
|
||||
protected XMLConfigurer buildAliasValidatorConfigs(Class<?> aClass, String context, boolean checkFile) {
|
||||
String fileName = aClass.getName().replace('.', '/') + "-" + context + VALIDATION_CONFIG_SUFFIX;
|
||||
|
||||
return loadFile(fileName, aClass, checkFile);
|
||||
}
|
||||
|
||||
protected XMLConfigurer buildClassValidatorConfigs(Class aClass, boolean checkFile) {
|
||||
protected XMLConfigurer buildClassValidatorConfigs(Class<?> aClass, boolean checkFile) {
|
||||
String fileName = aClass.getName().replace('.', '/') + VALIDATION_CONFIG_SUFFIX;
|
||||
|
||||
return loadFile(fileName, aClass, checkFile);
|
||||
}
|
||||
|
||||
protected XMLConfigurer loadFile(String fileName, Class clazz, boolean checkFile) {
|
||||
protected XMLConfigurer loadFile(String fileName, Class<?> clazz, boolean checkFile) {
|
||||
URL fileUrl = ClassLoaderUtil.getResource(fileName, clazz);
|
||||
if ((checkFile && fileManager.fileNeedsReloading(fileUrl)) || !validatorFileCache.containsKey(fileName)) {
|
||||
|
||||
|
||||
+114
-72
@@ -28,22 +28,26 @@ import com.opensymphony.xwork2.inject.Inject;
|
||||
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
|
||||
import com.opensymphony.xwork2.interceptor.PrefixMethodInvocationUtil;
|
||||
import com.opensymphony.xwork2.util.ValueStack;
|
||||
import net.sf.oval.exception.ExpressionEvaluationException;
|
||||
import net.sf.oval.expression.ExpressionLanguage;
|
||||
import net.sf.oval.expression.ExpressionLanguageOGNLImpl;
|
||||
import ognl.Ognl;
|
||||
import ognl.OgnlException;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import com.opensymphony.xwork2.validator.DelegatingValidatorContext;
|
||||
import com.opensymphony.xwork2.validator.ValidatorContext;
|
||||
import net.sf.oval.ConstraintViolation;
|
||||
import net.sf.oval.Validator;
|
||||
import net.sf.oval.configuration.Configurer;
|
||||
import net.sf.oval.context.FieldContext;
|
||||
import net.sf.oval.context.IterableElementContext;
|
||||
import net.sf.oval.context.MapKeyContext;
|
||||
import net.sf.oval.context.MapValueContext;
|
||||
import net.sf.oval.context.MethodReturnValueContext;
|
||||
import net.sf.oval.context.OValContext;
|
||||
import net.sf.oval.exception.ExpressionEvaluationException;
|
||||
import net.sf.oval.expression.ExpressionLanguage;
|
||||
import net.sf.oval.expression.ExpressionLanguageOGNLImpl;
|
||||
import net.sf.oval.localization.context.OValContextRenderer;
|
||||
import ognl.Ognl;
|
||||
import ognl.OgnlException;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.apache.struts2.oval.annotation.Profiles;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
@@ -54,7 +58,7 @@ import java.util.Map;
|
||||
/*
|
||||
This interceptor provides validation using the OVal validation framework
|
||||
*/
|
||||
public class OValValidationInterceptor extends MethodFilterInterceptor {
|
||||
public class OValValidationInterceptor extends MethodFilterInterceptor implements MethodNameExtractor {
|
||||
|
||||
public static final String STRUTS_OVAL_VALIDATE_JPAANNOTATIONS = "struts.oval.validateJPAAnnotations";
|
||||
|
||||
@@ -69,10 +73,11 @@ public class OValValidationInterceptor extends MethodFilterInterceptor {
|
||||
protected boolean validateJPAAnnotations;
|
||||
protected TextProviderFactory textProviderFactory;
|
||||
|
||||
private ExpressionLanguage ognlExpressionLanguage;
|
||||
private final ExpressionLanguage ognlExpressionLanguage;
|
||||
|
||||
public OValValidationInterceptor() {
|
||||
ognlExpressionLanguage = new ExpressionLanguageOGNL();
|
||||
Validator.setContextRenderer(new StrutsContextRenderer());
|
||||
}
|
||||
|
||||
@Inject
|
||||
@@ -143,8 +148,8 @@ public class OValValidationInterceptor extends MethodFilterInterceptor {
|
||||
|
||||
try {
|
||||
PrefixMethodInvocationUtil.invokePrefixMethod(
|
||||
invocation,
|
||||
new String[]{VALIDATE_PREFIX, ALT_VALIDATE_PREFIX});
|
||||
invocation,
|
||||
new String[]{VALIDATE_PREFIX, ALT_VALIDATE_PREFIX});
|
||||
} catch (Exception e) {
|
||||
// If any exception occurred while doing reflection, we want
|
||||
// validate() to be executed
|
||||
@@ -164,7 +169,7 @@ public class OValValidationInterceptor extends MethodFilterInterceptor {
|
||||
}
|
||||
|
||||
protected void performOValValidation(Object action, ValueStack valueStack, String methodName, String context) throws NoSuchMethodException {
|
||||
Class clazz = action.getClass();
|
||||
Class<?> clazz = action.getClass();
|
||||
//read validation from xmls
|
||||
List<Configurer> configurers = validationManager.getConfigurers(clazz, context, validateJPAAnnotations);
|
||||
|
||||
@@ -172,33 +177,31 @@ public class OValValidationInterceptor extends MethodFilterInterceptor {
|
||||
// Note: For Oval <= 1.70, API requires "validator.addExpressionLanguage("ognl", ognlExpressionLanguage)".
|
||||
validator.getExpressionLanguageRegistry().registerExpressionLanguage("ognl", ognlExpressionLanguage); // Usage for Oval >= 1.80 due to API changes
|
||||
//if the method is annotated with a @Profiles annotation, use those profiles
|
||||
Method method = clazz.getMethod(methodName, new Class[0]);
|
||||
if (method != null) {
|
||||
Profiles profiles = method.getAnnotation(Profiles.class);
|
||||
if (profiles != null) {
|
||||
String[] profileNames = profiles.value();
|
||||
if (profileNames != null && profileNames.length > 0) {
|
||||
validator.disableAllProfiles();
|
||||
LOG.debug("Enabling profiles [{}]", StringUtils.join(profileNames, ","));
|
||||
for (String profileName : profileNames)
|
||||
validator.enableProfile(profileName);
|
||||
}
|
||||
Method method = clazz.getMethod(methodName);
|
||||
Profiles profiles = method.getAnnotation(Profiles.class);
|
||||
if (profiles != null) {
|
||||
String[] profileNames = profiles.value();
|
||||
if (profileNames != null && profileNames.length > 0) {
|
||||
validator.disableAllProfiles();
|
||||
LOG.debug("Enabling profiles [{}]", StringUtils.join(profileNames, ","));
|
||||
for (String profileName : profileNames)
|
||||
validator.enableProfile(profileName);
|
||||
}
|
||||
}
|
||||
|
||||
//perform validation
|
||||
List<ConstraintViolation> violations = validator.validate(action);
|
||||
addValidationErrors(violations.toArray(new ConstraintViolation[violations.size()]), action, valueStack, null);
|
||||
addValidationErrors(violations.toArray(new ConstraintViolation[0]), action, valueStack, null);
|
||||
}
|
||||
|
||||
private void addValidationErrors(ConstraintViolation[] violations, Object action, ValueStack valueStack, String parentFieldname) {
|
||||
if (violations != null) {
|
||||
private void addValidationErrors(ConstraintViolation[] violations, Object action, ValueStack valueStack, String parentFieldname) {
|
||||
if (violations != null) {
|
||||
ValidatorContext validatorContext = new DelegatingValidatorContext(action, textProviderFactory);
|
||||
for (ConstraintViolation violation : violations) {
|
||||
//translate message
|
||||
String key = violation.getMessage();
|
||||
|
||||
String message = key;
|
||||
String message;
|
||||
// push context variable into stack, to allow use ${max}, ${min} etc in error messages
|
||||
valueStack.push(violation.getMessageVariables());
|
||||
//push the validator into the stack
|
||||
@@ -211,71 +214,65 @@ public class OValValidationInterceptor extends MethodFilterInterceptor {
|
||||
}
|
||||
|
||||
if (isActionError(violation)) {
|
||||
LOG.debug("Adding action error '{}'", message);
|
||||
LOG.debug("Adding action error '{}'", message);
|
||||
validatorContext.addActionError(message);
|
||||
} else {
|
||||
ValidationError validationError = buildValidationError(violation, message);
|
||||
ValidationError validationError = buildValidationError(violation.getContextPath(), message);
|
||||
|
||||
// build field name
|
||||
String fieldName = validationError.getFieldName();
|
||||
if (parentFieldname != null) {
|
||||
fieldName = parentFieldname + "." + fieldName;
|
||||
fieldName = parentFieldname + "." + fieldName;
|
||||
}
|
||||
|
||||
LOG.debug("Adding field error [{}] with message '{}'", fieldName, validationError.getMessage());
|
||||
LOG.debug("Adding field error [{}] with message '{}'", fieldName, validationError.getMessage());
|
||||
validatorContext.addFieldError(fieldName, validationError.getMessage());
|
||||
|
||||
// don't add "model." prefix to fields of model in model driven action
|
||||
if ((action instanceof ModelDriven) && "model".equals(fieldName)) {
|
||||
fieldName = null;
|
||||
}
|
||||
|
||||
// add violations of member object fields
|
||||
addValidationErrors(violation.getCauses(), action, valueStack, fieldName);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get field name and message, used to add the validation error to fieldErrors
|
||||
*/
|
||||
protected ValidationError buildValidationError(ConstraintViolation violation, String message) {
|
||||
OValContext context = violation.getContext();
|
||||
if (context instanceof FieldContext) {
|
||||
Field field = ((FieldContext) context).getField();
|
||||
String className = field.getDeclaringClass().getName();
|
||||
|
||||
//the default OVal message shows the field name as ActionClass.fieldName
|
||||
String finalMessage = StringUtils.removeStart(message, className + ".");
|
||||
|
||||
return new ValidationError(field.getName(), finalMessage);
|
||||
} else if (context instanceof MethodReturnValueContext) {
|
||||
Method method = ((MethodReturnValueContext) context).getMethod();
|
||||
String className = method.getDeclaringClass().getName();
|
||||
String methodName = method.getName();
|
||||
|
||||
//the default OVal message shows the field name as ActionClass.fieldName
|
||||
String finalMessage = StringUtils.removeStart(message, className + ".");
|
||||
|
||||
String fieldName = null;
|
||||
if (methodName.startsWith("get")) {
|
||||
fieldName = StringUtils.uncapitalize(StringUtils.removeStart(methodName, "get"));
|
||||
} else if (methodName.startsWith("is")) {
|
||||
fieldName = StringUtils.uncapitalize(StringUtils.removeStart(methodName, "is"));
|
||||
protected ValidationError buildValidationError(List<OValContext> contextPath, String message) {
|
||||
StringBuilder fieldName = new StringBuilder();
|
||||
String finalMessage = message;
|
||||
for (OValContext context : contextPath) {
|
||||
if (fieldName.length() > 0) {
|
||||
fieldName.append(".");
|
||||
}
|
||||
|
||||
//the result will have the full method name, like "getName()", replace it by "name" (obnly if it is a field)
|
||||
if (fieldName != null)
|
||||
finalMessage = finalMessage.replaceAll(methodName + "\\(.*?\\)", fieldName);
|
||||
if (context instanceof FieldContext) {
|
||||
Field field = ((FieldContext) context).getField();
|
||||
String className = field.getDeclaringClass().getName();
|
||||
|
||||
return new ValidationError(StringUtils.defaultString(fieldName, methodName), finalMessage);
|
||||
//the default OVal message shows the field name as ActionClass.fieldName
|
||||
finalMessage = StringUtils.removeStart(finalMessage, className + ".");
|
||||
fieldName.append(field.getName());
|
||||
} else if (context instanceof MethodReturnValueContext) {
|
||||
Method method = ((MethodReturnValueContext) context).getMethod();
|
||||
String className = method.getDeclaringClass().getName();
|
||||
String methodName = method.getName();
|
||||
|
||||
//the default OVal message shows the field name as ActionClass.fieldName
|
||||
finalMessage = StringUtils.removeStart(message, className + ".");
|
||||
fieldName.append(extractName(method));
|
||||
|
||||
//the result will have the full method name, like "getName()", replace it by "name" (obnly if it is a field)
|
||||
if (fieldName.length() == 0) {
|
||||
finalMessage = finalMessage.replaceAll(methodName + "\\(.*?\\)", fieldName.toString());
|
||||
}
|
||||
} else {
|
||||
fieldName.append(context.toStringUnqualified());
|
||||
}
|
||||
}
|
||||
|
||||
return new ValidationError(violation.getCheckName(), message);
|
||||
return new ValidationError(fieldName.toString(), message);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -285,9 +282,9 @@ public class OValValidationInterceptor extends MethodFilterInterceptor {
|
||||
return false;
|
||||
}
|
||||
|
||||
class ValidationError {
|
||||
private String fieldName;
|
||||
private String message;
|
||||
static class ValidationError {
|
||||
private final String fieldName;
|
||||
private final String message;
|
||||
|
||||
ValidationError(String fieldName, String message) {
|
||||
this.fieldName = fieldName;
|
||||
@@ -309,9 +306,9 @@ class ExpressionLanguageOGNL extends ExpressionLanguageOGNLImpl {
|
||||
|
||||
private static final Logger LOG = LogManager.getLogger(ExpressionLanguageOGNL.class);
|
||||
|
||||
public Object evaluate(final String expression, final Map<String, ? > values) throws ExpressionEvaluationException {
|
||||
public Object evaluate(final String expression, final Map<String, ?> values) throws ExpressionEvaluationException {
|
||||
try {
|
||||
LOG.debug("Evaluating OGNL expression: {1}", expression);
|
||||
LOG.debug("Evaluating OGNL expression: {}", expression);
|
||||
return Ognl.getValue(expression, ActionContext.getContext().getContextMap(), values);
|
||||
} catch (final OgnlException ex) {
|
||||
throw new ExpressionEvaluationException("Evaluating script with OGNL failed.", ex);
|
||||
@@ -319,3 +316,48 @@ class ExpressionLanguageOGNL extends ExpressionLanguageOGNLImpl {
|
||||
}
|
||||
}
|
||||
|
||||
class StrutsContextRenderer implements OValContextRenderer, MethodNameExtractor {
|
||||
|
||||
@Override
|
||||
public String render(final OValContext context) {
|
||||
return context.toStringUnqualified();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String render(List<OValContext> contextPath) {
|
||||
final StringBuilder sb = new StringBuilder(3 * contextPath.size());
|
||||
boolean isFirst = true;
|
||||
for (final OValContext ctx : contextPath) {
|
||||
final boolean isContainerElementContext = ctx instanceof IterableElementContext || ctx instanceof MapKeyContext || ctx instanceof MapValueContext;
|
||||
if (isFirst) {
|
||||
isFirst = false;
|
||||
} else if (isContainerElementContext) {
|
||||
// do nothing special
|
||||
} else {
|
||||
sb.append('.');
|
||||
}
|
||||
|
||||
if (ctx instanceof MethodReturnValueContext) {
|
||||
sb.append(extractName(((MethodReturnValueContext) ctx).getMethod()));
|
||||
} else {
|
||||
sb.append(render(ctx));
|
||||
}
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
interface MethodNameExtractor {
|
||||
|
||||
default String extractName(Method method) {
|
||||
String methodName = method.getName();
|
||||
if (methodName.startsWith("get")) {
|
||||
return StringUtils.uncapitalize(StringUtils.removeStart(methodName, "get"));
|
||||
} else if (methodName.startsWith("is")) {
|
||||
return StringUtils.uncapitalize(StringUtils.removeStart(methodName, "is"));
|
||||
}
|
||||
return methodName;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+1
-1
@@ -63,5 +63,5 @@ public interface OValValidationManager {
|
||||
* updated.
|
||||
* @return a list of xml configurers for the given class and context.
|
||||
*/
|
||||
List<Configurer> getConfigurers(Class clazz, String context, boolean validateJPAAnnotations);
|
||||
List<Configurer> getConfigurers(Class<?> clazz, String context, boolean validateJPAAnnotations);
|
||||
}
|
||||
|
||||
+2
-2
@@ -28,10 +28,10 @@ import com.opensymphony.xwork2.ModelDriven;
|
||||
public class ModelDrivenAction extends ActionSupport implements ModelDriven<Person> {
|
||||
|
||||
@AssertValid
|
||||
private Person model = new Person();
|
||||
private Person person = new Person();
|
||||
|
||||
public Person getModel() {
|
||||
return model;
|
||||
return person;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+29
-51
@@ -21,11 +21,11 @@ package org.apache.struts2.oval.interceptor;
|
||||
import com.opensymphony.xwork2.ActionProxy;
|
||||
import com.opensymphony.xwork2.XWorkTestCase;
|
||||
import com.opensymphony.xwork2.interceptor.ValidationAware;
|
||||
import junit.framework.AssertionFailedError;
|
||||
import net.sf.oval.configuration.Configurer;
|
||||
import org.apache.struts2.config.StrutsXmlConfigurationProvider;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@@ -37,8 +37,8 @@ public class OValValidationInterceptorTest extends XWorkTestCase {
|
||||
Map<String, List<String>> fieldErrors = ((ValidationAware) baseActionProxy.getAction()).getFieldErrors();
|
||||
assertNotNull(fieldErrors);
|
||||
assertEquals(2, fieldErrors.size());
|
||||
assertValue(fieldErrors, "firstName", Arrays.asList("firstName cannot be null"));
|
||||
assertValue(fieldErrors, "lastName", Arrays.asList("lastName cannot be null"));
|
||||
assertValue(fieldErrors, "firstName", Collections.singletonList("firstName cannot be null"));
|
||||
assertValue(fieldErrors, "lastName", Collections.singletonList("lastName cannot be null"));
|
||||
}
|
||||
|
||||
public void testSimpleFieldsJPAAnnotations() throws Exception {
|
||||
@@ -48,7 +48,7 @@ public class OValValidationInterceptorTest extends XWorkTestCase {
|
||||
Map<String, List<String>> fieldErrors = ((ValidationAware) baseActionProxy.getAction()).getFieldErrors();
|
||||
assertNotNull(fieldErrors);
|
||||
assertEquals(1, fieldErrors.size());
|
||||
assertValue(fieldErrors, "firstName", Arrays.asList("firstName cannot be null"));
|
||||
assertValue(fieldErrors, "firstName", Collections.singletonList("firstName cannot be null"));
|
||||
}
|
||||
|
||||
public void testValidationInMethods() throws Exception {
|
||||
@@ -58,10 +58,10 @@ public class OValValidationInterceptorTest extends XWorkTestCase {
|
||||
Map<String, List<String>> fieldErrors = ((ValidationAware) baseActionProxy.getAction()).getFieldErrors();
|
||||
assertNotNull(fieldErrors);
|
||||
assertEquals(4, fieldErrors.size());
|
||||
assertValue(fieldErrors, "name", Arrays.asList("name cannot be null"));
|
||||
assertValue(fieldErrors, "SisyphusHasTheAnswer", Arrays.asList("SisyphusHasTheAnswer() cannot be null"));
|
||||
assertValue(fieldErrors, "thereAnyMeaningInLife", Arrays.asList("thereAnyMeaningInLife cannot be null"));
|
||||
assertValue(fieldErrors, "theManingOfLife", Arrays.asList("theManingOfLife cannot be null"));
|
||||
assertValue(fieldErrors, "name", Collections.singletonList("name cannot be null"));
|
||||
assertValue(fieldErrors, "SisyphusHasTheAnswer", Collections.singletonList("SisyphusHasTheAnswer cannot be null"));
|
||||
assertValue(fieldErrors, "thereAnyMeaningInLife", Collections.singletonList("thereAnyMeaningInLife cannot be null"));
|
||||
assertValue(fieldErrors, "theMeaningOfLife", Collections.singletonList("theMeaningOfLife cannot be null"));
|
||||
}
|
||||
|
||||
public void testSimpleFieldsInheritedXML() throws Exception {
|
||||
@@ -71,9 +71,9 @@ public class OValValidationInterceptorTest extends XWorkTestCase {
|
||||
Map<String, List<String>> fieldErrors = ((ValidationAware) baseActionProxy.getAction()).getFieldErrors();
|
||||
assertNotNull(fieldErrors);
|
||||
assertEquals(3, fieldErrors.size());
|
||||
assertValue(fieldErrors, "firstName", Arrays.asList("firstName cannot be null"));
|
||||
assertValue(fieldErrors, "lastName", Arrays.asList("lastName cannot be null"));
|
||||
assertValue(fieldErrors, "middleName", Arrays.asList("middleName cannot be null"));
|
||||
assertValue(fieldErrors, "firstName", Collections.singletonList("firstName cannot be null"));
|
||||
assertValue(fieldErrors, "lastName", Collections.singletonList("lastName cannot be null"));
|
||||
assertValue(fieldErrors, "middleName", Collections.singletonList("middleName cannot be null"));
|
||||
}
|
||||
|
||||
public void testSlashesInNameWithWildcardsHitsCache() throws Exception {
|
||||
@@ -107,7 +107,7 @@ public class OValValidationInterceptorTest extends XWorkTestCase {
|
||||
Map<String, List<String>> fieldErrors = ((ValidationAware) baseActionProxy.getAction()).getFieldErrors();
|
||||
assertNotNull(fieldErrors);
|
||||
assertEquals(1, fieldErrors.size());
|
||||
assertValue(fieldErrors, "name", Arrays.asList("name cannot be null"));
|
||||
assertValue(fieldErrors, "name", Collections.singletonList("name cannot be null"));
|
||||
}
|
||||
|
||||
public void testSimpleFieldNegative() throws Exception {
|
||||
@@ -132,8 +132,8 @@ public class OValValidationInterceptorTest extends XWorkTestCase {
|
||||
|
||||
assertNotNull(fieldErrors);
|
||||
assertEquals(1, fieldErrors.size());
|
||||
assertValue(fieldErrors, "name", Arrays.asList("name is not between 0 and 3 characters long"));
|
||||
assertValue(fieldErrors, "name", Arrays.asList("name is not between 0 and 3 characters long"));
|
||||
assertValue(fieldErrors, "name", Collections.singletonList("name is not between 0 and 3 characters long"));
|
||||
assertValue(fieldErrors, "name", Collections.singletonList("name is not between 0 and 3 characters long"));
|
||||
}
|
||||
|
||||
public void testSimpleFieldMultipleValidators() throws Exception {
|
||||
@@ -202,7 +202,7 @@ public class OValValidationInterceptorTest extends XWorkTestCase {
|
||||
|
||||
assertNotNull(fieldErrors);
|
||||
assertEquals(1, fieldErrors.size());
|
||||
assertValue(fieldErrors, "name", Arrays.asList("name cannot be null"));
|
||||
assertValue(fieldErrors, "name", Collections.singletonList("name cannot be null"));
|
||||
}
|
||||
|
||||
public void testSimpleFieldI18n2() throws Exception {
|
||||
@@ -215,7 +215,7 @@ public class OValValidationInterceptorTest extends XWorkTestCase {
|
||||
|
||||
assertNotNull(fieldErrors);
|
||||
assertEquals(1, fieldErrors.size());
|
||||
assertValue(fieldErrors, "name", Arrays.asList("name value is too long, allowed length is 3"));
|
||||
assertValue(fieldErrors, "name", Collections.singletonList("name value is too long, allowed length is 3"));
|
||||
}
|
||||
|
||||
public void testSimpleFieldI18nDefaultKey() throws Exception {
|
||||
@@ -227,7 +227,7 @@ public class OValValidationInterceptorTest extends XWorkTestCase {
|
||||
|
||||
assertNotNull(fieldErrors);
|
||||
assertEquals(1, fieldErrors.size());
|
||||
assertValue(fieldErrors, "name", Arrays.asList("notnull.field"));
|
||||
assertValue(fieldErrors, "name", Collections.singletonList("notnull.field"));
|
||||
}
|
||||
|
||||
|
||||
@@ -239,7 +239,7 @@ public class OValValidationInterceptorTest extends XWorkTestCase {
|
||||
Map<String, List<String>> fieldErrors = ((ValidationAware) baseActionProxy.getAction()).getFieldErrors();
|
||||
assertNotNull(fieldErrors);
|
||||
assertEquals(1, fieldErrors.size());
|
||||
assertValue(fieldErrors, "name", Arrays.asList("name cannot be null"));
|
||||
assertValue(fieldErrors, "name", Collections.singletonList("name cannot be null"));
|
||||
assertTrue(action.isValidateCalled());
|
||||
assertTrue(action.isValidateExecuteCalled());
|
||||
}
|
||||
@@ -252,7 +252,7 @@ public class OValValidationInterceptorTest extends XWorkTestCase {
|
||||
Map<String, List<String>> fieldErrors = ((ValidationAware) baseActionProxy.getAction()).getFieldErrors();
|
||||
assertNotNull(fieldErrors);
|
||||
assertEquals(1, fieldErrors.size());
|
||||
assertValue(fieldErrors, "name", Arrays.asList("name cannot be null"));
|
||||
assertValue(fieldErrors, "name", Collections.singletonList("name cannot be null"));
|
||||
assertFalse(action.isValidateCalled());
|
||||
assertTrue(action.isValidateExecuteCalled());
|
||||
}
|
||||
@@ -265,7 +265,7 @@ public class OValValidationInterceptorTest extends XWorkTestCase {
|
||||
Map<String, List<String>> fieldErrors = ((ValidationAware) baseActionProxy.getAction()).getFieldErrors();
|
||||
assertNotNull(fieldErrors);
|
||||
assertEquals(1, fieldErrors.size());
|
||||
assertValue(fieldErrors, "name", Arrays.asList("name cannot be null"));
|
||||
assertValue(fieldErrors, "name", Collections.singletonList("name cannot be null"));
|
||||
assertFalse(action.isValidateCalled());
|
||||
assertFalse(action.isValidateExecuteCalled());
|
||||
}
|
||||
@@ -281,21 +281,10 @@ public class OValValidationInterceptorTest extends XWorkTestCase {
|
||||
|
||||
Map<String, List<String>> fieldErrors = ((ValidationAware) baseActionProxy.getAction()).getFieldErrors();
|
||||
assertNotNull(fieldErrors);
|
||||
assertEquals(5, fieldErrors.size()); // 5: as there will be field errors for 'model' and 'address' themselves
|
||||
assertValue(fieldErrors, "name", Arrays.asList("name cannot be null"));
|
||||
assertValue(fieldErrors, "email", Arrays.asList("email cannot be null"));
|
||||
try {
|
||||
// Oval version <= 1.40 validation error for invalid data reports: "net.sf.oval.constraint.AssertValid.violated".
|
||||
assertValue(fieldErrors, "address", Arrays.asList("net.sf.oval.constraint.AssertValid.violated"));
|
||||
// Oval version <= 1.40 validation error for minimum length reports: "street cannot be smaller than 7 characters".
|
||||
assertValue(fieldErrors, "address.street", Arrays.asList("street cannot be smaller than 7 characters"));
|
||||
} catch (AssertionFailedError afe) {
|
||||
// Oval version >= 1.50 validation error for invalid data reports: "address is invalid".
|
||||
assertValue(fieldErrors, "address", Arrays.asList("address is invalid"));
|
||||
// Oval version >= 1.50 validation error for minimum length reports: "street cannot be shorter than 7 characters".
|
||||
assertValue(fieldErrors, "address.street", Arrays.asList("street cannot be shorter than 7 characters"));
|
||||
}
|
||||
|
||||
assertEquals(3, fieldErrors.size());
|
||||
assertValue(fieldErrors, "person.name", Collections.singletonList("person.name cannot be null"));
|
||||
assertValue(fieldErrors, "person.email", Collections.singletonList("person.email cannot be null"));
|
||||
assertValue(fieldErrors, "person.address.street", Collections.singletonList("person.address.street cannot be shorter than 7 characters"));
|
||||
}
|
||||
|
||||
public void testMemberObject() throws Exception {
|
||||
@@ -308,24 +297,12 @@ public class OValValidationInterceptorTest extends XWorkTestCase {
|
||||
|
||||
Map<String, List<String>> fieldErrors = ((ValidationAware) baseActionProxy.getAction()).getFieldErrors();
|
||||
assertNotNull(fieldErrors);
|
||||
assertEquals(5, fieldErrors.size()); // 5: as there will be field errors for 'person' and 'person.address' themselves
|
||||
assertValue(fieldErrors, "person.name", Arrays.asList("name cannot be null"));
|
||||
assertValue(fieldErrors, "person.email", Arrays.asList("email cannot be null"));
|
||||
try {
|
||||
// Oval version <= 1.40 validation error for invalid data reports: "net.sf.oval.constraint.AssertValid.violated".
|
||||
assertValue(fieldErrors, "person.address", Arrays.asList("net.sf.oval.constraint.AssertValid.violated"));
|
||||
// Oval version <= 1.40 validation error for minimum length reports: "street cannot be smaller than 7 characters".
|
||||
assertValue(fieldErrors, "person.address.street", Arrays.asList("street cannot be smaller than 7 characters"));
|
||||
} catch (AssertionFailedError afe) {
|
||||
// Oval version >= 1.50 validation error for invalid data reports: "address is invalid".
|
||||
assertValue(fieldErrors, "person.address", Arrays.asList("address is invalid"));
|
||||
// Oval version >= 1.50 validation error for minimum length reports: "street cannot be shorter than 7 characters".
|
||||
assertValue(fieldErrors, "person.address.street", Arrays.asList("street cannot be shorter than 7 characters"));
|
||||
}
|
||||
|
||||
assertEquals(3, fieldErrors.size());
|
||||
assertValue(fieldErrors, "person.name", Collections.singletonList("person.name cannot be null"));
|
||||
assertValue(fieldErrors, "person.email", Collections.singletonList("person.email cannot be null"));
|
||||
assertValue(fieldErrors, "person.address.street", Collections.singletonList("person.address.street cannot be shorter than 7 characters"));
|
||||
}
|
||||
|
||||
|
||||
private void assertValue(Map<String, List<String>> map, String key, List<String> expectedValues) {
|
||||
assertNotNull(map);
|
||||
assertNotNull(key);
|
||||
@@ -341,4 +318,5 @@ public class OValValidationInterceptorTest extends XWorkTestCase {
|
||||
super.setUp();
|
||||
loadConfigurationProviders(new StrutsXmlConfigurationProvider("oval-test.xml"));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+3
-3
@@ -35,9 +35,9 @@ public class ValidationInMethods extends ActionSupport {
|
||||
return null;
|
||||
}
|
||||
|
||||
@IsInvariant
|
||||
@IsInvariant
|
||||
@NotNull
|
||||
public String getTheManingOfLife() {
|
||||
public String getTheMeaningOfLife() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -47,4 +47,4 @@ public class ValidationInMethods extends ActionSupport {
|
||||
//some method annotated, whose name is not a field
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1115,13 +1115,13 @@
|
||||
<dependency>
|
||||
<groupId>net.sf.oval</groupId>
|
||||
<artifactId>oval</artifactId>
|
||||
<version>1.90</version>
|
||||
<version>3.2.1</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.thoughtworks.xstream</groupId>
|
||||
<artifactId>xstream</artifactId>
|
||||
<version>1.4.17</version>
|
||||
<version>1.4.18</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>io.github.x-stream</groupId>
|
||||
|
||||
Reference in New Issue
Block a user