23.6 使用工作空间保存事件来保存关键数据
当插件包含一些特殊的要求(如保留资源或私有模型数据的信息)时,该插件应该参与工作空间的保存事件,将数据保存在持久存储中,例如保存为它的状态目录中的一个文件。
23.6.1 保存事件——何种与何时
工作空间将会触发以下几种保存事件:
● SNAPSHOT事件:当需要时会触发该事件,例如,当项目添加到该工作空间中时。
● PROJECT_SAVE事件:当项目被关闭时,会触发该事件。
● FULL_SAVE事件:当工作空间即将被关闭时,会触发该事件。
通过成为保存参与者,您的插件将获得两种独特的功能。
● 一旦您的插件已经向工作空间中添加了一个保存参与者,当工作空间保存事件被触发时,您将有机会在插件状态目录中保存数据。
● 在插件的启动过程时,只要您曾经保存过数据,就可以在启动前的一个会话过程中取回所保存的数据。
当工作空间启动时,并不会调用插件的保存参与者。参与者的启动取决于插件的启动以及添加保存参与者的启动代码。
23.6.2 保存参与者API
您可以使用IWorkspace.addSaveParticipant(plugin,saveParticipant)方法来成为一个保存参与者。保存参与者API也允许您请求为插件提供一个资源变化。这将使您有机会恰当地处理任何资源更改。这里的资源更改不包括标记的更改,因为发生标记更改时,插件可能是非活动的。
当您希望将保存参与者的处理过程作为工作空间生命周期的一部分进行实现时,您可以使用如表23-6所示的接口。
表23-6 工作空间保存事件接口
|
事件处理接口 |
描 述 |
|
ISaveParticipant |
您可以实现该接口来参与保存工作空间 |
|
ISaveContext |
保存操作的上下文可以用于控制有关保存参与者处理的选项 |
|
ISavedState |
当向工作空间添加一个保存参与者时,返回一个数据结构。如果是第一次添加参与者,则返回null。该数据结构中包含保存次数以及可选的资源 变化 |
下面的架构返回先前您注册为保存参与者时所保存的状态。
ISaveParticipant saveParticipant =
new WorkSpaceSaveParticipant();
ISavedState lastState = ResourcesPlugin.getWorkspace()
.addSaveParticipant(p1ugin, saveParticipant);
如果插件先前没有请求成为保存参与者,则该保存的状态是null。一旦曾经请求过,则该保存参与者将会作为Eclipse关闭操作的一部分被调用。下面显示的是一个实现ISaveParticipant接口的类的结构。
public class SimpleSaveParticipant
implements ISaveParticipant {
public void doneSaving(ISaveContext context) {
// Called when the save state process is complete (clean up).
}
public void prepareToSave(ISaveContext context)
throws CoreException {
// Called as a prelude to the task of
// saving state information.
}
public void rollback(ISaveContext context) {
// Called when a save has to be undone.
}
public void saving(ISaveContext context)
throws CoreException {
// Called when it is time to save state information.
context.needDelta();
// needDelta() means that the next time you ask to add a
// save participant, you will be given a saved state that
// includes a delta.
}
}
图23-7提供了一个保存参与者处理过程的完整概观。下面描述的步骤如图23-7所示。
(1) 向工作空间中添加插件的保存参与者。如果不是第一次添加保存参与者,将返回一个已保存的状态。该保存的状态将包含任何以前保存的信息,如保存次数。

图23-7 保存参与者处理过程概观
(2) 如果在以前的关闭操作期间,保存参与者请求了一个资源变化,那么在状态被保存的时刻与保存参与者被添加的时刻之间发生的所有更改的信息,都将包含在该资源变化中。这些更改可以跨越Eclipse的多次启动和关闭。但API并不总是返回资源变化,如果资源变化过于陈旧或者保存的状态无效时,API就可能就无法返回相应的资源变化。
(3) 在一次保存事件期间,所有的保存参与者将会被发送一条带有保存上下文的saving消息。工作空间可以触发保存处理过程,该保存处理过程作为一次快照、一次项目保存或者一次完整保存事件的一部分。保存参与者实现了与它在各种类型的保存事件的角色相适宜的处理过程。该保存上下文允许每个保存参与者设置保存上下文选项,例如设置保存次数计数器以及设置当保存参与者再次被添加时,是否需要资源变化。
(4) 有必要的话,保存参与者可以在它的插件状态目录中保存数据。从保存上下文中获取的保存次数,可以用来确定保存的文件名以避免冲突。
通过参与工作空间保存事件处理,您将有机会在适当的时候保存您可能在跟踪的项目信息。例如,JDT实现了一个保存参与者(JavaModelManager)。该保存参与者用于在PROJECT_SAVE事件期间保存项目信息,并且用于在FULL_SAVE事件期间保存Java构建器所用到的构建状态信息。






