/*******************************************************************************
 * Copyright (c) 2000, 2011 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdt.internal.debug.core.model;

/**
 * A timer notifies listeners when a specific amount of time has passed.
 * 
 * @see ITimeoutListener
 */
public class Timer {

	/**
	 * Listener to notify of a timeout
	 */
	private ITimeoutListener fListener;

	/**
	 * Timeout value, in milliseconds
	 */
	private int fTimeout;

	/**
	 * Whether this timer's thread is alive
	 */
	private boolean fAlive = true;

	/**
	 * Whether this timer has been started and has not yet timed out or been
	 * stopped.
	 */
	private boolean fStarted = false;

	/**
	 * The single thread used for each request.
	 */
	private Thread fThread;

	/**
	 * Constructs a new timer
	 */
	public Timer() {
		setTimeout(Integer.MAX_VALUE);
		Runnable r = new Runnable() {
			@Override
			public void run() {
				while (isAlive()) {
					boolean interrupted = false;
					try {
						Thread.sleep(getTimeout());
					} catch (InterruptedException e) {
						interrupted = true;
					}
					if (!interrupted) {
						if (getListener() != null) {
							setStarted(false);
							setTimeout(Integer.MAX_VALUE);
							getListener().timeout();
							setListener(null);
						}
					}
				}
			}
		};
		setThread(new Thread(r, "Evaluation Timer")); //$NON-NLS-1$
		getThread().setDaemon(true);
		getThread().start();
	}

	/**
	 * Starts this timer, and notifies the given listener when the time has
	 * passed. A call to <code>stop</code>, before the time expires, will cancel
	 * the the timer and timeout callback. This method can only be called if
	 * this timer is idle (i.e. <code>isStarted() == false<code>).
	 * 
	 * @param listener
	 *            The timer listener
	 * @param ms
	 *            The number of milliseconds to wait before notifying the
	 *            listener
	 */
	public void start(ITimeoutListener listener, int ms) {
		if (isStarted()) {
			throw new IllegalStateException(
					JDIDebugModelMessages.Timer_Timer_cannot_be_started_more_than_once_1);
		}
		setListener(listener);
		setTimeout(ms);
		setStarted(true);
		getThread().interrupt();
	}

	/**
	 * Stops this timer, cancelling any pending timeout notification.
	 */
	public void stop() {
		if (isAlive()) {
			setStarted(false);
			setTimeout(Integer.MAX_VALUE);
			getThread().interrupt();
		}
	}

	/**
	 * Disposes this timer
	 */
	public void dispose() {
		if (isAlive()) {
			setAlive(false);
			getThread().interrupt();
			setThread(null);
		}
	}

	/**
	 * Returns whether this timer's thread is alive
	 * 
	 * @return whether this timer's thread is alive
	 */
	private boolean isAlive() {
		return fAlive;
	}

	/**
	 * Sets whether this timer's thread is alive. When set to <code>false</code>
	 * this timer's thread will exit on its next iteration.
	 * 
	 * @param alive
	 *            whether this timer's thread should be alive
	 * @see #dispose()
	 */
	private void setAlive(boolean alive) {
		fAlive = alive;
	}

	/**
	 * Returns the current timeout listener
	 * 
	 * @return timeout listener
	 */
	protected ITimeoutListener getListener() {
		return fListener;
	}

	/**
	 * Sets the listener to be notified if this timer times out.
	 * 
	 * @param listener
	 *            timeout listener
	 */
	private void setListener(ITimeoutListener listener) {
		fListener = listener;
	}

	/**
	 * Returns whether this timer has been started, and has not yet timed out,
	 * or been stopped.
	 * 
	 * @return whether this timer has been started, and has not yet timed out,
	 *         or been stopped
	 */
	public boolean isStarted() {
		return fStarted;
	}

	/**
	 * Sets whether this timer has been started, and has not yet timed out, or
	 * been stopped.
	 * 
	 * @param started
	 *            whether this timer has been started, and has not yet timed
	 *            out, or been stopped
	 */
	private void setStarted(boolean started) {
		fStarted = started;
	}

	/**
	 * Returns this timer's thread
	 * 
	 * @return thread that waits for a timeout
	 */
	private Thread getThread() {
		return fThread;
	}

	/**
	 * Sets this timer's thread used to perform timeout processing
	 * 
	 * @param thread
	 *            thread that waits for a timeout
	 */
	private void setThread(Thread thread) {
		fThread = thread;
	}

	/**
	 * Returns the amount of time, in milliseconds, that this timer is/was
	 * waiting for.
	 * 
	 * @return timeout value, in milliseconds
	 */
	protected int getTimeout() {
		return fTimeout;
	}

	/**
	 * Sets the amount of time, in milliseconds, that this timer will wait for
	 * before timing out.
	 * 
	 * @param timeout
	 *            value, in milliseconds
	 */
	private void setTimeout(int timeout) {
		fTimeout = timeout;
	}
}
