1

組織内で使用されるWSDLおよびXSDのリポジトリを構築するためのいくつかのテクノロジーを評価しています。私たちが持っているオプションの1つは、ApacheJackRabbitを使用することです。、JCR1.0および2.0を実装します。コンテンツのアップロード、認証、バージョン管理に関する私たちの期待をほぼ満たしています。ただし、WSDLとXSDを含むいくつかのメタデータ(createdBy、lastModifiedBy、lastModifiedTimeなど)をリポジトリにアップロードすることも計画しています。JackRabbitのWebサイトのStackOverflow、JCR仕様、およびwikiページのいくつかの投稿を読みましたが、完全には理解していませんでした-アップロードしているメタデータを検証する方法は?たとえば、メタデータをXML形式のコンテンツとしてアップロードする場合、リポジトリでXMLをXMLスキーマに対して検証する必要があります。JCR APIに関して、 Session.importXMLを介してXMLコンテンツをインポートしながらXMLの検証を有効にする方法はありますか?

4

2 に答える 2

2

Randallが言うように、JCR APIは、コンテンツの保存中にコンテンツを検証するためのフックを提供しません。

一般的なパターンの1つは、データをJCRツリーの中間の場所(たとえば/ incoming)にアップロードし、JCRオブザーバーにこの受信データを監視させ、検証して、有効な場合は最終的な場所に移動させることです。

もう1つのオプションは、JCRリポジトリーの上にOSGiベースのスクリプト可能なアプリケーション層を提供するApacheSling[1]を使用することです。Slingを使用すると、たとえば、データを保存する前にデータを検証するために、HTTPPOSTリクエストをインターセプトできます。

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

于 2011-05-17T09:23:34.167 に答える
1

ModeShapeを見てみてください。これはオープンソース(LGPLライセンス)のJCR実装でもありますが、アップロードされたファイルから情報を自動的に取得し、その情報を構造化コンテンツ(ノードやプロパティのサブグラフなど)としてリポジトリに保存する「シーケンサー」の概念があります。他のリポジトリコンテンツと同じように、検索、クエリ、アクセスができる場所です。ModeShapeにはすでにかなりの数のシーケンスがありますが、WSDLまたはXSDシーケンサーはまだありません(2011年5月末頃の次のリリースで登場する予定です)。

私はModeShapeのプロジェクトリーダーであり、WSDLファイルとXSDファイル(およびその他のファイル形式)の保存にも使用しています。実際、私たちはJCRリポジトリを使用して、あらゆる種類の構造化メタデータを格納しています。

おっしゃるように、JCRはコンテンツをインポートする方法を提供しますが、インポートされるXMLファイルは、JCR仕様で定義されている2つの形式(システムビューとドキュメントビュー)のいずれかです。システムビューの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」ノードタイプの2つのノードが含まれています。'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ファイル(またはコンテンツ)がリポジトリにアップロードされていることを監視し、アップロードされたばかりのバイナリコンテンツをフェッチし、検証を実行する他のライブラリ。

最後に、アップロードしたファイルに追加のプロパティを保存する方法について説明します。ミックスインノードタイプを定義して使用する方法について、JCRの「nt:file」ノードと「nt:folder」ノードでこれを行う方法について説明したブログ投稿を少し前に書きました。

お役に立てれば。

于 2011-05-16T16:04:27.060 に答える