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