package org.openstack.atlas.api.mgmt.validation.validators;
import org.openstack.atlas.docs.loadbalancers.api.management.v1.RateLimit;
import org.openstack.atlas.api.validation.validators.ResourceValidator;
import org.openstack.atlas.api.validation.validators.ValidatorUtilities;
import org.openstack.atlas.api.validation.verifiers.MustBeNonNegativeInteger;
import org.openstack.atlas.api.validation.Validator;
import org.openstack.atlas.api.validation.ValidatorBuilder;
import org.openstack.atlas.api.validation.results.ValidatorResult;
import org.openstack.atlas.api.validation.verifiers.MustBeNonNegativeInteger;
import org.openstack.atlas.api.validation.verifiers.MustNotBeEmptyOrNull;
import org.openstack.atlas.api.validation.verifiers.Verifier;
import org.openstack.atlas.api.validation.verifiers.VerifierResult;
import static org.openstack.atlas.api.validation.context.HttpRequestType.POST;
import static org.openstack.atlas.api.validation.context.HttpRequestType.PUT;
import static org.openstack.atlas.api.validation.ValidatorBuilder.build;
public class RateLimitValidator implements ResourceValidator<RateLimit> {
private final Validator<RateLimit> validator;
public RateLimitValidator() {
validator = build(new ValidatorBuilder<RateLimit>(RateLimit.class) {
{
// POST EXPECTATIONS
result(validationTarget().getTicket()).must().exist().forContext(POST).withMessage("Must provide a ticket for the rate limit.");
result(validationTarget().getTicket()).must().delegateTo(new TicketValidator().getValidator(), POST).forContext(POST);
result(validationTarget().getExpirationTime()).must().exist().forContext(POST).withMessage("Must provide an expiration date/time for the rate limit.");
result(validationTarget().getMaxRequestsPerSecond()).must().exist().forContext(POST).withMessage("Must provide the maximum number of request per second for the rate limit.");
// PUT EXPECTATIONS
must().adhereTo(new Verifier<RateLimit>() {
@Override
public VerifierResult verify(RateLimit rateLimit) {
return new VerifierResult(rateLimit.getExpirationTime() != null || rateLimit.getMaxRequestsPerSecond() != null);
}
}).forContext(PUT).withMessage("The rate limit must have at least one of the following to update: expirationTime, maxRequestsPerSecond.");
result(validationTarget().getTicket()).must().not().exist().forContext(PUT).withMessage("Ticket element cannot be updated here. Please remove.");
// SHARED EXPECTATIONS
result(validationTarget().getMaxRequestsPerSecond()).if_().exist().then().must().adhereTo(new MustBeNonNegativeInteger()).withMessage("The maximum number of request per second for the rate limit must be a positive integer.");
result(validationTarget().getMaxRequestsPerSecond()).if_().exist().then().must().adhereTo(new MustNotBeEmptyOrNull()).withMessage("Max requests per second much contain a value.");
}
});
}
@Override
public ValidatorResult validate(RateLimit rateLimit, Object httpRequestType) {
ValidatorResult result = validator.validate(rateLimit, httpRequestType);
return ValidatorUtilities.removeEmptyMessages(result);
}
@Override
public Validator<RateLimit> getValidator() {
return validator;
}
}