Коллективная работа и связанные ресурсы

В проекте могут содержаться ресурсы, которые не находятся в каталоге проекта в локальной файловой системе. Такие ресурсы называются связанными ресурсами.

Влияние на типы хранилищ

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

Связанные ресурсы могут воздействовать на хранилища со следующими характеристиками:

  1. Те, которые вызывают внешнюю программу, которая, в свою очередь, работает напрямую с файловой системой.
  2. Те, которые реализованы на уровне IResource, но считают, что все файлы/папки проекта являются прямыми потомками этого корневого дерева каталогов.

В первом случае будем считать, что пользователь выбирает связанный ресурс и пытается выполнить над ним какое-либо действие. Так как класс типа хранилища вызывает клиента командной строки, то считаем, что выполняется некий эквивалент первого вызова IResource.getLocation().toOSString(), в качестве аргумента для программы командной строки, передающий расположение в файловой системе. Если ресурс в запросе является связанным, то такое действие выведет файл или папку за пределы дерева каталогов проекта. А такую ситуацию могут обработать не все клиенты командной строки. Короче говоря, если класс хранилища все время получает расположение файловой системы ресурса, то, вероятно, для обработки связанных ресурсов потребуются дополнительные усилия.

Второй случай похож на первый тем, что здесь тоже подразумевается, что структура ресурсов проекта один к одному совпадает с файлами и папками файловой системы. Вообще, при смешении операций IResource и java.io.File в классах хранилищ могут возникнуть проблемы. Например, предок ресурса IFile вовсе не то же самое, что предок java.io.File. Это следует учитывать при написании кода.

Обратная совместимость

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

Советы по обработке связанных ресурсов

Для того, поддерживать связанные ресурсы, класс хранилища должен позволять проектам со связанными ресурсами осуществлять управление версиями, но запрещать управление версиями для самих связанных ресурсов.

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

Технические сведения о "поддержке связи"

Поддержку связанных ресурсов в реализации типов хранилищ можно добавить путем переопределения метода RepositoryProvider.canHandleLinkedResources(), чтобы он возвращал true.Когда это будет сделано, связанные ресурсы будут разрешены в проектах, общих с этим типом хранилища. Однако, для обеспечения правильной их обработки тип хранилища должен соответствовать следующим требованиям. Как говорилось выше, настоятельно рекомендуется, чтобы тип хранилища игнорировал все связанные ресурсы. Это значит, что связанные ресурсы (и их потомки) должны исключаться из действий, поддерживаемых типом хранилища. Далее, тип хранилища должен использовать для связанных ресурсов стандартные функции удаления и перемещения, если стандартный перехватчик IMoveDeleteHook переопределен в реализации типа хранилища.

Для определения, является ли ресурс связанным, в модулях типов хранилища можно применять метод IResource.isLinked(). Однако, этот метод возвращает true только для корневого связанного ресурса. Для определения, является ли ресурс потомком связанного ресурса, можно воспользоваться следующим фрагментом кода.

String linkedParentName = resource.getProjectRelativePath().segment(0);IFolder linkedParent = resource.getProject().getFolder(linkedParentName);boolean isLinked = linkedParent.isLinked();

Типы хранилищ должны игнорировать все ресурсы, для которых вышеприведенный код вернет true.