存储库提供程序

存储库提供程序(RepositoryProvider)是您的存储库实现中的中心类。此类负责配置存储库管理的项目,并提供资源修改所需的挂钩。使用项目持久属性将提供程序映射到项目。将提供程序映射到项目的机制不是小组 API 的中心,但当过滤用户界面中的资源时,您要考虑到它。大多数情况下,您将使用小组 API 来处理项目,并将它们与您的提供程序关联。  

要实现提供程序,您必须使用 org.eclipse.team.core.repository 来定义一个存储库,并提供从 RepositoryProvider 派生的类。我们将使用 CVS 客户机作为示例来查看它是如何工作的。

扩展点

org.eclipse.team.core.repository 扩展点用来添加存储库定义。以下是 CVS 客户机的标记。

<extension

point="org.eclipse.team.core.repository">
<repository
class="org.eclipse.team.internal.ccvs.core.CVSTeamProvider"
id="org.eclipse.team.cvs.core.cvsprovider">
</repository>
</extension>

这将向小组支持插件登记您的小组提供程序,并分配一个标识,应在您的提供程序与项目关联时使用它。存储库的指定必须扩展 RepositoryProvider

实现 RepositoryProvider

在扩展中标识的类必须是 RepositoryProvider 的子类。其主要职责是为存储库支持配置和取消配置项目,并提供任何必需的资源修改挂钩。CVS 客户机可作为一个很好的示例。它的存储库提供程序是 CVSTeamProvider

   public class CVSTeamProvider extends RepositoryProvider {

...

RepositoryProvider 定义两个抽象方法:configureProjectdeconfigure。所有提供程序必须实现这些方法。 

项目是在第一次与特定存储库提供程序进行关联时配置的。当用户选择某个项目并使用小组向导以将项目与存储库进行关联时通常会发生这种情况。不管操作是如何触发的,这都是计算或高速缓存有关提供存储库功能时所需的项目的数据的适当时机。(假定已将项目映射至提供程序。在配置向导中应注意这一点。)

CVS 提供程序仅广播项目已被配置的事实:

public void configureProject() throws CoreException {

CVSProviderPlugin.broadcastProjectConfigured(getProject());
}

我们将不跟随插件广播机制的实现。可以保证,需要计算或初始化特定于项目的数据的任何一方都可在此时这样做。

当用户不再想要将小组提供程序与项目关联时,项目将取消配置。您的插件将决定导致此结果的用户操作(并且从小组提供程序取消项目映射也将发生)。此时是取消配置方法删除任何项目相关高速缓存或除去用户界面中项目的任何引用的合适时间。CVS 提供程序清除保留在其视图中的项目相关高速缓存,并广播项目被取消配置的事实。

public void deconfigure() throws CoreException {

...
try {
EclipseSynchronizer.getInstance().flush(getProject(), true, true /*flush deep*/, null);
} catch(CVSException e) {
throw new CoreException(e.getStatus());
} finally {
CVSProviderPlugin.broadcastProjectDeconfigured(getProject());
}
}

配置项目

通常,构建小组用户界面的第一步是实现向导页,它允许用户为插件的小组支持配置项目。将在此处将小组提供程序的标识添加至项目的属性。通过添加至 org.eclipse.team.ui.configurationWizards 扩展点来参予项目配置。当用户选择小组 -> 共享项目... 时将显示此向导。

将在 CVS 客户机实现的上下文中看到它。下面是其配置向导的 CVS 用户界面标记:

<extension

point="org.eclipse.team.ui.configurationWizards">
<wizard
name="%SharingWizard.name"
icon="icons/full/wizards/newconnect_wiz.png"
class="org.eclipse.team.internal.ccvs.ui.wizards.SharingWizard"
id="org.eclipse.team.ccvs.ui.SharingWizard">
</wizard>
</extension>

通常,插件提供一个,该类实现扩展和标识其扩展的唯一标识。如果要从多个提供程序中选择,则名称图标将显示在项目配置向导的第一页中。

一旦用户选择了提供程序,下一页将显示该提供程序的特定配置信息。(如果该提供程序是安装的唯一小组提供程序,则向导将直接跳至页面。)向导必须实现 IConfigurationWizard,它初始化指定工作台和项目的向导。余下的实现取决于向导的设计。必须收集将项目与小组支持进行关联所需的所有信息。

向导完成时,必须使用 RepositoryProvider.map(IProject, String) 将小组提供程序映射至项目。映射处理将正确的项目持久属性指定给项目这一操作。

CVS 客户机提供程序在其提供程序的 setSharing 方法中完成此操作,向导完成时将调用该方法:

public void setSharing(IProject project, FolderSyncInfo info, IProgressMonitor monitor) throws TeamException {


// 确保提供的信息与项目的信息相匹配
...
// 确保提供的位置是受管的
...
// 向小组注册该项目
RepositoryProvider.map(project, CVSProviderPlugin.getTypeId());
}

查找提供程序

RepositoryProvider 中的静态方法使客户机很容易将项目映射到提供程序,并找到与给定项目相关联的提供程序。

存储库提供程序和功能

如果产品选择将存储库插件添加至功能,它应将该功能绑定至存储库标识。以下是将 RepositoryProvider 作为功能启用所采取的步骤:

  1. 将该功能绑定至存储库提供程序标识。这允许小组插件根据存储库提供程序标识激活/禁用。
    <activityPatternBinding
        activityId="org.eclipse.team.cvs"
        pattern="org\.eclipse\.team\.cvs\.core/.*cvsnature">
    </activityPatternBinding>
  2. 然后将该功能绑定至该提供程序的所有用户界面包:
    <activityPatternBinding
         activityId="org.eclipse.team.cvs"
         pattern="org\.eclipse\.team\.cvs\.ui/.*">
    </activityPatternBinding>

小组插件定义了两个功能触发器点。第一个是小组 > 共享项目... 向导,它允许根据工作台功能的启用/禁用状态过滤存储库提供程序,另一个是小组插件自动启用触发器。

资源修改挂钩

大多数有意义的与存储库提供程序相关联的功能是在用户使用为提供程序配置的项目中的资源时发生的。为了解用户对资源所作的更改,提供程序可实现资源修改挂钩。资源插件提供这些挂钩作为扩展点。IMoveDeleteHookIFileModificationValidatorResourceRuleFactory 的文档描述实现这些挂钩的详细信息。

小组插件通过向资源插件登记类属挂钩,来优化和简化挂钩与合适资源的关联。这些类属挂钩仅在存储库提供程序中查找给定的资源并获取其挂钩。这具有只调用一个提供程序挂钩的优势,而不是使每个提供程序实现登记挂钩,那样必须首先检查资源是否由提供程序管理。

对于您的插件,这意味着您通过覆盖 RepositoryProvider 中的方法来提供任何必要的挂钩。这些方法的缺省实现将回答空,指示没有任何挂钩是必需的(但资源规则工厂除外,如下所述)。