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