有人可以告诉我,在以下情况下如何进行?
接收文件(MS文件,ODS,PDF)
通过Apache Tika提取公元核心元数据+通过jackrabbit-content-extractors提取内容
使用Jackrabbit将文档(内容)及其元数据存储到存储库中 ?
检索文档+元数据
我对第3点和第4点感兴趣…
详细信息:该应用程序正在以交互方式处理文档(一些分析-语言检测,单词计数等。+收集尽可能多的详细信息- Dublin核心+解析内容/事件处理),以便将处理结果返回给用户,然后将其返回给用户。提取的内容和元数据(提取的和自定义的用户元数据)存储到JCR存储库中
感谢任何帮助,谢谢
对于JCR 2.0,上传文件基本上与对于JCR 1.0而言是相同的。但是,JCR 2.0添加了一些有用的附加内置属性定义。
“ nt:file”节点类型旨在表示文件,并且在JCR 2.0中具有两个内置属性定义(这两个属性定义都是在创建节点时由存储库自动创建的):
并定义一个名为“ jcr:content”的子级。该“ jcr:content”节点可以是任何节点类型,但是通常来说,与内容本身有关的所有信息都存储在此子节点上。事实上的标准是使用“ nt:resource”节点类型,该节点类型定义了以下属性:
注意,在JCR 2.0中添加了“ jcr:mimeType”和“ jcr:encoding”。
特别是,“ jcr:mimeType”属性的目的是完全按照您的要求执行-捕获内容的“类型”。但是,“ jcr:mimeType”和“ jcr:encoding”属性定义可以(通过JCR实现)定义为受保护(意味着JCR实现自动设置它们)-如果是这种情况,将不允许您手动进行设置这些属性。我相信Jackrabbit和ModeShape不会将它们视为受保护的对象。
以下是一些代码,显示了如何使用这些内置节点类型将文件上传到JCR 2.0存储库:
// Get an input stream for the file ... File file = ... InputStream stream = new BufferedInputStream(new FileInputStream(file)); Node folder = session.getNode("/absolute/path/to/folder/node"); Node file = folder.addNode("Article.pdf","nt:file"); Node content = file.addNode("jcr:content","nt:resource"); Binary binary = session.getValueFactory().createBinary(stream); content.setProperty("jcr:data",binary);
而且,如果JCR实现未将“ jcr:mimeType”属性视为受保护的对象(即Jackrabbit和ModeShape),则必须手动设置此属性:
content.setProperty("jcr:mimeType","application/pdf");
元数据可以很容易地存储在“ nt:file”和“ jcr:content”节点上,但是现成的“ nt:file”和“ nt:resource”节点类型不允许额外的属性。因此,在添加其他属性之前,首先需要添加一个mixin(或多个mixin),这些mixin具有要存储的各种属性的属性定义。您甚至可以定义允许任何属性的混合。这是一个定义此类混合的CND文件:
<custom = 'http://example.com/mydomain'> [custom:extensible] mixin - * (undefined) multiple - * (undefined)
注册此节点类型定义后,可以在节点上使用它:
content.addMixin("custom:extensible"); content.setProperty("anyProp","some value"); content.setProperty("custom:otherProp","some other value");
您还可以定义并使用允许所有Dublin Core元素使用的mixin :
<dc = 'http://purl.org/dc/elements/1.1/'> [dc:metadata] mixin - dc:contributor (STRING) - dc:coverage (STRING) - dc:creator (STRING) - dc:date (DATE) - dc:description (STRING) - dc:format (STRING) - dc:identifier (STRING) - dc:language (STRING) - dc:publisher (STRING) - dc:relation (STRING) - dc:right (STRING) - dc:source (STRING) - dc:subject (STRING) - dc:title (STRING) - dc:type (STRING)
所有这些属性都是可选的,并且该mixin不允许使用任何名称或类型的属性。我还没有真正解决“ dc:metadata”混合问题,因为其中一些已经用内置属性表示(例如,“ jcr:createBy”,“ jcr:lastModifiedBy”,“ jcr:created” ,“ jcr:lastModified”,“ jcr:mimeType”),其中一些可能与内容更相关,而其他一些与文件更相关。
您当然可以定义其他更适合您的元数据需求的混合,并在需要时使用继承。但是要谨慎使用继承与mixin- 由于JCR允许一个节点使用多个mixin,因此通常最好将mixin设计为范围狭窄且面向方面的(例如,“ ex:taggable”,“ ex:describable”等)。然后只需根据需要将适当的mixin应用于节点。
(甚至更复杂,甚至有可能定义一个混合,以便在“ nt:file”节点下允许更多子节点,并在其中存储一些元数据。)
Mixins非常棒,为您的JCR内容提供了极大的灵活性和力量。
哦,当您创建了所有想要的节点后,请确保保存会话:
session.save();