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