1

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

4

1 回答 1

3

不知道如何正确地迭代版本树-我认为应该可以,通过遍历/jcr:system/jcr:versionStorage,请参阅JCR 1.0 第 8.2.2.1 节JCR 2.0 第 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在会话中找不到frozenNode的时候它被删除了:

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 );
于 2010-09-22T16:47:42.697 回答