10888a09821a98ac0680fad765217302858e70fa4Paul Duffin/* 20888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Copyright (C) 2012 The Guava Authors 30888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 40888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License"); 50888a09821a98ac0680fad765217302858e70fa4Paul Duffin * you may not use this file except in compliance with the License. 60888a09821a98ac0680fad765217302858e70fa4Paul Duffin * You may obtain a copy of the License at 70888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 80888a09821a98ac0680fad765217302858e70fa4Paul Duffin * http://www.apache.org/licenses/LICENSE-2.0 90888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 100888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Unless required by applicable law or agreed to in writing, software 110888a09821a98ac0680fad765217302858e70fa4Paul Duffin * distributed under the License is distributed on an "AS IS" BASIS, 120888a09821a98ac0680fad765217302858e70fa4Paul Duffin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130888a09821a98ac0680fad765217302858e70fa4Paul Duffin * See the License for the specific language governing permissions and 140888a09821a98ac0680fad765217302858e70fa4Paul Duffin * limitations under the License. 150888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 160888a09821a98ac0680fad765217302858e70fa4Paul Duffin 170888a09821a98ac0680fad765217302858e70fa4Paul Duffinpackage com.google.common.util.concurrent; 180888a09821a98ac0680fad765217302858e70fa4Paul Duffin 190888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static com.google.common.base.Preconditions.checkNotNull; 200888a09821a98ac0680fad765217302858e70fa4Paul Duffin 210888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport javax.annotation.Nullable; 220888a09821a98ac0680fad765217302858e70fa4Paul Duffin 230888a09821a98ac0680fad765217302858e70fa4Paul Duffin/** 240888a09821a98ac0680fad765217302858e70fa4Paul Duffin * A settable future that can be set asynchronously via {@link #setFuture}. 250888a09821a98ac0680fad765217302858e70fa4Paul Duffin * A similar effect could be accomplished by adding a listener to the delegate 260888a09821a98ac0680fad765217302858e70fa4Paul Duffin * future that sets a normal settable future after the delegate is complete. 270888a09821a98ac0680fad765217302858e70fa4Paul Duffin * This approach gains us the ability to keep track of whether a delegate has 280888a09821a98ac0680fad765217302858e70fa4Paul Duffin * been set (i.e. so that we can prevent collisions from setting it twice and 290888a09821a98ac0680fad765217302858e70fa4Paul Duffin * can know before the computation is done whether it has been set), as well 300888a09821a98ac0680fad765217302858e70fa4Paul Duffin * as improved cancellation semantics (i.e. if either future is cancelled, 310888a09821a98ac0680fad765217302858e70fa4Paul Duffin * then the other one is too). This class is thread-safe. 320888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 330888a09821a98ac0680fad765217302858e70fa4Paul Duffin * @param <V> The result type returned by the Future's {@code get} method. 340888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 350888a09821a98ac0680fad765217302858e70fa4Paul Duffin * @author Stephen Hicks 360888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 370888a09821a98ac0680fad765217302858e70fa4Paul Duffinfinal class AsyncSettableFuture<V> extends ForwardingListenableFuture<V> { 380888a09821a98ac0680fad765217302858e70fa4Paul Duffin 390888a09821a98ac0680fad765217302858e70fa4Paul Duffin /** Creates a new asynchronously-settable future. */ 400888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <V> AsyncSettableFuture<V> create() { 410888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new AsyncSettableFuture<V>(); 420888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 430888a09821a98ac0680fad765217302858e70fa4Paul Duffin 440888a09821a98ac0680fad765217302858e70fa4Paul Duffin private final NestedFuture<V> nested = new NestedFuture<V>(); 450888a09821a98ac0680fad765217302858e70fa4Paul Duffin private final ListenableFuture<V> dereferenced = Futures.dereference(nested); 460888a09821a98ac0680fad765217302858e70fa4Paul Duffin 470888a09821a98ac0680fad765217302858e70fa4Paul Duffin private AsyncSettableFuture() {} 480888a09821a98ac0680fad765217302858e70fa4Paul Duffin 490888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override protected ListenableFuture<V> delegate() { 500888a09821a98ac0680fad765217302858e70fa4Paul Duffin return dereferenced; 510888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 520888a09821a98ac0680fad765217302858e70fa4Paul Duffin 530888a09821a98ac0680fad765217302858e70fa4Paul Duffin /** 540888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Sets this future to forward to the given future. Returns {@code true} 550888a09821a98ac0680fad765217302858e70fa4Paul Duffin * if the future was able to be set (i.e. it hasn't been set already). 560888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 570888a09821a98ac0680fad765217302858e70fa4Paul Duffin public boolean setFuture(ListenableFuture<? extends V> future) { 580888a09821a98ac0680fad765217302858e70fa4Paul Duffin return nested.setFuture(checkNotNull(future)); 590888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 600888a09821a98ac0680fad765217302858e70fa4Paul Duffin 610888a09821a98ac0680fad765217302858e70fa4Paul Duffin /** 620888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Convenience method that calls {@link #setFuture} on a {@link 630888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Futures#immediateFuture}. Returns {@code true} if the future 640888a09821a98ac0680fad765217302858e70fa4Paul Duffin * was able to be set (i.e. it hasn't been set already). 650888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 660888a09821a98ac0680fad765217302858e70fa4Paul Duffin public boolean setValue(@Nullable V value) { 670888a09821a98ac0680fad765217302858e70fa4Paul Duffin return setFuture(Futures.immediateFuture(value)); 680888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 690888a09821a98ac0680fad765217302858e70fa4Paul Duffin 700888a09821a98ac0680fad765217302858e70fa4Paul Duffin /** 710888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Convenience method that calls {@link #setFuture} on a {@link 720888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Futures#immediateFailedFuture}. Returns {@code true} if the 730888a09821a98ac0680fad765217302858e70fa4Paul Duffin * future was able to be set (i.e. it hasn't been set already). 740888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 750888a09821a98ac0680fad765217302858e70fa4Paul Duffin public boolean setException(Throwable exception) { 760888a09821a98ac0680fad765217302858e70fa4Paul Duffin return setFuture(Futures.<V>immediateFailedFuture(exception)); 770888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 780888a09821a98ac0680fad765217302858e70fa4Paul Duffin 790888a09821a98ac0680fad765217302858e70fa4Paul Duffin /** 800888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Returns {@code true} if this future has been (possibly asynchronously) set. 810888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Note that a {@code false} result in no way gaurantees that a later call 820888a09821a98ac0680fad765217302858e70fa4Paul Duffin * to, e.g., {@link #setFuture} will succeed, since another thread could 830888a09821a98ac0680fad765217302858e70fa4Paul Duffin * make the call in between. This is somewhat analogous to {@link #isDone}, 840888a09821a98ac0680fad765217302858e70fa4Paul Duffin * but since setting and completing are not the same event, it is useful to 850888a09821a98ac0680fad765217302858e70fa4Paul Duffin * have this method broken out. 860888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 870888a09821a98ac0680fad765217302858e70fa4Paul Duffin public boolean isSet() { 880888a09821a98ac0680fad765217302858e70fa4Paul Duffin return nested.isDone(); 890888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 900888a09821a98ac0680fad765217302858e70fa4Paul Duffin 910888a09821a98ac0680fad765217302858e70fa4Paul Duffin private static final class NestedFuture<V> extends AbstractFuture<ListenableFuture<? extends V>> { 920888a09821a98ac0680fad765217302858e70fa4Paul Duffin boolean setFuture(ListenableFuture<? extends V> value) { 930888a09821a98ac0680fad765217302858e70fa4Paul Duffin boolean result = set(value); 940888a09821a98ac0680fad765217302858e70fa4Paul Duffin if (isCancelled()) { 950888a09821a98ac0680fad765217302858e70fa4Paul Duffin value.cancel(wasInterrupted()); 960888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 970888a09821a98ac0680fad765217302858e70fa4Paul Duffin return result; 980888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 990888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1000888a09821a98ac0680fad765217302858e70fa4Paul Duffin} 101