package com.nominanuda.web.http.concurrent; import java.util.concurrent.CountDownLatch; import org.apache.http.concurrent.FutureCallback; import org.slf4j.Logger; public class FutureCallbackLatch<T> extends CountDownLatch implements FutureCallback<T> { private final Logger log; private final String logMessage; public FutureCallbackLatch(int count, Logger log, String logMessage) { super(count); this.log = log; this.logMessage = logMessage; } public FutureCallbackLatch(int count, Logger log) { this(count, log, "job %s, %d remaining"); } public FutureCallbackLatch(int count) { this(count, null, null); } @Override public final void completed(T result) { countDown(); if (log != null) { String.format(logMessage, "completed", getCount()); } } @Override public final void failed(Exception ex) { countDown(); if (log != null) { String.format(logMessage, "failed", getCount()); } } @Override public final void cancelled() { countDown(); if (log != null) { String.format(logMessage, "cancelled", getCount()); } } public FutureCallback<T> wrap(final FutureCallback<T> cback) { return new FutureCallback<T>() { @Override public void completed(T result) { cback.completed(result); FutureCallbackLatch.this.completed(result); } @Override public void failed(Exception ex) { cback.failed(ex); FutureCallbackLatch.this.failed(ex); } @Override public void cancelled() { cback.cancelled(); FutureCallbackLatch.this.cancelled(); } }; } }