1

我的问题是:您如何阅读(子)冻结节点的版本?
更多细节:
- 让我们想象以下情况:节点 A 有两个子节点 B 和节点 C。
- 所有三个节点都是可版本控制的节点(具有 mixin 类型)
- 假设节点 A 从 1.0 到 1.6 有 7 个版本:在 1.2 版本我们添加了节点 B,在 1.4 版中我们添加了节点 C。
我有一个例程在 1.5 版中打印节点 A 的“输出”。

 //I already obtained the Version object version associated to node A version 1.5
 NodeIterator nodeIterator = version.getNodes(); 
 while (nodeIterator.hasNext()) { 
   Node currentNode = nodeIterator.nextNode();
   System.out.println("Node: "+currentNode.getPath());
   // I can see that some of the nodes correspond to children (versions) of 
   //node B and C ..how can I get their version? 
 }

谢谢你。

4

1 回答 1

3

父节点历史记录中的每个版本都将包含一个“冻结节点”,它表示创建版本时(例如,签入父节点时)存在的父节点的快照。此冻结节点包含子节点,它们是子节点的快照(如果子节点不可版本化)或“nt:versionedChild”节点(如果子节点可版本化)。此“ nt:versionedChild”节点包含一个“ jcr:childVersionHistory”REFERENCE 属性,该属性指向子节点的版本历史记录

JSR-283 规范的第 3.13.10 节包含一个很好的图表来显示这种结构。

请注意,“ nt:versionedChild”节点并不指向子版本历史记录中的特定版本,这意味着您必须确定在父签入时存在子版本的哪个版本。毕竟,在这种可版本化的情况下child,父子版本历史是独立的,节点是独立签入的。(原因也可能源于应用程序可以在单个会话中同时更改父节点和子节点,然后先签入父节点,然后签入子节点,或者签入子节点,然后签入父节点.)

一种方法是查看子版本历史记录中每个版本的创建日期。这并不理想,因为它只会告诉您在创建父版本时存在哪个子版本。这可能是模棱两可的,因为时间戳的比较取决于父母是在版本控制的孩子之前还是之后签入的。在您的应用程序中,您可能有一些约定可以帮助您解决这些歧义。

也许更好的选择是使用版本标签并将相同的标签应用于父版本和子版本。(这可能在签入节点之后而不是稍后更容易做到。)然后,一旦您有了父的特定版本,获取它的标签并使用它在子版本中找到对应的子版本历史(使用VersionHistory.getVersionByLabel(String))。

于 2012-10-19T12:45:03.473 回答