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 }