/*******************************************************************************
 * Copyright (c) 2004, 2015 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.ui.monitors;

import org.eclipse.core.runtime.Platform;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.model.IDebugElement;
import org.eclipse.debug.core.model.IDebugTarget;
import org.eclipse.debug.core.model.ITerminate;

/**
 * Object used to display waiting thread in the debug launch view.
 * In this case, the thread owns for the owned monitors, and is waiting
 * for the parent monitor.
 */
public class JavaWaitingThread implements IDebugElement, ITerminate {

	/**
	 * The thread object in the thread and monitor model.
	 */
	private JavaMonitorThread fThread;

	/**
	 * The monitors this thread owns.
	 */
	private JavaOwnedMonitor[] fOwnedMonitors;
	/**
	 * The parent, in the debug view tree.
	 */
	private JavaOwnedMonitor fParent;

	public JavaWaitingThread(JavaMonitorThread thread, JavaOwnedMonitor parent) {
		fThread= thread;
		thread.addElement(this);
		fParent= parent;
	}

	public JavaMonitorThread getThread() {
		return fThread;
	}
	
	public JavaOwnedMonitor getParent() {
		return fParent;
	}

	public JavaOwnedMonitor[] getOwnedMonitors() {
		JavaMonitor[] ownedMonitors= fThread.getOwnedMonitors0();
		JavaOwnedMonitor[] tmp= new JavaOwnedMonitor[ownedMonitors.length];
		if (fOwnedMonitors == null) {
			// the list was empty, creating new objects
			for (int i= 0; i < ownedMonitors.length; i++) {
				tmp[i]= new JavaOwnedMonitor(ownedMonitors[i], this);
			}
		} else {
			// trying to reuse the objects from the previous list
	outer:	for (int i= 0; i < ownedMonitors.length; i++) {
				JavaMonitor ownedMonitor= ownedMonitors[i];
				for (int j= 0; j < fOwnedMonitors.length; j++) {
					if (fOwnedMonitors[j].getMonitor() == ownedMonitor) {
						tmp[i]= fOwnedMonitors[j];
						continue outer;
					}
				}
				tmp[i]= new JavaOwnedMonitor(ownedMonitor, this);
			}
		}
		fOwnedMonitors= tmp;
		return fOwnedMonitors;
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.debug.core.model.IDebugElement#getModelIdentifier()
	 */
	@Override
	public String getModelIdentifier() {
		return fThread.getModelIdentifier();
	}

	/* (non-Javadoc)
	 * @see org.eclipse.debug.core.model.IDebugElement#getDebugTarget()
	 */
	@Override
	public IDebugTarget getDebugTarget() {
		return fThread.getDebugTarget();
	}

	/* (non-Javadoc)
	 * @see org.eclipse.debug.core.model.IDebugElement#getLaunch()
	 */
	@Override
	public ILaunch getLaunch() {
		return fThread.getLaunch();
	}

	/* (non-Javadoc)
	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
	 */
	@Override
	@SuppressWarnings("unchecked")
	public <T> T getAdapter(Class<T> adapter) {
		if(adapter == IDebugTarget.class) {
			return (T) getDebugTarget();
		}
		//CONTEXTLAUNCHING
		if(adapter.equals(ILaunchConfiguration.class)) {
			return (T) getLaunch().getLaunchConfiguration();
		}
		return Platform.getAdapterManager().getAdapter(this, adapter);
	}

	/**
	 * Returns whether this waiting thread is suspended
	 */
	public boolean isSuspended() {
		return fThread.isSuspended();
	}

	/* (non-Javadoc)
	 * @see org.eclipse.debug.core.model.ITerminate#canTerminate()
	 */
	@Override
	public boolean canTerminate() {
		return getDebugTarget().canTerminate();
	}

	/* (non-Javadoc)
	 * @see org.eclipse.debug.core.model.ITerminate#isTerminated()
	 */
	@Override
	public boolean isTerminated() {
		return getDebugTarget().isTerminated();
	}

	/* (non-Javadoc)
	 * @see org.eclipse.debug.core.model.ITerminate#terminate()
	 */
	@Override
	public void terminate() throws DebugException {
		getDebugTarget().terminate();
	}
}
