001    
002    /*
003     * Copyright (C) 2011 Archie L. Cobbs. All rights reserved.
004     *
005     * $Id: PatternValidator.java 313 2012-03-26 21:47:12Z archie.cobbs $
006     */
007    
008    package org.dellroad.stuff.validation;
009    
010    import java.util.Collection;
011    import java.util.regex.PatternSyntaxException;
012    
013    import javax.validation.ConstraintDeclarationException;
014    import javax.validation.ConstraintValidatorContext;
015    
016    /**
017     * Validator for the @{@link Pattern} constraint.
018     *
019     * @see Pattern
020     */
021    public class PatternValidator extends AbstractValidator<Pattern, Object> {
022    
023        private java.util.regex.Pattern pattern;
024    
025        @Override
026        public void initialize(Pattern pattern) {
027            super.initialize(pattern);
028    
029            // Get flags
030            int flags = 0;
031            for (javax.validation.constraints.Pattern.Flag flag : this.annotation.flags())
032                flags |= flag.getValue();
033    
034            // Compile regular expression
035            try {
036                this.pattern = java.util.regex.Pattern.compile(this.annotation.regexp(), flags);
037            } catch (PatternSyntaxException e) {
038                throw new ConstraintDeclarationException("Invalid regular expression `" + annotation.regexp() + "': " + e.getMessage());
039            }
040        }
041    
042        @Override
043        @SuppressWarnings("unchecked")
044        public boolean isValid(Object value, ConstraintValidatorContext context) {
045    
046            // Handle null
047            if (value == null)
048                return true;
049    
050            // Handle collection
051            if (value instanceof Collection)
052                return this.isCollectionValid((Collection<?>)value, context);
053    
054            // Check pattern
055            return this.pattern.matcher(value.toString()).matches();
056        }
057    }
058