166e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilsonpackage javax.annotation;
266e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson
366e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilsonimport java.lang.annotation.Documented;
466e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilsonimport java.lang.annotation.Retention;
566e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilsonimport java.lang.annotation.RetentionPolicy;
666e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilsonimport java.util.regex.Pattern;
766e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson
866e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilsonimport javax.annotation.meta.TypeQualifier;
966e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilsonimport javax.annotation.meta.TypeQualifierValidator;
1066e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilsonimport javax.annotation.meta.When;
1166e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson
1266e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson@Documented
1366e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson@TypeQualifier(applicableTo = String.class)
1466e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson@Retention(RetentionPolicy.RUNTIME)
1566e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilsonpublic @interface MatchesPattern {
1666e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson    @RegEx
1766e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson    String value();
1866e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson
1966e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson    int flags() default 0;
2066e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson
2166e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson    static class Checker implements TypeQualifierValidator<MatchesPattern> {
2266e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson        public When forConstantValue(MatchesPattern annotation, Object value) {
2366e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson            Pattern p = Pattern.compile(annotation.value(), annotation.flags());
2466e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson            if (p.matcher(((String) value)).matches())
2566e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson                return When.ALWAYS;
2666e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson            return When.NEVER;
2766e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson        }
2866e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson
2966e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson    }
3066e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson}
31