11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2011 The Guava Authors
31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License");
51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License.
61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at
71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0
91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software
111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS,
121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and
141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License.
151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.util.concurrent;
181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.ForwardingObject;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.List;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.concurrent.Callable;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.concurrent.ExecutionException;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.concurrent.ExecutorService;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.concurrent.Future;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.concurrent.TimeUnit;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.concurrent.TimeoutException;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * An executor service which forwards all its method calls to another executor
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * service. Subclasses should override one or more methods to modify the
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * behavior of the backing executor service as desired per the <a
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * href="http://en.wikipedia.org/wiki/Decorator_pattern">decorator pattern</a>.
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Kurt Alfred Kluever
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 10.0
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
390888a09821a98ac0680fad765217302858e70fa4Paul Duffinpublic abstract class ForwardingExecutorService extends ForwardingObject
400888a09821a98ac0680fad765217302858e70fa4Paul Duffin    implements ExecutorService {
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /** Constructor for use by subclasses. */
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected ForwardingExecutorService() {}
430888a09821a98ac0680fad765217302858e70fa4Paul Duffin
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected abstract ExecutorService delegate();
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
470888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
480888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public boolean awaitTermination(long timeout, TimeUnit unit)
490888a09821a98ac0680fad765217302858e70fa4Paul Duffin      throws InterruptedException {
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().awaitTermination(timeout, unit);
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
530888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
540888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public <T> List<Future<T>> invokeAll(
550888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Collection<? extends Callable<T>> tasks) throws InterruptedException {
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().invokeAll(tasks);
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
590888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
600888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public <T> List<Future<T>> invokeAll(
610888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
620888a09821a98ac0680fad765217302858e70fa4Paul Duffin      throws InterruptedException {
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().invokeAll(tasks, timeout, unit);
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
660888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
670888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public <T> T invokeAny(Collection<? extends Callable<T>> tasks)
680888a09821a98ac0680fad765217302858e70fa4Paul Duffin      throws InterruptedException, ExecutionException {
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().invokeAny(tasks);
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
720888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
730888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public <T> T invokeAny(
740888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      throws InterruptedException, ExecutionException, TimeoutException {
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().invokeAny(tasks, timeout, unit);
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
790888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public boolean isShutdown() {
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().isShutdown();
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
840888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public boolean isTerminated() {
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().isTerminated();
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
890888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void shutdown() {
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    delegate().shutdown();
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
940888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public List<Runnable> shutdownNow() {
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().shutdownNow();
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
990888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void execute(Runnable command) {
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    delegate().execute(command);
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public <T> Future<T> submit(Callable<T> task) {
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().submit(task);
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1080888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public Future<?> submit(Runnable task) {
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().submit(task);
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1130888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public <T> Future<T> submit(Runnable task, T result) {
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return delegate().submit(task, result);
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
118