blob: 0c18f5ef112b98fdfd9209df7a1b1ddd4f7c0235 [file] [log] [blame]
/**********************************************************************
Copyright (c) 2000, 2001, 2002 IBM Corp. and others.
All rights reserved.   This program and the accompanying materials
are made available under the terms of the Common Public License v0.5
which accompanies this distribution, and is available at
http://www.eclipse.org/legal/cpl-v05.html
 
Contributors:
IBM Corporation - initial API and implementation
**********************************************************************/
package org.eclipse.jdt.core;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jdt.core.eval.IEvaluationContext;
/**
* A Java project represents a view of a project resource in terms of Java
* elements such as package fragments, types, methods and fields.
* A project may contain several package roots, which contain package fragments.
* A package root corresponds to an underlying folder or JAR.
* <p>
* Each Java project has a classpath, defining which folders contain source code and
* where required libraries are located. Each Java project also has an output location,
* defining where the builder writes <code>.class</code> files. A project that
* references packages in another project can access the packages by including
* the required project in a classpath entry. The Java model will present the
* source elements in the required project, and when building, the compiler will
* use the binaries from that project (that is, the output location of the
* required project is used as a library). The classpath format is a sequence
* of classpath entries describing the location and contents of package fragment
* roots.
* </p>
* Java project elements need to be opened before they can be navigated or manipulated.
* The children of a Java project are the package fragment roots that are
* defined by the classpath and contained in this project (in other words, it
* does not include package fragment roots for other projects).
* </p>
* <p>
* This interface is not intended to be implemented by clients. An instance
* of one of these handles can be created via
* <code>JavaCore.create(project)</code>.
* </p>
*
* @see JavaCore#create(org.eclipse.core.resources.IProject)
* @see IClasspathEntry
*/
public interface IJavaProject extends IParent, IJavaElement, IOpenable {
/**
* Returns the <code>IJavaElement</code> corresponding to the given
* classpath-relative path, or <code>null</code> if no such
* <code>IJavaElement</code> is found. The result is one of an
* <code>ICompilationUnit</code>, <code>IClassFile</code>, or
* <code>IPackageFragment</code>.
* <p>
* When looking for a package fragment, there might be several potential
* matches; only one of them is returned.
*
* <p>For example, the path "java/lang/Object.java", would result in the
* <code>ICompilationUnit</code> or <code>IClassFile</code> corresponding to
* "java.lang.Object". The path "java/lang" would result in the
* <code>IPackageFragment</code> for "java.lang".
*
* @exception JavaModelException if the given path is <code>null</code>
* or absolute
*/
IJavaElement findElement(IPath path) throws JavaModelException;
/**
* Returns the first existing package fragment on this project's classpath
* whose path matches the given (absolute) path, or <code>null</code> if none
* exist.
* The path can be:
* - internal to the workbench: "/Project/src"
* - external to the workbench: "c:/jdk/classes.zip/java/lang"
*
* @exception JavaModelException if this element does not exist or if an
* exception occurs while accessing its corresponding resource
*/
IPackageFragment findPackageFragment(IPath path) throws JavaModelException;
/**
* Returns the existing package fragment root on this project's classpath
* whose path matches the given (absolute) path, or <code>null</code> if
* one does not exist.
* The path can be:
* - internal to the workbench: "/Compiler/src"
* - external to the workbench: "c:/jdk/classes.zip"
*
* @exception JavaModelException if this element does not exist or if an
* exception occurs while accessing its corresponding resource
*/
IPackageFragmentRoot findPackageFragmentRoot(IPath path)
throws JavaModelException;
/**
* Returns the first type found following this project's classpath
* with the given fully qualified name or <code>null</code> if none is found.
* The fully qualified name is a dot-separated name. For example,
* a class B defined as a member type of a class A in package x.y should have a
* the fully qualified name "x.y.A.B".
*
* @exception JavaModelException if this element does not exist or if an
* exception occurs while accessing its corresponding resource
* @see IType#getFullyQualifiedName(char)
* @since 2.0
*/
IType findType(String fullyQualifiedName) throws JavaModelException;
/**
* Returns the first type found following this project's classpath
* with the given package name and type qualified name
* or <code>null</code> if none is found.
* The package name is a dot-separated name.
* The type qualified name is also a dot-separated name. For example,
* a class B defined as a member type of a class A should have the
* type qualified name "A.B".
*
* @exception JavaModelException if this element does not exist or if an
* exception occurs while accessing its corresponding resource
* @see IType#getTypeQualifiedName(char)
* @since 2.0
*/
IType findType(String packageName, String typeQualifiedName) throws JavaModelException;
/**
* Returns all of the existing package fragment roots that exist
* on the classpath, in the order they are defined by the classpath.
*
* @exception JavaModelException if this element does not exist or if an
* exception occurs while accessing its corresponding resource
*/
IPackageFragmentRoot[] getAllPackageFragmentRoots() throws JavaModelException;
/**
* Returns an array of non-Java resources directly contained in this project.
* It does not transitively answer non-Java resources contained in folders;
* these would have to be explicitly iterated over.
*/
Object[] getNonJavaResources() throws JavaModelException;
/**
* Returns the full path to the location where the builder writes
* <code>.class</code> files.
*
* @exception JavaModelException if this element does not exist or if an
* exception occurs while accessing its corresponding resource
*/
IPath getOutputLocation() throws JavaModelException;
/**
* Returns a package fragment root for the JAR at the specified file system path.
* This is a handle-only method. The underlying <code>java.io.File</code>
* may or may not exist. No resource is associated with this local JAR
* package fragment root.
*/
IPackageFragmentRoot getPackageFragmentRoot(String jarPath);
/**
* Returns a package fragment root for the given resource, which
* must either be a folder representing the top of a package hierarchy,
* or a <code>.jar</code> or <code>.zip</code> file.
* This is a handle-only method. The underlying resource may or may not exist.
*/
IPackageFragmentRoot getPackageFragmentRoot(IResource resource);
/**
* Returns all of the package fragment roots contained in this
* project, identified on this project's resolved classpath. The result
* does not include package fragment roots in other projects referenced
* on this project's classpath.
*
* <p>NOTE: This is equivalent to <code>getChildren()</code>.
*
* @exception JavaModelException if this element does not exist or if an
* exception occurs while accessing its corresponding resource
*/
IPackageFragmentRoot[] getPackageFragmentRoots() throws JavaModelException;
/**
* Returns the existing package fragment roots identified by the given entry.
* Note that a classpath entry that refers to another project may
* have more than one root (if that project has more than on root
* containing source), and classpath entries within the current
* project identify a single root.
* <p>
* If the classpath entry denotes a variable, it will be resolved and return
* the roots of the target entry (empty if not resolvable).
* <p>
* If the classpath entry denotes a container, it will be resolved and return
* the roots corresponding to the set of container entries (empty if not resolvable).
*
* @see IClasspathContainer
*/
IPackageFragmentRoot[] getPackageFragmentRoots(IClasspathEntry entry);
/**
* Returns all package fragments in all package fragment roots contained
* in this project. This is a convenience method.
*
* Note that the package fragment roots corresponds to the resolved
* classpath of the project.
*
* @exception JavaModelException if this element does not exist or if an
* exception occurs while accessing its corresponding resource
*/
IPackageFragment[] getPackageFragments() throws JavaModelException;
/**
* Returns the <code>IProject</code> on which this <code>IJavaProject</code>
* was created. This is handle-only method.
*/
IProject getProject();
/**
* This is a helper method returning the resolved classpath for the project, as a list of classpath entries,
* where all classpath variable entries have been resolved and substituted with their final target entries.
* <p>
* A resolved classpath corresponds to a particular instance of the raw classpath bound in the context of
* the current values of the referred variables, and thus should not be persisted.
* <p>
* A classpath variable provides an indirection level for better sharing a classpath. As an example, it allows
* a classpath to no longer refer directly to external JARs located in some user specific location. The classpath
* can simply refer to some variables defining the proper locations of these external JARs.
* <p>
* The boolean argument <code>ignoreUnresolvedVariable</code> allows to specify how to handle unresolvable variables,
* when set to <code>true</code>, missing variables are simply ignored, the resulting path is then only formed of the
* resolvable entries, without any indication about which variable(s) was ignored. When set to <code>false</code>, a
* JavaModelException will be thrown for the first unresolved variable (from left to right).
*
* @exception JavaModelException in one of the corresponding situation:
* <ul>
* <li> this element does not exist </li>
* <li> an exception occurs while accessing its corresponding resource </li>
* <li> a classpath variable was not resolvable and <code>ignoreUnresolvedVariable</code> was set to <code>false</code>. </li>
* </ul>
* @see IClasspathEntry
*/
// IClasspathEntry[] getExpandedClasspath(boolean ignoreUnresolvedVariable)
// throws JavaModelException;
/**
* Returns the raw classpath for the project, as a list of classpath entries. This corresponds to the exact set
* of entries which were assigned using <code>setRawClasspath</code>, in particular such a classpath may contain
* classpath variable entries. Classpath variable entries can be resolved individually (see <code>JavaCore#getClasspathVariable</code>),
* or the full classpath can be resolved at once using the helper method <code>getResolvedClasspath</code>.
* <p>
* A classpath variable provides an indirection level for better sharing a classpath. As an example, it allows
* a classpath to no longer refer directly to external JARs located in some user specific location. The classpath
* can simply refer to some variables defining the proper locations of these external JARs.
* <p>
* Note that in case the project isn't yet opened, the classpath will directly be read from the associated <tt>.classpath</tt> file.
* <p>
* @exception JavaModelException in one of the corresponding situation:
* <ul>
* <li> an exception occurs while accessing the associated <tt>.classpath</tt> file </li>
* <li> an exception occurs while accessing its corresponding resource </li>
* </ul>
* @see IClasspathEntry
*/
IClasspathEntry[] getRawClasspath() throws JavaModelException;
/**
* Returns the names of the projects that are directly required by this
* project. A project is required if it is in its classpath.
*
* @exception JavaModelException if this element does not exist or if an
* exception occurs while accessing its corresponding resource
*/
String[] getRequiredProjectNames() throws JavaModelException;
/**
* This is a helper method returning the resolved classpath for the project, as a list of classpath entries,
* where all classpath variable entries have been resolved and substituted with their final target entries.
* <p>
* A resolved classpath corresponds to a particular instance of the raw classpath bound in the context of
* the current values of the referred variables, and thus should not be persisted.
* <p>
* A classpath variable provides an indirection level for better sharing a classpath. As an example, it allows
* a classpath to no longer refer directly to external JARs located in some user specific location. The classpath
* can simply refer to some variables defining the proper locations of these external JARs.
* <p>
* The boolean argument <code>ignoreUnresolvedVariable</code> allows to specify how to handle unresolvable variables,
* when set to <code>true</code>, missing variables are simply ignored, the resulting path is then only formed of the
* resolvable entries, without any indication about which variable(s) was ignored. When set to <code>false</code>, a
* JavaModelException will be thrown for the first unresolved variable (from left to right).
*
* @exception JavaModelException in one of the corresponding situation:
* <ul>
* <li> this element does not exist </li>
* <li> an exception occurs while accessing its corresponding resource </li>
* <li> a classpath variable was not resolvable and <code>ignoreUnresolvedVariable</code> was set to <code>false</code>. </li>
* </ul>
* @see IClasspathEntry
*/
IClasspathEntry[] getResolvedClasspath(boolean ignoreUnresolvedVariable) throws JavaModelException;
/**
* Returns whether this project has been built at least once and thus whether it has a build state.
*/
boolean hasBuildState();
/**
* Returns whether setting this projec's classpath to the given classpath entries
* would result in a cycle.
*
* If the set of entries contains some variables, these are resolved in order to determine
* cycles.
*/
boolean hasClasspathCycle(IClasspathEntry[] entries);
/**
* Returns whether the given element is on the classpath of this project.
*
* @exception JavaModelException if this element does not exist or if an
* exception occurs while accessing its corresponding resource
*
* @since 2.0
*/
boolean isOnClasspath(IJavaElement element) throws JavaModelException;
/**
* Creates a new evaluation context.
*/
IEvaluationContext newEvaluationContext();
/**
* Creates and returns a type hierarchy for all types in the given
* region, considering subtypes within that region.
*
* @exception JavaModelException if this element does not exist or if an
* exception occurs while accessing its corresponding resource
*
* @exception IllegalArgumentException if region is <code>null</code>
*/
ITypeHierarchy newTypeHierarchy(IRegion region, IProgressMonitor monitor)
throws JavaModelException;
/**
* Creates and returns a type hierarchy for the given type considering
* subtypes in the specified region.
*
* @exception JavaModelException if this element does not exist or if an
* exception occurs while accessing its corresponding resource
*
* @exception IllegalArgumentException if type or region is <code>null</code>
*/
ITypeHierarchy newTypeHierarchy(
IType type,
IRegion region,
IProgressMonitor monitor)
throws JavaModelException;
/**
* Sets the output location of this project to the location
* described by the given absolute path.
* <p>
*
* @exception JavaModelException if the classpath could not be set. Reasons include:
* <ul>
* <li>This Java element does not exist (ELEMENT_DOES_NOT_EXIST)</li>
* <li>The path refers to a location not contained in this project (<code>PATH_OUTSIDE_PROJECT</code>)
* <li>The path is not an absolute path (<code>RELATIVE_PATH</code>)
* <li>The path is nested inside a package fragment root of this project (<code>INVALID_PATH</code>)
* <li> The output location is being modified during resource change event notification (CORE_EXCEPTION)
* </ul>
*/
void setOutputLocation(IPath path, IProgressMonitor monitor)
throws JavaModelException;
/**
* Sets the classpath of this project using a list of classpath entries. In particular such a classpath may contain
* classpath variable entries. Classpath variable entries can be resolved individually (see <code>JavaCore#getClasspathVariable</code>),
* or the full classpath can be resolved at once using the helper method <code>getResolvedClasspath</code>.
* <p>
* A classpath variable provides an indirection level for better sharing a classpath. As an example, it allows
* a classpath to no longer refer directly to external JARs located in some user specific location. The classpath
* can simply refer to some variables defining the proper locations of these external JARs.
* <p>
* Setting the classpath to <code>null</code> specifies a default classpath
* (the project root). Setting the classpath to an empty array specifies an
* empty classpath.
* <p>
* If a cycle is detected while setting this classpath, an error marker will be added
* to the project closing the cycle.
* To avoid this problem, use <code>hasClasspathCycle(IClasspathEntry[] entries)</code>
* before setting the classpath.
*
* @exception JavaModelException if the classpath could not be set. Reasons include:
* <ul>
* <li> This Java element does not exist (ELEMENT_DOES_NOT_EXIST)</li>
* <li> The classpath is being modified during resource change event notification (CORE_EXCEPTION)
* <li> The classpath failed the validation check as defined by <code>JavaConventions#validateClasspath</code>
* </ul>
* @see IClasspathEntry
*/
void setRawClasspath(IClasspathEntry[] entries, IProgressMonitor monitor)
throws JavaModelException;
/**
* Sets the both the classpath of this project and its output location at once.
* The classpath is defined using a list of classpath entries. In particular such a classpath may contain
* classpath variable entries. Classpath variable entries can be resolved individually (see <code>JavaCore#getClasspathVariable</code>),
* or the full classpath can be resolved at once using the helper method <code>getResolvedClasspath</code>.
* <p>
* A classpath variable provides an indirection level for better sharing a classpath. As an example, it allows
* a classpath to no longer refer directly to external JARs located in some user specific location. The classpath
* can simply refer to some variables defining the proper locations of these external JARs.
* <p>
* Setting the classpath to <code>null</code> specifies a default classpath
* (the project root). Setting the classpath to an empty array specifies an
* empty classpath.
* <p>
* If a cycle is detected while setting this classpath, an error marker will be added
* to the project closing the cycle.
* To avoid this problem, use <code>hasClasspathCycle(IClasspathEntry[] entries)</code>
* before setting the classpath.
*
* @exception JavaModelException if the classpath could not be set. Reasons include:
* <ul>
* <li> This Java element does not exist (ELEMENT_DOES_NOT_EXIST)</li>
* <li> Two or more entries specify source roots with the same or overlapping paths (NAME_COLLISION)
* <li> A entry of kind <code>CPE_PROJECT</code> refers to this project (INVALID_PATH)
* <li>This Java element does not exist (ELEMENT_DOES_NOT_EXIST)</li>
* <li>The output location path refers to a location not contained in this project (<code>PATH_OUTSIDE_PROJECT</code>)
* <li>The output location path is not an absolute path (<code>RELATIVE_PATH</code>)
* <li>The output location path is nested inside a package fragment root of this project (<code>INVALID_PATH</code>)
* <li> The classpath is being modified during resource change event notification (CORE_EXCEPTION)
* </ul>
* @see IClasspathEntry
* @since 2.0
*/
void setRawClasspath(IClasspathEntry[] entries, IPath outputLocation, IProgressMonitor monitor)
throws JavaModelException;
/**
* Returns the classpath for the project, as a list of classpath
* entries.
*
* @exception JavaModelException if this element does not exist or if an
* exception occurs while accessing its corresponding resource
*
* @deprecated - since classpath variable support was added either use #getRawClasspath or #getResolvedClasspath
*/
IClasspathEntry[] getClasspath() throws JavaModelException;
/**
* Creates and returns a new classpath entry of kind <code>K_BINARY</code> for the JAR
* or folder identified by the given absolute path. This specifies that
* all package fragments within the root will have children of type
* <code>IClassFile</code>.
* The path can be:
* - internal to the workbench: "/Project/binary"
* - external to the workbench: "c:/jdk/classes.zip"
*
* @deprecated - use JavaCore#newLibraryEntry
*/
public IClasspathEntry newLibraryEntry(IPath path);
/**
* Creates and returns a new classpath entry of kind <code>K_SOURCE</code>
* for the project identified by the given absolute path. This
* identifies all the source code of the given project to be
* used in the Java model, and the output location of the project
* to be used when building.
* The path can be:
* - internal to the workbench: "/Project/binary"
* - external to the workbench: "c:/jdk/classes.zip"
*
* @deprecated - use JavaCore#newProjectEntry
*/
public IClasspathEntry newProjectEntry(IPath path);
/**
* Creates and returns a new classpath entry of kind <code>K_SOURCE</code>
* for folder identified by the given absolute path. This specifies that
* all package fragments within the root will have children of type
* <code>ICompilationUnit</code>.
* The path can be:
* - internal to the workbench: "/Project/binary"
* - external to the workbench: "c:/jdk/classes.zip"
*
* @deprecated - use JavaCore#newSourceEntry
*/
public IClasspathEntry newSourceEntry(IPath path);
/**
* Sets the classpath of this project.
* <p>
* Setting the classpath to <code>null</code> specifies a default classpath
* (the project root). Setting the classpath to an empty array specifies an
* empty classpath.
* <p>
* If a cycle is detected while setting this classpath, an error marker will be added
* to the project closing the cycle.
* To avoid this problem, use <code>hasClasspathCycle(IClasspathEntry[] entries)</code>
* before setting the classpath.
*
* @exception JavaModelException if the classpath could not be set. Reasons include:
* <ul>
* <li> This Java element does not exist (ELEMENT_DOES_NOT_EXIST)</li>
* <li> Two or more entries specify source roots with the same or overlapping paths (NAME_COLLISION)
* <li> A entry of kind <code>CPE_PROJECT</code> refers to this project (INVALID_PATH)
* <li> The classpath is being modified during resource change event notification (CORE_EXCEPTION)
* </ul>
* @deprecated - was renamed to #setRawClasspath
*/
void setClasspath(IClasspathEntry[] entries, IProgressMonitor monitor) throws JavaModelException;
}