166e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilsonimport java.lang.annotation.Documented;
266e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilsonimport java.lang.annotation.ElementType;
366e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilsonimport java.lang.annotation.Retention;
466e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilsonimport java.lang.annotation.RetentionPolicy;
566e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson
666e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilsonimport javax.annotation.MatchesPattern;
766e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilsonimport javax.annotation.meta.TypeQualifier;
866e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilsonimport javax.annotation.meta.TypeQualifierValidator;
966e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilsonimport javax.annotation.meta.When;
1066e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson
1166e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson@Documented
1266e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson@TypeQualifier
1366e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson@MatchesPattern("[0-9]{16}")
1466e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson@Retention(RetentionPolicy.RUNTIME)
1566e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilsonpublic @interface CreditCardNumber {
1666e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson	class Checker implements TypeQualifierValidator<CreditCardNumber> {
1766e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson
1866e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson		public When forConstantValue(CreditCardNumber annotation, Object v) {
1966e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson			if (!(v instanceof String))
2066e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson				return When.NEVER;
2166e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson			String s = (String) v;
2266e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson			if (LuhnVerification.checkNumber(s))
2366e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson				return When.ALWAYS;
2466e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson			return When.NEVER;
2566e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson		}
2666e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson	}
2766e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson}
28