JCR中的内容验证

时间:2011-05-16 14:50:39

标签: jackrabbit jcr content-repository

我们正在评估一些技术来构建WSDL的存储库,以及我们组织内使用的XSD。我们的选择之一是使用实现JCR 1.0和2.0的Apache JackRabbit。它几乎满足了我们对上传内容,身份验证和版本控制的期望。但是,我们还计划将几个元数据(例如,createdBy,lastModifiedBy,lastModifiedTime等)与WSDL和XSD一起上传到存储库。我们已经阅读了JackRabbit网站上有关StackOverflow,JCR规范和维基页面的几篇文章,但是我们并不十分明白 - 我们上传的元数据如何得到验证?例如,如果我们将元数据上传为XML格式的内容,我们希望存储库根据XML模式验证XML。 就JCR API而言,有没有办法在通过Session.importXML导入XML内容时启用XML验证?

2 个答案:

答案 0 :(得分:2)

正如Randall所说,JCR API在您存储内容时不提供验证内容的钩子。

一种常见的模式是将数据上传到JCR树中的中间位置,例如/ incoming,并让JCR观察者观察此传入数据,验证它并将其移动到最终位置(如果有效)。

另一种选择是使用Apache Sling [1],它在JCR存储库之上提供基于OSGi的脚本化应用程序层。使用Sling,您可以拦截HTTP POST请求,例如,在存储之前验证数据。

[1] http://sling.apache.org

答案 1 :(得分:1)

您可以尝试查看ModeShape。它也是一个开源(LGPL许可的)JCR实现,但它有“sequencers”的概念,它自动从上传的文件中获取信息并将该信息存储为结构化内容(例如,节点和属性的子图)在存储库中,可以像任何其他存储库内容一样搜索,查询和访问它。 ModeShape已经有相当多的序列,但还没有WSDL或XSD序列发生器(它们计划在下一个版本中出现,大约在2011年5月底)。

我是ModeShape的项目主管,我也用它来存储WSDL和XSD文件(以及其他文件格式)。实际上,我们使用JCR存储库来存储各种结构化元数据。

正如您所提到的,JCR确实提供了一种导入内容的方法,但导入的XML文件是JCR规范(系统视图和文档视图)定义的两种格式之一。 System View XML格式使用特定于JCR的元素和属性,而文档视图将元素映射到节点和属性到属性(它实际上有点细微差别)。并且因为此导入过程将导致其他存储库内容(节点和属性),JCR存储库会使用JCR的节点类型机制验证此结构。

以下是文档视图格式的XML文件示例:

<?xml version="1.0" encoding="UTF-8"?>
<Hybrid xmlns:car="http://www.modeshape.org/examples/cars/1.0" 
        xmlns:jcr="http://www.jcp.org/jcr/1.0" 
        xmlns:nt="http://www.jcp.org/jcr/nt/1.0" 
        xmlns:mix="http://www.jcp.org/jcr/mix/1.0" 
        jcr:primaryType="nt:unstructured" 
        jcr:uuid="7e999653-e558-4131-8889-af1e16872f4d"
        jcr:mixinTypes="mix:referenceable">
    <Toyota_x0020_Prius jcr:primaryType="car:Car" 
          jcr:mixinTypes="mix:referenceable" 
          jcr:uuid="e92eddc1-d33a-4bd4-ae36-fe0a761b8d89" 
          car:year="2008" car:msrp="$21,500" car:mpgHighway="45" 
          car:model="Prius" car:valueRating="5" car:maker="Toyota" 
          car:mpgCity="48" car:userRating="4"/>
    <Toyota_x0020_Highlander jcr:primaryType="car:Car" 
          jcr:mixinTypes="mix:referenceable" 
          jcr:uuid="f6348fbe-a0ba-43c4-9ae5-3faff5c0f6ec" 
          car:year="2008" car:msrp="$34,200" car:mpgHighway="25" 
          car:model="Highlander" car:valueRating="5" car:maker="Toyota" 
          car:mpgCity="27" car:userRating="4"/>
</Hybrid>

这里,'Hybrid'是一个'nt:unstructured'节点,它包含两个类型为'car:Car'节点的节点。 'car:Car'节点类型定义如下:

[car:Car] > nt:unstructured, mix:created
  - car:maker (string)
  - car:model (string)
  - car:year (string) < '(19|20)\d{2}'  // any 4 digit number starting with '19' or '20'
  - car:msrp (string) < '[$]\d{1,3}[,]?\d{3}([.]\d{2})?'   // of the form "$X,XXX.ZZ", "$XX,XXX.ZZ" or "$XXX,XXX.ZZ" 
                                                           // where '.ZZ' is optional
  - car:userRating (long) < '[1,5]'                        // any value from 1 to 5 (inclusive)
  - car:valueRating (long) < '[1,5]'                       // any value from 1 to 5 (inclusive)
  - car:mpgCity (long) < '(0,]'                            // any value greater than 0
  - car:mpgHighway (long) < '(0,]'                         // any value greater than 0
  - car:lengthInInches (double) < '(0,]'                   // any value greater than 0
  - car:wheelbaseInInches (double) < '(0,]'                // any value greater than 0
  - car:engine (string)
  - car:alternateModels (reference)  < 'car:Car'

如果此节点类型在JCR存储库中注册,则它将确保导入的内容结构对于节点类型定义有效。

如果您正在讨论验证内容的值(例如,元数据值,二进制文件的结构等),我不知道任何可以开箱即用的JCR存储库实现。 JCR存储库更通用,因此这将是您的应用程序可以通过使用JCR事件侦听器来观察何时将新XML文件(或内容)上载到存储库,获取刚刚上载的二进制内容以及使用其他库来执行验证。

最后,您谈到在上传的文件中存储额外的属性。我前段时间写了blog post,讨论了如何使用JCR'nt:file'和'nt:folder'节点定义和使用mixin节点类型。

希望这有帮助。