xref: /aosp_15_r20/external/jsr305/sampleUses/src/main/java/CreditCardNumber.java (revision b04680f1c99af11485d01a884cf292a99837b6c5)
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