/*******************************************************************************
 * Copyright (c) 2000, 2011 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
 *     Jesper Steen Moller - enhancement 254677 - filter getters/setters
 *     Codenza Software Development Inc. - Darin Wright - bug 330987
 *******************************************************************************/
package org.eclipse.jdt.debug.core;

import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.model.IDebugTarget;
import org.eclipse.debug.core.model.IStepFilters;

/**
 * A Java virtual machine.
 * 
 * @see IDebugTarget
 * @see org.eclipse.core.runtime.IAdaptable
 * @noimplement This interface is not intended to be implemented by clients.
 * @noextend This interface is not intended to be extended by clients.
 */

public interface IJavaDebugTarget extends IDebugTarget, IStepFilters {
	/**
	 * Searches for and returns a variable with the given name, or
	 * <code>null</code> if unable to resolve a variable with the name.
	 * <p>
	 * Variable lookup works only when a debug target has one or more threads
	 * suspended. Lookup is performed in each suspended thread, returning the
	 * first successful match, or <code>null</code> if no match if found. If
	 * this debug target has no suspended threads, <code>null</code> is
	 * returned.
	 * </p>
	 * 
	 * @param variableName
	 *            name of the variable
	 * @return a variable with the given name, or <code>null</code> if none
	 * @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>
	 *                </ul>
	 */
	public abstract IJavaVariable findVariable(String variableName)
			throws DebugException;

	/**
	 * Returns the types loaded in this debug target with the given fully
	 * qualified name, or <code>null</code> of no type with the given name is
	 * loaded.
	 * 
	 * @param name
	 *            fully qualified name of type, for example
	 *            <code>java.lang.String</code>
	 * @return the types with the given name, 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>
	 *                </ul>
	 */
	public abstract IJavaType[] getJavaTypes(String name) throws DebugException;

	/**
	 * Returns a value from this target that corresponds to the given boolean.
	 * The returned value can be used for setting and comparing against a value
	 * retrieved from this debug target.
	 * 
	 * @param value
	 *            a boolean from which to create a value
	 * @return a corresponding value from this target
	 */
	public abstract IJavaValue newValue(boolean value);

	/**
	 * Returns a value from this target that corresponds to the given byte. The
	 * returned value can be used for setting and comparing against a value
	 * retrieved from this debug target.
	 * 
	 * @param value
	 *            a byte from which to create a value
	 * @return a corresponding value from this target
	 */
	public abstract IJavaValue newValue(byte value);

	/**
	 * Returns a value from this target that corresponds to the given char. The
	 * returned value can be used for setting and comparing against a value
	 * retrieved from this debug target.
	 * 
	 * @param value
	 *            a char from which to create a value
	 * @return a corresponding value from this target
	 */
	public abstract IJavaValue newValue(char value);

	/**
	 * Returns a value from this target that corresponds to the given double.
	 * The returned value can be used for setting and comparing against a value
	 * retrieved from this debug target.
	 * 
	 * @param value
	 *            a double from which to create a value
	 * @return a corresponding value from this target
	 */
	public abstract IJavaValue newValue(double value);

	/**
	 * Returns a value from this target that corresponds to the given float. The
	 * returned value can be used for setting and comparing against a value
	 * retrieved from this debug target.
	 * 
	 * @param value
	 *            a float from which to create a value
	 * @return a corresponding value from this target
	 */
	public abstract IJavaValue newValue(float value);

	/**
	 * Returns a value from this target that corresponds to the given int. The
	 * returned value can be used for setting and comparing against a value
	 * retrieved from this debug target.
	 * 
	 * @param value
	 *            an int from which to create a value
	 * @return a corresponding value from this target
	 */
	public abstract IJavaValue newValue(int value);

	/**
	 * Returns a value from this target that corresponds to the given long. The
	 * returned value can be used for setting and comparing against a value
	 * retrieved from this debug target.
	 * 
	 * @param value
	 *            a long from which to create a value
	 * @return a corresponding value from this target
	 */
	public abstract IJavaValue newValue(long value);

	/**
	 * Returns a value from this target that corresponds to the given short. The
	 * returned value can be used for setting and comparing against a value
	 * retrieved from this debug target.
	 * 
	 * @param value
	 *            a short from which to create a value
	 * @return a corresponding value from this target
	 */
	public abstract IJavaValue newValue(short value);

	/**
	 * Returns a value from this target that corresponds to the given string.
	 * The returned value can be used for setting and comparing against a value
	 * retrieved from this debug target.
	 * 
	 * @param value
	 *            a string from which to create a value
	 * @return a corresponding value from this target
	 */
	public abstract IJavaValue newValue(String value);

	/**
	 * Returns a value from this target that corresponds to <code>null</code>.
	 * The returned value can be used for setting and comparing against a value
	 * retrieved from this debug target.
	 * 
	 * @return a value corresponding to <code>null</code>
	 */
	public abstract IJavaValue nullValue();

	/**
	 * Returns a value from this target that corresponds to <code>void</code>.
	 * The returned value can be used for setting and comparing against a value
	 * retrieved from this debug target.
	 * 
	 * @return a value corresponding to <code>void</code>
	 */
	public abstract IJavaValue voidValue();

	/**
	 * Returns whether any of the threads associated with this debug target are
	 * running code in the VM that is out of synch with the code in the
	 * workspace.
	 * 
	 * @return whether this debug target is out of synch with the workspace.
	 * @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 abstract boolean isOutOfSynch() throws DebugException;

	/**
	 * Returns whether any of the threads associated with this debug target may
	 * be running code in the VM that is out of synch with the code in the
	 * workspace.
	 * 
	 * @return whether this debug target may be out of synch with the workspace.
	 * @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 abstract boolean mayBeOutOfSynch() throws DebugException;

	/**
	 * Returns whether this target supports hot code replace.
	 * 
	 * @return whether this target supports hot code replace
	 */
	public boolean supportsHotCodeReplace();

	/**
	 * Returns whether this target is currently performing a hot code replace.
	 * 
	 * @return whether this target is currently performing a hot code replace
	 * @since 2.1
	 */
	public boolean isPerformingHotCodeReplace();

	/**
	 * Returns whether this target supports instance breakpoints.
	 * 
	 * @return whether this target supports instance breakpoints
	 * @since 2.1
	 */
	public boolean supportsInstanceBreakpoints();

	/**
	 * Returns whether synthetic methods are filtered when stepping, if step
	 * filters are enabled.
	 * 
	 * @return whether synthetic methods are filtered when stepping
	 */
	public abstract boolean isFilterSynthetics();

	/**
	 * Sets whether synthetic methods are filtered when stepping.
	 * 
	 * @param filter
	 *            whether to synthetic methods are filtered when stepping
	 */
	public abstract void setFilterSynthetics(boolean filter);

	/**
	 * Returns whether simple getters are filtered when stepping.
	 * 
	 * @return true, if simple getters should be filtered when stepping
	 * @since 3.7
	 */
	public abstract boolean isFilterGetters();

	/**
	 * Sets whether simple getters are filtered when stepping.
	 * 
	 * @param filter
	 *            whether to filter simple getters when stepping
	 * @since 3.7
	 */
	public abstract void setFilterGetters(boolean filter);

	/**
	 * Returns whether simple setters are filtered when stepping.
	 * 
	 * @return true, if simple setters should be filtered when stepping
	 * @since 3.7
	 */
	public abstract boolean isFilterSetters();

	/**
	 * Sets whether simple setters are filtered when stepping.
	 * 
	 * @param filter
	 *            whether to filter simple setters when stepping
	 * @since 3.7
	 */
	public abstract void setFilterSetters(boolean filter);

	/**
	 * Returns whether static initializers are filtered when stepping, if step
	 * filters are enabled.
	 * 
	 * @return whether static initializers are filtered when stepping
	 */
	public abstract boolean isFilterStaticInitializers();

	/**
	 * Sets whether to filter static initializers when stepping.
	 * 
	 * @param filter
	 *            whether to filter static initializers when stepping
	 */
	public abstract void setFilterStaticInitializers(boolean filter);

	/**
	 * Returns whether constructors are filtered when stepping, if step filters
	 * are enabled.
	 * 
	 * @return whether constructors are filtered when stepping
	 */
	public abstract boolean isFilterConstructors();

	/**
	 * Sets whether to filter constructors when stepping.
	 * 
	 * @param filter
	 *            whether to filter constructors when stepping
	 */
	public abstract void setFilterConstructors(boolean filter);

	/**
	 * Returns the list of active step filters in this target. The list is a
	 * collection of Strings. Each string is the fully qualified name/pattern of
	 * a type/package to filter when stepping. For example
	 * <code>java.lang.*</code> or <code>java.lang.String</code>.
	 * 
	 * @return the list of active step filters, or <code>null</code>
	 */
	public abstract String[] getStepFilters();

	/**
	 * Sets the list of active step filters in this target. The list is a
	 * collection of Strings. Each string is the fully qualified name/pattern of
	 * a type/package to filter when stepping. For example
	 * <code>java.lang.*</code> or <code>java.lang.String</code>.
	 * 
	 * @param list
	 *            active step filters, or <code>null</code>
	 */
	public abstract void setStepFilters(String[] list);

	/**
	 * Sets whether a step that lands in a filtered location should continue
	 * through to an un-filtered location, or return to where the step
	 * originated.
	 * 
	 * @param thru
	 *            whether to step thru a filtered location or return to location
	 *            where step originated
	 * @since 3.5
	 */
	public void setStepThruFilters(boolean thru);

	/**
	 * Returns whether a step that lands in a filtered location should proceed
	 * through to an un-filtered location or return to the location where a step
	 * originated.
	 * 
	 * @return whether a step that lands in a filtered location should proceed
	 *         through to an un-filtered location or return to the location
	 *         where a step originated
	 * @since 3.5
	 */
	public boolean isStepThruFilters();

	/**
	 * Returns whether this debug target supports a request timeout - a maximum
	 * time for a JDI request to receive a response. This option is only
	 * supported by the Eclipse JDI implementation.
	 * 
	 * @return whether this debug target supports a request timeout
	 */
	public boolean supportsRequestTimeout();

	/**
	 * Sets the timeout value for JDI requests in milliseconds. Has no effect if
	 * this target does not support a request timeout.
	 * 
	 * @param timeout
	 *            the communication timeout, in milliseconds
	 */
	public void setRequestTimeout(int timeout);

	/**
	 * Returns the timeout value for JDI requests in milliseconds, or -1 if not
	 * supported.
	 * 
	 * @return timeout value, in milliseconds, or -1 if not supported
	 */
	public int getRequestTimeout();

	/**
	 * Returns whether this target supports providing monitor information.
	 * 
	 * @return whether this target supports providing monitor information.
	 * @since 2.1
	 */
	public boolean supportsMonitorInformation();

	/**
	 * Returns whether this target supports access watchpoints.
	 * 
	 * @return whether this target supports access watchpoints
	 * @since 3.0
	 */
	public boolean supportsAccessWatchpoints();

	/**
	 * Returns whether this target supports modification watchpoints.
	 * 
	 * @return whether this target supports modification watchpoints
	 * @since 3.0
	 */
	public boolean supportsModificationWatchpoints();

	/**
	 * Set the default stratum used in this debug target.
	 * 
	 * @param stratum
	 *            the new default stratum, or <code>null</code> to indicate
	 *            per-class default stratum
	 * @since 3.0
	 */
	public void setDefaultStratum(String stratum);

	/**
	 * Return the default stratum used in this the target, or <code>null</code>
	 * to indicate a per-class default stratum.
	 * 
	 * @return the default stratum, or <code>null</code> to indicate a per-class
	 *         default stratum
	 * @see #setDefaultStratum(String)
	 * @since 3.0
	 */
	public String getDefaultStratum();

	/**
	 * Returns the top level thread groups in this target. Top level thread
	 * groups do not have a parent.
	 * 
	 * @return top level thread groups
	 * @throws DebugException
	 *             if an exception occurs
	 * @since 3.2
	 */
	public IJavaThreadGroup[] getRootThreadGroups() throws DebugException;

	/**
	 * Returns all thread groups in this target.
	 * 
	 * @return all thread groups in this target
	 * @throws DebugException
	 *             if an exception occurs
	 * @since 3.2
	 */
	public IJavaThreadGroup[] getAllThreadGroups() throws DebugException;

	/**
	 * Returns whether this VM supports instance and reference retrieval for
	 * types and objects.
	 * 
	 * @return whether this VM supports instance and reference retrieval for
	 *         types and objects
	 * @since 3.3
	 */
	public boolean supportsInstanceRetrieval();

	/**
	 * Returns whether this VM supports the ability to force an early return
	 * from methods.
	 * 
	 * @return whether this VM can force an early return from methods
	 * @since 3.3
	 * @see IJavaThread
	 */
	public boolean supportsForceReturn();

	/**
	 * Returns whether this VM supports the ability to enable and disable
	 * garbage collection of individual objects.
	 * 
	 * @return whether this VM supports the ability to enable and disable
	 *         garbage collection of individual objects
	 * @see IJavaObject
	 * @since 3.4
	 */
	public boolean supportsSelectiveGarbageCollection();

	/**
	 * Returns the name of the underlying virtual machine as defined by the
	 * system property <code>java.vm.name</code>.
	 * 
	 * @return virtual machine name
	 * @exception DebugException
	 *                if retrieving the name fails
	 * @since 3.4
	 */
	public String getVMName() throws DebugException;

	/**
	 * Returns the version of the underlying virtual machine as defined by the
	 * system property <code>java.version</code>.
	 * 
	 * @return <code>java.version</code> system property
	 * @exception DebugException
	 *                if retrieving the version property fails
	 * @since 3.4
	 */
	public String getVersion() throws DebugException;

	/**
	 * Refreshes the state of the Java debug model elements (client) with the
	 * current state of the debug target.
	 * <p>
	 * For example, a {@link IJavaThread} may currently have a suspended state,
	 * but was somehow resumed on the target. Calling this method will causes
	 * all threads to update their state based on the current state of the
	 * target. Elements will fire debug events associated with any state
	 * changes. For example, a thread would fire a resume event if it discovered
	 * it was in a running state when it thought it was suspended.
	 * </p>
	 * 
	 * @throws DebugException
	 *             if an exception occurs
	 * @since 3.6
	 */
	public void refreshState() throws DebugException;

	/**
	 * Sends a JDWP command to the back end and returns the JDWP reply packet as
	 * bytes. This method creates an appropriate command header and packet id,
	 * before sending to the back end.
	 * 
	 * @param commandSet
	 *            command set identifier as defined by JDWP
	 * @param commandId
	 *            command identifier as defined by JDWP
	 * @param data
	 *            any bytes required for the command that follow the command
	 *            header or <code>null</code> for commands that have no data
	 * @return raw reply packet as bytes defined by JDWP
	 * @exception DebugException
	 *                if an error occurs sending the packet or receiving the
	 *                reply
	 * @since 3.6
	 */
	public byte[] sendCommand(byte commandSet, byte commandId, byte[] data)
			throws DebugException;

	/**
	 * Adds the given listener to this target for hot code replace
	 * notifications. Has no effect if an identical listener is already
	 * registered.
	 * <p>
	 * When a hot code replace listener is added to a specific target, general
	 * hot code replace notifications via {@link JDIDebugModel} are not reported
	 * for that target. This allows a target to override general/default hot
	 * code replace listeners/handlers.
	 * </p>
	 * 
	 * @param listener
	 *            hot code replace listener
	 * @since 3.6
	 */
	public void addHotCodeReplaceListener(IJavaHotCodeReplaceListener listener);

	/**
	 * Removes the given listener from this target. Has no effect if an
	 * identical listener is not already registered.
	 * 
	 * @param listener
	 *            hot code replace listener
	 * @since 3.6
	 */
	public void removeHotCodeReplaceListener(
			IJavaHotCodeReplaceListener listener);

}
