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