package org.limewire.concurrent; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; /** An Event about a {@link Future}'s result. */ public class FutureEvent<V> { public static enum Type { SUCCESS, EXCEPTION, CANCELLED } private final FutureEvent.Type type; private final V result; private final ExecutionException exception; private FutureEvent(FutureEvent.Type type, V result, ExecutionException exception) { this.type = type; this.result = result; this.exception = exception; } /** Creates an event out of the future. */ public static <V> FutureEvent<V> createEvent(Future<V> future) { assert future.isDone(); boolean cancelled = future.isCancelled(); V result = null; ExecutionException ee = null; if(!cancelled) { try { result = future.get(); } catch(ExecutionException exception) { ee = exception; } catch(InterruptedException ie) { throw new IllegalStateException(ie); } } if(cancelled) { return FutureEvent.createCancelled(); } else if(ee != null) { return FutureEvent.createException(ee); } else { return FutureEvent.createSuccess(result); } } /** Creates a cancelled FutureEvent. */ public static <V> FutureEvent<V> createCancelled() { return new FutureEvent<V>(Type.CANCELLED, null, null); } /** Creates a successful FutureEvent. */ public static <V> FutureEvent<V> createSuccess(V result) { return new FutureEvent<V>(Type.SUCCESS, result, null); } /** Creates an exception FutureEvent. */ public static <V> FutureEvent<V> createException(ExecutionException ee) { return new FutureEvent<V>(Type.EXCEPTION, null, ee); } /** Gets the kind of event. */ public FutureEvent.Type getType() { return type; } /** Gets the result, if any. Null if none. */ public V getResult() { return result; } /** Gets the exception, if any. Null if none. */ public ExecutionException getException() { return exception; } }