1*b04680f1SMatt Gilbride import java.lang.annotation.Documented; 2*b04680f1SMatt Gilbride import java.lang.annotation.ElementType; 3*b04680f1SMatt Gilbride import java.lang.annotation.Retention; 4*b04680f1SMatt Gilbride import java.lang.annotation.RetentionPolicy; 5*b04680f1SMatt Gilbride 6*b04680f1SMatt Gilbride import javax.annotation.MatchesPattern; 7*b04680f1SMatt Gilbride import javax.annotation.meta.TypeQualifier; 8*b04680f1SMatt Gilbride import javax.annotation.meta.TypeQualifierValidator; 9*b04680f1SMatt Gilbride import javax.annotation.meta.When; 10*b04680f1SMatt Gilbride 11*b04680f1SMatt Gilbride @Documented 12*b04680f1SMatt Gilbride @TypeQualifier 13*b04680f1SMatt Gilbride @MatchesPattern("[0-9]{16}") 14*b04680f1SMatt Gilbride @Retention(RetentionPolicy.RUNTIME) 15*b04680f1SMatt Gilbride public @interface CreditCardNumber { 16*b04680f1SMatt Gilbride class Checker implements TypeQualifierValidator<CreditCardNumber> { 17*b04680f1SMatt Gilbride forConstantValue(CreditCardNumber annotation, Object v)18*b04680f1SMatt Gilbride public When forConstantValue(CreditCardNumber annotation, Object v) { 19*b04680f1SMatt Gilbride if (!(v instanceof String)) 20*b04680f1SMatt Gilbride return When.NEVER; 21*b04680f1SMatt Gilbride String s = (String) v; 22*b04680f1SMatt Gilbride if (LuhnVerification.checkNumber(s)) 23*b04680f1SMatt Gilbride return When.ALWAYS; 24*b04680f1SMatt Gilbride return When.NEVER; 25*b04680f1SMatt Gilbride } 26*b04680f1SMatt Gilbride } 27*b04680f1SMatt Gilbride } 28