package com.github.drapostolos.rdp4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.CountDownLatch;
public class PollCycleCounter extends AbstractRdp4jListener {
private static final Logger LOG = LoggerFactory.getLogger(PollCycleCounter.class);
private int cycleCounter = 0;
private int numOfcyclesBeforeStop = Integer.MAX_VALUE;
private boolean debugEnabled = false;
private ConcurrentLinkedQueue<CountDownLatch> queue = new ConcurrentLinkedQueue<CountDownLatch>();
private Runnable action;
private int countUntilAction = -1;
public PollCycleCounter stopPollingAfterNumOfCycles(int i) {
numOfcyclesBeforeStop = i;
return this;
}
public PollCycleCounter enableDebug() {
debugEnabled = true;
return this;
}
public PollCycleCounter onBeforePollingCycleDo(int cycleCount, Runnable runnable) {
action = runnable;
countUntilAction = cycleCount;
return this;
}
public void awaitAtLeastNumPollCycles(int num) throws InterruptedException {
CountDownLatch latch = new CountDownLatch(num + 1);
queue.add(latch);
latch.await();
}
@Override
public void beforePollingCycle(final BeforePollingCycleEvent event) {
logEventIfDebugEnabled(event);
if (cycleCounter >= numOfcyclesBeforeStop - 1) {
event.getDirectoryPoller().stopAsync();
}
for (CountDownLatch latch : queue) {
latch.countDown();
}
if (cycleCounter == countUntilAction) {
action.run();
}
cycleCounter++;
}
@Override
public void initialContent(InitialContentEvent event) {
logEventIfDebugEnabled(event);
}
@Override
public void afterPollingCycle(AfterPollingCycleEvent event) {
logEventIfDebugEnabled(event);
}
@Override
public void afterStop(AfterStopEvent event) {
logEventIfDebugEnabled(event);
}
@Override
public void beforeStart(BeforeStartEvent event) {
logEventIfDebugEnabled(event);
}
@Override
public void fileAdded(FileAddedEvent event) {
logEventIfDebugEnabled(event);
}
@Override
public void fileModified(FileModifiedEvent event) {
logEventIfDebugEnabled(event);
}
@Override
public void fileRemoved(FileRemovedEvent event) {
logEventIfDebugEnabled(event);
}
@Override
public void ioErrorCeased(IoErrorCeasedEvent event) {
logEventIfDebugEnabled(event);
}
@Override
public void ioErrorRaised(IoErrorRaisedEvent event) {
logEventIfDebugEnabled(event);
}
private void logEventIfDebugEnabled(Event event) {
if (debugEnabled) {
LOG.debug("# " + event.getClass().getSimpleName() + "; ThreadId: "
+ Thread.currentThread().getId());
}
}
}