diff options
Diffstat (limited to 'bundles/org.eclipse.osgi.util/src/org/osgi/util/promise/Promises.java')
-rw-r--r-- | bundles/org.eclipse.osgi.util/src/org/osgi/util/promise/Promises.java | 45 |
1 files changed, 22 insertions, 23 deletions
diff --git a/bundles/org.eclipse.osgi.util/src/org/osgi/util/promise/Promises.java b/bundles/org.eclipse.osgi.util/src/org/osgi/util/promise/Promises.java index 06d506675..7067fe50a 100644 --- a/bundles/org.eclipse.osgi.util/src/org/osgi/util/promise/Promises.java +++ b/bundles/org.eclipse.osgi.util/src/org/osgi/util/promise/Promises.java @@ -1,5 +1,5 @@ /* - * Copyright (c) OSGi Alliance (2014). All Rights Reserved. + * Copyright (c) OSGi Alliance (2014, 2016). All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,12 +17,15 @@ package org.osgi.util.promise; import static org.osgi.util.promise.PromiseImpl.requireNonNull; + import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; +import org.osgi.util.promise.PromiseImpl.Result; + /** * Static helper methods for {@link Promise}s. * @@ -42,7 +45,7 @@ public class Promises { * @return A new Promise that has been resolved with the specified value. */ public static <T> Promise<T> resolved(T value) { - return new PromiseImpl<T>(value, null); + return new PromiseImpl<>(value, null); } /** @@ -54,7 +57,7 @@ public class Promises { * @return A new Promise that has been resolved with the specified failure. */ public static <T> Promise<T> failed(Throwable failure) { - return new PromiseImpl<T>(null, requireNonNull(failure)); + return new PromiseImpl<>(null, requireNonNull(failure)); } /** @@ -85,13 +88,14 @@ public class Promises { */ public static <T, S extends T> Promise<List<T>> all(Collection<Promise<S>> promises) { if (promises.isEmpty()) { - List<T> result = new ArrayList<T>(); + List<T> result = new ArrayList<>(); return resolved(result); } /* make a copy and capture the ordering */ - List<Promise<? extends T>> list = new ArrayList<Promise<? extends T>>(promises); - PromiseImpl<List<T>> chained = new PromiseImpl<List<T>>(); - All<T> all = new All<T>(chained, list); + List<Promise< ? extends T>> list = new ArrayList<Promise< ? extends T>>( + promises); + PromiseImpl<List<T>> chained = new PromiseImpl<>(); + All<T> all = new All<>(chained, list); for (Promise<? extends T> promise : list) { promise.onResolve(all); } @@ -121,6 +125,7 @@ public class Promises { * {@link FailedPromisesException} must contain all of the specified * Promises which resolved with a failure. */ + @SafeVarargs public static <T> Promise<List<T>> all(Promise<? extends T>... promises) { @SuppressWarnings("unchecked") List<Promise<T>> list = Arrays.asList((Promise<T>[]) promises); @@ -144,36 +149,30 @@ public class Promises { this.promiseCount = new AtomicInteger(promises.size()); } + @Override public void run() { if (promiseCount.decrementAndGet() != 0) { return; } - List<T> result = new ArrayList<T>(promises.size()); - List<Promise<?>> failed = new ArrayList<Promise<?>>(promises.size()); + List<T> value = new ArrayList<>(promises.size()); + List<Promise<?>> failed = new ArrayList<>(promises.size()); Throwable cause = null; for (Promise<? extends T> promise : promises) { - Throwable failure; - T value; - try { - failure = promise.getFailure(); - value = (failure != null) ? null : promise.getValue(); - } catch (Throwable e) { - chained.resolve(null, e); - return; - } - if (failure != null) { + Result<T> result = Result.collect(promise); + if (result.fail != null) { failed.add(promise); if (cause == null) { - cause = failure; + cause = result.fail; } } else { - result.add(value); + value.add(result.value); } } if (failed.isEmpty()) { - chained.resolve(result, null); + chained.tryResolve(value, null); } else { - chained.resolve(null, new FailedPromisesException(failed, cause)); + chained.tryResolve(null, + new FailedPromisesException(failed, cause)); } } } |