首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从JackRabbit versionStorage中删除未使用的节点

从JackRabbit versionStorage中删除未使用的节点
EN

Stack Overflow用户
提问于 2014-07-11 20:52:25
回答 2查看 1.4K关注 0票数 1

我有一个场景,其中存储库包含几个不引用任何mix:versionable节点的版本节点。这是因为这些可验证的节点已经从存储库中删除,而不是它们的相应版本。

这导致JackRabbit垃圾收集器无法从数据存储中删除某些文件,因为仍然存在引用它们的版本,因此磁盘空间没有被正确释放。

我尝试用以下算法手动删除这些版本:

  1. 按其路径获取版本,比方说: /jcr:system/jcr:versionStorage/40/05/a9/4005a9b2-51d1-4ed1-8c30-934409e05f86/1.14/jcr:frozenNode
  2. 从获取的节点获取jcr:frozenUuid属性
  3. 使用步骤2中的frozenUuid,按标识符获取节点
  4. 如果不存在这样的节点,请删除版本。

但在最后一步中,我得到了以下例外:

代码语言:javascript
运行
复制
javax.jcr.nodetype.ConstraintViolationException: Unable to perform operation. Node is protected.

所以我的问题是。如何删除未使用的版本节点?

我用的是野兔-2.2.13。

EN

回答 2

Stack Overflow用户

发布于 2014-09-15 15:27:48

这就是我如何删除我的版本..。

代码语言:javascript
运行
复制
String nodePath...
String versionName...
Session session...

VersionManager versionManager = session.getWorkspace().getVersionManager()
VersionHistory versionHistory = versionManager.getVersionHistory(nodePath);
versionHistory.removeVersion(versionName);
票数 0
EN

Stack Overflow用户

发布于 2015-09-15 06:32:30

我认为这将有助于您遍历所有版本,以便您可以删除或恢复。

代码语言:javascript
运行
复制
        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;
        }

下面的代码是遍历节点的所有版本并通过versionName删除的

代码语言:javascript
运行
复制
           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());
                        }
                    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24706376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档