blob: 9ff3faf82adbba78e20da66a40bd5894a9abc345 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2009 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.core.resources;
import org.eclipse.core.runtime.IPath;
/**
* A context for workspace <code>save</code> operations.
* <p>
* Note that <code>IWorkspace.save</code> uses a
* different save context for each registered participant,
* allowing each to declare whether they have actively
* participated and decide whether to receive a resource
* delta on reactivation.
* </p>
*
* @see IWorkspace#save(boolean, org.eclipse.core.runtime.IProgressMonitor)
* @noimplement This interface is not intended to be implemented by clients.
* @noextend This interface is not intended to be extended by clients.
*/
public interface ISaveContext {
/*====================================================================
* Constants related to save kind
*====================================================================*/
/**
* Type constant which identifies a full save.
*
* @see ISaveContext#getKind()
*/
int FULL_SAVE = 1;
/**
* Type constant which identifies a snapshot.
*
* @see ISaveContext#getKind()
*/
int SNAPSHOT = 2;
/**
* Type constant which identifies a project save.
*
* @see ISaveContext#getKind()
*/
int PROJECT_SAVE = 3;
/**
* Returns current files mapped with the <code>ISaveContext.map</code>
* facility or an empty array if there are no mapped files.
*
* @return the files currently mapped by the participant
*
* @see #map(IPath, IPath)
*/
IPath[] getFiles();
/**
* Returns the type of this save. The types can be:
* <ul>
* <li> <code>ISaveContext.FULL_SAVE</code></li>
* <li> <code>ISaveContext.SNAPSHOT</code></li>
* <li> <code>ISaveContext.PROJECT_SAVE</code></li>
* </ul>
*
* @return the type of the current save
*/
int getKind();
/**
* Returns the number for the previous save in
* which the plug-in actively participated, or <code>0</code>
* if the plug-in has never actively participated in a save before.
* <p>
* In the event of an unsuccessful save, this is the value to
* <code>rollback</code> to.
* </p>
*
* @return the previous save number if positive, or <code>0</code>
* if never saved before
* @see ISaveParticipant#rollback(ISaveContext)
*/
int getPreviousSaveNumber();
/**
* If the current save is a project save, this method returns the project
* being saved.
*
* @return the project being saved or <code>null</code> if this is not
* project save
*
* @see #getKind()
*/
IProject getProject();
/**
* Returns the number for this save. This number is
* guaranteed to be <code>1</code> more than the
* previous save number.
* <p>
* This is the value to use when, for example, creating files
* in which a participant will save its data.
* </p>
*
* @return the save number
* @see ISaveParticipant#saving(ISaveContext)
*/
int getSaveNumber();
/**
* Returns the current location for the given file or
* <code>null</code> if none.
*
* @return the location of a given file or <code>null</code>
* @see #map(IPath, IPath)
* @see ISavedState#lookup(IPath)
*/
IPath lookup(IPath file);
/**
* Maps the given plug-in file to its real location. This method is intended to be used
* with <code>ISaveContext.getSaveNumber()</code> to map plug-in configuration
* file names to real locations.
* <p>
* For example, assume a plug-in has a configuration file named "config.properties".
* The map facility can be used to map that logical name onto a real
* name which is specific to a particular save (e.g., 10.config.properties,
* where 10 is the current save number). The paths specified here should
* always be relative to the plug-in state location for the plug-in saving the state.
* </p>
* <p>
* Each save participant must manage the deletion of its old state files. Old state files
* can be discovered using <code>getPreviousSaveNumber</code> or by using
* <code>getFiles</code> to discover the current files and comparing that to the
* list of files on disk.
* </p>
* @param file the logical name of the participant's data file
* @param location the real (i.e., filesystem) name by which the file should be known
* for this save, or <code>null</code> to remove the entry
* @see #lookup(IPath)
* @see #getSaveNumber()
* @see #needSaveNumber()
* @see ISavedState#lookup(IPath)
*/
void map(IPath file, IPath location);
/**
* Indicates that the saved workspace tree should be remembered so that a delta
* will be available in a subsequent session when the plug-in re-registers
* to participate in saves. If this method is not called, no resource delta will
* be made available. This facility is not available for marker deltas.
* Plug-ins must assume that all markers may have changed when they are activated.
* <p>
* Note that this is orthogonal to <code>needSaveNumber</code>. That is,
* one can ask for a delta regardless of whether or not one is an active participant.
* </p>
* <p>
* Note that deltas are not guaranteed to be saved even if saving is requested.
* Deltas cannot be supplied where the previous state is too old or has become invalid.
* </p>
* <p>
* This method is only valid for full saves. It is ignored during snapshots
* or project saves.
* </p>
*
* @see IWorkspace#addSaveParticipant(org.eclipse.core.runtime.Plugin, ISaveParticipant)
* @see ISavedState#processResourceChangeEvents(IResourceChangeListener)
*/
void needDelta();
/**
* Indicates that this participant has actively participated in this save.
* If the save is successful, the current save number will be remembered;
* this save number will be the previous save number for subsequent saves
* until the participant again actively participates.
* <p>
* If this method is not called, the plug-in is not deemed to be an active
* participant in this save.
* </p>
* <p>
* Note that this is orthogonal to <code>needDelta</code>. That is,
* one can be an active participant whether or not one asks for a delta.
* </p>
*
* @see IWorkspace#addSaveParticipant(org.eclipse.core.runtime.Plugin, ISaveParticipant)
* @see ISavedState#getSaveNumber()
*/
void needSaveNumber();
}