/*
 * Copyright 2011-2023 MicroEJ Corp. All rights reserved.
 * This library is provided in source code for use, modification and test, subject to license terms.
 * Any modification of the source code will break MicroEJ Corp. warranties on the whole library.
 */
package ej.bon;

import java.util.Date;

/**
 * A task that can be scheduled for one-time or repeated execution by a Timer.
 */
public abstract class TimerTask implements Runnable {

	/**
	 * Creates a new timer task.
	 */
	protected TimerTask() {
		throw new RuntimeException();
	}

	/**
	 * The action to be performed by this timer task.
	 *
	 * @see Thread#run()
	 */
	@Override
	public abstract void run();

	/**
	 * Cancels this timer task. If the task has been scheduled for one-time
	 * execution and has not yet run, or has not yet been scheduled, it will never
	 * run. If the task has been scheduled for repeated execution, it will never run
	 * again. (If the task is running when this call occurs, the task will run to
	 * completion, but will never run again.)
	 *
	 * Note that calling this method from within the run method of a repeating timer
	 * task absolutely guarantees that the timer task will not run again.
	 *
	 * This method may be called repeatedly; the second and subsequent calls have no
	 * effect.
	 *
	 * @return <code>true</code> if this task is scheduled for one-time execution
	 *         and has not yet run, or this task is scheduled for repeated
	 *         execution. Returns <code>false</code> if the task was scheduled for
	 *         one-time execution and has already run, or if the task was never
	 *         scheduled, or if the task was already canceled (Loosely speaking,
	 *         this method returns <code>true</code> if it prevents one or more
	 *         scheduled executions from taking place.)
	 */
	public boolean cancel() {
		throw new RuntimeException();
	}

	/**
	 * Returns the scheduled execution time of the most recent actual execution of
	 * this task. (If this method is invoked while task execution is in progress,
	 * the return value is the scheduled execution time of the ongoing task
	 * execution.)
	 * <p>
	 * This method is typically invoked from within a task's run method, to
	 * determine whether the current execution of the task is sufficiently timely to
	 * warrant performing the scheduled activity:
	 * <pre>
	 * public void run() {
	 * 	if (CurrentTime.get() - scheduledExecutionTime() &gt;= MAX_TARDINESS)
	 * 		return; // Too late; skip this execution.
	 * 	// Perform the task
	 * }
	 * </pre>
	 *
	 * <p>
	 * This method is typically not used in conjunction with fixed-delay execution
	 * repeating tasks, as their scheduled execution times are allowed to drift over
	 * time, and so are not terribly significant.
	 *
	 * @return the time at which the most recent execution of this task was
	 *         scheduled to occur, in the format returned by Date.getTime(). The
	 *         return value is undefined if the task has yet to commence its first
	 *         execution.
	 * @see Date#getTime()
	 */
	public long scheduledExecutionTime() {
		throw new RuntimeException();
	}

	/**
	 * Method invoked when this {@link TimerTask} terminates due to an uncaught
	 * exception thrown by {@link TimerTask#run()}.
	 * <p>
	 * The default implementation of this method handles the uncaught exception as
	 * following:
	 * <ol>
	 * <li>if the {@link Timer} instance has a registered handler, this handler is
	 * invoked,</li>
	 * <li>otherwise, if the {@link Timer} class has a registered default handler,
	 * this handler is invoked,</li>
	 * <li>otherwise, the task is canceled and {@link Throwable#printStackTrace()}
	 * is invoked on the given exception.
	 * </ol>
	 * <p>
	 * Any exception thrown by this method will be ignored.
	 *
	 * @param timer
	 *            The {@link Timer} on which this {@link TimerTask} is scheduled.
	 * @param e
	 *            The uncaught exception.
	 * @see Timer#setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler)
	 * @see Timer#setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler)
	 */
	public void uncaughtException(Timer timer, Throwable e) {
		throw new RuntimeException();
	}

}
