8

次のシナリオでどのように進めるか、誰でも私に説明できますか?

  1. ドキュメントの受信 (MS ドキュメント、ODS、PDF)

  2. Apache Tika による二重コア メタデータ抽出 + jackrabbit-content-extractors によるコンテンツ抽出

  3. Jackrabbit を使用して、ドキュメント (コンテンツ) をメタデータと共にリポジトリに保存しますか?

  4. ドキュメント + メタデータの取得

ポイント3と4に興味があります...

詳細: アプリケーションは対話的にドキュメントを処理しています (いくつかの分析 - 言語検出、単語カウントなど + 可能な限り多くの詳細を収集 - Dublin コア + コンテンツ/イベント処理の解析) 処理の結果をユーザーに返し、次に抽出されたコンテンツとメタデータ (抽出されたカスタム ユーザー メタデータ) が JCR リポジトリに保存されます

助けてくれてありがとう、ありがとう

4

3 に答える 3

32

ファイルのアップロードは、基本的に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();
于 2011-03-02T15:46:35.280 に答える
1

私は Jackrabbit を初めて使用し、2.4.2 に取り組んでいます。ソリューションに関しては、コア Java ロジックを使用してタイプをチェックし、アクションのバリエーションを定義するケースを配置できます。

コンテンツがバイナリに変換されて保存されるため、異なる .txt または .pdf のコンテンツを保存する際の問題を心配する必要はありません。これは、jackrabbit リポジトリ内/リポジトリから pdf ファイルをアップロードおよびダウンロードした小さなサンプルです。

    // Import the pdf file unless already imported 
            // This program is for sample purpose only so everything is hard coded.
        if (!root.hasNode("Alfresco_E0_Training.pdf"))
        { 
            System.out.print("Importing PDF... "); 

            // Create an unstructured node under which to import the XML 
            //Node node = root.addNode("importxml", "nt:unstructured"); 
            Node file = root.addNode("Alfresco_E0_Training.pdf","nt:file");

            // Import the file "Alfresco_E0_Training.pdf" under the created node 
            FileInputStream stream = new FileInputStream("<path of file>\\Alfresco_E0_Training.pdf");
            Node content = file.addNode("jcr:content","nt:resource");
            Binary binary = session.getValueFactory().createBinary(stream);
            content.setProperty("jcr:data",binary);
            stream.close();
            session.save(); 
            //System.out.println("done."); 
            System.out.println("::::::::::::::::::::Checking content of the node:::::::::::::::::::::::::");
            System.out.println("File Node Name : "+file.getName());
            System.out.println("File Node Identifier : "+file.getIdentifier());
            System.out.println("File Node child : "+file.JCR_CHILD_NODE_DEFINITION);
            System.out.println("Content Node Name : "+content.getName());
            System.out.println("Content Node Identifier : "+content.getIdentifier());
            System.out.println("Content Node Content : "+content.getProperty("jcr:data"));
            System.out.println(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::");

        }else
        {
            session.save();
            Node file = root.getNode("Alfresco_E0_Training.pdf");
            Node content = file.getNode("jcr:content");
            String path = content.getPath();
            Binary bin = session.getNode(path).getProperty("jcr:data").getBinary();
            InputStream stream = bin.getStream();
             File f=new File("C:<path of the output file>\\Alfresco_E0_Training.pdf");

              OutputStream out=new FileOutputStream(f);
              byte buf[]=new byte[1024];
              int len;
              while((len=stream.read(buf))>0)
              out.write(buf,0,len);
              out.close();
              stream.close();
              System.out.println("\nFile is created...................................");


            System.out.println("done."); 
            System.out.println("::::::::::::::::::::Checking content of the node:::::::::::::::::::::::::");
            System.out.println("File Node Name : "+file.getName());
            System.out.println("File Node Identifier : "+file.getIdentifier());
            //System.out.println("File Node child : "+file.JCR_CHILD_NODE_DEFINITION);
            System.out.println("Content Node Name : "+content.getName());
            System.out.println("Content Node Identifier : "+content.getIdentifier());
            System.out.println("Content Node Content : "+content.getProperty("jcr:data"));
            System.out.println(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::");
        } 

        //output the repository content
        } 
    catch (IOException e){
        System.out.println("Exception: "+e);
    }
    finally { 
        session.logout(); 
        } 
        } 
}

お役に立てれば

于 2012-07-25T05:39:00.050 に答える
1

私は JCR に少し慣れておらず、2.0 を使用したことはありませんが、これで始められるはずです。

このリンクを参照してください。2 番目のコメントを開きます。

ファイルをノードに保存し、追加のメタデータをノードに追加するだけです。ファイルの保存方法は次のとおりです。

Node folder = session.getRootNode().getNode("path/to/file/uploads"); 
Node file = folder.addNode(fileName, "nt:file"); 
Node fileContent = file.addNode("jcr:content"); 
fileContent.setProperty("jcr:data", fileStream);
// Add other metadata
session.save();

メタデータをどのように保存するかはあなた次第です。簡単な方法は、キーと値のペアを保存することです。

fileContent.setProperty(key, value, PropertyType.STRING);

を呼び出すだけでデータを読み取ることができますgetProperty()

fileStream = fileContent.getProperty("jcr:data");
value = fileContent.getProperty(key);
于 2011-03-01T23:31:45.707 に答える