blob: e3ffa6c893a11350d6d7cc553914f4d8bb735f4f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2009 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.core.resources;
import java.util.EventListener;
import org.eclipse.core.runtime.CoreException;
/**
* A participant in the saving of the workspace.
* <p>
* Plug-ins implement this interface and register to participate
* in workspace save operations.
* </p>
* <p>
* Clients may implement this interface.
* </p>
* @see IWorkspace#save(boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
public interface ISaveParticipant extends EventListener {
/**
* Tells this participant that the workspace save operation is now
* complete and it is free to go about its normal business.
* Exceptions are not expected to be thrown at this point, so they
* should be handled internally.
* <p>
* Note: This method is called by the platform; it is not intended
* to be called directly by clients.
* </p>
*
* @param context the save context object
*/
public void doneSaving(ISaveContext context);
/**
* Tells this participant that the workspace is about to be
* saved. In preparation, the participant is expected to suspend
* its normal operation until further notice. <code>saving</code>
* will be next, followed by either <code>doneSaving</code>
* or <code>rollback</code> depending on whether the workspace
* save was successful.
* <p>
* Note: This method is called by the platform; it is not intended
* to be called directly by clients.
* </p>
*
* @param context the save context object
* @exception CoreException if this method fails to snapshot
* the state of this workspace
*/
public void prepareToSave(ISaveContext context) throws CoreException;
/**
* Tells this participant to rollback its important state.
* The context's previous state number indicates what it was prior
* to the failed save.
* Exceptions are not expected to be thrown at this point, so they
* should be handled internally.
* <p>
* Note: This method is called by the platform; it is not intended
* to be called directly by clients.
* </p>
*
* @param context the save context object
* @see ISaveContext#getPreviousSaveNumber()
*/
public void rollback(ISaveContext context);
/**
* Tells this participant to save its important state because
* the workspace is being saved, as described in the supplied
* save context.
* <p>
* Note: This method is called by the platform; it is not intended
* to be called directly by clients.
* </p>
* <p>
* The basic contract for this method is the same for full saves,
* snapshots and project saves: the participant must absolutely guarantee that any
* important user data it has gathered will not be irrecoverably lost
* in the event of a crash. The only difference is in the space-time
* tradeoffs that the participant should make.
* <ul>
* <li>Full saves: the participant is
* encouraged to save additional non-essential information that will aid
* it in retaining user state and configuration information and quickly getting
* back in sync with the state of the platform at a later point.
* </li>
* <li>Snapshots: the participant is discouraged from saving non-essential
* information that could be recomputed in the unlikely event of a crash.
* This lifecycle event will happen often and participant actions should take
* an absolute minimum of time.
* </li>
* <li>Project saves: the participant should only save project related data.
* It is discouraged from saving non-essential information that could be recomputed
* in the unlikely event of a crash.
* </li>
* </ul>
* For instance, the Java IDE gathers various user preferences and would want to
* make sure that the current settings are safe and sound after a
* <code>save</code> (if not saved immediately).
* The Java IDE would likely save computed image builder state on full saves,
* because this would allow the Java IDE to be restarted later and not
* have to recompile the world at that time. On the other hand, the Java
* IDE would not save the image builder state on a snapshot because
* that information is non-essential; in the unlikely event of a crash,
* the image should be rebuilt either from scratch or from the last saved
* state.
* </p>
* <p>
* The following snippet shows how a plug-in participant would write
* its important state to a file whose name is based on the save
* number for this save operation.
* <pre>
* Plugin plugin = ...; // known
* int saveNumber = context.getSaveNumber();
* String saveFileName = "save-" + Integer.toString(saveNumber);
* File f = plugin.getStateLocation().append(saveFileName).toFile();
* plugin.writeImportantState(f);
* context.map(new Path("save"), new Path(saveFileName));
* context.needSaveNumber();
* context.needDelta(); // optional
* </pre>
* When the plug-in is reactivated in a subsequent workspace session,
* it needs to re-register to participate in workspace saves. When it
* does so, it is handed back key information about what state it had last
* saved. If it's interested, it can also ask for a resource delta
* describing all resource changes that have happened since then, if this
* information is still available.
* The following snippet shows what a participant plug-in would
* need to do if and when it is reactivated:
* <pre>
* IWorkspace ws = ...; // known
* Plugin plugin = ...; // known
* ISaveParticipant saver = ...; // known
* ISavedState ss = ws.addSaveParticipant(plugin, saver);
* if (ss == null) {
* // activate for very first time
* plugin.buildState();
* } else {
* String saveFileName = ss.lookup(new Path("save"));
* File f = plugin.getStateLocation().append(saveFileName).toFile();
* plugin.readImportantState(f);
* IResourceChangeListener listener = new IResourceChangeListener() {
* public void resourceChanged(IResourceChangeEvent event) {
* IResourceDelta delta = event.getDelta();
* if (delta != null) {
* // fast reactivation using delta
* plugin.updateState(delta);
* } else {
* // slower reactivation without benefit of delta
* plugin.rebuildState();
* }
* };
* ss.processResourceChangeEvents(listener);
* }
* </pre>
* </p>
*
* @param context the save context object
* @exception CoreException if this method fails
* @see ISaveContext#getSaveNumber()
*/
public void saving(ISaveContext context) throws CoreException;
}