long scheduledTime = System.currentTimeMillis();
try {
oldEventList.clear();
while (true) {
threadBarrier.pass();
RemoveEvent removeEvent = (RemoveEvent) window.poll();
if (removeEvent == null) {
if (oldEventList.size() > 0) {
nextProcessor.process(new RemoveListEvent(
oldEventList.toArray(new RemoveEvent[oldEventList.size()])));
oldEventList.clear();
}
if (newEventList.size() > 0) {
InEvent[] inEvents =
newEventList.toArray(new InEvent[newEventList.size()]);
for (InEvent inEvent : inEvents) {
window.put(new RemoveEvent(inEvent, -1));
}
// in order to find second derivative, we need at least 3 events.
if (newEventList.size() > 2) {
InEvent firstDerivative1 =
gradient(inEvents[0],
inEvents[(newEventList.size() / 2) - 1],
null)[0];
InEvent firstDerivative2 =
gradient(inEvents[newEventList.size() / 2],
inEvents[newEventList.size() - 1],
null)[0];
InEvent[] secondDerivative =
gradient(firstDerivative1,
firstDerivative2, Type.DOUBLE);
for (InEvent inEvent : secondDerivative) {
window.put(new RemoveEvent(inEvent, -1));
}
nextProcessor.process(new InListEvent(secondDerivative));
} else {
log.debug("Insufficient events to calculate second derivative. We need at least 3 events. Current event count: " +
newEventList.size());
}
newEventList.clear();
}
long diff = timeToKeep - (System.currentTimeMillis() - scheduledTime);
if (diff > 0) {
try {
eventRemoverScheduler.schedule(this, diff, TimeUnit.MILLISECONDS);
} catch (RejectedExecutionException ex) {
log.warn("scheduling cannot be accepted for execution: elementID " +
elementId);
}
break;
}
scheduledTime = System.currentTimeMillis();
} else {
oldEventList.add(new RemoveEvent(removeEvent, System.currentTimeMillis()));
}
}
} catch (Throwable t) {
log.error(t.getMessage(), t);
}