版本控制

当文档启用了版本控制,扩展组件则不会覆盖任何内容。每次更改都会存储为单独的 WebdavDocumentVersion 实例,因此文档会保留完整历史记录,较早版本仍然可使用。

文档版本通过两种方式创建:

  • 自动创建:每次文档内容写入服务端时,即用户在桌面应用中保存文档,或 WebDAV 客户端有新上传内容时。会在当前最新版本之后添加新版本。

  • 手动创建:在下面介绍的 WebDAV 文档版本 视图中进行操作。

默认情况下,WebdavDocument 类型的所有属性都会启用版本控制。可以通过 @WebdavSupport 注解为特定属性禁用版本控制,也可以通过 jmix.webdav.versioning-enabled 属性全局禁用。

WebDAV 文档版本

WebDAV document versions 视图显示文档的历史记录,并支持用户进行管理:添加版本、以旧版本为基础创建新版本、打开特定版本以及将某个版本作为文件下载。这是用户界面中除了编辑文档本身之外,唯一可以直接处理版本历史的地方。

有两种方式可以打开 WebDAV document versions 视图:

  1. 通过 WebdavDocumentUploadField 组件,点击组件中显示的文档版本链接。

    link for open versions
  2. 通过 WebDAV 文档 视图中的 Manage versions 按钮。

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。

覆盖默认策略

如需修改默认的冲突解决策略,可以在 Spring 配置类中声明一个 DefaultMergePolicy 类型的 bean。这个 bean 需要返回所需的策略,示例:

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