/*******************************************************************************
 * 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
 *******************************************************************************/
package org.eclipse.jdt.debug.core;

import org.eclipse.core.runtime.CoreException;

/**
 * A breakpoint that suspends execution when a corresponding exception is thrown
 * in a target VM. An exception breakpoint can be configured to suspend
 * execution when the corresponding exception is thrown in a caught or uncaught
 * location. As well, the location can be filtered inclusively or exclusively by
 * type name patterns.
 *
 * @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 IJavaExceptionBreakpoint extends IJavaBreakpoint {
	/**
	 * Sets the inclusion filters that will define the scope for the associated
	 * exception. Filters are a collection of strings of type name prefixes.
	 * Default packages should be specified as the empty string.
	 *
	 * @param filters
	 *            the array of filters to apply
	 * @exception CoreException
	 *                if unable to set the property on this breakpoint's
	 *                underlying marker
	 * @since 2.1
	 */
	public void setInclusionFilters(String[] filters) throws CoreException;

	/**
	 * Returns the inclusive filters that define the scope for the associated
	 * exception. Filters are a collection of strings of type name prefixes.
	 *
	 * @return the array of defined inclusive filters
	 * @exception CoreException
	 *                if unable to access the property on this breakpoint's
	 *                underlying marker
	 * @since 2.1
	 */
	public String[] getInclusionFilters() throws CoreException;

	/**
	 * Returns whether this breakpoint suspends execution when the associated
	 * exception is thrown in a caught location (in a try/catch statement).
	 *
	 * @return <code>true</code> if this is a caught exception breakpoint
	 * @exception CoreException
	 *                if unable to access the property from this breakpoint's
	 *                underlying marker
	 */
	public boolean isCaught() throws CoreException;

	/**
	 * Returns whether this breakpoint suspends execution when the associated
	 * exception is thrown in an uncaught location (not caught by a try/catch
	 * statement).
	 *
	 * @return <code>true</code> if this is an uncaught exception breakpoint.
	 * @exception CoreException
	 *                if unable to access the property from this breakpoint's
	 *                underlying marker
	 */
	public boolean isUncaught() throws CoreException;

	/**
	 * Sets whether this breakpoint suspends execution when the associated
	 * exception is thrown in a caught location (in a try/catch statement).
	 *
	 * @param caught
	 *            whether or not this breakpoint suspends execution when the
	 *            associated exception is thrown in a caught location
	 * @exception CoreException
	 *                if unable to set the property on this breakpoint's
	 *                underlying marker
	 */
	public void setCaught(boolean caught) throws CoreException;

	/**
	 * Sets whether this breakpoint suspends execution when the associated
	 * exception is thrown in an uncaught location.
	 *
	 * @param uncaught
	 *            whether or not this breakpoint suspends execution when the
	 *            associated exception is thrown in an uncaught location
	 * @exception CoreException
	 *                if unable to set the property on this breakpoint's
	 *                underlying marker
	 */
	public void setUncaught(boolean uncaught) throws CoreException;

	/**
	 * Returns whether the exception associated with this breakpoint is a
	 * checked exception (compiler detected).
	 *
	 * @return <code>true</code> if the exception associated with this
	 *         breakpoint is a checked exception
	 * @exception CoreException
	 *                if unable to access the property from this breakpoint's
	 *                underlying marker
	 */
	public boolean isChecked() throws CoreException;

	/**
	 * Returns the fully qualified type name of the exception that last caused
	 * this breakpoint to suspend, of <code>null</code> if this breakpoint has
	 * not caused a thread to suspend. Note that this name may be a sub type of
	 * the exception that this breakpoint is associated with.
	 *
	 * @return fully qualified exception name or <code>null</code>
	 */
	public String getExceptionTypeName();

	/**
	 * Sets the filters that will define the scope for the associated exception.
	 * Filters are a collection of strings of type name prefixes. Default
	 * packages should be specified as the empty string.
	 *
	 * @param filters
	 *            the array of filters to apply
	 * @param inclusive
	 *            whether or not to apply the filters as inclusive or exclusive
	 * @exception CoreException
	 *                if unable to set the property on this breakpoint's
	 *                underlying marker
	 * @deprecated Exception breakpoints can have a mixed set of filters. Use
	 *             setInclusiveFilters(String[] filters) or
	 *             setExclusiveFilters(String[] filters)
	 */
	@Deprecated
	public void setFilters(String[] filters, boolean inclusive)
			throws CoreException;

	/**
	 * Sets the exclusion filters that will define the scope for the associated
	 * exception. Filters are a collection of strings of type name prefixes.
	 * Default packages should be specified as the empty string.
	 *
	 * @param filters
	 *            the array of filters to apply
	 * @exception CoreException
	 *                if unable to set the property on this breakpoint's
	 *                underlying marker
	 * @since 2.1
	 */
	public void setExclusionFilters(String[] filters) throws CoreException;

	/**
	 * Returns the filters that define the scope for the associated exception.
	 * Filters are a collection of strings of type name prefixes.
	 *
	 * @return the array of defined filters
	 * @exception CoreException
	 *                if unable to access the property on this breakpoint's
	 *                underlying marker
	 * @deprecated Use getExclusionFilters() or getInclusionFilters()
	 */
	@Deprecated
	public String[] getFilters() throws CoreException;

	/**
	 * Returns the exclusive filters that define the scope for the associated
	 * exception. Filters are a collection of strings of type name prefixes.
	 *
	 * @return the array of defined inclusive filters
	 * @exception CoreException
	 *                if unable to access the property on this breakpoint's
	 *                underlying marker
	 * @since 2.1
	 */
	public String[] getExclusionFilters() throws CoreException;

	/**
	 * Returns whether any inclusive filters have been applied.
	 *
	 * @return <code>true</code> if the inclusive filters have been applied
	 * @exception CoreException
	 *                if unable to access the property on this breakpoint's
	 *                underlying marker
	 * @deprecated Exception breakpoints can have a mixed set of filters and
	 *             this method is maintained strictly for API backwards
	 *             compatibility
	 */
	@Deprecated
	public boolean isInclusiveFiltered() throws CoreException;
}
