//#preprocess
/* *************************************************
 * Copyright (c) 2010 - 2010
 * HT srl,   All rights reserved.
 * Project      : RCS, RCSBlackBerry
 * Package      : blackberry.utils
 * File         : BlockingQueue.java
 * Created      : 28-apr-2010
 * *************************************************/
package com.android.dvci.util;

//#ifdef DEBUG
//#endif
/**
 * The Class BlockingQueue.
 * 
 * @author Rob Gordon.
 */
public final class BlockingQueue {

	/**
	 * The Class ClosedException.
	 */
	public static class ClosedException extends RuntimeException {

		/**
		 * Instantiates a new closed exception.
		 */
		ClosedException() {
			super("Queue closed.");
		}
	}

	private final Queue list = new VectorQueue();

	// private final boolean wait = false;

	private boolean closed = false;

	/**
	 * Close.
	 */
	public synchronized void close() {
		closed = true;
		notifyAll();
	}

	Object blockedLock = new Object();

	/**
	 * Dequeue.
	 * 
	 * @return the object
	 */
	public synchronized Object dequeue() {
		while (!closed && list.isEmpty()) {
			try {
				wait();
			} catch (final InterruptedException e) {
				// ignore
			}
		}
		if (list.isEmpty()) {
			return null;
		}
		return list.dequeue();
	}

	/**
	 * Enqueue.
	 * 
	 * @param o
	 *            the o
	 */
	public synchronized void enqueue(final Object o) {
		if (closed) {
			throw new ClosedException();
		}
		list.enqueue(o);
		notifyAll();
	}

	/**
	 * Checks if is empty.
	 * 
	 * @return true, if is empty
	 */
	public synchronized boolean isEmpty() {
		return list.isEmpty();
	}

	/**
	 * Open.
	 */
	public synchronized void open() {
		closed = false;
	}

}
