package org.openstack.atlas.api.validation.validators; 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.*; import org.openstack.atlas.docs.loadbalancers.api.v1.CertificateMapping; import static org.openstack.atlas.api.validation.ValidatorBuilder.build; import static org.openstack.atlas.api.validation.context.HttpRequestType.POST; import static org.openstack.atlas.api.validation.context.HttpRequestType.PUT; public class CertificateMappingValidator implements ResourceValidator<CertificateMapping> { private final Validator<CertificateMapping> validator; protected static final int MAX_HOST_NAME_LENGTH = 128; public CertificateMappingValidator() { validator = build(new ValidatorBuilder<CertificateMapping>(CertificateMapping.class) { { // SHARED EXPECTATIONS result(validationTarget().getId()).must().not().exist().withMessage("Certificate mapping id field cannot be modified."); result(validationTarget().getPrivateKey()).if_().exist().then().must().adhereTo(new PrivateKeyVerifier()).withMessage("Private key is invalid. Please provide a valid private key."); result(validationTarget().getCertificate()).if_().exist().then().must().adhereTo(new CertificateVerifier()).withMessage("Certificate is invalid. Please provide a valid certificate."); result(validationTarget().getIntermediateCertificate()).if_().exist().then().must().adhereTo(new IntermediateCertificateVerifier()).withMessage("Intermediate certificate is invalid. Please provide a valid intermediate certificate."); result(validationTarget().getHostName()).if_().exist().then().must().adhereTo(new HostNameVerifier()).withMessage("Host name is invalid. Please provide a valid host name."); result(validationTarget().getHostName()).if_().exist().then().must().adhereTo(new MustHaveLengthVerifier(MAX_HOST_NAME_LENGTH)).withMessage(String.format("Host name is too long. Maximum length for the host name is %d characters.", MAX_HOST_NAME_LENGTH)); // POST EXPECTATIONS result(validationTarget().getPrivateKey()).must().exist().forContext(POST).withMessage("Must provide a private key for the certificate mapping."); result(validationTarget().getCertificate()).must().exist().forContext(POST).withMessage("Must provide a certificate for the certificate mapping."); result(validationTarget().getHostName()).must().exist().forContext(POST).withMessage("Must provide a host name for the certificate mapping."); // PUT EXPECTATIONS must().adhereTo(new Verifier<CertificateMapping>() { @Override public VerifierResult verify(CertificateMapping obj) { return new VerifierResult(obj.getCertificate() != null || obj.getPrivateKey() != null || obj.getIntermediateCertificate() != null || obj.getHostName() != null); } }).forContext(PUT).withMessage("The certificate mapping must have at least one of the following to update: certificate, privateKey, intermediateCertificate, or hostName."); } }); } @Override public ValidatorResult validate(CertificateMapping certificateMapping, Object httpRequestType) { ValidatorResult result = validator.validate(certificateMapping, httpRequestType); return ValidatorUtilities.removeEmptyMessages(result); } @Override public Validator<CertificateMapping> getValidator() { return validator; } }