如何在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 导出。不优雅,但可能可行)。
我有一个系统视图 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 导出。不优雅,但可能可行)。