package com.opendoorlogistics.codefromweb;
import java.util.Collection;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.TimeUnit;
/**
* From http://stackoverflow.com/questions/4620061/how-to-create-lifo-executor
* @param <T>
*/
public final class BlockingLifoQueue<T> implements BlockingQueue<T> {
// we add and remove only from the end of the queue
private final BlockingDeque<T> deque;
public BlockingLifoQueue() {
deque = new LinkedBlockingDeque<T>();
}
public boolean add(T e) {
deque.addLast(e);
return true;
}
public boolean contains(Object o) {
return deque.contains(o);
}
public int drainTo(Collection<? super T> c) {
return deque.drainTo(c);
}
public int drainTo(Collection<? super T> c, int maxElements) {
return deque.drainTo(c, maxElements);
}
public boolean offer(T e) {
return deque.offerLast(e);
}
public boolean offer(T e, long timeout, TimeUnit unit) throws InterruptedException {
return deque.offerLast(e, timeout, unit);
}
public T poll(long timeout, TimeUnit unit) throws InterruptedException {
return deque.pollLast(timeout, unit);
}
public void put(T e) throws InterruptedException {
deque.putLast(e);
}
public int remainingCapacity() {
return deque.size();
}
public boolean remove(Object o) {
return deque.remove(o);
}
public T take() throws InterruptedException {
return deque.takeLast();
}
public T element() {
if (deque.isEmpty()) {
throw new NoSuchElementException("empty stack");
}
return deque.pollLast();
}
public T peek() {
return deque.peekLast();
}
public T poll() {
return deque.pollLast();
} // deque.peekLast(); } -- fixed typo.
public T remove() {
if (deque.isEmpty()) {
throw new NoSuchElementException("empty stack");
}
return deque.pollLast();
}
public boolean addAll(Collection<? extends T> c) {
for (T e : c) {
deque.add(e);
}
return true;
}
public void clear() {
deque.clear();
}
public boolean containsAll(Collection<?> c) {
return deque.containsAll(c);
}
public boolean isEmpty() {
return deque.isEmpty();
}
public Iterator<T> iterator() {
return deque.descendingIterator();
}
public boolean removeAll(Collection<?> c) {
return deque.removeAll(c);
}
public boolean retainAll(Collection<?> c) {
return deque.retainAll(c);
}
public int size() {
return deque.size();
}
public Object[] toArray() {
return deque.toArray();
}
public <T> T[] toArray(T[] a) {
return deque.toArray(a);
}
}