Контроль версий

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

Версии создаются двумя способами:

  • Автоматически — каждый раз, когда содержимое документа записывается на сервер: когда пользователь сохраняет документ в настольном приложении или когда клиент WebDAV загружает новое содержимое. Новая версия добавляется после текущей последней версии.

  • Вручную — в экране WebDAV document versions, описанном ниже.

Версионирование по умолчанию включено для всех атрибутов типа WebdavDocument. Вы можете отключить его для отдельного атрибута с помощью аннотации @WebdavSupport или глобально — с помощью свойства jmix.webdav.versioning-enabled.

Версии документов WebDAV

Экран WebDAV document versions показывает историю документа и позволяет управлять ею: добавлять версии, создавать новую версию на основе более старой, открывать конкретную версию и скачивать версии в виде файлов. Это единственное место в UI, где вы работаете с историей версий напрямую, а не через редактирование самого документа.

Есть два способа открыть экран WebDAV document versions:

  1. С помощью компонента WebdavDocumentUploadField, нажав на ссылку, отображающую номер версии документа.

    link for open versions
  2. С помощью кнопки Manage versions на экране WebDAV Documents.

После выполнения любого из этих действий откроется диалоговое окно WebDAV document versions.

web dav document versions

Неподтвержденные версии

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

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

Кнопка Refresh перезагружает историю из базы данных и отменяет все неподтвержденные версии. Если вы скопировали или загрузили версию, но еще не сохранили диалоговое окно, эти версии будут потеряны.

Операции

Диалоговое окно WebDAV document versions поддерживает следующие операции:

  1. Создание новой версии: нажмите Upload и выберите файлы для загрузки. Загруженные файлы нумеруются после текущей последней версии и отмечаются как неподтвержденные.

  2. Создание новой версии на основе существующей: выберите версию и нажмите Copy to head. Ее содержимое копируется в новую версию, пронумерованную после текущей последней версии и отмеченную как неподтвержденная. Используйте эту операцию, чтобы вернуться к более раннему состоянию документа, не теряя версии, созданные в промежутке.

  3. Открытие документа для редактирования: нажмите Open, чтобы открыть документ в связанном настольном приложении. При этом всегда открывается последняя версия с полным доступом, независимо от того, какая версия выбрана в таблице. Каждый раз при сохранении документа в настольном приложении на сервер отправляется новая версия, поэтому используйте Refresh, чтобы увидеть ее в таблице.

  4. Открытие версии для чтения: нажмите на ссылку с именем файла. Выбранная версия откроется в режиме только для чтения.

  5. Скачивание версий: кнопка Download скачивает выбранные версии как отдельные файлы. Опция Download as ZIP упаковывает их в единый архив files.zip. В обоих случаях к имени файла добавляется номер версии, например example-v3.docx и document-v1.docx.

Политики разрешения конфликтов

Политика разрешения конфликтов определяет, как дополнение согласовывает версии, добавленные вами в диалоговом окне WebDAV document versions, с версиями, появившимися в базе данных за то время, пока диалоговое окно было открыто.

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

Дополнение предоставляет следующие политики разрешения конфликтов:

Политика Описание

RejectMergePolicy

Применяется по умолчанию при возникновении конфликта. Ничего не сохраняется: отображается предупреждение, и версии, добавленные вами в диалоговом окне, отменяются. Сохраненная история остается без изменений.

RebaseMergePolicy

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

CancelTheirMergePolicy

Сохраняет версии, добавленные вами в диалоговом окне, и удаляет версии, которые за это время были сохранены в базе данных.

CancelMyMergePolicy

Сохраняет версии, сохраненные в базе данных, и удаляет версии, добавленные вами в диалоговом окне.

FastForwardMergePolicy

Применяется автоматически, если конфликта нет. Сохраняются все версии из диалогового окна. Ее нельзя выбрать в качестве политики разрешения конфликтов.

Сравнение результатов применения политик

Чтобы проиллюстрировать разницу между политиками, рассмотрим документ, у которого есть версии 1, 2 и 3. Вы открываете диалоговое окно WebDAV document versions и загружаете файл, который появляется как неподтвержденная версия 4*. В это же время другой пользователь дважды сохраняет тот же документ из настольного приложения, поэтому в базе данных документ теперь имеет версии 4 и 5. Затем вы сохраняете диалоговое окно.

Результат зависит от политики:

Политика Версии после сохранения

RejectMergePolicy

1, 2, 3, 4, 5 — ваша загрузка не сохраняется, отображается предупреждение

RebaseMergePolicy

1, 2, 3, 4, 5, 6 — ваша загрузка сохраняется как версия 6

CancelTheirMergePolicy

1, 2, 3, 4 — версия 4 — это ваша загрузка, а версии 4 и 5, сохраненные другим пользователем, удаляются

CancelMyMergePolicy

1, 2, 3, 4, 5 — ваша загрузка удаляется

Если бы другой пользователь не сохранял документ, конфликта бы не было: применилась бы политика FastForwardMergePolicy, и ваша загрузка сохранилась бы как версия 4.

Переопределение политики разрешения конфликтов по умолчанию

Чтобы переопределить политику разрешения конфликтов по умолчанию, объявите бин типа DefaultMergePolicy в классе конфигурации Spring. Этот бин должен предоставлять требуемую политику слияния. Например:

@Bean
public DefaultMergePolicy defaultMergePolicy() {
    return RebaseMergePolicy::new;
}