/** * 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 org.apache.cxf.validation; import java.lang.reflect.Method; import java.util.Map; import java.util.Set; import java.util.logging.Logger; import javax.validation.Configuration; import javax.validation.ConstraintViolation; import javax.validation.ConstraintViolationException; import javax.validation.ParameterNameProvider; import javax.validation.Validation; import javax.validation.ValidationException; import javax.validation.ValidationProviderResolver; import javax.validation.ValidatorFactory; import javax.validation.executable.ExecutableValidator; import javax.validation.spi.ValidationProvider; import org.apache.cxf.common.logging.LogUtils; public class BeanValidationProvider { private static final Logger LOG = LogUtils.getL7dLogger(BeanValidationProvider.class); private final ValidatorFactory factory; public BeanValidationProvider() { try { factory = Validation.buildDefaultValidatorFactory(); } catch (final ValidationException ex) { LOG.severe("Bean Validation provider can not be found, no validation will be performed"); throw ex; } } public BeanValidationProvider(ParameterNameProvider parameterNameProvider) { this(new ValidationConfiguration(parameterNameProvider)); } public BeanValidationProvider(ValidationConfiguration cfg) { try { Configuration<?> factoryCfg = Validation.byDefaultProvider().configure(); initFactoryConfig(factoryCfg, cfg); factory = factoryCfg.buildValidatorFactory(); } catch (final ValidationException ex) { LOG.severe("Bean Validation provider can not be found, no validation will be performed"); throw ex; } } public BeanValidationProvider(ValidatorFactory factory) { if (factory == null) { throw new NullPointerException("Factory is null"); } this.factory = factory; } public BeanValidationProvider(ValidationProviderResolver resolver) { this(resolver, null); } public <T extends Configuration<T>, U extends ValidationProvider<T>> BeanValidationProvider( ValidationProviderResolver resolver, Class<U> providerType) { this(resolver, providerType, null); } public <T extends Configuration<T>, U extends ValidationProvider<T>> BeanValidationProvider( ValidationProviderResolver resolver, Class<U> providerType, ValidationConfiguration cfg) { try { Configuration<?> factoryCfg = providerType != null ? Validation.byProvider(providerType).providerResolver(resolver).configure() : Validation.byDefaultProvider().providerResolver(resolver).configure(); initFactoryConfig(factoryCfg, cfg); factory = factoryCfg.buildValidatorFactory(); } catch (final ValidationException ex) { LOG.severe("Bean Validation provider can not be found, no validation will be performed"); throw ex; } } private static void initFactoryConfig(Configuration<?> factoryCfg, ValidationConfiguration cfg) { if (cfg != null) { factoryCfg.parameterNameProvider(cfg.getParameterNameProvider()); factoryCfg.messageInterpolator(cfg.getMessageInterpolator()); factoryCfg.traversableResolver(cfg.getTraversableResolver()); factoryCfg.constraintValidatorFactory(cfg.getConstraintValidatorFactory()); for (Map.Entry<String, String> entry : cfg.getProperties().entrySet()) { factoryCfg.addProperty(entry.getKey(), entry.getValue()); } } } public< T > void validateParameters(final T instance, final Method method, final Object[] arguments) { final ExecutableValidator methodValidator = getExecutableValidator(); final Set< ConstraintViolation< T > > violations = methodValidator.validateParameters(instance, method, arguments); if (!violations.isEmpty()) { throw new ConstraintViolationException(violations); } } public< T > void validateReturnValue(final T instance, final Method method, final Object returnValue) { final ExecutableValidator methodValidator = getExecutableValidator(); final Set<ConstraintViolation< T > > violations = methodValidator.validateReturnValue(instance, method, returnValue); if (!violations.isEmpty()) { throw new ResponseConstraintViolationException(violations); } } public< T > void validateReturnValue(final T bean) { final Set<ConstraintViolation< T > > violations = doValidateBean(bean); if (!violations.isEmpty()) { throw new ResponseConstraintViolationException(violations); } } public< T > void validateBean(final T bean) { final Set<ConstraintViolation< T > > violations = doValidateBean(bean); if (!violations.isEmpty()) { throw new ConstraintViolationException(violations); } } private< T > Set<ConstraintViolation< T > > doValidateBean(final T bean) { return factory.getValidator().validate(bean); } private ExecutableValidator getExecutableValidator() { return factory.getValidator().forExecutables(); } }