Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
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.java45
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));
}
}
}

Back to the top