/*
* Hibernate Validator, declare and validate application constraints
*
* License: Apache License, Version 2.0
* See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package org.hibernate.validator.performance.statistical;
import java.lang.annotation.Annotation;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
/**
* @author Hardy Ferentschik
*/
public class StatisticalConstraintValidator implements ConstraintValidator<Annotation, Object> {
private static final float FAILURE_RATE = 0.25f;
public static final ThreadLocal<Counter> threadLocalCounter = new ThreadLocal<Counter>() {
@Override
protected Counter initialValue() {
return new Counter();
}
};
@Override
public void initialize(Annotation constraintAnnotation) {
}
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
return threadLocalCounter.get().incrementCount();
}
public static class Counter {
private int totalCount = 0;
private int failures = 0;
public int getFailures() {
return failures;
}
public boolean incrementCount() {
totalCount++;
if ( totalCount * FAILURE_RATE > failures ) {
failures++;
return false;
}
return true;
}
public void reset() {
totalCount = 0;
failures = 0;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append( "Counter" );
sb.append( "{totalCount=" ).append( totalCount );
sb.append( ", failures=" ).append( failures );
sb.append( '}' );
return sb.toString();
}
}
}