Типы хранилищ

Тип хранилища (RepositoryProvider) - это центральный класс при реализации хранилища.  Этот класс отвечает за управление хранилищем и предоставления перехватчиков для изменения ресурсов.  Типы связываются с проектом с помощью постоянных свойств проекта.  Для API коллективной работы механизм связывания типов с проектом не является центральным, но о нем следует знать при фильтрации ресурсов в UI.  В большинстве случаев для работы с проектами и привязывания их к типу будет использоваться 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 определены два абстрактных метода: configureProject и deconfigure.  Эти методы должны реализовываться во всех типах. 

Проект настраивается при первом связывании с конкретным типом хранилища.  Обычно это происходит, когда пользователь выбирает проект и связывает его с хранилищем с помощью мастера Коллективная работа.  Независимо от того, как инициируется операция, это подходящий момент для вычисления или кэширования любых данных о проекте, необходимых для поддержки хранилища.  (Будем считать, что проект уже связан с типом хранилища.   Вы должны были позаботиться об этом при работе с мастером настройки.)

Класс хранилища CVS просто оповещает о факте, что проект уже настроен:

public void configureProject() throws CoreException {
CVSProviderPlugin.broadcastProjectConfigured(getProject());
}

Мы не будем рассматривать механизм реализации модуля оповещения.  Достаточно сказать, что сейчас можно выполнить все инициализации и вычисления каких-либо данных проекта.

Если пользователю больше не нужна связь типа хранилища с проектом, то она расформировывается.   Пользовательское действие, вызывающее это событие (а также удаление соответствия проекта с типом хранилища), должно реализовываться в вашем модуле.  Метод deconfigure  - это подходящее место для удаления всех кэшированных данных проекта и ссылок на проект из UI.  Модуль для хранилища 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());
}
}

Настройка проекта

Обычно при формировании UI коллективной работы в первую очередь реализуется страница мастеров, позволяющая настраивать проект для поддержки модулей группы.  На этой странице ИД типа хранилища добавляется в свойства проекта.  Ваше участие в настройке проекта заключается в создании точки расширения org.eclipse.team.ui.configurationWizards.   Ниже показан мастер для случая, когда пользователь выбирает Коллективная работа->Общий проект...

Рассмотрим его в контексте реализации клиента CVS.  Ниже приведен текст на языке описания CVS UI для этого мастера настройки:

<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>

Как правило, модуль поставляет класс, реализующий расширение, и уникальный id для обозначения этого расширения.  Если типов хранилищ несколько, то на первой странице мастера настройки проекта отображаются параметры name и icon.

После того, как пользователь выбрал тип хранилища, на следующей странице отображается информация о его настройке.  (Если установлен только ваш модуль типа хранилища, то мастер перейдет сразу на соответствующую страницу.)  В мастере должен быть реализован интерфейс IConfigurationWizard, инициализирующий его для заданной рабочей среды и проекта.  Реализация остальных классов и функций зависит от ваших требований. Необходимо собрать как можно больше информации для связи проекта с поддержкой коллективной работы.

Когда мастер отработает, следует связать тип хранилища с проектом. Это делается с помощью RepositoryProvider.map(IProject, String).  При этом контролируется правильность присвоения проекту постоянного свойства.

Клиент CVS выполняет эту работу в методе setSharing типа хранилища, который вызывается сразу после завершения мастера:

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

// Ensure provided info matches that of the project
...
// Ensure that the provided location is managed
...
// Register the project with Team
RepositoryProvider.map(project, CVSProviderPlugin.getTypeId());
}

Поиск типа хранилища

Связать проекты с типами хранилищ и найти хранилища, связанные с заданным проектом, проще всего с помощью статических методов класса RepositoryProvider.

Типы хранилищ и группы функций

Если в группу функций продукта решено добавить функцию хранилища, то ее следует привязать к ИД хранилища. Ниже приведены два действия по активизации RepositoryProvider в группе функции:

  1. Привяжите функцию к ИД типа хранилища. Это даст возможность модулю коллективной работы активировать и деактивировать ее на основе ИД типов хранилищ.
    <activityPatternBinding
        activityId="org.eclipse.team.cvs"
        pattern="org\.eclipse\.team\.cvs\.core/.*cvsnature">
    </activityPatternBinding>
  2. Далее привяжите группу функций ко всем пакетам UI для хранилища:
    <activityPatternBinding
         activityId="org.eclipse.team.cvs"
         pattern="org\.eclipse\.team\.cvs\.ui/.*">
    </activityPatternBinding>

В модуле коллективной работы определены две точки триггеров группы функции. Первый - это мастер Коллективная работа > Общий проект..., который позволяет фильтровать типы хранилищ на уровне состояния активна/неактивна группы функций в рабочей среде, а второй - это триггер автоматического подключения, реализованный в модуле коллективной работы.

Перехватчики изменения ресурсов

Большинство интересующих нас функций, связанных с типом хранилища, выполняются при работе пользователя с ресурсами проекта, настроенного для этого типа хранилища.  Для того, чтобы пользователь мог изменять ресурсы, в классе хранилища следует реализовать перехватчики для изменения ресурсов.  В модулях ресурсов эти перехватчики реализованы как точки расширения.  Подробнее их реализация описана в документации по IMoveDeleteHook, IFileModificationValidator и ResourceRuleFactory.

Процесс связывания перехватчика с соответствующим ресурсом оптимизируется и упрощается с помощью модуля коллективной работы. Он позволяет зарегистрировать стандартные перехватчики в модулях ресурсов.  Они позволяют определить перехватчик для заданного ресурса по его типу хранилища.  Гораздо удобнее вызывать один перехватчик для хранилища, чем регистрировать их для каждой реализации хранилища по отдельности и проверять, управляет ли хранилище этим ресурсом.

Для настройки необходимых перехватчиков следует переопределить методы класса RepositoryProvider. Стандартная реализация этих методов возвращает пустое значение, свидетельствующее об отсутствии перехватчиков (за исключением фабрики правил ресурсов, см. ниже):