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