54 lines
1.4 KiB
Java
54 lines
1.4 KiB
Java
package fr.xephi.authme.util;
|
|
|
|
/**
|
|
* A thread-safe interval counter, allows to detect if an event happens more than 'threshold' times
|
|
* in the given 'interval'.
|
|
*/
|
|
public class AtomicIntervalCounter {
|
|
private final int threshold;
|
|
private final int interval;
|
|
private int count;
|
|
private long lastInsert;
|
|
|
|
/**
|
|
* Constructs a new counter.
|
|
*
|
|
* @param threshold the threshold value of the counter.
|
|
* @param interval the counter interval in milliseconds.
|
|
*/
|
|
public AtomicIntervalCounter(int threshold, int interval) {
|
|
this.threshold = threshold;
|
|
this.interval = interval;
|
|
reset();
|
|
}
|
|
|
|
/**
|
|
* Resets the counter count.
|
|
*/
|
|
public synchronized void reset() {
|
|
count = 0;
|
|
lastInsert = 0;
|
|
}
|
|
|
|
/**
|
|
* Increments the counter and returns true if the current count has reached the threshold value
|
|
* in the given interval, this will also reset the count value.
|
|
*
|
|
* @return true if the count has reached the threshold value.
|
|
*/
|
|
public synchronized boolean handle() {
|
|
long now = System.currentTimeMillis();
|
|
if (now - lastInsert > interval) {
|
|
count = 1;
|
|
} else {
|
|
count++;
|
|
}
|
|
if (count > threshold) {
|
|
reset();
|
|
return true;
|
|
}
|
|
lastInsert = now;
|
|
return false;
|
|
}
|
|
}
|