2012-10-19 89 views
1

我的問題是:你如何閱讀(孩子)冰凍節點的版本?
更多細節:
- 讓我們想象一下以下情況:節點A有兩個孩子節點B和節點C.
- 所有這三個節點是多版本節點(有混合料攪拌型)
- 比方說,節點A有7個版本從1.0到1.6:在1.2版本中,我們添加了節點B,在1.4版本中我們添加了節點C.
我有一個例程,打印版本1.5的節點A的「輸出」。

(JCR)兒童冰凍節點的版本

//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? 
} 

謝謝。

回答

3

父級歷史記錄中的每個版本都將包含一個「凍結節點」,表示創建版本時(例如,檢入父節點時)父級快照的「快照」。此凍結節點包含子節點,它們是子節點的快照(如果該子節點不可版本化)或「nt:versionedChild」節點(如果該子節點是可版本化的)。該「nt:versionedChild」節點包含單個「jcr:childVersionHistory」REFERENCE屬性,指向子版本的版本歷史

Section 3.13.10 JSR-283規範包含一個很好的圖表,顯示了這個結構。

注意「nt:versionedChild」節點不點特定版本在孩子的版本歷史記錄,這意味着你必須確定哪些孩子的版本在父在檢查時存在。畢竟,在這種情況下,可版本化的子版本中,父版本和子版本歷史是獨立的,並且獨立檢入節點。 (原因也可能源於應用程序可以在單個會話中更改父節點和子節點,然後檢查父進程,然後檢查子進程,或者檢查子進程,然後檢查父進程)

這樣做的一種方法是查看每個版本在孩子版本歷史記錄中的創建日期。這並不理想,因爲它只會告訴您在創建父代時哪個子版本存在。這可能是不明確的,因爲時間戳的比較取決於在版本化的孩子之前還是之後檢查了父母。在您的應用程序中,您可能有一些幫助您解決這些歧義的約定。

也許是更好的選擇是使用版本標籤和應用相同的標籤,以父版本和子版本。 (這在檢查節點之後而不是稍後可能會更容易)。然後,一旦您有了父級的特定版本,就可以獲取其標籤並使用它來在子版本中查找相應版本的子級歷史(使用VersionHistory.getVersionByLabel(String))。

+0

嗨蘭德爾,謝謝你的回覆。我只是在玩(「jcr:childVersionHistory」);說實話,如果我們有可能直接進入一個版本,而不是版本歷史(這使得無法檢測到除非如你所說,我們在應用程序中需要一些額外的邏輯/約定)。同時我喜歡版本標籤的想法(謝謝!),我會採用它。 – silverb77

+1

我完全同意,直接引用版本歷史會好很多。但是在實現規範之後,我只是不認爲在創建父版的新版本時我們知道應該引用哪個子版本。例如,孩子可能會在父母之後立即簽入,但父母版本會指向先前的孩子版本。可能會搞砸了。 –