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