blob: 1c8646a97c1a074db35391456ed258cf327dea7d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2007 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
*
*******************************************************************************/
package org.eclipse.dltk.core;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
/**
* A project fragment contains a set of script folders. It corresponds to an
* underlying resource which is either a folder or an archive (like JAR/zip). In
* the case of a folder, all descendant folders represent script folders. For a
* given child folder representing a script folder, the corresponding folder
* name is composed of the folder names between the folder for this project
* fragment and the child folder representing the script folder, separated by
* '/'. In the case of a archive (JAR/zip), the contents of the archive dictates
* the set of script folders in an analogous manner. Project fragments need to
* be opened before they can be navigated or manipulated.
*
* The children are of type <code>IScriptFolder</code>, and are in no particular
* order.
*
* @noimplement This interface is not intended to be implemented by clients.
*/
public interface IProjectFragment extends IParent, IModelElement, IOpenable {
/**
* <p>
* The name of default script folder (value: the empty
* string, <code>""</code>).
* </p>
*/
public static final String DEFAULT_SCRIPT_FOLDER_NAME = ""; //$NON-NLS-1$
public static final String DEFAULT_PACKAGE_ROOT = ""; //$NON-NLS-1$
/**
* Update model flag constant (bit mask value 1) indicating that the operation
* is to not copy/move/delete the package fragment root resource.
*/
int NO_RESOURCE_MODIFICATION = 1;
/**
* Update model flag constant (bit mask value 2) indicating that the operation
* is to update the buildpath of the originating project.
*
*/
int ORIGINATING_PROJECT_BUILDPATH = 2;
/**
* Update model flag constant (bit mask value 4) indicating that the operation
* is to update the buildpath of all referring projects except the originating project.
*
*/
int OTHER_REFERRING_PROJECTS_BUILDPATH = 4;
/**
* Update model flag constant (bit mask value 8) indicating that the operation
* is to update the buildpath of the destination project.
*
*/
int DESTINATION_PROJECT_BUILDPATH = 8;
/**
* Update model flag constant (bit mask value 16) indicating that the operation
* is to replace the resource and the destination project's buildpath entry.
*
*/
int REPLACE = 16;
/**
* Kind constant for a source project fragment. Indicates this root
* may contains source files.
*/
int K_SOURCE = 1;
int K_STATIC = 2;
int K_BINARY = 3;
int getKind() throws ModelException;
/**
* Returns the script folder with the given path.
* An empty path indicates the root folder.
* This is a handle-only operation. The folder
* may or may not exist.
*
* @param path of the given folder
* @return the script folder with the given path
*/
IScriptFolder getScriptFolder(IPath path);
/**
* Returns the script folder with the given path.
* An empty path indicates the root folder.
* This is a handle-only operation. The folder
* may or may not exist.
*
* @param path of the given folder
* @return the script folder with the given path
*/
IScriptFolder getScriptFolder(String path);
public Object[] getForeignResources() throws ModelException;
/**
* Returns the first raw buildpath entry that corresponds to this package
* fragment root.
* A raw buildpath entry corresponds to a package fragment root if once resolved
* this entry's path is equal to the root's path.
*
* @exception ModelException if this element does not exist or if an
* exception occurs while accessing its corresponding resource.
* @return the first raw buildpath entry that corresponds to this package fragment root
*
*/
IBuildpathEntry getRawBuildpathEntry() throws ModelException;
/**
* Returns whether this package fragment root's underlying
* resource is a binary archive (a zip file).
* <p>
* This is a handle-only method.
* </p>
*
* @return true if this package fragment root's underlying resource is a binary archive, false otherwise
*/
public boolean isArchive();
/**
* Returns whether this package fragment root is external
* to the workbench (that is, a local file), and has no
* underlying resource.
* <p>
* This is a handle-only method.
* </p>
*
* @return true if this package fragment root is external
* to the workbench (that is, a local file), and has no
* underlying resource, false otherwise
*/
boolean isExternal();
/**
* Tests whether this package fragment is built-in in the interpreter and
* has no underlying resource.
* <p>
* This is a handle-only method.
* </p>
*
* @return true if this package fragment root is built-in in the interpreter
*/
boolean isBuiltin();
/**
* Creates and returns a script folder in this root with the given
* slash-separated folder name. An empty string specifies the default
* package. This has the side effect of creating all script folders that are
* a prefix of the new folder which do not exist yet. If the script folder
* already exists, this has no effect.
*
* For a description of the <code>force</code> flag, see
* <code>IFolder.create</code>.
*
* @param name
* the given slash-separated package name
* @param force
* a flag controlling how to deal with resources that are not in
* sync with the local file system
* @param monitor
* the given progress monitor
* @exception ModelException
* if the element could not be created. Reasons include:
* <ul>
* <li>This script element does not exist
* (ELEMENT_DOES_NOT_EXIST)</li>
* <li>A <code>CoreException</code> occurred while creating
* an underlying resource
* <li>This project fragment is read only (READ_ONLY)
* <li>The name is not a valid folder name (INVALID_NAME)
* </ul>
* @return a script folder in this project fragment with the given
* slash-separated package name
* @see org.eclipse.core.resources.IFolder#create(boolean, boolean,
* IProgressMonitor)
*/
IScriptFolder createScriptFolder(
String name,
boolean force,
IProgressMonitor monitor)
throws ModelException;
/**
* Deletes the resource of this package fragment root as specified by
* <code>IResource.delete(int, IProgressMonitor)</code> but excluding nested
* source folders.
* <p>
* If <code>NO_RESOURCE_MODIFICATION</code> is specified in
* <code>updateModelFlags</code> or if this package fragment root is external,
* this operation doesn't delete the resource. <code>updateResourceFlags</code>
* is then ignored.
* </p><p>
* If <code>ORIGINATING_PROJECT_CLASSPATH</code> is specified in
* <code>updateModelFlags</code>, update the raw buildpath of this package
* fragment root's project by removing the corresponding buildpath entry.
* </p><p>
* If <code>OTHER_REFERRING_PROJECTS_CLASSPATH</code> is specified in
* <code>updateModelFlags</code>, update the raw buildpaths of all other Script
* projects referring to this root's resource by removing the corresponding buildpath
* entries.
* </p><p>
* If no flags is specified in <code>updateModelFlags</code> (using
* <code>IResource.NONE</code>), the default behavior applies: the
* resource is deleted (if this package fragment root is not external) and no
* buildpaths are updated.
* </p>
*
* @param updateResourceFlags bit-wise or of update resource flag constants
* (<code>IResource.FORCE</code> and <code>IResource.KEEP_HISTORY</code>)
* @param updateModelFlags bit-wise or of update resource flag constants
* (<code>ORIGINATING_PROJECT_CLASSPATH</code>,
* <code>OTHER_REFERRING_PROJECTS_CLASSPATH</code> and
* <code>NO_RESOURCE_MODIFICATION</code>)
* @param monitor a progress monitor
*
* @exception ScriptModelException if this root could not be deleted. Reasons
* include:
* <ul>
* <li> This root does not exist (ELEMENT_DOES_NOT_EXIST)</li>
* <li> A <code>CoreException</code> occurred while deleting the resource
* or updating a buildpath
* </li>
* </ul>
* @see org.eclipse.core.resources.IResource#delete(boolean, IProgressMonitor)
*
*/
void delete(int updateResourceFlags, int updateModelFlags, IProgressMonitor monitor) throws ModelException;
/**
* Copies the resource of this package fragment root to the destination path
* as specified by <code>IResource.copy(IPath, int, IProgressMonitor)</code>
* but excluding nested source folders.
* <p>
* If <code>NO_RESOURCE_MODIFICATION</code> is specified in
* <code>updateModelFlags</code> or if this package fragment root is external,
* this operation doesn't copy the resource. <code>updateResourceFlags</code>
* is then ignored.
* </p><p>
* If <code>DESTINATION_PROJECT_CLASSPATH</code> is specified in
* <code>updateModelFlags</code>, updates the buildpath of the
* destination's project (if it is a Script project). If a non-<code>null</code>
* sibling is specified, a copy of this root's buildpath entry is inserted before the
* sibling on the destination project's raw buildpath. If <code>null</code> is
* specified, the buildpath entry is added at the end of the raw buildpath.
* </p><p>
* If <code>REPLACE</code> is specified in <code>updateModelFlags</code>,
* overwrites the resource at the destination path if any.
* If the same buildpath entry already exists on the destination project's raw
* buildpath, then the sibling is ignored and the new buildpath entry replaces the
* existing one.
* </p><p>
* If no flags is specified in <code>updateModelFlags</code> (using
* <code>IResource.NONE</code>), the default behavior applies: the
* resource is copied (if this package fragment root is not external) and the
* buildpath is not updated.
* </p>
*
* @param destination the destination path
* @param updateResourceFlags bit-wise or of update resource flag constants
* (<code>IResource.FORCE</code> and <code>IResource.SHALLOW</code>)
* @param updateModelFlags bit-wise or of update resource flag constants
* (<code>DESTINATION_PROJECT_CLASSPATH</code> and
* <code>NO_RESOURCE_MODIFICATION</code>)
* @param sibling the buildpath entry before which a copy of the buildpath
* entry should be inserted or <code>null</code> if the buildpath entry should
* be inserted at the end
* @param monitor a progress monitor
*
* @exception ScriptModelException if this root could not be copied. Reasons
* include:
* <ul>
* <li> This root does not exist (ELEMENT_DOES_NOT_EXIST)</li>
* <li> A <code>CoreException</code> occurred while copying the
* resource or updating a buildpath</li>
* <li>
* The destination is not inside an existing project and <code>updateModelFlags</code>
* has been specified as <code>DESTINATION_PROJECT_CLASSPATH</code>
* (INVALID_DESTINATION)</li>
* <li> The sibling is not a buildpath entry on the destination project's
* raw buildpath (INVALID_SIBLING)</li>
* <li> The same buildpath entry already exists on the destination project's
* buildpath (NAME_COLLISION) and <code>updateModelFlags</code>
* has not been specified as <code>REPLACE</code></li>
* </ul>
* @see org.eclipse.core.resources.IResource#copy(IPath, boolean, IProgressMonitor)
*
*/
void copy(IPath destination, int updateResourceFlags, int updateModelFlags, IBuildpathEntry sibling, IProgressMonitor monitor) throws ModelException;
/**
* Moves the resource of this package fragment root to the destination path
* as specified by <code>IResource.move(IPath,int,IProgressMonitor)</code>
* but excluding nested source folders.
* <p>
* If <code>NO_RESOURCE_MODIFICATION</code> is specified in
* <code>updateModelFlags</code> or if this package fragment root is external,
* this operation doesn't move the resource. <code>updateResourceFlags</code>
* is then ignored.
* </p><p>
* If <code>DESTINATION_PROJECT_CLASSPATH</code> is specified in
* <code>updateModelFlags</code>, updates the buildpath of the
* destination's project (if it is a Script project). If a non-<code>null</code>
* sibling is specified, a copy of this root's buildpath entry is inserted before the
* sibling on the destination project's raw buildpath. If <code>null</code> is
* specified, the buildpath entry is added at the end of the raw buildpath.
* </p><p>
* If <code>ORIGINATING_PROJECT_CLASSPATH</code> is specified in
* <code>updateModelFlags</code>, update the raw buildpath of this package
* fragment root's project by removing the corresponding buildpath entry.
* </p><p>
* If <code>OTHER_REFERRING_PROJECTS_CLASSPATH</code> is specified in
* <code>updateModelFlags</code>, update the raw buildpath of all other Script
* projects referring to this root's resource by removing the corresponding buildpath
* entries.
* </p><p>
* If <code>REPLACE</code> is specified in <code>updateModelFlags</code>,
* overwrites the resource at the destination path if any.
* If the same buildpath entry already exists on the destination project's raw
* buildpath, then the sibling is ignored and the new buildpath entry replaces the
* existing one.
* </p><p>
* If no flags is specified in <code>updateModelFlags</code> (using
* <code>IResource.NONE</code>), the default behavior applies: the
* resource is moved (if this package fragment root is not external) and no
* buildpaths are updated.
* </p>
*
* @param destination the destination path
* @param updateResourceFlags bit-wise or of update flag constants
* (<code>IResource.FORCE</code>, <code>IResource.KEEP_HISTORY</code>
* and <code>IResource.SHALLOW</code>)
* @param updateModelFlags bit-wise or of update resource flag constants
* (<code>DESTINATION_PROJECT_CLASSPATH</code>,
* <code>ORIGINATING_PROJECT_CLASSPATH</code>,
* <code>OTHER_REFERRING_PROJECTS_CLASSPATH</code> and
* <code>NO_RESOURCE_MODIFICATION</code>)
* @param sibling the buildpath entry before which a copy of the buildpath
* entry should be inserted or <code>null</code> if the buildpath entry should
* be inserted at the end
* @param monitor a progress monitor
*
* @exception ScriptModelException if this root could not be moved. Reasons
* include:
* <ul>
* <li> This root does not exist (ELEMENT_DOES_NOT_EXIST)</li>
* <li> A <code>CoreException</code> occurred while copying the
* resource or updating a buildpath</li>
* <li>
* The destination is not inside an existing project and <code>updateModelFlags</code>
* has been specified as <code>DESTINATION_PROJECT_CLASSPATH</code>
* (INVALID_DESTINATION)</li>
* <li> The sibling is not a buildpath entry on the destination project's
* raw buildpath (INVALID_SIBLING)</li>
* <li> The same buildpath entry already exists on the destination project's
* buildpath (NAME_COLLISION) and <code>updateModelFlags</code>
* has not been specified as <code>REPLACE</code></li>
* </ul>
* @see org.eclipse.core.resources.IResource#move(IPath, boolean, IProgressMonitor)
*
*/
void move(IPath destination, int updateResourceFlags, int updateModelFlags, IBuildpathEntry sibling, IProgressMonitor monitor) throws ModelException;
/**
* @since 2.0
*/
boolean isBinary();
}