/*******************************************************************************
 * 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.debug.core.DebugException;

/**
 * Represents the type of an object in a virtual machine - including classes,
 * interfaces and array types.
 *
 * @since 3.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 IJavaReferenceType extends IJavaType {

	/**
	 * Returns a variable representing the static field in this type 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
	 * @return the variable representing the static 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>
	 *                </ul>
	 */
	public IJavaFieldVariable getField(String name) throws DebugException;

	/**
	 * Returns the class object associated with this type.
	 *
	 * @return the class object associated with this type
	 * @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 IJavaClassObject getClassObject() throws DebugException;

	/**
	 * Returns a collection of strata available for this type.
	 *
	 * @return a collection of strata available for this type
	 * @throws DebugException
	 *             if unable to retrieve available strata
	 */
	public String[] getAvailableStrata() throws DebugException;

	/**
	 * Returns the default stratum for this type.
	 *
	 * @return the default stratum for this type
	 * @throws DebugException
	 *             if unable to retrieve the default stratum
	 */
	public String getDefaultStratum() throws DebugException;

	/**
	 * Returns a collection of the names of the fields declared in this type.
	 *
	 * @return a collection of the names of the field declared in this type
	 * @throws DebugException
	 *             if unable to retrieve declared field names
	 */
	public String[] getDeclaredFieldNames() throws DebugException;

	/**
	 * Returns a collection of the names of all of the fields declared in this
	 * type, all of its super classes, implemented interfaces and super
	 * interfaces.
	 *
	 * @return a collection of the names of all of the fields declared in this
	 *         type, all of its super classes, implemented interfaces and super
	 *         interfaces
	 * @throws DebugException
	 *             if unable to retrieve field names
	 */
	public String[] getAllFieldNames() throws DebugException;

	/**
	 * Returns the class loader object that loaded the class corresponding to
	 * this type, or <code>null</code> if this type was loaded by the bootstrap
	 * loader.
	 *
	 * @return the class loader object that loaded the class corresponding to
	 *         this type or <code>null</code>
	 * @throws DebugException
	 *             if unable to get the class loader
	 * @since 3.1
	 */
	public IJavaObject getClassLoaderObject() throws DebugException;

	/**
	 * Returns the generic signature as defined in the JVM specification for
	 * this type. Returns <code>null</code> if this type is not a generic type.
	 *
	 * @return signature, or <code>null</code> if generic signature not
	 *         available
	 * @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>
	 * @since 3.1
	 */
	public String getGenericSignature() throws DebugException;

	/**
	 * Returns the unqualified name of the source file corresponding to this
	 * type, or <code>null</code> if source name debug attribute is not present.
	 * The source name returned is based on this target's default stratum.
	 *
	 * @return unqualified source file name or <code>null</code>
	 * @throws DebugException
	 *             if an exception occurs retrieving the source name
	 * @since 3.2
	 */
	public String getSourceName() throws DebugException;

	/**
	 * Returns the unqualified names of the source files corresponding to this
	 * type in the specified stratum, or <code>null</code> if the source name
	 * debug attribute is not present.
	 *
	 * @param stratum
	 *            stratum identifier or <code>null</code> to use this type's
	 *            default stratum
	 * @return unqualified source file names or <code>null</code>
	 * @throws DebugException
	 *             if an exception occurs retrieving the source name
	 * @since 3.2
	 */
	public String[] getSourceNames(String stratum) throws DebugException;

	/**
	 * Returns the qualified names of the source files corresponding to this
	 * type in the specified stratum, or <code>null</code> if the source name
	 * debug attribute is not present.
	 *
	 * @param stratum
	 *            stratum identifier or <code>null</code> to use this type's
	 *            default stratum
	 * @return qualified source file names or <code>null</code>
	 * @throws DebugException
	 *             if an exception occurs retrieving the source name
	 * @since 3.2
	 */
	public String[] getSourcePaths(String stratum) throws DebugException;

	/**
	 * Retrieves and returns instances of this reference type.
	 *
	 * @param max
	 *            the maximum number of instances to retrieve or 0 to retrieve
	 *            all instances
	 * @return instances of this reference type
	 * @throws DebugException
	 *             on failure
	 * @since 3.3
	 */
	public IJavaObject[] getInstances(long max) throws DebugException;

	/**
	 * Returns the number of instances of this type currently allocated in the
	 * target virtual machine, or -1 if instance counts are not supported by the
	 * target.
	 *
	 * @return number of instances of this type, or -1 if unsupported
	 * @throws DebugException
	 *             on failure
	 * @since 3.6
	 */
	public long getInstanceCount() throws DebugException;

}
