Validation(検証)  目次

Oracle Service RegistryのValidation(検証)デモでは、カスタム値セットの検証サービスを実装、デプロイ、使用する方法を示します。

値セット検証APIによって、checked分類のkeyedReference内で使用される値を検証するためのメソッドが提供されます。チェックには、非常に単純なもの(InternalValidationサービスにあるような、利用可能な値のリストに照らし合わせて値をチェックする)から複雑なもの(状況チェックを実行する)まであります。

Validation(検証)デモで使用される分類をインポートするために、2つのクラスと1つのxmlファイルが用意されています。

ISBNValidation 値セット検証インタフェースの実装です。すべての構造においてkeyedReferenceのkeyValueをチェックします。keyValueはISBN形式である必要があります。それ以外の場合は、E_invalidValue UDDI例外がスローされ、保存操作が拒否されます。

isbn.xml checkedカテゴリ化demo:ISBNをOracle Service Registryにインポートするために使用される分類の記述です。

ValidationDemo ISBNValidationで検証されたdemo:ISBNカテゴリ化を使用するkeyedReferenceが含まれるtModelの保存方法のデモンストレーションです。

前提条件および準備手順: コード  目次

Oracle Service Registryがすでにインストールされ、環境変数REGISTRY_HOMEにレジストリのインストール場所が設定されていることを想定しています。

Oracle Service Registryのデモを実行するには、レジストリが実行中である必要があります。

デモを構成する必要があります。構成システムには、グローバルとローカルの2つのレベルがあります。グローバル・レベルで定義されたプロパティは、ローカル・レベルで上書きできます。グローバル・プロパティは、次のファイルにあります。

Windows: %REGISTRY_HOME%¥demos¥env.properties
UNIX: $REGISTRY_HOME/demos/env.properties

Oracle Service Registryのインストール中に設定された値はそのまま使用でき、値の変更はすべてのデモに影響を与えます。単一のデモについて(つまりローカル・レベルで)一部のプロパティの値を再定義する必要がある場合は、env.propertiesを編集してください。このファイルは、ファイルrun.shrun.bat)と同じディレクトリにあります。Validationのデモのローカル・レベルのプロパティは、次のファイルからロードされます。

Windows: %REGISTRY_HOME%¥demos¥advanced¥validation¥env.properties
UNIX: $REGISTRY_HOME/demos/advanced/validation/env.properties

表10 デモで使用されるプロパティ

名前デフォルト値説明
uddi.demos.user.john.namedemo_john1人目のユーザーの名前
uddi.demos.user.john.passworddemo_john1人目のユーザーのパスワード
uddi.demos.url.publishinghttp://localhost:8888/registry/uddi/publishingパブリッシュWebサービス・ポートのURL
uddi.demos.url.securityhttp://localhost:8888/registry/uddi/securityセキュリティWebサービス・ポートのURL

プレゼンテーションおよび機能プレゼンテーション  目次

この項では、ISBNValidationクラスで使用されるプログラミング・パターンについて説明します。ソース・コードは次のファイルにあります。

Windows: %REGISTRY_HOME%¥demos¥advanced¥validation¥src¥demo¥uddi¥validation¥ISBNValidation.java
UNIX: $REGISTRY_HOME/demos/advanced/validation/src/demo/uddi/validation/ISBNValidation.java

Oracle Service Registryでは、Valueset(値セット)検証サービスの開発が簡略化されます。分類(categoryBagの内容)のプロパティに基づいていくつかのチェックが自動的にインテリジェントに実行されるので、開発者は検証サービスのロジックに集中できます。たとえば、カテゴリ化tModelKeyがidentifierBagで使用されていないこと、または互換性が宣言されているUDDI構造でのみ使用されていることなどが確認されます。

validate_valuesメソッドの説明から始めます。このメソッドは、検証サービスの開始ポイントとして機能します。Validate_valuesオブジェクトには、tModel、businessEntity、businessService、bindingTemplate、publisherAsertionのうち少なくとも1つが含まれており、その中にはこのWebサービスで検証された分類への参照が含まれています。検証サービスが複数の分類で共有される場合は、それを使用するUDDI構造が1つのvalidate_valuesコールにグループ化されます。

検証する構造タイプがメソッドvalidate_valuesによって見つけられると、この構造タイプによってUDDI構造のリストでvalidate_valuesがコールされてリストの各エレメントで反復され、1つの構造上でvalidateメソッドがコールされます。dispositionReportにエラーが1つでもある場合は、UDDI例外がスローされ、保存処理が拒否されます。

public DispositionReport validate_values(Validate_values body) throws UDDIException {
    DispositionReport report = new DispositionReport();

    if (body.getBusinessEntityArrayList() != null)
        validate_values(body.getBusinessEntityArrayList(), report);

    else if (body.getBusinessServiceArrayList() != null)
        validate_values(body.getBusinessServiceArrayList(), report);

    else if (body.getTModelArrayList() != null)
        validate_values(body.getTModelArrayList(), report);

    else if (body.getPublisherAssertionArrayList() != null)
        validate_values(body.getPublisherAssertionArrayList(), report);

    else if (body.getBindingTemplateArrayList() != null)
        validate_values(body.getBindingTemplateArrayList(), report);

    ResultArrayList results = report.getResultArrayList();
    if (results == null || results.size() == 0)
        return DispositionReport.DISPOSITION_REPORT_SUCCESS;

    throw new UDDIException(report);
}

次にこのメソッドにより、すべてのkeyedReferenceが検証され、構造に子(businessEntity内のbusinessServiceなど)が含まれる場合は、それも再帰的に検証されます。 demo:ISBNカテゴリ化では、identifierBagをチェックしても意味がありません。Oracle Service Registryによってあらかじめエラーとして検出され、保存処理の実行が停止されるためです。

private void validate(TModel tModel, DispositionReport report) throws UDDIException {
    CategoryBag categoryBag = tModel.getCategoryBag();
    IdentifierBag identifierBag = tModel.getIdentifierBag();
    KeyedReferenceArrayList keyedReferences;

    if (categoryBag != null) {
        keyedReferences = categoryBag.getKeyedReferenceArrayList();
        if (keyedReferences != null) {
            validate(keyedReferences, report);
        }

        validateKeyedReferenceGroups(categoryBag.getKeyedReferenceGroupArrayList(), report);
    }

    if (identifierBag != null) {
        keyedReferences = identifierBag.getKeyedReferenceArrayList();
        if (keyedReferences != null) {
            validate(keyedReferences, report);
        }
    }
}

メソッドvalidateによってすべてのkeyedReferenceが反復され、これらがdemo:ISBN分類を参照する場合は、keyValueが有効なISBN形式であるかどうかがチェックされます。有効な形式ではない場合は、dispositionReportにエラーレポートが追加されます。

private void validate(KeyedReferenceArrayList keyedReferenceArrayList, DispositionReport report)
  throws UDDIException {
    for (Iterator iter = keyedReferenceArrayList.iterator(); iter.hasNext();) {
        KeyedReference keyedReference = (KeyedReference) iter.next();
        if (TMODEL_KEY.equalsIgnoreCase(keyedReference.getTModelKey())) {
            if (!checkISBN(keyedReference.getKeyValue())) {
                String message = "KeyValue is not valid ISBN number in " + keyedReference.toXML();
                report.addResult(createResult(UDDIErrorCodes.E_INVALID_VALUE, message));
            }
        }
    }
}

ISBNValidation Webサービスの実装は最適ではありません。 Oracle Service Registryがその使用を拒否するように構成されている場合でも、すべてのUDDI構造およびkeyedReferencesのコンテナがスキャンされます。最適なコードでは、tModel内のcategoryBagのみがチェックされます。

デモのビルドと実行  目次

この項では、Oracle Service RegistryのAdvancedのValidationデモをビルド、デプロイ、実行する方法を示します。

  1. デモが適切に構成され、Oracle Service Registryが実行中であることを確認してください。

  2. 次のディレクトリに移動します。

    Windows: %REGISTRY_HOME%¥demos¥advanced¥validation
    UNIX: $REGISTRY_HOME/demos/advanced/validation

  3. 次のコマンドを使用して、すべてのクラスをビルドします。

    Windows: run.bat make
    UNIX: ./run.sh make

    注意注意

    Windowsプラットフォームでデモをコンパイルすると、次のテキストが表示されることがあります。

    A subdirectory or file ..\..\common\.\build\classes already exists.

    これは予想される現象であり、問題を示すものではありません。

  4. ファイルISBNValidation.classをREGISTRY_HOME/app/uddi/services/Wasp-inf/classesにコピーします。

    Windows: cd %REGISTRY_HOME%¥demos¥advanced¥validation¥build
      xcopy classes %REGISTRY_HOME%¥app¥uddi¥services¥Wasp-inf¥classes /S
    UNIX: cd $REGISTRY_HOME/demos/advanced/validation/build
      cp -r classes $REGISTRY_HOME/app/uddi/services/Wasp-inf
  5. 次に、AdvancedのTaxonomyデモのUploadTaxonomyを使用して、Validation demoディレクトリのdataサブディレクトリにあるファイルisbn.xmlをアップロードします。詳細および方法は、Taxonomy(分類)デモのドキュメントを参照してください。

  6. demo:ISBN分類がアップロードされ、ISBNValidation.classがコピーされたら、Oracle Service Registryをシャットダウンし、REGISTRY_HOME/workディレクトリを削除してから、Oracle Service Registryを再起動する必要があります。

  7. ValidationDemoは、コマンドrunを使用して次のようにして実行できます。

    Windows: run.bat ValidationDemo
    UNIX: ./run.sh ValidationDemo

    このデモの出力は次のようになります。

  8. デモを再ビルドするには、run.bat clean./run.sh clean)を実行してclassesディレクトリを削除し、run.bat make./run.sh make)を実行してデモ・クラスを再ビルドします。