如果您打算提供同步支持,但是没有用于管理同步状态的现有机制,本节说明如何从头开始实现订户。这表示没有现成的同步基础结构,并说明如何使用所提供的某些 API 来维护同步状态。
对于此示例的其余部分,我们将利用正在运行的示例。可以在 org.eclipse.team.examples.filesystem 插件的文件系统提供程序包中找到源代码。当您阅读本教程时,应该从 CVS 存储库中检出项目并用作参考。
这第一个示例假定没有现成的基础结构来维护本地工作空间的同步状态。当从头开始实现订户时,可以利用 org.eclipse.team.core 插件中提供的一些附加 API。包 org.eclipse.team.core.variants 包含 订户的两个子类,可以用来简化实现。第一个子类是 ResourceVariantTreeSubscriber,将在下面的第二个示例中讨论它。第二个子类是第一个子类的子类:ThreeWaySubscriber。 此订户实现提供了几个很有帮助的类,用来管理本地工作空间的同步状态。如果您没有任何现成的基础结构,则最好从这里开始。
将使用 org.eclipse.team.examples.filesystem 插件中提供的 文件系统示例来说明从头开始实现订户。以下描述中的代码始终保持最小量,因为它是从 Eclipse CVS 存储库中提供的。尽管从技术上来说不是三方订户,但是,文件系统示例仍然可以充分利用此基础结构。FTP 和 WebDAV 插件也是使用此基础结构构建的。
对于文件系统示例,我们已经具有 RepositoryProvider 的实现,它使本地项目与本地内容镜像至的文件系统位置相关联。FileSystemSubscriber 是作为 ThreeWaySubscriber 的子类来创建的,以便利用 ThreeWaySynchronizer 来管理工作空间同步状态。此类的子类必须执行下列任务:
除了订户实现以外,还修改了文件系统提供程序的 get 和 put 操作,以更新 ThreeWaySynchronizer 中的同步状态。这些操作是在 org.eclipse.team.examples.filesystem.FileSystemOperations 类中实现的。
ThreeWaySynchronizer 负责管理本地工作空间与远程位置之间的同步状态。 它高速缓存并持久保存本地、基本和远程时间戳记,以便支持高效计算资源的同步状态。它还将更改通知发送至任何已注册的侦听器。 ThreeWaySubscriber 将这些更改事件转换为正确的格式,以便发送至已向订户注册的侦听器。
ThreeWaySynchronizer 利用核心调度规则和锁定来确保线程安全并提供更改通知批处理。
ThreeWayRemoteTree 是适合于 ThreeWaySubscriber 的 ResourceVariantTree 的一个子类。 客户机必须覆盖它以提供从服务器中访存远程状态的机制。在下一个示例中更详细地讨论了 ResourceVariantTree。
CachedResourceVariant 是 IResourceVariant 的部分实现,IResourceVariant 将对一段时间内(目前是 1 个小时)访存的任何内容进行高速缓存。这是很有用的,因为在很短的一段时间内就可能会多次访问这些内容 (例如,为了确定同步状态和显示比较编辑器中的内容)。子类仍然必须提供唯一的内容标识以及字节队列(可以持久保存它们以便重新创建资源变体句柄)。
许多存储库提供程序可能已经具有用于管理它们的同步状态的机制(例如,如果它们具有现有插件)。 ResourceVariantTreeSubscriber 及其相关类提供了 在现有同步基础结构的基础上进行构建的能力。例如,这是所有 CVS 订户的超类。
正如前一示例中提到的那样,ThreeWaySubscriber 是 ResourceVariantTreeSubscriber(它使用 ThreeWaySynchronizer 来提供本地工作空间同步)的子类。 ResourceVariantTreeSubscriber 的子类必须提供:
ResourceVariantTree(或 AbstractResourceVariantTree)的子类,这些子类为支持三方比较的订户提供遍历和刷新远程资源变体的行为和基本资源变体。
订户的其它功能是使用下列设施来实现的。
ResourceVariantTree 是提供下列各项的 IResourceVariantTree 的具体实现:
下列功能必须由子类来实现:
提供了 ResourceVariantByteStore 的具体实现,它持久保存工作台调用中的字节(PersistantResourceVariantByteStore)或者只对当前会话的字节进行高速缓存(SessionResourceVariantByteStore)。但是,在现有工作空间同步基础结构的基础上构建订户通常将需要 ResourceVariantByteStore 子类的实现,该子类与底层同步器进行交互。例如,ThreeWayRemoteTree 利用字节库实现,该字节库实现将远程字节存储在 ThreeWaySynchronizer 中。
为此示例创建资源变体句柄与前一示例没有什么不同,只不过该句柄是从资源变体树实例中而不是从订户中请求的。