blob: 385f2ab0a3f54cf7da4a0a7a1df2985f9ad13d0f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package com.opensymphony.xwork2.validator;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.XWorkTestCase;
import com.opensymphony.xwork2.util.ValueStack;
import com.opensymphony.xwork2.util.ValueStackFactory;
import com.opensymphony.xwork2.validator.validators.RequiredFieldValidator;
import com.opensymphony.xwork2.validator.validators.RequiredStringValidator;
import com.opensymphony.xwork2.validator.validators.VisitorFieldValidator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* A test case for ActionValidatorManager.
*
* @author tmjee
* @version $Date$ $Id$
*/
public class ActionValidatorManagerTest extends XWorkTestCase {
public void testValidate() throws Exception {
/* MockAction.class */
// reference number
ValueStack stack = container.getInstance(ValueStackFactory.class).createValueStack();
final RequiredStringValidator referenceNumberRequiredStringValidator = container.inject(RequiredStringValidator.class);
referenceNumberRequiredStringValidator.setFieldName("referenceNumber");
referenceNumberRequiredStringValidator.setDefaultMessage("Reference number is required");
referenceNumberRequiredStringValidator.setValueStack(stack);
// order
final RequiredFieldValidator orderRequiredValidator = container.inject(RequiredFieldValidator.class);
orderRequiredValidator.setFieldName("order");
orderRequiredValidator.setDefaultMessage("Order is required");
orderRequiredValidator.setValueStack(stack);
// customer
final RequiredFieldValidator customerRequiredValidator = container.inject(RequiredFieldValidator.class);
customerRequiredValidator.setFieldName("customer");
customerRequiredValidator.setDefaultMessage("Customer is required");
customerRequiredValidator.setValueStack(stack);
final VisitorFieldValidator customerVisitorValidator = container.inject(VisitorFieldValidator.class);
customerVisitorValidator.setAppendPrefix(true);
customerVisitorValidator.setFieldName("customer");
customerVisitorValidator.setValueStack(stack);
/* Customer.class */
// customer -> name
final RequiredStringValidator customerNameRequiredStringValidator = container.inject(RequiredStringValidator.class);
customerNameRequiredStringValidator.setFieldName("name");
customerNameRequiredStringValidator.setDefaultMessage("Name is required");
customerNameRequiredStringValidator.setValueStack(stack);
// customer -> age
final RequiredFieldValidator customerAgeRequiredValidator = container.inject(RequiredFieldValidator.class);
customerAgeRequiredValidator.setFieldName("age");
customerAgeRequiredValidator.setDefaultMessage("Age is required");
customerAgeRequiredValidator.setValueStack(stack);
// customer -> Address
final RequiredFieldValidator customerAddressRequiredFieldValidator = container.inject(RequiredFieldValidator.class);
customerAddressRequiredFieldValidator.setFieldName("address");
customerAddressRequiredFieldValidator.setDefaultMessage("Address is required");
customerAddressRequiredFieldValidator.setValueStack(stack);
final VisitorFieldValidator customerAddressVisitorFieldValidator = container.inject(VisitorFieldValidator.class);
customerAddressVisitorFieldValidator.setFieldName("address");
customerAddressVisitorFieldValidator.setAppendPrefix(true);
//customerAddressVisitorFieldValidator.setDefaultMessage("");
customerAddressVisitorFieldValidator.setValueStack(stack);
/* Address.class */
// customer -> Address -> street
final RequiredStringValidator customerAddressStreetRequiredFieldValidator = container.inject(RequiredStringValidator.class);
customerAddressStreetRequiredFieldValidator.setFieldName("street");
customerAddressStreetRequiredFieldValidator.setDefaultMessage("Street is required");
customerAddressStreetRequiredFieldValidator.setShortCircuit(true);
customerAddressStreetRequiredFieldValidator.setValueStack(stack);
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 = container.inject(RequiredStringValidator.class);
customerAddressPoboxRequiredFieldValidator.setFieldName("pobox");
customerAddressPoboxRequiredFieldValidator.setDefaultMessage("PO Box is required");
customerAddressPoboxRequiredFieldValidator.setShortCircuit(false);
customerAddressPoboxRequiredFieldValidator.setValueStack(stack);
final RequiredStringValidator customerAddressPoboxRequiredFieldValidator2 = container.inject(RequiredStringValidator.class);
customerAddressPoboxRequiredFieldValidator2.setFieldName("pobox");
customerAddressPoboxRequiredFieldValidator2.setDefaultMessage("PO Box is required 2");
customerAddressPoboxRequiredFieldValidator2.setShortCircuit(false);
customerAddressPoboxRequiredFieldValidator2.setValueStack(stack);
final List<Validator> validatorsForMockAction = new ArrayList<Validator>() {
{
add(referenceNumberRequiredStringValidator);
add(orderRequiredValidator);
add(customerRequiredValidator);
add(customerVisitorValidator);
}
};
final List<Validator> validatorsForCustomer = new ArrayList<Validator>() {
{
add(customerNameRequiredStringValidator);
add(customerAgeRequiredValidator);
add(customerAddressRequiredFieldValidator);
add(customerAddressVisitorFieldValidator);
}
};
final List<Validator> validatorsForAddress = new ArrayList<Validator>() {
{
add(customerAddressStreetRequiredFieldValidator);
add(customerAddressStreetRequiredFieldValidator2);
add(customerAddressPoboxRequiredFieldValidator);
add(customerAddressPoboxRequiredFieldValidator2);
}
};
DefaultActionValidatorManager validatorManager = new DefaultActionValidatorManager() {
@Override
public List<Validator> getValidators(Class clazz, String context, String method) {
if (clazz.isAssignableFrom(MockAction.class)) {
return validatorsForMockAction;
}
else if (clazz.isAssignableFrom(Customer.class)) {
return validatorsForCustomer;
}
else if (clazz.isAssignableFrom(Address.class)) {
return validatorsForAddress;
}
return Collections.emptyList();
}
};
container.inject(validatorManager);
customerVisitorValidator.setActionValidatorManager(validatorManager);
customerAddressVisitorFieldValidator.setActionValidatorManager(validatorManager);
MockAction action = container.inject(MockAction.class);
stack.push(action);
validatorManager.validate(action, "ctx");
assertFalse(action.hasActionErrors());
assertFalse(action.hasActionMessages());
assertTrue(action.hasFieldErrors());
assertTrue(action.getFieldErrors().containsKey("referenceNumber"));
assertEquals((action.getFieldErrors().get("referenceNumber")).size(), 1);
assertTrue(action.getFieldErrors().containsKey("order"));
assertEquals((action.getFieldErrors().get("order")).size(), 1);
assertTrue(action.getFieldErrors().containsKey("customer.name"));
assertEquals((action.getFieldErrors().get("customer.name")).size(), 1);
assertTrue(action.getFieldErrors().containsKey("customer.age"));
assertEquals((action.getFieldErrors().get("customer.age")).size(), 1);
assertTrue(action.getFieldErrors().containsKey("customer.address.street"));
assertEquals((action.getFieldErrors().get("customer.address.street")).size(), 1);
assertTrue(action.getFieldErrors().containsKey("customer.address.pobox"));
assertEquals((action.getFieldErrors().get("customer.address.pobox")).size(), 2);
}
public static class MockAction extends ActionSupport {
private String referenceNumber;
private Integer order;
private Customer customer = new Customer();
public String getReferenceNumber() { return referenceNumber; }
public void setReferenceNumber(String referenceNumber) { this.referenceNumber = referenceNumber; }
public Integer getOrder() { return order; }
public void setOrder(Integer order) { this.order = order; }
public Customer getCustomer() { return customer; }
public void setCustomer(Customer customer) { this.customer = customer; }
}
public static class Customer {
private String name;
private Integer age;
private Address address = new Address();
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Integer getAge() { return age; }
public void setAge(Integer age) { this.age = age; }
public Address getAddress() { return address; }
public void setAddress(Address address) { this.address = address; }
}
public static class Address {
private String street;
private String pobox;
public String getStreet() { return street; }
public void setStreet(String street) { this.street = street; }
public String getPobox() { return pobox; }
public void setPobox(String pobox) { this.pobox = pobox; }
}
}