/******************************************************************************* * 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(); }