    001    package org.junit.validator;
    002
    003    import java.util.concurrent.ConcurrentHashMap;
    004
    005    /**
    006     * Creates instances of Annotation Validators.
    007     *
    008     * @since 4.12
    009     */
    010    public class AnnotationValidatorFactory {
    011        private static final ConcurrentHashMap<ValidateWith, AnnotationValidator> VALIDATORS_FOR_ANNOTATION_TYPES =
    012                new ConcurrentHashMap<ValidateWith, AnnotationValidator>();
    013
    014        /**
    015         * Creates the AnnotationValidator specified by the value in
    016         * {@link org.junit.validator.ValidateWith}. Instances are
    017         * cached.
    018         *
    019         * @return An instance of the AnnotationValidator.
    020         *
    021         * @since 4.12
    022         */
    023        public AnnotationValidator createAnnotationValidator(ValidateWith validateWithAnnotation) {
    024            AnnotationValidator validator = VALIDATORS_FOR_ANNOTATION_TYPES.get(validateWithAnnotation);
    025            if (validator != null) {
    026                return validator;
    027            }
    028
    029            Class<? extends AnnotationValidator> clazz = validateWithAnnotation.value();
    030            try {
    031                AnnotationValidator annotationValidator = clazz.newInstance();
    032                VALIDATORS_FOR_ANNOTATION_TYPES.putIfAbsent(validateWithAnnotation, annotationValidator);
    033                return VALIDATORS_FOR_ANNOTATION_TYPES.get(validateWithAnnotation);
    034            } catch (Exception e) {
    035                throw new RuntimeException("Exception received when creating AnnotationValidator class " + clazz.getName(), e);
    036            }
    037        }
    038
    039    }