/* ExecutionMonitor.java

	Purpose:
		
	Description:
		
	History:
		Wed Jun 30 14:15:16 TST 2010, Created by tomyeh

Copyright (C) 2010 Potix Corporation. All Rights Reserved.

*/
package org.zkoss.zk.ui.util;

import org.zkoss.zk.ui.Desktop;
import org.zkoss.zk.ui.Execution;
import org.zkoss.zk.ui.event.Event;

/**
 * An application-level listener to know when an execution is activated,
 * deactivated, or waiting for activation.
 * In addition, it also monitors the processing of an event, such that
 * it can be used to monitor the performance of the processing of events
 * (while {@link PerformanceMeter} monitors the AU requests).
 *
 * <p>Notice that the same listener is used for the whole application.
 * Make sure it is thread-safe and the performance is good.
 * In additions, don't throw any exception, and don't hold a reference to execution.
 * <p>If you hold references to desktops, remember to clean them up
 * when {@link #desktopDestroy} is called.
 *
 * @author tomyeh
 * @since 6.0.0
 * @see PerformanceMeter
 */
public interface ExecutionMonitor {
	/** Called when an execution is activated.
	 * There is only one execution per desktop is allowed to activate at
	 * the same time.
	 */
	public void executionActivate(Execution exec, Desktop desktop);

	/** Called when an execution fails to activate and then being waiting
	 * for activation.
	 * <p>Since 5.0, the AU requests are blocked at the client if ZK is busy
	 * for processing an AU request. Thus, this method is rarely called.
	 */
	public void executionWait(Execution exec, Desktop desktop);

	/** Called when an activated execution completes and is deactivated.
	 */
	public void executionDeactivate(Execution exec, Desktop desktop);

	/** Called when the activation of the given execution is aborted.
	 *
	 * @param t the exception causing the abort, or null if it is aborted
	 * normally.
	 */
	public void executionAbort(Execution exec, Desktop desktop, Throwable t);

	/** Called when a desktop is destroyed.
	 * This callback is useful to clean up the memory,
	 * if you have references to desktops.
	 */
	public void desktopDestroy(Desktop desktop);

	/** Called when the processing of the given event starts.
	 * The execution can be found by {@link org.zkoss.zk.ui.Executions#getCurrent}.
	 */
	public void eventStart(Event event);

	/** Called when the processing of the given event completes.
	 * The execution can be found by {@link org.zkoss.zk.ui.Executions#getCurrent}.
	 */
	public void eventComplete(Event event);

	/** Called when the processing of the given event suspends.
	* The execution can be found by {@link org.zkoss.zk.ui.Executions#getCurrent}.
	 */
	public void eventSuspend(Event event);

	/** Called when the processing of the given event resumes.
	* The execution can be found by {@link org.zkoss.zk.ui.Executions#getCurrent}.
	 */
	public void eventResume(Event event);
}
