package org.eclipse.debug.jdi.tests;

/**********************************************************************
Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
This file is made available under the terms of the Common Public License v1.0
which accompanies this distribution, and is available at
http://www.eclipse.org/legal/cpl-v10.html
**********************************************************************/

import com.sun.jdi.event.AccessWatchpointEvent;
import com.sun.jdi.event.BreakpointEvent;
import com.sun.jdi.event.ClassPrepareEvent;
import com.sun.jdi.event.ClassUnloadEvent;
import com.sun.jdi.event.Event;
import com.sun.jdi.event.ExceptionEvent;
import com.sun.jdi.event.MethodEntryEvent;
import com.sun.jdi.event.MethodExitEvent;
import com.sun.jdi.event.ModificationWatchpointEvent;
import com.sun.jdi.event.StepEvent;
import com.sun.jdi.event.ThreadDeathEvent;
import com.sun.jdi.event.ThreadStartEvent;
import com.sun.jdi.event.VMDeathEvent;
import com.sun.jdi.event.VMDisconnectEvent;
import com.sun.jdi.request.EventRequest;

/**
 * Listen for a specific kind of event.
 */
public class EventWaiter implements EventListener {
	protected EventRequest fRequest;
	protected boolean fShouldGo;
	protected Event fEvent;
	/**
	 * Creates a new EventWaiter for the given request. Sets whether it
	 * should let the VM go after it got the event.
	 */
	public EventWaiter(EventRequest request, boolean shouldGo) {
		fRequest = request;
		fShouldGo = shouldGo;
	}
	public boolean accessWatchpoint(AccessWatchpointEvent event) {
		return handleEvent(event);
	}
	public boolean methodEntry(MethodEntryEvent event) {
		return handleEvent(event);
	}
	public boolean methodExit(MethodExitEvent event) {
		return handleEvent(event);
	}
	public boolean breakpoint(BreakpointEvent event) {
		return handleEvent(event);
	}
	public boolean classPrepare(ClassPrepareEvent event) {
		return handleEvent(event);
	}
	public boolean classUnload(ClassUnloadEvent event) {
		return handleEvent(event);
	}
	public boolean exception(ExceptionEvent event) {
		return handleEvent(event);
	}
	/**
	 * Handles an incoming event.
	 * Returns whether the VM should be resumed if it was suspended.
	 */
	protected boolean handleEvent(Event event) {
		if ((event.request() != null) && (event.request().equals(fRequest))) {
			notifyEvent(event);
			return fShouldGo;
		} else
			return true;
	}
	public boolean modificationWatchpoint(ModificationWatchpointEvent event) {
		return handleEvent(event);
	}
	/**
	 * Notify any object that is waiting for an event.
	 */
	synchronized protected void notifyEvent(Event event) {
		notify();
		fEvent = event;
	}
	public boolean step(StepEvent event) {
		return handleEvent(event);
	}
	public boolean threadDeath(ThreadDeathEvent event) {
		return handleEvent(event);
	}
	public boolean threadStart(ThreadStartEvent event) {
		return handleEvent(event);
	}
	public boolean vmDeath(VMDeathEvent event) {
		if (fEvent == null) {
			// This is the last event we can ever get an this was not the one we expected
			notifyEvent(null);
			return true;
		}
		return handleEvent(event);
	}
	public boolean vmDisconnect(VMDisconnectEvent event) {
		return handleEvent(event);
	}
	/**
	 * Waits for the first event corresponding to this waiter's request.
	 */
	synchronized public Event waitEvent() throws InterruptedException {
		if (fEvent == null) // If event didn't already come in
			wait();
		Event result = fEvent;
		fEvent = null;
		return result;
	}
	/**
	 * Waits for the first event corresponding to this waiter's request
	 * for the given time (in ms). If it times out, return null.
	 */
	synchronized public Event waitEvent(long time)
		throws InterruptedException {
		if (fEvent == null) // If event didn't already come in
			wait(time);
		Event result = fEvent;
		fEvent = null;
		return result;
	}
}
