如何在Jackrabbit中直接在root下导入系统视图XML?

How to import system view XML directly under root in Jackrabbit?

我有一个系统视图 XML 从 ModeShape (4.1) 存储库转储,我尝试将其导入 Jackrabbit (2.8)。

我的 XML 的根节点包含一个名为 "jcr:root" 的节点(但我已经注释掉了 "jcr:uuid" 和 "jcr:primaryType" ("mode:root" ) 因为 Jackrabbit 似乎不喜欢这些)。

我导入 XML 使用:

session.importXML("/", stream, ImportUUIDBehavior.IMPORT_UUID_COLLISION_THROW);

XML 看起来像(我手写了这个,因为我在一个封闭的网络上,所以忽略名称空间,它们 没问题 :-):

<?xml version="1.0" encoding="UTF-8" ?>
<sv:node xmlns:jcr=".../jcr/1.0" xmlns:sv=".../sv/1.0" ... sv:name="jcr:root">
   <!-- jcr:uuid and jcr:primaryType properties commented out... -->
   <sv:node sv:name="Messages">
      ...
   </sv:node>
</sv:node>

将其导入 Jackrabbit 没有任何错误,但是,导入会在真正的存储库根节点下创建一个名为 "jcr:root"(包含 "Messages")的新节点,而不是将 "Messages" 节点直接位于存储库根节点下(与 ModeShape 一样)。

即,我得到:

/jcr:root/Messages

而不是我的预期:

/Messages

(我也尝试设置 "jcr:uuid" 与 Jackrabbit 存储库匹配,IMPORT_UUID_COLLISION_REPLACE_EXISTING,但出现无法替换根节点的异常。

如何将其正确导入到 Jackrabbit 中,直接位于根节点下?

更新:

在阅读 JCR spec, section 11.9, "Importing jcr:root" 时,Jackrabbit 和 ModeShape 似乎都没有做正确的事情。尽管我有点喜欢 ModeShape 的行为。

Jackrabbit 的行为似乎与规范中针对 IMPORT_UUID_CREATE_NEW 所说的一样(并且没有特别对待 jcr:root)。如果我将 jcr:uuid 属性 添加为当前存储库根节点的值,它将按指定工作。

ModeShape 只是合并根,似乎根本不关心碰撞(这实际上是合理的,但不符合规范中定义的任何行为)。

...还是我错了? :-)

我应该尝试的一个显而易见的解决方案是将 "Messages" 节点移动到 XML 文档的根目录。

<?xml version="1.0" encoding="UTF-8" ?>
<sv:node sv:name="Messages" xmlns...>
   ...
</sv:node>

(不幸的是,我在根目录下有多个节点,所以我需要创建多个 XML 导出。不优雅,但可能可行)。