1bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor/* 21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2009 The Guava Authors 3bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 4bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Licensed under the Apache License, Version 2.0 (the "License"); 5bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * you may not use this file except in compliance with the License. 6bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * You may obtain a copy of the License at 7bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 8bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * http://www.apache.org/licenses/LICENSE-2.0 9bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 10bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Unless required by applicable law or agreed to in writing, software 11bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * distributed under the License is distributed on an "AS IS" BASIS, 12bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * See the License for the specific language governing permissions and 14bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * limitations under the License. 15bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 16bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 17bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorpackage com.google.common.util.concurrent; 18bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Preconditions; 20bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport com.google.common.collect.ForwardingObject; 21bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 22bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.util.concurrent.ExecutionException; 23bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.util.concurrent.Future; 24bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.util.concurrent.TimeUnit; 25bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.util.concurrent.TimeoutException; 26bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 27bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor/** 28bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * A {@link Future} which forwards all its method calls to another future. 29bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Subclasses should override one or more methods to modify the behavior of 301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * the backing future as desired per the <a 31bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * href="http://en.wikipedia.org/wiki/Decorator_pattern">decorator pattern</a>. 32bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>Most subclasses can just use {@link SimpleForwardingFuture}. 341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 35bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @author Sven Mawson 361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 1.0 37bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 38bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorpublic abstract class ForwardingFuture<V> extends ForwardingObject 39bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor implements Future<V> { 40bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** Constructor for use by subclasses. */ 421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert protected ForwardingFuture() {} 431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 44bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor @Override protected abstract Future<V> delegate(); 45bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 47bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public boolean cancel(boolean mayInterruptIfRunning) { 48bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor return delegate().cancel(mayInterruptIfRunning); 49bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 50bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 52bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public boolean isCancelled() { 53bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor return delegate().isCancelled(); 54bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 55bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 57bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public boolean isDone() { 58bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor return delegate().isDone(); 59bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 60bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 62bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public V get() throws InterruptedException, ExecutionException { 63bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor return delegate().get(); 64bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 65bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 67bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public V get(long timeout, TimeUnit unit) 68bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor throws InterruptedException, ExecutionException, TimeoutException { 69bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor return delegate().get(timeout, unit); 70bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /* 731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * TODO(cpovirk): Use standard Javadoc form for SimpleForwarding* class and 741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * constructor 751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A simplified version of {@link ForwardingFuture} where subclasses 781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * can pass in an already constructed {@link Future} as the delegate. 791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 9.0 811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public abstract static class SimpleForwardingFuture<V> 831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert extends ForwardingFuture<V> { 841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private final Future<V> delegate; 851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert protected SimpleForwardingFuture(Future<V> delegate) { 871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.delegate = Preconditions.checkNotNull(delegate); 881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert protected final Future<V> delegate() { 921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return delegate; 931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 96bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor} 97