package net.tomp2p.futures; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; public class Futures { public static <K extends BaseFuture> FutureDone<K[]> whenAll(final K... all) { final AtomicInteger counter = new AtomicInteger(); final int size = all.length; final FutureDone<K[]> futureDone = new FutureDone<K[]>(); for (final K future : all) { future.addListener(new BaseFutureAdapter<K>() { @Override public void operationComplete(final K future) throws Exception { if (counter.incrementAndGet() == size) { futureDone.done(all); } } }); } return futureDone; } public static <K extends BaseFuture> FutureDone<List<K>> whenAll(final List<K> all) { final AtomicInteger counter = new AtomicInteger(); final int size = all.size(); final FutureDone<List<K>> futureDone = new FutureDone<List<K>>(); for (final K future : all) { future.addListener(new BaseFutureAdapter<K>() { @Override public void operationComplete(final K future) throws Exception { if (counter.incrementAndGet() == size) { futureDone.done(all); } } }); } return futureDone; } public static <K extends BaseFuture> FutureDone<List<K>> whenAllSuccess(final List<K> all) { final AtomicInteger counter = new AtomicInteger(); final int size = all.size(); final FutureDone<List<K>> futureDone = new FutureDone<List<K>>(); for (final K future : all) { future.addListener(new BaseFutureAdapter<K>() { @Override public void operationComplete(final K future) throws Exception { if (futureDone.isCompleted()) { return; } if (future.isFailed()) { // at least one future failed futureDone.failed(future); } else if (counter.incrementAndGet() == size) { futureDone.done(all); } } }); } return futureDone; } public static <K extends BaseFuture> FutureDone<K[]> whenAllSuccess(final K... all) { final AtomicInteger counter = new AtomicInteger(); final int size = all.length; final FutureDone<K[]> futureDone = new FutureDone<K[]>(); for (final K future : all) { future.addListener(new BaseFutureAdapter<K>() { @Override public void operationComplete(final K future) throws Exception { if (futureDone.isCompleted()) { return; } if (future.isFailed()) { // at least one future failed futureDone.failed(future); } else if (counter.incrementAndGet() == size) { futureDone.done(all); } } }); } return futureDone; } public static <K extends BaseFuture> FutureDone<K> whenAny(final List<K> all) { final FutureDone<K> futureDone = new FutureDone<K>(); for (final K future : all) { future.addListener(new BaseFutureAdapter<K>() { @Override public void operationComplete(final K future) throws Exception { futureDone.done(future); } }); } return futureDone; } public static <K extends BaseFuture> FutureDone<K> whenAny(final K... all) { final FutureDone<K> futureDone = new FutureDone<K>(); for (final K future : all) { future.addListener(new BaseFutureAdapter<K>() { @Override public void operationComplete(final K future) throws Exception { futureDone.done(future); } }); } return futureDone; } public static <K extends BaseFuture> FutureDone<K> whenAnySuccess(final List<K> all) { final AtomicInteger counter = new AtomicInteger(); final int size = all.size(); final FutureDone<K> futureDone = new FutureDone<K>(); for (final K future : all) { future.addListener(new BaseFutureAdapter<K>() { @Override public void operationComplete(final K future) throws Exception { if (futureDone.isCompleted()) { return; } if (future.isSuccess()) { futureDone.done(future); } else if (counter.incrementAndGet() == size) { futureDone.failed("not a single future was successful"); } } }); } return futureDone; } public static <K extends BaseFuture> FutureDone<K> whenAnySuccess(final K... all) { final AtomicInteger counter = new AtomicInteger(); final int size = all.length; final FutureDone<K> futureDone = new FutureDone<K>(); for (final K future : all) { future.addListener(new BaseFutureAdapter<K>() { @Override public void operationComplete(final K future) throws Exception { if (futureDone.isCompleted()) { return; } if (future.isSuccess()) { futureDone.done(future); } else if (counter.incrementAndGet() == size) { futureDone.failed("not a single future was successful"); } } }); } return futureDone; } }