如何在jackrabbit 2.1存储库中恢复“版本化节点”?

时间:2010-07-16 20:19:18

标签: jcr

Jackrabbit 2.1有版本化节点。我们希望支持删除其中一个节点的“撤消”。 “找到它”似乎是棘手的部分。

1 个答案:

答案 0 :(得分:3)

不确定如何正确迭代版本树 - 应该可以,我认为,通过/jcr:system/jcr:versionStorage,请参阅JCR 1.0 section 8.2.2.1JCR 2.0 section 15.10 - 但您可以查询版本树像

这样的查询
SELECT * FROM nt:frozenNode WHERE prop = 'value'

(如果在Jackrabbit中为版本工作区配置了搜索索引,默认情况下应该这样做。)

返回的节点将是冻结的节点,让父节点检索版本:

NodeIterator iter = res.getNodes();
while (iter.hasNext()) {
    Node frozenNode = iter.nextNode();
    Version v = (Version) frozenNode.getParent();
    // ...
}

每当您在第一个位置创建版本时,将节点的(父)路径存储为属性是有意义的,这样您就可以查询它并在以后知道将其恢复的位置(见下文)。

您知道在会话中找不到冻结节点的jcr:frozenUuid时会将其删除:

boolean deleted = false;
try {
    session.getNodeByUUID(
        frozenNode.getProperty(JcrConstants.JCR_FROZENUUID).getString()
    );
} catch (ItemNotFoundException e) {
    deleted = true;
} catch (RepositoryException e) {
    continue;
}

要恢复它,请将版本传递给版本管理器,并将其恢复到的绝对路径(可能来自版本冻结节点上保存的属性):

VersionManager vMgr = session.getWorkspace().getVersionManager();
vMgr.restore(path, v, true);

如果您以某种方式知道它而不需要搜索它,您也可以通过其UUID获取该版本:

Version v = (Version) session.getNodeByUUID( versionUUID );