Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
hprose.util.concurrent.Promise Maven / Gradle / Ivy
/**********************************************************\
| |
| hprose |
| |
| Official WebSite: http://www.hprose.com/ |
| http://www.hprose.org/ |
| |
\**********************************************************/
/**********************************************************\
* *
* Promise.java *
* *
* Promise class for Java. *
* *
* LastModified: Sep 19, 2016 *
* Author: Ma Bingyao *
* *
\**********************************************************/
package hprose.util.concurrent;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
public final class Promise implements Resolver, Rejector, Thenable {
private static volatile ScheduledExecutorService timer = Executors.newSingleThreadScheduledExecutor();
static {
Threads.registerShutdownHandler(new Runnable() {
public void run() {
ScheduledExecutorService t = timer;
timer = Executors.newSingleThreadScheduledExecutor();
t.shutdownNow();
}
});
}
private final LinkedList> subscribers = new LinkedList>();
private volatile AtomicReference state = new AtomicReference(State.PENDING);
private volatile V value;
private volatile Throwable reason;
public Promise() {}
public Promise(final Call computation) {
timer.execute(new Runnable() {
public void run() {
try {
Promise.this.resolve(computation.call());
}
catch (Throwable e) {
Promise.this.reject(e);
}
}
});
}
public Promise(final AsyncCall computation) {
timer.execute(new Runnable() {
public void run() {
try {
Promise.this.resolve(computation.call());
}
catch (Throwable e) {
Promise.this.reject(e);
}
}
});
}
public Promise(Executor executor) {
executor.exec((Resolver)this, (Rejector)this);
}
public final static Promise value(T value) {
Promise promise = new Promise();
promise.resolve(value);
return promise;
}
public final static Promise value(Promise value) {
Promise promise = new Promise();
promise.resolve(value);
return promise;
}
public final static Promise value(Thenable value) {
Promise promise = new Promise();
promise.resolve(value);
return promise;
}
public final static Promise error(Throwable reason) {
Promise promise = new Promise();
promise.reject(reason);
return promise;
}
public final static Promise delayed(long duration, TimeUnit timeunit, final Call computation) {
final Promise promise = new Promise();
timer.schedule(new Runnable() {
public void run() {
try {
promise.resolve(computation.call());
}
catch (Throwable e) {
promise.reject(e);
}
}
}, duration, timeunit);
return promise;
}
public final static Promise delayed(long duration, TimeUnit timeunit, final AsyncCall computation) {
final Promise promise = new Promise();
timer.schedule(new Runnable() {
public void run() {
try {
promise.resolve(computation.call());
}
catch (Throwable e) {
promise.reject(e);
}
}
}, duration, timeunit);
return promise;
}
public final static Promise delayed(long duration, TimeUnit timeunit, final T value) {
final Promise promise = new Promise();
timer.schedule(new Runnable() {
public void run() {
promise.resolve(value);
}
}, duration, timeunit);
return promise;
}
public final static Promise delayed(long duration, TimeUnit timeunit, final Promise value) {
final Promise promise = new Promise();
timer.schedule(new Runnable() {
public void run() {
promise.resolve(value);
}
}, duration, timeunit);
return promise;
}
public final static Promise delayed(long duration, Call computation) {
return delayed(duration, TimeUnit.MILLISECONDS, computation);
}
public final static Promise delayed(long duration, AsyncCall computation) {
return delayed(duration, TimeUnit.MILLISECONDS, computation);
}
public final static Promise delayed(long duration, T value) {
return delayed(duration, TimeUnit.MILLISECONDS, value);
}
public final static Promise delayed(long duration, Promise value) {
return delayed(duration, TimeUnit.MILLISECONDS, value);
}
public final static Promise sync(Call computation) {
try {
return value(computation.call());
}
catch (Throwable e) {
return error(e);
}
}
public final static Promise sync(AsyncCall computation) {
try {
return value(computation.call());
}
catch (Throwable e) {
return error(e);
}
}
public final static boolean isThenable(Object value) {
return value instanceof Thenable;
}
public final static boolean isPromise(Object value) {
return value instanceof Promise;
}
public final static Promise toPromise(Object value) {
return isPromise(value) ? (Promise)value : value(value);
}
@SuppressWarnings("unchecked")
private static void allHandler(final Promise promise, final AtomicInteger count, final T[] result, Object element, final int i) {
((Promise)toPromise(element)).then(
new Action() {
public void call(T value) throws Throwable {
result[i] = value;
if (count.decrementAndGet() == 0) {
promise.resolve(result);
}
}
},
new Action() {
public void call(Throwable e) throws Throwable {
promise.reject(e);
}
}
);
}
@SuppressWarnings("unchecked")
public final static Promise all(Object[] array, Class type) {
if (array == null) return value((T[])null);
int n = array.length;
T[] result = (type == Object.class) ?
(T[])(new Object[n]) :
(T[])Array.newInstance(type, n);
if (n == 0) return value(result);
AtomicInteger count = new AtomicInteger(n);
Promise promise = new Promise();
for (int i = 0; i < n; ++i) {
allHandler(promise, count, result, array[i], i);
}
return promise;
}
public final static Promise all(Object[] array) {
return all(array, Object.class);
}
public final static Promise all(Promise promise, final Class type) {
return promise.then(new AsyncFunc() {
public Promise call(Object[] array) throws Throwable {
return all(array, type);
}
});
}
public final static Promise all(Promise promise) {
return all(promise, Object.class);
}
@SuppressWarnings("unchecked")
public final Promise all(Class type) {
return all((Promise)this, type);
}
@SuppressWarnings("unchecked")
public final Promise all() {
return all((Promise)this);
}
public final static Promise join(Object...args) {
return all(args);
}
@SuppressWarnings("unchecked")
public final static Promise race(Object[] array, Class type) {
Promise promise = new Promise();
for (int i = 0, n = array.length; i < n; ++i) {
((Promise)toPromise(array[i])).fill(promise);
}
return promise;
}
public final static Promise race(Object[] array) {
return race(array, Object.class);
}
public final static Promise race(Promise promise, final Class type) {
return promise.then(new AsyncFunc() {
public Promise call(Object[] array) throws Throwable {
return race(array, type);
}
});
}
public final static Promise race(Promise promise) {
return race(promise, Object.class);
}
@SuppressWarnings("unchecked")
public final Promise race(Class type) {
return race((Promise)this, type);
}
@SuppressWarnings("unchecked")
public final Promise race() {
return race((Promise)this);
}
@SuppressWarnings("unchecked")
public final static Promise any(Object[] array, Class type) {
int n = array.length;
if (n == 0) {
return (Promise)Promise.error(new IllegalArgumentException("any(): array must not be empty"));
}
final RuntimeException reason = new RuntimeException("any(): all promises failed");
final Promise promise = new Promise();
final AtomicInteger count = new AtomicInteger(n);
for (int i = 0; i < n; ++i) {
((Promise)toPromise(array[i])).then(
new Action() {
public void call(T value) throws Throwable {
promise.resolve(value);
}
},
new Action() {
public void call(Throwable e) throws Throwable {
if (count.decrementAndGet() == 0) {
promise.reject(reason);
}
}
}
);
}
return promise;
}
public final static Promise any(Object[] array) {
return any(array, Object.class);
}
public final static Promise any(Promise promise, final Class type) {
return promise.then(new AsyncFunc() {
public Promise call(Object[] array) throws Throwable {
return any(array, type);
}
});
}
public final static Promise any(Promise promise) {
return any(promise, Object.class);
}
@SuppressWarnings("unchecked")
public final Promise any(Class type) {
return any((Promise)this, type);
}
@SuppressWarnings("unchecked")
public final Promise any() {
return any((Promise)this);
}
public final static Promise run(Action handler, Object...args) {
return all(args).then(handler);
}
public final static Promise run(Func handler, Object...args) {
return all(args).then(handler);
}
public final static Promise run(AsyncFunc handler, Object...args) {
return all(args).then(handler);
}
public final static Promise run(Class type, Action handler, Object...args) {
return all(args, type).then(handler);
}
public final static Promise run(Class type, Func handler, Object...args) {
return all(args, type).then(handler);
}
public final static Promise run(Class type, AsyncFunc handler, Object...args) {
return all(args, type).then(handler);
}
@SuppressWarnings("unchecked")
public final static Promise forEach(final Action callback, Object...args) {
return all(args).then(new Action() {
public void call(Object[] array) throws Throwable {
if (array == null) return;
for (int i = 0, n = array.length; i < n; ++i) {
callback.call((V)array[i]);
}
}
});
}
@SuppressWarnings("unchecked")
private static Action getForEachHandler(final Handler callback) {
return new Action() {
public void call(Object[] array) throws Throwable {
if (array == null) return;
for (int i = 0, n = array.length; i < n; ++i) {
callback.call((V)array[i], i);
}
}
};
}
public final static Promise forEach(Object[] array, Handler callback) {
return all(array).then(getForEachHandler(callback));
}
public final static Promise forEach(Promise array, Handler callback) {
return all(array).then(getForEachHandler(callback));
}
public final Promise forEach(Handler callback) {
return this.all().then(getForEachHandler(callback));
}
@SuppressWarnings("unchecked")
public final static Promise every(final Func callback, Object...args) {
return all(args).then(new Func() {
public Boolean call(Object[] array) throws Throwable {
for (int i = 0, n = array.length; i < n; ++i) {
if (!callback.call((V)array[i])) return false;
}
return true;
}
});
}
@SuppressWarnings("unchecked")
private static Func getEveryHandler(final Handler callback) {
return new Func() {
public Boolean call(Object[] array) throws Throwable {
for (int i = 0, n = array.length; i < n; ++i) {
if (!callback.call((V)array[i], i)) return false;
}
return true;
}
};
}
public final static Promise every(Object[] array, Handler callback) {
return all(array).then(getEveryHandler(callback));
}
public final static Promise every(Promise array, Handler callback) {
return all(array).then(getEveryHandler(callback));
}
public final Promise every(Handler callback) {
return all().then(getEveryHandler(callback));
}
@SuppressWarnings("unchecked")
public final static Promise some(final Func callback, Object...args) {
return all(args).then(new Func() {
public Boolean call(Object[] array) throws Throwable {
if (array == null) return false;
for (int i = 0, n = array.length; i < n; ++i) {
if (callback.call((V)array[i])) return true;
}
return false;
}
});
}
@SuppressWarnings("unchecked")
private static Func getSomeHandler(final Handler callback) {
return new Func() {
public Boolean call(Object[] array) throws Throwable {
if (array == null) return false;
for (int i = 0, n = array.length; i < n; ++i) {
if (callback.call((V)array[i], i)) return true;
}
return false;
}
};
}
public final static Promise some(Object[] array, Handler callback) {
return all(array).then(getSomeHandler(callback));
}
public final static Promise some(Promise array, Handler callback) {
return all(array).then(getSomeHandler(callback));
}
public final Promise some(Handler callback) {
return this.all().then(getSomeHandler(callback));
}
@SuppressWarnings("unchecked")
public final static Promise filter(final Func callback, Object...args) {
return all(args).then(new Func() {
public Object[] call(Object[] array) throws Throwable {
if (array == null) return null;
int n = array.length;
ArrayList result = new ArrayList(n);
for (int i = 0; i < n; ++i) {
if (callback.call((V)array[i])) result.add(array[i]);
}
return result.toArray();
}
});
}
@SuppressWarnings("unchecked")
private static Func getFilterHandler(final Handler callback, final Class type) {
return new Func() {
public T[] call(T[] array) throws Throwable {
if (array == null) return null;
int n = array.length;
ArrayList result = new ArrayList(n);
for (int i = 0; i < n; ++i) {
if (callback.call((V)array[i], i)) result.add(array[i]);
}
return result.toArray((type == Object.class) ?
(T[])(new Object[result.size()]) :
(T[])Array.newInstance(type, result.size()));
}
};
}
public final static Promise filter(Object[] array, Handler callback, Class type) {
return all(array, type).then(getFilterHandler(callback, type));
}
public final static Promise filter(Object[] array, Handler callback) {
return filter(array, callback, Object.class);
}
public final static Promise filter(Promise array, Handler callback, Class type) {
return all(array, type).then(getFilterHandler(callback, type));
}
public final static Promise filter(Promise array, Handler callback) {
return filter(array, callback, Object.class);
}
public final Promise filter(Handler callback, Class type) {
return all(type).then(getFilterHandler(callback, type));
}
public final Promise filter(Handler callback) {
return filter(callback, Object.class);
}
@SuppressWarnings("unchecked")
public final static Promise map(final Func callback, Object...args) {
return all(args).then(new Func() {
public Object[] call(Object[] array) throws Throwable {
if (array == null) return null;
int n = array.length;
Object[] result = new Object[n];
for (int i = 0; i < n; ++i) {
result[i] = callback.call((V)array[i]);
}
return result;
}
});
}
@SuppressWarnings("unchecked")
private static Func getMapHandler(final Handler callback, final Class type) {
return new Func() {
public T[] call(Object[] array) throws Throwable {
if (array == null) return null;
int n = array.length;
T[] result = (type == Object.class) ?
(T[])(new Object[n]) :
(T[])Array.newInstance(type, n);
for (int i = 0; i < n; ++i) {
result[i] = callback.call((V)array[i], i);
}
return result;
}
};
}
@SuppressWarnings("unchecked")
private static Func getMapHandler(final Handler callback) {
return new Func() {
public Object[] call(Object[] array) throws Throwable {
if (array == null) return null;
int n = array.length;
Object[] result = new Object[n];
for (int i = 0; i < n; ++i) {
result[i] = callback.call((V)array[i], i);
}
return result;
}
};
}
public final static Promise map(Object[] array, Handler callback, Class type) {
return all(array).then(getMapHandler(callback, type));
}
public final static Promise map(Object[] array, Handler callback) {
return all(array).then(getMapHandler(callback));
}
public final static Promise map(Promise array, Handler callback, Class