13ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin/*
23ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * Copyright (C) 2012 The Guava Authors
33ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin *
43ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License");
53ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * you may not use this file except in compliance with the License.
63ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * You may obtain a copy of the License at
73ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin *
83ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * http://www.apache.org/licenses/LICENSE-2.0
93ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin *
103ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * Unless required by applicable law or agreed to in writing, software
113ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * distributed under the License is distributed on an "AS IS" BASIS,
123ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * See the License for the specific language governing permissions and
143ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * limitations under the License.
153ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin */
163ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
173ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffinpackage com.google.common.collect;
183ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
193ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffinimport java.util.Collection;
203ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffinimport java.util.concurrent.BlockingDeque;
213ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffinimport java.util.concurrent.TimeUnit;
223ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
233ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin/**
243ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * A {@link BlockingDeque} which forwards all its method calls to another {@code BlockingDeque}.
253ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * Subclasses should override one or more methods to modify the behavior of the backing deque as
263ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * desired per the <a href="http://en.wikipedia.org/wiki/Decorator_pattern">decorator pattern</a>.
273ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin *
283ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <p><b>Warning:</b> The methods of {@code ForwardingBlockingDeque} forward
293ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <b>indiscriminately</b> to the methods of the delegate. For example, overriding {@link #add}
303ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * alone <b>will not</b> change the behaviour of {@link #offer} which can lead to unexpected
313ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * behaviour. In this case, you should override {@code offer} as well, either providing your own
323ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * implementation, or delegating to the provided {@code standardOffer} method.
333ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin *
343ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <p>
353ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * The {@code standard} methods are not guaranteed to be thread-safe, even when all of the methods
363ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * that they depend on are thread-safe.
373ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin *
383ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * @author Emily Soldal
393ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * @since 14.0
403ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin */
413ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffinpublic abstract class ForwardingBlockingDeque<E>
423ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    extends ForwardingDeque<E> implements BlockingDeque<E> {
433ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
443ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  /** Constructor for use by subclasses. */
453ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  protected ForwardingBlockingDeque() {}
463ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
473ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  @Override protected abstract BlockingDeque<E> delegate();
483ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
493ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  @Override
503ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public int remainingCapacity() {
513ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    return delegate().remainingCapacity();
523ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
533ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
543ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  @Override
553ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public void putFirst(E e) throws InterruptedException {
563ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    delegate().putFirst(e);
573ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
583ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
593ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  @Override
603ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public void putLast(E e) throws InterruptedException {
613ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    delegate().putLast(e);
623ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
633ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
643ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  @Override
653ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public boolean offerFirst(E e, long timeout, TimeUnit unit) throws InterruptedException {
663ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    return delegate().offerFirst(e, timeout, unit);
673ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
683ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
693ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  @Override
703ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public boolean offerLast(E e, long timeout, TimeUnit unit) throws InterruptedException {
713ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    return delegate().offerLast(e, timeout, unit);
723ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
733ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
743ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  @Override
753ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public E takeFirst() throws InterruptedException {
763ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    return delegate().takeFirst();
773ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
783ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
793ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  @Override
803ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public E takeLast() throws InterruptedException {
813ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    return delegate().takeLast();
823ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
833ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
843ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  @Override
853ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public E pollFirst(long timeout, TimeUnit unit) throws InterruptedException {
863ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    return delegate().pollFirst(timeout, unit);
873ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
883ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
893ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  @Override
903ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public E pollLast(long timeout, TimeUnit unit) throws InterruptedException {
913ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    return delegate().pollLast(timeout, unit);
923ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
933ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
943ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  @Override
953ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public void put(E e) throws InterruptedException {
963ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    delegate().put(e);
973ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
983ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
993ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  @Override
1003ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public boolean offer(E e, long timeout, TimeUnit unit) throws InterruptedException {
1013ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    return delegate().offer(e, timeout, unit);
1023ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
1033ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
1043ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  @Override
1053ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public E take() throws InterruptedException {
1063ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    return delegate().take();
1073ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
1083ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
1093ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  @Override
1103ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public E poll(long timeout, TimeUnit unit) throws InterruptedException {
1113ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    return delegate().poll(timeout, unit);
1123ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
1133ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
1143ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  @Override
1153ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public int drainTo(Collection<? super E> c) {
1163ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    return delegate().drainTo(c);
1173ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
1183ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin
1193ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  @Override
1203ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  public int drainTo(Collection<? super E> c, int maxElements) {
1213ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    return delegate().drainTo(c, maxElements);
1223ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin  }
1233ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin}
124