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 Wilson 766e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilsonimport javax.annotation.meta.TypeQualifier; 866e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilsonimport javax.annotation.meta.TypeQualifierValidator; 966e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilsonimport javax.annotation.meta.When; 1066e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson 1166e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson/** Used to annotate a value that should only contain nonnegative values */ 1266e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson@Documented 1366e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson@TypeQualifier(applicableTo = Number.class) 1466e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson@Retention(RetentionPolicy.RUNTIME) 1566e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilsonpublic @interface Nonnegative { 1666e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson When when() default When.ALWAYS; 1766e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson 1866e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson class Checker implements TypeQualifierValidator<Nonnegative> { 1966e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson 2066e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson public When forConstantValue(Nonnegative annotation, Object v) { 2166e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson if (!(v instanceof Number)) 2266e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson return When.NEVER; 2366e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson boolean isNegative; 2466e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson Number value = (Number) v; 2566e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson if (value instanceof Long) 2666e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson isNegative = value.longValue() < 0; 2766e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson else if (value instanceof Double) 2866e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson isNegative = value.doubleValue() < 0; 2966e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson else if (value instanceof Float) 3066e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson isNegative = value.floatValue() < 0; 3166e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson else 3266e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson isNegative = value.intValue() < 0; 3366e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson 3466e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson if (isNegative) 3566e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson return When.NEVER; 3666e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson else 3766e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson return When.ALWAYS; 3866e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson 3966e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson } 4066e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson } 4166e84b9ff30de7c75b510cb9117205368cf5bd25Jesse Wilson} 42