通过DAV版本化JCR节点 - howto?

时间:2012-05-13 12:55:46

标签: versioning jackrabbit jcr

背景:为了在网站设计中进行内容管理,我一直在考虑采用Apache Sling,Jackrabbit和Jetty等服务组合。在这一点上,我想想有可能使用DAV创建一个移动内容创建平台来访问JCR内容库。 JCR 2.0中的版本控制问题(JSR-283)让我感到疑惑,如何通过HTTP进行JCR版本操作?

更详细:我正在考虑我认为的section 15 of JSR-283, served up in HTML format from Adobe.在该部分中,JSR-283提出了JCR节点版本控制的概念。

然后,我在JSR-283兼容​​版本的Jackrabbit中了解that there's a VersionManager API。这有助于解释如何通过API进行JCR(JSR-283)版本控制操作。那么,用户代理如何通过DAV进行版本控制操作呢?

我想为自己回答这个问题,但我甚至不知道从哪里开始。

JSR-283的另一部分是否解释了版本签入/签出操作如何转换为HTTP请求?这是简单的DAV属性的问题吗?我甚至接近那个标记了吗?

/需要同行评审,大声笑

2 个答案:

答案 0 :(得分:1)

有一个文档(JCR_Webdav_Protocol.doc - Apache Jackrabbit)描述了Jackrabbit网站上WebDAV方法调用和Jackrabbit JCR API调用之间的映射:

http://jackrabbit.apache.org/JCR_Webdav_Protocol.doc

虽然这个文件是最后更新的。2006年3月,我发现我的第一步非常有帮助。

我使用Word和Wireshark跟踪了我的Jackrabbit默认存储库与Microsoft Office 2010的会话。以下shell脚本使用* nix上的curl和libreoffice执行相同的操作。


正如您所看到的那样,DELETE,UPLOAD,VERSION-CONTROL文档WebDAV调用是在Word中的操作之前执行的。

“浏览目录”在Internet Explorer实例中打开URL。

Microsoft Word检索文档属性(PROPFIND),然后打开(GET)并锁定文档。 它还会因为未知原因请求%EE%B3%B0上的属性(UTF-8(十六进制)0xEE 0xB3 0xB0(eeb3b0)或UTF-16" \ uECF0" aka"&#34 ;来自Unicode字符集的私有使用范围)。

在Microsoft Word中保存文档后,它将上传(PUT)并更新Document节点的属性(PROPPATCH),以包含Win32CreationTime,Win32LastModifiedTime和Win32LastAccessTime标记。

在Word中关闭文档将使用UNLOCK释放获取的锁。

再次手动执行CHECKIN文档以完成版本生命周期。

版本树报告也可以从WebDAV获得。

#!/bin/sh

# Delete document
curl -A Microsoft-WebDAV-MiniRedir/6.1.7601 -X DELETE -v http://localhost:7001/repository/default/test.docx

# Upload document
curl -A Microsoft-WebDAV-MiniRedir/6.1.7601 -X PUT -v http://localhost:7001/repository/default/test.docx --data-binary "@test.docx"

# Version-Control document
curl -A Microsoft-WebDAV-MiniRedir/6.1.7601 -X VERSION-CONTROL -v http://localhost:7001/repository/default/test.docx 

# Checkout document
curl -A Microsoft-WebDAV-MiniRedir/6.1.7601 -X CHECKOUT -v http://localhost:7001/repository/default/test.docx

# Browse directory
curl -A "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko" -X GET -v http://localhost:7001/repository/default/ 

# Open document in Word
curl -A Microsoft-WebDAV-MiniRedir/6.1.7601 -X PROPFIND -v http://localhost:7001/repository/default/test.docx | xmllint --format -
curl -A Microsoft-WebDAV-MiniRedir/6.1.7601 -X GET -v http://localhost:7001/repository/default/test.docx -O
curl -A Microsoft-WebDAV-MiniRedir/6.1.7601 -X PROPFIND -v http://localhost:7001/repository/default/test.docx%EE%B3%B0
cat > LOCK_document.xml <<EOF
<?xml version="1.0" encoding="utf-8" ?>
<D:lockinfo xmlns:D="DAV:">
  <D:lockscope>
    <D:exclusive/>
  </D:lockscope>
  <D:locktype>
    <D:write/>
  </D:locktype>
  <D:owner>
    <D:href>WINDOWSDOMAIN\USER</D:href>
  </D:owner>
</D:lockinfo>
EOF
curl -A Microsoft-WebDAV-MiniRedir/6.1.7601 -X LOCK -v http://localhost:7001/repository/default/test.docx --data "@LOCK_document.xml" | xmllint --format - | tee LOCK_document.txt
export LOCK_token=$(grep opaquelocktoken LOCK_document.txt | sed 's/^.*opaquelocktoken:/<opaquelocktoken:/' | sed 's/<\/D:href>.*$/>/')

curl -A "Microsoft Office Existence Discovery" -X HEAD -v http://localhost:7001/repository/default/test.docx
curl -A Microsoft-WebDAV-MiniRedir/6.1.7601 -X OPTIONS -v http://localhost:7001/ -H "translate: f"

# Edit document in Word
libreoffice test.docx 

# Save document in Word
curl -A Microsoft-WebDAV-MiniRedir/6.1.7601 -X HEAD -v http://localhost:7001/repository/default/test.docx
curl -A Microsoft-WebDAV-MiniRedir/6.1.7601 -X PUT -v http://localhost:7001/repository/default/test.docx -H "If: (${LOCK_token})" --data-binary "@test.docx"
cat > PROPPATCH_document.xml <<EOF
<?xml version="1.0" encoding="utf-8" ?>
<D:propertyupdate xmlns:D="DAV:" xmlns:Z="urn:schemas-microsoft-com:">
  <D:set>
    <D:prop>
      <Z:Win32CreationTime>Mon, 09 Mar 2015 15:24:36 GMT</Z:Win32CreationTime>
      <Z:Win32LastAccessTime>Mon, 16 Mar 2015 13:22:40 GMT</Z:Win32LastAccessTime>
      <Z:Win32LastModifiedTime>Mon, 16 Mar 2015 13:22:40 GMT</Z:Win32LastModifiedTime>
    </D:prop>
  </D:set>
</D:propertyupdate>
EOF
curl -A Microsoft-WebDAV-MiniRedir/6.1.7601 -X PROPPATCH -v http://localhost:7001/repository/default/test.docx -H "If: (${LOCK_token})" --data "@PROPPATCH_document.xml" | xmllint --format -

# Close document in Word
curl -A "Microsoft Office Existence Discovery" -X HEAD -v http://localhost:7001/repository/default/test.docx
curl -A Microsoft-WebDAV-MiniRedir/6.1.7601 -X UNLOCK -v http://localhost:7001/repository/default/test.docx -H "Lock-Token: ${LOCK_token}"

# Checkin document
curl -A Microsoft-WebDAV-MiniRedir/6.1.7601 -X CHECKIN -v http://localhost:7001/repository/default/test.docx

# Version tree report on document
cat > REPORT_version-tree.xml <<EOF
<?xml version="1.0" encoding="utf-8" ?>
<D:version-tree xmlns:D="DAV:">
 <D:prop>
   <D:version-name/>
 </D:prop>
</D:version-tree>
EOF
curl -A Microsoft-WebDAV-MiniRedir/6.1.7601 -X REPORT -v http://localhost:7001/repository/default/test.docx --data "@REPORT_version-tree.xml" | xmllint --format -

我只有Jackrabbit的自动版本功能出现问题,这些功能显然尚未实现。

https://issues.apache.org/jira/browse/JCR-1348

#<!--
# see http://www.webdav.org/specs/rfc3253.html#PROPERTY_auto-version
#      <D:auto-version>checkout-checkin</D:auto-version>
#      <D:auto-version>checkout-unlocked-checkin</D:auto-version>
#      <D:auto-version>checkout</D:auto-version>
#      <D:auto-version>locked-checkout</D:auto-version>
#-->
cat > PROPPATCH_auto-version.xml <<EOF
<?xml version="1.0" encoding="utf-8" ?>
<D:propertyupdate xmlns:D="DAV:">
  <D:set>
    <D:prop>
      <D:auto-version>checkout-checkin</D:auto-version>
    </D:prop>
  </D:set>
</D:propertyupdate>
EOF
curl -A Microsoft-WebDAV-MiniRedir/6.1.7601 -X PROPPATCH -v http://localhost:7001/repository/default/test.docx -H "If: (${LOCK_token})" --data "@PROPPATCH_auto-version.xml" | xmllint --format -

答案 1 :(得分:0)

  

据我所知,JCR版本控制框架有效地围绕着混合:可版本化的JCR mixin节点类型(Jackrabbit Wiki)。因此,如果一个节点被创建为类型mix:versionable,那么我假设传统的WebDAV签入和签出操作 - 可以用WebDAV API封装 - 那些可能就是人们如何进行JCR签入/签出操作在可版本化的节点上。我认为,这将回答大部分问题

     

我没有看到任何确切的DAV对JCR检查点操作的称赞,但是如果只是签入后签入,正如文档所解释的那样,那么通过DAV模拟就足够了 - 从而对JCR进行了补充操作