我有一个场景,其中存储库包含几个不引用任何mix:versionable
节点的版本节点。这是因为那些可版本化的节点已从存储库中删除,但未从其相应的版本中删除。
这导致JackRabbit垃圾收集器无法从数据存储中删除某些文件,因为有些版本仍然引用它们,因此磁盘空间未正确释放。
我尝试使用以下算法手动删除这些版本:
jcr:frozenUuid
属性但是在最后一步中我得到以下异常:
javax.jcr.nodetype.ConstraintViolationException: Unable to perform operation. Node is protected.
所以,我的问题是。如何删除未使用的版本节点?
我使用的是jackrabbit-2.2.13。
答案 0 :(得分:0)
这就是我删除版本的方法......
String nodePath...
String versionName...
Session session...
VersionManager versionManager = session.getWorkspace().getVersionManager()
VersionHistory versionHistory = versionManager.getVersionHistory(nodePath);
versionHistory.removeVersion(versionName);
答案 1 :(得分:0)
我认为这可以帮助您遍历所有版本,以便您可以删除或恢复。
Node vs = session.getRootNode().getNode("jcr:system").getNode("jcr:versionStorage");
Version v = traverseVersionStorage(vs, 0);
private static Version traverseVersionStorage(Node n, int level)
throws Exception {
Version v = null;
for (NodeIterator it = n.getNodes(); it.hasNext();) {
Node n2 = it.nextNode();
if (n2 instanceof Version && !n2.getName().startsWith("jcr:")) {
v = (Version) n2;
System.out.println("version " + n2.getName() + " of node "+ n2.getParent().getName() + ":");
Node n3 = n2.getNode("jcr:frozenNode");
VersionManager vman=session.getWorkspace().getVersionManager();
Node parent=n3.getParent();
System.out.println(parent.getName());
vman.restore("/any/path/where/to/restore", v, true);
session.save();
}
Version v2 = traverseVersionStorage(n2, level + 1);
v = v == null ? v2 : v;
}
return v;
}
下面的代码是遍历节点的所有版本并按版本名称删除
VersionManager versionManager=jcrsession.getWorkspace().getVersionManager();
VersionHistory vHistory=versionManager.getVersionHistory("/absolute/path/of/node/which/versions/to/be/removed");
for (VersionIterator pt = vHistory.getAllVersions(); pt.hasNext();)
{
Version p = pt.nextVersion();
if(p.getName()!="jcr:rootVersion")
{
vHistory.removeVersion(p.getName());
}
}