ファイルのアップロードは、基本的にJCR2.0でもJCR1.0でも同じです。ただし、JCR 2.0には、便利な組み込みのプロパティ定義がいくつか追加されています。
「nt:file」ノードタイプはファイルを表すことを目的としており、JCR 2.0には2つの組み込みプロパティ定義があります(どちらもノードの作成時にリポジトリによって自動作成されます)。
- jcr:created(DATE)
- jcr:createdBy(STRING)
「jcr:content」という名前の単一の子を定義します。この「jcr:content」ノードは任意のノードタイプにすることができますが、一般的に言えば、コンテンツ自体に関連するすべての情報はこの子ノードに格納されます。デファクトスタンダードは、次のプロパティが定義されている「nt:resource」ノードタイプを使用することです。
- jcr:data(BINARY)必須
- jcr:lastModified(DATE)自動作成
- jcr:lastModifiedBy(STRING)自動作成
- jcr:mimeType(STRING)は保護されていますか?
- jcr:encoding(STRING)保護されていますか?
「jcr:mimeType」と「jcr:encoding」がJCR2.0で追加されたことに注意してください。
特に、「jcr:mimeType」プロパティの目的は、要求していることを正確に実行することでした。つまり、コンテンツの「タイプ」をキャプチャします。ただし、「jcr:mimeType」および「jcr:encoding」プロパティ定義は、保護されたものとして(JCR実装によって)定義できます(つまり、JCR実装が自動的に設定します)。この場合、手動で定義することはできません。これらのプロパティを設定します。JackrabbitとModeShapeはこれらを保護されたものとして扱っていないと思います。
これらの組み込みノードタイプを使用してファイルをJCR2.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」ノードタイプでは追加のプロパティを使用できません。 。したがって、他のプロパティを追加する前に、まず、保存するプロパティの種類のプロパティ定義を持つミックスイン(または複数のミックスイン)を追加する必要があります。任意のプロパティを許可するミックスインを定義することもできます。このようなミックスインを定義する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");
ダブリンコア要素を許可するミックスインを定義して使用することもできます。
<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)
これらのプロパティはすべてオプションであり、このミックスインでは名前やタイプのプロパティを使用できません。また、これらの一部はすでに組み込みのプロパティ( "jcr:createBy"、 "jcr:lastModifiedBy"、 "jcr:created"など)で表されているため、この'dc:metadata'ミックスでは実際には対処していません。 、"jcr:lastModified"、 "jcr:mimeType")であり、それらの一部はコンテンツに関連している可能性があり、その他はファイルに関連している可能性があります。
もちろん、必要に応じて継承を使用して、メタデータのニーズにより適した他のミックスインを定義することもできます。ただし、ミックスインで継承を使用する場合は注意が必要です。JCRではノードが複数のミックスインに対応できるため、スコープが厳密でファセット指向になるようにミックスインを設計するのが最適な場合がよくあります(たとえば、「ex:taggable」、「ex:describable」など)。次に、必要に応じて適切なミックスインをノードに適用します。
(はるかに複雑ですが、「nt:file」ノードの下でより多くの子を許可するミックスインを定義し、そこにメタデータを格納することも可能です。)
ミックスインは素晴らしく、JCRコンテンツに途方もない柔軟性とパワーを与えます。
ああ、必要なノードをすべて作成したら、必ずセッションを保存してください。
session.save();