/*******************************************************************************
 * Copyright (c) 2000, 2011 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdt.debug.core;

import org.eclipse.debug.core.DebugException;

/**
 * A value referencing an object on a target VM.
 *
 * @see IJavaValue
 * @since 2.0
 * @noimplement This interface is not intended to be implemented by clients.
 * @noextend This interface is not intended to be extended by clients.
 */
public interface IJavaObject extends IJavaValue {

	/**
	 * Returns the result of sending the specified message to this object with
	 * the given arguments in the specified thread. The given thread is resumed
	 * to perform the method invocation. The thread will suspend in its original
	 * location when the method invocation is complete. This method does not
	 * return until the method invocation is complete. Invoking a method in the
	 * target VM can result in breakpoints being hit, infinite loops, and
	 * deadlock.
	 *
	 * @param selector
	 *            the selector of the method to be invoked
	 * @param signature
	 *            the JNI style signature of the method to be invoked
	 * @param args
	 *            the arguments of the method, which can be <code>null</code> or
	 *            empty if there are none
	 * @param thread
	 *            the thread in which to invoke the method
	 * @param superSend
	 *            <code>true</code> if the method lookup should begin in this
	 *            object's superclass
	 * @return the result of invoking the method
	 * @exception DebugException
	 *                if this method fails. Reasons include:
	 *                <ul>
	 *                <li>Failure communicating with the VM. The
	 *                DebugException's status code contains the underlying
	 *                exception responsible for the failure.</li>
	 *                <li>This object does not implement the specified method</li>
	 *                <li>An exception occurs while invoking the specified
	 *                method</li>
	 *                <li>The given thread is already performing a message send,
	 *                (status code
	 *                <code>IJavaThread.ERR_NESTED_METHOD_INVOCATION</code>)</li>
	 *                <li>The given thread is not currently suspended (status
	 *                code <code>IJavaThread.ERR_THREAD_NOT_SUSPENDED</code>)</li>
	 *                <li>The given thread was explicitly suspended (status code
	 *                <code>IJavaThread.ERR_INCOMPATIBLE_THREAD_STATE</code>)</li>
	 *                </ul>
	 */
	public IJavaValue sendMessage(String selector, String signature,
			IJavaValue[] args, IJavaThread thread, boolean superSend)
			throws DebugException;

	/**
	 * Returns the result of sending the specified message on the specified
	 * declaring type to this object with the given arguments in the specified
	 * thread. The given thread is resumed to perform the method invocation. The
	 * thread will suspend in its original location when the method invocation
	 * is complete. This method does not return until the method invocation is
	 * complete. Invoking a method in the target VM can result in breakpoints
	 * being hit, infinite loops, and deadlock.
	 *
	 * @param selector
	 *            the selector of the method to be invoked
	 * @param signature
	 *            the JNI style signature of the method to be invoked
	 * @param args
	 *            the arguments of the method, which can be <code>null</code> or
	 *            empty if there are none
	 * @param thread
	 *            the thread in which to invoke the method
	 * @param typeSignature
	 *            the signature of the type in which the method is defined or
	 *            <code>null</code> if the method should be invoked normally
	 *            using polymorphism
	 * @return the result of invoking the method
	 * @exception DebugException
	 *                if this method fails. Reasons include:
	 *                <ul>
	 *                <li>Failure communicating with the VM. The
	 *                DebugException's status code contains the underlying
	 *                exception responsible for the failure.</li>
	 *                <li>This object does not implement the specified method</li>
	 *                <li>An exception occurs while invoking the specified
	 *                method</li>
	 *                <li>The given thread is already performing a message send,
	 *                (status code
	 *                <code>IJavaThread.ERR_NESTED_METHOD_INVOCATION</code>)</li>
	 *                <li>The given thread is not currently suspended (status
	 *                code <code>IJavaThread.ERR_THREAD_NOT_SUSPENDED</code>)</li>
	 *                <li>The given thread was explicitly suspended (status code
	 *                <code>IJavaThread.ERR_INCOMPATIBLE_THREAD_STATE</code>)</li>
	 *                </ul>
	 * @since 2.0.1
	 */
	public IJavaValue sendMessage(String selector, String signature,
			IJavaValue[] args, IJavaThread thread, String typeSignature)
			throws DebugException;

	/**
	 * Returns a variable representing the field in this object with the given
	 * name, or <code>null</code> if there is no field with the given name, or
	 * the name is ambiguous.
	 *
	 * @param name
	 *            field name
	 * @param superField
	 *            whether or not to get the field in the superclass of this
	 *            objects.
	 * @return the variable representing the field, or <code>null</code>
	 * @exception DebugException
	 *                if this method fails. Reasons include:
	 *                <ul>
	 *                <li>Failure communicating with the VM. The
	 *                DebugException's status code contains the underlying
	 *                exception responsible for the failure.</li>
	 */
	public IJavaFieldVariable getField(String name, boolean superField)
			throws DebugException;

	/**
	 * Returns a variable representing the field in this object with the given
	 * name declared in the type with the given signature, or <code>null</code>
	 * if there is no field with the given name, or the name is ambiguous.
	 *
	 * @param name
	 *            field name
	 * @param typeSignature
	 *            the signature of the type in which the field is defined
	 * @return the variable representing the field, or <code>null</code>
	 * @exception DebugException
	 *                if this method fails. Reasons include:
	 *                <ul>
	 *                <li>Failure communicating with the VM. The
	 *                DebugException's status code contains the underlying
	 *                exception responsible for the failure.</li>
	 */
	public IJavaFieldVariable getField(String name, String typeSignature)
			throws DebugException;

	/**
	 * Returns the threads waiting for the monitor associated to this object, or
	 * <code>null</code> if no thread is waiting for the monitor.
	 *
	 * @return the thread waiting for the monitor, or <code>null</code>.
	 * @exception DebugException
	 *                if this method fails. Reasons include:
	 *                <ul>
	 *                <li>The VM is not able to retrieve the monitor information
	 *                </li>
	 *                <li>Failure communicating with the VM. The
	 *                DebugException's status code contains the underlying
	 *                exception responsible for the failure.</li>
	 *                </ul>
	 * @since 3.1
	 */
	public IJavaThread[] getWaitingThreads() throws DebugException;

	/**
	 * Returns the threads which owns for the monitor associated to this object,
	 * or <code>null</code> if no thread owns the monitor.
	 *
	 * @return the thread which owns the monitor, or <code>null</code>.
	 * @exception DebugException
	 *                if this method fails. Reasons include:
	 *                <ul>
	 *                <li>The VM is not able to retrieve the monitor information
	 *                </li>
	 *                <li>Failure communicating with the VM. The
	 *                DebugException's status code contains the underlying
	 *                exception responsible for the failure.</li>
	 *                </ul>
	 * @since 3.1
	 */
	public IJavaThread getOwningThread() throws DebugException;

	/**
	 * Returns objects that directly reference this object.
	 *
	 * @param max
	 *            the maximum number of references to retrieve or 0 for all
	 *            references
	 * @return objects that directly reference this object
	 * @throws DebugException
	 *             if the request fails
	 * @since 3.3
	 */
	public IJavaObject[] getReferringObjects(long max) throws DebugException;

	/**
	 * Permits this object to be garbage collected. Has no effect if this VM
	 * does not support enabling/disabling of garbage collection of specific
	 * objects.
	 *
	 * @throws DebugException
	 *             if request fails
	 * @see IJavaDebugTarget
	 * @since 3.4
	 */
	public void enableCollection() throws DebugException;

	/**
	 * Prevents this object from being garbage collected. Has no effect if this
	 * VM does not support enabling/disabling of garbage collection of specific
	 * objects.
	 *
	 * @throws DebugException
	 *             if request fails
	 * @see IJavaDebugTarget
	 * @since 3.4
	 */
	public void disableCollection() throws DebugException;

	/**
	 * Returns the unique id for this object.
	 *
	 * @return unique id or -1 if this value is <code>null</code>
	 * @throws DebugException
	 *             if the request fails
	 * @since 3.4
	 */
	public long getUniqueId() throws DebugException;

}
