Jackrabbit 2.1有版本化节点。我们希望支持删除其中一个节点的“撤消”。 “找到它”似乎是棘手的部分。
答案 0 :(得分:3)
不确定如何正确迭代版本树 - 应该可以,我认为,通过/jcr:system/jcr:versionStorage
,请参阅JCR 1.0 section 8.2.2.1和JCR 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 );