この章では、JAXR で提供されているレジストリ検索用のインタフェースとメソッドについて説明します。ここでは、次のトピックについて説明します。
クライアントがレジストリを使用するもっとも単純な形態は、レジストリ内にあるオブジェクトやデータについての情報の検索です。QueryManager、 BusinessQueryManager、および RegistryObject の各インタフェースでは、多くの検索メソッドおよび取得メソッドがサポートされています。これらのメソッドによって、クライアントは JAXR 情報モデルを使用してデータを検索できます。多くの検索メソッドは BulkResponse を返します。BulkResponse は、メソッドの引数に指定された一連の条件を満たすオブジェクトのコレクションです。これらのメソッドのうち、もっとも一般的なものは次のとおりです。
getRegistryObject と getRegistryObjects。これらの QueryManager メソッドは、引数とともに使用すると、オブジェクト型または一意の識別子に基づいて 1 つまたは複数のオブジェクトを返します。引数を指定しない場合、getRegistryObjects メソッドは呼び出し元に所有されているオブジェクトを返します。一意の識別子については、「一意の識別子によるオブジェクトの検索」を参照してください。
findObjects。BusinessQueryManager クラスの実装固有のメソッド。指定された条件を満たし、指定された型を持つすべてのオブジェクトのリストを返します。
他の検索メソッドでは、JAXR 情報モデルでサポートされている特定の種類のオブジェクトを検索できます。UDDI レジストリでは、オブジェクトの特定の階層がサポートされます。すなわち、ユーザー、サービス、およびサービスバインディングを含む組織です。一方、ebXML レジストリでは、独立したさまざまな型のオブジェクトの格納を可能にし、いろいろな方法でオブジェクトどうしをリンクできます。ほかのオブジェクトは、独立したオブジェクトではなく、常に別のオブジェクトの属性になります。
BusinessQueryManager の検索メソッドは、主に UDDI レジストリの検索に役立ちます。より一般的な findObjects メソッドと RegistryObject の取得メソッドは、Service Registry に適しています。
クエリーを実行するためにレジストリにログインする必要はありません。デフォルトでは、未認証のユーザーには「Registry Guest」というユーザーアイデンティティーが付与されます。
表 3–1 に、JAXR 情報モデルでサポートされている主要なインタフェースを示します。これらのインタフェースはすべて、RegistryObject インタフェースを拡張します。
より詳しい説明と、これらのインタフェース間の関係を示す図については、javax.xml.registry.infomodel パッケージの API ドキュメント (http://java.sun.com/j2ee/1.4/docs/api/javax/xml/registry/infomodel/package-summary.html) を参照してください。
表 3–1 JAXR RegistryObject のサブインタフェース
インタフェース名 |
説明 |
---|---|
2 つのオブジェクトの関係を定義します。 取得メソッドおよび検索メソッド: RegistryObject.getAssociations、BusinessQueryManager.findAssociations、BusinessQueryManager.findCallerAssociations |
|
オブジェクトに加えられた変更の履歴を表します。AuditableEvent オブジェクトのコレクションで、オブジェクトの監査証跡が構成されます。 取得メソッド: RegistryObject.getAuditTrail |
|
ClassificationScheme を使用してオブジェクトを分類します。 取得メソッド: RegistryObject.getClassifications |
|
オブジェクトの分類に使用される分類方式を表します。内部 ClassificationScheme では、すべての分類方式の要素は Concept インスタンスとしてレジストリに定義されます。外部 ClassificationScheme では、値はレジストリで Concept インスタンスとして定義されるのではなく、その String 表現によって参照されます。 検索メソッド: BusinessQueryManager.findClassificationSchemes、BusinessQueryManager.findClassificationSchemeByName |
|
分類方式の要素、および内部 ClassificationScheme のほかの要素との構造的関係を表します。ebXML 仕様では ClassificationNode と呼ばれます。 検索メソッド: BusinessQueryManager.findConcepts、BusinessQueryManager.findConceptByPath |
|
識別スキーマ (外部 ClassificationScheme) の内部で、String 値を使用してオブジェクトに関する追加情報を提供します。識別スキーマの例には、DUNS 番号や社会保障番号などがあります。 取得メソッド: RegistryObject.getExternalIdentifiers |
|
レジストリの外部に存在するコンテンツの URI を表します。 取得メソッド: RegistryObject.getExternalLinks |
|
レジストリに本来組み込まれていない型を持つコンテンツが送信された場合は、MIME タイプなどの追加の属性を使用して、そのコンテンツを記述する必要があります。このインタフェースは、そのようなメタデータを表します。 特定の取得メソッドや検索メソッドはありません。 |
|
組織に関する情報を表します。1 つの親組織、および 1 つ以上の子組織を持つことができます。常に主担当者として User オブジェクトを持ち、Service オブジェクトを提供することもできます。 検索メソッド: BusinessQueryManager.findOrganizations |
|
レジストリオブジェクトの論理的なグループ化を表します。RegistryPackage は任意の数の RegistryObject を持つことができます。 取得および検索メソッド: RegistryObject.getRegistryPackages、BusinessQueryManager.findRegistryPackages |
|
サービスに関する情報を表します。ServiceBinding オブジェクトの集合を持つことができます。 検索メソッド: BusinessQueryManager.findServices |
|
Service へのアクセス方法に関する技術情報を表します。 取得および検索メソッド: Service.getServiceBindings、BusinessQueryManager.findServiceBindings |
|
RegistryObject インスタンスに任意の属性を動的に追加する手段を提供します。 取得メソッド: RegistryObject.getSlot、RegistryObject.getSlots |
|
ServiceBinding と技術仕様のリンクを表します。技術仕様には、ServiceBinding を用いてサービスを利用する方法が記述されています。 取得メソッド: ServiceBinding.getSpecificationLinks |
|
レジストリ内の登録済みユーザーに関する情報を表します。User オブジェクトは Organization オブジェクトに関連付けられます。 取得メソッド: Organization.getUsers、Organization.getPrimaryContact |
表 3–2 に、JAXR 情報モデルでサポートされているその他のインタフェースを示します。これらのインタフェースは、主要なレジストリオブジェクトの属性を表します。これらのインタフェースは RegistryObject インタフェースを拡張しません。
表 3–2 属性として使用される JAXR 情報モデルのインタフェース
インタフェース名 |
説明 |
---|---|
電子メールアドレスを表します。User は 1 つの EmailAddress を持つことができます。 取得メソッド: User.getEmailAddresses |
|
複数のロケールに国際化できる String を表します。LocalizedString オブジェクトの Collection が含まれます。RegistryObject の名前と説明は InternationalString オブジェクトです。 取得メソッド: RegistryObject.getName、RegistryObject.getDescription |
|
RegistryObject を識別するオブジェクトです。一意の識別子の値を含みます。この値は DCE 128 UUID (Universal Unique IDentifier) である必要があります。 取得メソッド: RegistryObject.getKey |
|
String とその Locale を関連付ける、InternationalString のコンポーネントです。 取得メソッド: InternationalString.getLocalizedStrings |
|
個人の名前を表します。User は PersonName を 1 つ持ちます。 取得メソッド: User.getPersonName |
|
住所を表します。Organization または User は 1 つ以上の PostalAddress オブジェクトを持つことができます。 取得メソッド: Organization.getPostalAddress、OrganizationImpl.getPostalAddresses (実装に固有)、User.getPostalAddresses |
|
電話番号を表します。Organization または User は 1 つ以上の TelephoneNumber オブジェクトを持つことができます。 取得メソッド: Organization.getTelephoneNumbers、User.getTelephoneNumbers |
Service Registry 内のすべてのオブジェクトは、一意の識別子 (Key とも呼ばれる) と論理識別子の 2 つの識別子を持ちます。多くの場合、一意の識別子と論理識別子は同じです。しかし、あるオブジェクトが複数のバージョンで存在する場合、一意の識別子はバージョンごとに異なりますが、論理識別子は同じになります。(「オブジェクトのバージョンの取得」を参照)。
オブジェクトの一意の識別子の値がわかっている場合は、その String 値を引数として指定して QueryManager.getRegistryObject メソッドを呼び出すことで、オブジェクトを取得できます。たとえば、bqm という BusinessQueryManager インスタンスがあり、String 値が idString である場合は、次のコードでオブジェクトを取得できます。
RegistryObject obj = bqm.getRegistryObject(idString);
オブジェクトを取得したら、オブジェクトの型、名前、説明などの属性を取得できます。
一意の識別子によってオブジェクトを検索する例については、<INSTALL>/registry/samples/search-id/src ディレクトリにある JAXRSearchById.java を参照してください。このサンプルは、指定された一意の識別子を持つオブジェクトを検索します。
<INSTALL>/registry/samples/search-id ディレクトリに移動します。
次のコマンドを入力します。
asant run -Did=urn_value |
たとえば、次の ID を指定すると、ObjectType 分類方式に関する情報を取得できます。
urn:oasis:names:tc:ebxml-regrep:classificationScheme:ObjectType |
オブジェクトを名前で検索するには、通常、検索修飾子と名前パターンの組み合わせを使用します。検索修飾子はソートとパターンマッチングに作用します。名前パターンには検索する文字列を指定します。BusinessQueryManagerImpl.findObjects メソッドは、2 番目の引数として FindQualifier オブジェクトのコレクション、3 番目の引数として名前パターンのコレクションを取ります。メソッドシグニチャーは次のとおりです。
public BulkResponse findObjects(java.lang.String objectType, java.util.Collection findQualifiers, java.util.Collection namePatterns, java.util.Collection classifications, java.util.Collection specifications, java.util.Collection externalIdentifiers, java.util.Collection externalLinks) throws JAXRException
最初の引数にはオブジェクト型を指定しますが、通常は、LifeCycleManager インタフェースで定義されている一連の文字列定数の 1 つを指定します。
名前パターンにはワイルドカードを使用できます。パーセント記号 (%) を用いると、指定した検索文字列をオブジェクト名の先頭、中間、または末尾で検索するよう指定できます。次に例を示します。
nor% と指定すると、Nor または nor で始まる文字列を検索できます。たとえば、North や northern などです。
%off% と指定すると、文字列 off を含む文字列を検索できます。たとえば、Coffee などです。
%ica と指定すると、ica で終わる文字列を検索できます。たとえば、America などです。
1 文字分に相当するワイルドカードとして、下線 (_) も使用できます。たとえば、検索文字列 _us_ は、Aus1 や Bus3 などのオブジェクト名に一致します。
次のコードは、指定された文字列 searchString で始まる名前を持つすべての組織を Service Registry から検索し、見つかった組織名をアルファベット順にソートします。
// Define find qualifiers and name patterns Collection findQualifiers = new ArrayList(); findQualifiers.add(FindQualifier.SORT_BY_NAME_ASC); Collection namePatterns = new ArrayList(); namePatterns.add(searchString + "%"); // Find organizations with name that starts with searchString BulkResponse response = bqm.findObjects("Organization", findQualifiers, namePatterns, null, null, null, null); Collection orgs = response.getCollection();
FindQualifier.CASE_SENSITIVE_MATCH を指定しない限り、findObjects メソッドでは大文字と小文字が区別されません。上記のコードにおいて、最初の引数は "Organization" または "organization" のどちらでもよく、名前パターンは名前に一致します。大文字と小文字は区別されません。
次のコードは、文字列 searchString が名前に含まれているすべてのレジストリオブジェクトを検索し、アルファベット順にソートします。この検索では大文字と小文字を区別します。
Collection findQualifiers = new ArrayList(); findQualifiers.add(FindQualifier.CASE_SENSITIVE_MATCH); findQualifiers.add(FindQualifier.SORT_BY_NAME_ASC); Collection namePatterns = new ArrayList(); namePatterns.add("%" + searchString + "%"); // Find objects with name that contains searchString BulkResponse response = bqm.findObjects("RegistryObject", findQualifiers, namePatterns, null, null, null, null); Collection orgs = response.getCollection();
パーセント記号は任意の数の文字に一致します。1 文字に一致させるには、下線 (_) を使用します。たとえば、"Arg1" と "Org2" の両方に一致させるには、_rg_ という名前パターンを指定します。
名前によってオブジェクトを検索する例については、<INSTALL>/registry/samples/search-name/src ディレクトリにある JAXRSearchByName.java を参照してください。
<INSTALL>/registry/samples/search-name ディレクトリに移動します。
次のコマンドを入力して string 値を指定します。
asant run -Dname=string |
このプログラムは、大文字と小文字を区別せずに、指定された文字列が名前に含まれているすべてのオブジェクトを検索します。また、オブジェクトの分類、外部識別子、外部リンク、スロット、および監査証跡を表示します。
指定された型を持つすべてのオブジェクトを検索するには、BusinessQueryManagerImpl.findObjects メソッドの最初の引数だけを指定し、必要に応じて FindQualifier オブジェクトのコレクションも指定します。たとえば、typeString が "Service" または "service" という値を持つ文字列である場合、次のコードは、Service Registry 内のすべてのサービスを検索し、アルファベット順にソートします。
Collection findQualifiers = new ArrayList(); findQualifiers.add(FindQualifier.SORT_BY_NAME_ASC); BulkResponse response = bqm.findObjects(typeString, findQualifiers, null, null, null, null, null);
findObjects の最初の引数にはワイルドカードを使用できません。
型によってオブジェクトを検索する例については、<INSTALL>/registry/samples/search-object-type/src ディレクトリにある JAXRSearchByObjectType.java を参照してください。
<INSTALL>/registry/samples/search-object-type ディレクトリに移動します。
次のコマンドを入力して string 値を指定します。
asant run -Dtype=type_name |
このプログラムは、大文字と小文字を区別せずに、type_name で指定された型を持つすべてのオブジェクトを検索します。また、オブジェクトの名前、説明、および一意の識別子を表示します。次のコマンド行のように、ワイルドカードを使わずに型の名前を正確に指定してください。
asant run -Dtype=federation |
オブジェクトを分類によって検索するには、まず、特定の分類スキーマの内部での分類を確立します。次に、BusinessQueryManagerImpl.findObjects メソッドへの引数として分類を指定します。
特定の分類スキーマの内部で分類を確立するには、まず分類スキーマを検索します。次に、findObjects メソッドまたは別の検索メソッドへの引数として使用される Classification オブジェクトを作成します。
次のコードは、International Organization for Standardization (ISO) によって管理されている ISO 3166 国番号分類スキーマの内部の特定の分類に対応するすべての組織を検索します。詳細については、http://www.iso.org/iso/en/prods-services/iso3166ma/index.html を参照してください。この分類スキーマは、Service Registry に付属するサンプルデータベースで提供されています。
ClassificationScheme cScheme = bqm.findClassificationSchemeByName(null, "iso-ch:3166:1999"); Classification classification = blcm.createClassification(cScheme, "United States", "US"); Collection classifications = new ArrayList(); classifications.add(classification); // perform search BulkResponse response = bqm.findObjects("Organization", null, null, classifications, null, null, null); Collection orgs = response.getCollection();
ebXML Registry Information Model Specification (レジストリ情報モデル仕様) では、一連の標準的な分類スキーマを ebXML レジストリに用意しておく必要があります。各スキーマには、ebXML 仕様で ClassificationNode オブジェクトと呼ばれる一連の必須 Concept もあります。標準的な分類スキーマの主な目的は、オブジェクトを分類することではなく、オブジェクトの属性のタイプを列挙することです。たとえば、EmailType 分類スキーマでは、EmailAddress オブジェクトの type 属性の値が列挙されています。
表 3–3 に、これらの標準的な分類スキーマの概要を示します。
表 3–3 標準的な分類スキーマ
分類スキーマ |
説明 |
---|---|
RegistryObject どうしの関連付けのタイプを定義します。 |
|
コンテンツ管理サービスのタイプを定義します。 |
|
仕様で定義されているクラスの属性のデータ型を定義します。 |
|
RemoveObjectsRequest プロトコルメッセージの deletionScope 属性の値を定義します。 |
|
電子メールアドレスのタイプを定義します。 |
|
コンテンツ管理サービスのエラー処理モデルのタイプを定義します。 |
|
レジストリでプロトコルメッセージの処理中に発生するエラーの重要度のタイプを定義します。 |
|
レジストリで発生する可能性のあるイベントのタイプを定義します。 |
|
レジストリでコンテンツ管理サービスを呼び出す方法を定義します。 |
|
ClassificationScheme がその ClassificationNode の code 属性の値を割り当てる方法を定義します。 |
|
クライアントがレジストリから Subscription 内部のイベントの通知を受け取る方法を定義します。 |
|
レジストリでサポートできる RegistryObject のタイプを定義します。 |
|
電話番号のタイプを定義します。 |
|
レジストリでサポートされるクエリー言語を定義します。 |
|
RegistryResponse の状態のタイプを定義します。 |
|
RegistryObject の状態のタイプを定義します。 |
|
アクセス制御の目的で User が所属できるグループを定義します。 |
|
アクセス制御の目的で User に割り当てることのできるロールを定義します。 |
標準的な分類スキーマとその Concept を使用するオブジェクトを検索するために、パッケージ org.freebxml.common.CanonicalConstants で定義されている文字列定数を使用してオブジェクトを検索できます。定数の一覧については、「分類スキーマに対する定数」を参照してください。
まず、一意の識別子の値を使用して分類スキーマを検索します。
String schemeId = CanonicalConstants.CANONICAL_CLASSIFICATION_SCHEME_ID_SubjectRole; ClassificationScheme cScheme = (ClassificationScheme) bqm.getRegistryObject(schemeId); String schemeName = getName(cScheme);
次に、同じ方法で Concept を検索し、それを使用して分類を作成します。
String concId = CanonicalConstants.CANONICAL_SUBJECT_ROLE_ID_RegistryAdministrator; Concept concept = (Concept) bqm.getRegistryObject(concId); Classification classification = blcm.createClassification(concept);
最後に、標準的な分類スキーマ以外の場合と同じ方法で、オブジェクトを検索します。
Collection classifications = new ArrayList(); classifications.add(classification); BulkResponse response = bqm.findObjects("RegistryObject", null, null, classifications, null, null, null); Collection objects = response.getCollection();
すべての標準的な分類スキーマとその Concept を表示するサンプルプログラムについては、 <INSTALL>/registry/samples/classification-schemes/src ディレクトリにある JAXRGetCanonicalSchemes.java を参照してください。
分類によってオブジェクトを検索する例については、<INSTALL>/registry/samples/search-classification/src ディレクトリにある JAXRSearchByClassification.java および JAXRSearchByCountryClassification.java を参照してください。最初のサンプルは、標準的な分類スキーマ SubjectRole を使用するオブジェクトを検索します。2 番目のサンプルは、地理的な分類を使用する組織を検索します。
JAXRSearchByCountryClassification サンプルで結果を取得するには、指定された分類を使用するオブジェクトを発行する必要があります。「分類の追加: 例」または 「組織の作成: 例」のサンプルをまず実行してください。
<INSTALL>/registry/samples/search-classification ディレクトリに移動します。
次のいずれかのコマンドを入力します。
asant search-class asant search-geo |
通常、search-class ターゲットは 1 つの結果を返します。search-geo ターゲットは、「分類の追加: 例」の run ターゲットまたは 「組織の作成: 例」の pub-org ターゲットが実行済みであれば、結果を返します。
外部識別子によるオブジェクトの検索は、分類によるオブジェクトの検索に似ています。まず分類スキーマを検索し、次に BusinessQueryManagerImpl.findObjects メソッドなどの検索メソッドの引数として使用する ExternalIdentifier オブジェクトを作成します。
次のコードは、外部識別子として Sun Microsystems の株価表示記号を含んでいるすべてのレジストリオブジェクトを検索します。このサンプルを正しく動作させるには、NASDAQ という名前の外部分類スキーマを作成する必要があります。その方法の詳細は、「オブジェクトへの外部識別子の追加」を参照してください。
外部識別子のコレクションは、findObjects メソッドの最後から 2 番目の引数として指定します。
ClassificationScheme cScheme = null; cScheme = bqm.findClassificationSchemeByName(null, "NASDAQ"); ExternalIdentifier extId = blcm.createExternalIdentifier(cScheme, "%Sun%", "SUNW"); Collection extIds = new ArrayList(); extIds.add(extId); // perform search BulkResponse response = bqm.findObjects("RegistryObject", null, null, null, null, extIds, null); Collection objects = response.getCollection();
外部識別子によってオブジェクトを検索する例については、<INSTALL>/registry/samples/search-external-identifier/src ディレクトリにある JAXRSearchByExternalIdentifier.java を参照してください。このサンプルは、NASDAQ 分類スキーマを使用するオブジェクトを検索します。
このサンプルで結果を取得するには、まず 「分類の追加: 例」の publish-object サンプルを実行する必要があります。
外部リンクによってオブジェクトを検索するには、分類スキーマを使用する必要はありませんが、有効な URI を指定する必要があります。createExternalLink メソッドの引数は、URI と説明です。
ファイアウォールの外側へのリンクを指定する場合は、JAXR で URI の有効性を確認できるように、プログラムの実行時にシステムプロパティー http.proxyHost および http.proxyPort も指定する必要があります。
次のコードは、指定された ExternalLink オブジェクトを持つすべての組織を検索します。
ExternalLink extLink = blcm.createExternalLink("http://java.sun.com/", "Sun Java site"); Collection extLinks = new ArrayList(); extLinks.add(extLink); BulkResponse response = bqm.findObjects("Organization", null, null, null, null, null, extLinks); Collection objects = response.getCollection();
外部リンクによってオブジェクトを検索する例については、<INSTALL>/registry/samples/search-external-link/src ディレクトリにある JAXRSearchByExternalLink.java を参照してください。このサンプルは、指定された外部リンクを持つオブジェクトを検索します。http.proxyHost プロパティーと http.proxyPort プロパティーは、build.xml ファイルの run ターゲットで指定されます。
このサンプルで結果を取得するには、まず 「分類の追加: 例」の publish-object サンプルを実行する必要があります。
/Service Registry に発行したすべてのオブジェクトを取得できます。また、検索を絞り込み、発行したオブジェクトのうち特定のオブジェクト型のものだけを取得することもできます。発行したすべてのオブジェクトを取得するには、引数なしの QueryManager.getRegistryObjects メソッドを使用します。このメソッドの名前は誤解を招きやすいのですが、このメソッドで取得できるのは、すべてのレジストリオブジェクトではなく、発行したオブジェクトだけです。
たとえば、bqm という BusinessQueryManager インスタンスの場合は、次のコードを使用します。
BulkResponse response = bqm.getRegistryObjects();
発行したオブジェクトのうち特定の型のものだけを取得するには、QueryManager.getRegistryObjects に String 引数を指定します。
BulkResponse response = bqm.getRegistryObjects("Service");
このメソッドでは大文字と小文字が区別されるので、オブジェクト型は大文字で始める必要があります。
サンプルプログラム JAXRGetMyObjects および JAXRGetMyObjectsByType は、これらのメソッドの使用方法を示しています。
分類によってオブジェクトを検索する例については、<INSTALL>/registry/samples/get-objects/src ディレクトリにある JAXRGetMyObjects.java および JAXRGetMyObjectsByType.java を参照してください。最初のサンプル JAXRGetMyObjects.java は、発行したすべてのオブジェクトを取得します。2 番目のサンプル JAXRGetMyObjectsByType.java は、発行したオブジェクトのうち指定した型のものをすべて取得します。
<INSTALL>/registry/sample/s/get-objects ディレクトリに移動します。
発行したすべてのオブジェクトを検索するには、次のコマンドを入力します。
asant get-obj |
発行したオブジェクトのうち特定の型のものをすべて取得するには、次のコマンドを入力します。type_name では、大文字と小文字が区別されます。
asant get-obj-type -Dtype=type_name |
目的のオブジェクトを取得した後は、そのオブジェクトの属性や、そのオブジェクトに属しているほかのオブジェクトも取得できます。
名前
説明
タイプ
一意の識別子と論理識別子
分類
外部識別子
外部リンク
スロット
組織については、次の属性も取得できます。
主担当者 (User オブジェクト)
住所
電話番号
サービス
サービスの場合は、サービスバインディングを取得できます。
任意のオブジェクトについて、監査証跡も取得できます。監査証跡には、オブジェクトの状態を変更したイベントやバージョンが含まれています。オブジェクトのバージョン番号も取得できます。バージョン番号は、オブジェクトの属性のいずれかに変更が加えられるたびに更新されます。
ここでは、次の項目について説明します。
オブジェクトの一意の識別子は Key オブジェクトに格納されています。Key は、String 値である id 属性の形式で識別子を格納する構造体です。識別子を取得するには、RegistryObject.getKey().getId() メソッドを呼び出します。
JAXR プロバイダには、lid と呼ばれる論理識別子を取得するための、実装に固有のメソッドもあります。lid は RegistryObject のString 属性です。lid を取得するには、 RegistryObjectImpl.getLid を呼び出します。このメソッドのシグニチャーは次のとおりです。
public java.lang.String getLid() throws JAXRException
このメソッドの使用例については、<INSTALL>/registry/samples/organizations/src ディレクトリにある JAXRSearchOrg.java を参照してください。このサンプルの詳細については、「組織の属性の取得: 例」を参照してください。
オブジェクトの名前と説明は、どちらも InternationalString オブジェクトです。InternationalString オブジェクトには LocalizedString オブジェクトの集合が格納されます。RegistryObject.getName メソッドおよび RegistryObject.getDescription メソッドは、デフォルトロケールの LocalizedString オブジェクトを返します。その後、LocalizedString オブジェクトの String 値を取得できます。これらのメソッドを使用するコードの例を次に示します。
String name = ro.getName().getValue(); String description = ro.getDescription().getValue();
特定のロケールの値を取得するには、Locale 引数を指定して getName メソッドまたは getDescription メソッドを呼び出します。
サンプルの多くには、オブジェクトの名前、説明、および一意の識別子を取得する private のユーティリティーメソッドが含まれています。たとえば、<INSTALL>ー/registry/samples/get-objects/src ディレクトリにある JAXRGetMyObjects.java を参照してください。
特定のオブジェクト型を指定せずに Service Registry を検索した場合、検索によって返されたオブジェクトの型を取得できます。Concept 値を返す RegistryObject.getObjectType メソッドを使用します。次に、Concept.getValue メソッドを使用して、オブジェクト型の String 値を取得します。これらのメソッドを使用するコードの例を次に示します。
Concept objType = object.getObjectType(); System.out.println("Object type is " + objType.getValue());
Concept は、標準的な分類スキーマ ObjectType の Concept のいずれかになります。このコードの例については、<INSTALL>/registry/samples/search-name/src ディレクトリにある JAXRSearchByName.java を参照してください。
オブジェクトの分類の Collection を取得するには、RegistryObject.getClassifications メソッドを使用します。分類に関して重要な属性は、分類の値と、その分類が属している分類スキーマです。多くの場合、分類には名前や説明がありません。次のコードは、オブジェクトの分類を取得して表示します。
Collection classifications = object.getClassifications(); Iterator classIter = classifications.iterator(); while (classIter.hasNext()) { Classification classification = (Classification) classIter.next(); String name = classification.getName().getValue(); System.out.println(" Classification name is " + name); System.out.println(" Classification value is " + classification.getValue()); ClassificationScheme scheme = classification.getClassificationScheme(); System.out.println(" Classification scheme for " + name + " is " + scheme.getName().getValue()); }
一部のサンプルには、これに似たコードを使用する showClassifications メソッドがあります。たとえば、<INSTALL>/registry/samples/search-name/src ディレクトリにある JAXRSearchByName.java を参照してください。
オブジェクトの外部識別子の Collection を取得するには、RegistryObject.getExternalIdentifiers メソッドを使用します。各識別子について、その名前、値、およびそれが属している分類スキーマを取得できます。外部識別子の分類スキーマを取得するメソッドは getIdentificationScheme です。次のコードは、オブジェクトの外部識別子を取得して表示します。
Collection exIds = object.getExternalIdentifiers(); Iterator exIdIter = exIds.iterator(); while (exIdIter.hasNext()) { ExternalIdentifier exId = (ExternalIdentifier) exIdIter.next(); String name = exId.getName().getValue(); System.out.println(" External identifier name is " + name); String exIdValue = exId.getValue(); System.out.println(" External identifier value is " + exIdValue); ClassificationScheme scheme = exId.getIdentificationScheme(); System.out.println(" External identifier " + "classification scheme is " + scheme.getName().getValue()); }
一部のサンプルには、これに似たコードを使用する showExternalIdentifiers メソッドがあります。たとえば、<INSTALL>/registry/samples/search-name/src ディレクトリにある JAXRSearchByName.java を参照してください。
オブジェクトの外部リンクの Collection を取得するには、RegistryObject.getExternalLinks メソッドを使用します。各外部リンクについて、名前、説明、および値を取得できます。外部リンクについては、名前は省略可能です。次のコードは、オブジェクトの外部リンクを取得して表示します。
Collection exLinks = obj.getExternalLinks(); Iterator exLinkIter = exLinks.iterator(); while (exLinkIter.hasNext()) { ExternalLink exLink = (ExternalLink) exLinkIter.next(); String name = exLink.getName().getValue(); if (name != null) { System.out.println(" External link name is " + name); } String description = exLink.getDescription().getValue(); System.out.println(" External link description is " + description); String externalURI = exLink.getExternalURI(); System.out.println(" External link URI is " + externalURI); }
一部のサンプルには、これに似たコードを使用する showExternalLinks メソッドがあります。たとえば、<INSTALL>/registry/samples/search-name/src ディレクトリにある JAXRSearchByName.java を参照してください。
スロットは、オブジェクトに対して作成できる任意の属性です。オブジェクトのスロットの Collection を取得するには、RegistryObject.getSlots メソッドを使用します。各スロットについて、名前、値、およびタイプを取得できます。Slot オブジェクトの名前は String で、InternationalString ではありません。スロットは値の Collection を持ちます。次のコードは、オブジェクトのスロットを取得して表示します。
Collection slots = object.getSlots(); Iterator slotIter = slots.iterator(); while (slotIter.hasNext()) { Slot slot = (Slot) slotIter.next(); String name = slot.getName(); System.out.println(" Slot name is " + name); Collection values = slot.getValues(); Iterator valIter = values.iterator(); int count = 1; while (valIter.hasNext()) { String value = (String) valIter.next(); System.out.println(" Slot value " + count++ + ": " + value); } String type = slot.getSlotType(); if (type != null) { System.out.println(" Slot type is " + type); }
一部のサンプルには、このコードを使用する showSlots メソッドがあります。たとえば、<INSTALL>/registry/samples/search-name/src ディレクトリにある JAXRSearchByName.java を参照してください。
各 Organization オブジェクトは、ほかのすべてのオブジェクトで使用可能な属性に加え、1 つの住所と複数の電話番号を持つことができます。各組織は主担当者として User オブジェクトも持ちます。組織には追加の User オブジェクトを関連付けることができます。
User オブジェクトの属性の 1 つに PersonName オブジェクトがありますが、その形式はオブジェクト名の形式とは異なっています。ユーザーは、複数の電話番号と同様に複数の住所を持つことができます。ユーザーは複数の電子メールアドレスも持つことができます。
組織の住所を取得するには、次のように Organization.getPostalAddress メソッドを呼び出します (org は組織)。
PostalAddress pAd = org.getPostalAddress();
System.out.println(" Postal Address:\n " + pAd.getStreetNumber() + " " + pAd.getStreet() + "\n " + pAd.getCity() + ", " + pAd.getStateOrProvince() + " " + pAd.getPostalCode() + "\n " + pAd.getCountry() + "(" + pAd.getType() + ")");
組織の主担当者を取得するには、次のように Organization.getPrimaryContact メソッドを呼び出します (org は組織)。
User pc = org.getPrimaryContact();
ユーザーの住所を取得するには、次のように User.getPostalAddresses メソッドを呼び出し、Collection の値を抽出します (pc は主担当者)。
Collection pcpAddrs = pc.getPostalAddresses(); Iterator pcaddIter = pcpAddrs.iterator(); while (pcaddIter.hasNext()) { PostalAddress pAd = (PostalAddress) pcaddIter.next(); /* retrieve attributes */ }
組織またはユーザーの電話番号を取得するには、getTelephoneNumbers メソッドを呼び出します。次のコードで、org は組織を表しています。このコードは、国番号、市外局番、主番号、および電話番号のタイプを取得します。
Collection orgphNums = org.getTelephoneNumbers(null); Iterator orgphIter = orgphNums.iterator(); while (orgphIter.hasNext()) { TelephoneNumber num = (TelephoneNumber) orgphIter.next(); System.out.println(" Phone number: " + "+" + num.getCountryCode() + " " + "(" + num.getAreaCode() + ") " + num.getNumber() + " (" + num.getType() + ")"); }
TelephoneNumber には内線も含まれることがあり、これは getExtension メソッドで取得できます。電子的にダイアル可能な番号の場合は、url 属性も含まれることがあり、これは getUrl メソッドで取得できます。
ユーザーの名前を取得するには、User.getPersonName メソッドを呼び出します。PersonName には、ユーザーの名、ミドルネーム、および姓に対応する 3 つの属性があります。次のコードで、pc は主担当者を表しています。
PersonName pcName = pc.getPersonName(); System.out.println(" Contact name: " + pcName.getFirstName() + " " + pcName.getMiddleName() + " " + pcName.getLastName());
ユーザーの電子メールアドレスを取得するには、User.getEmailAddresses メソッドを呼び出します。EmailAddress には、アドレスとそのタイプの 2 つの属性があります。次のコードでは、pc は主担当者を表しています。
Collection eAddrs = pc.getEmailAddresses(); Iterator eaIter = eAddrs.iterator(); while (eaIter.hasNext()) { EmailAddress eAd = (EmailAddress) eaIter.next(); System.out.println(" Email address: " + eAd.getAddress() + " (" + eAd.getType() + ")"); }
PostalAddress、TelephoneNumber、PersonName、および EmailAddress オブジェクトの属性はすべて String 値です。「JAXR 情報モデルのインタフェース」で説明しているとおり、これらのオブジェクトは RegistryObject インタフェースを拡張しないため、ほかのレジストリオブジェクトの属性は持っていません。
組織、およびその主担当者である User の属性を取得するについては、<INSTALL>/registry/samples/organizations/src ディレクトリにある JAXRSearchOrg.java を参照してください。このサンプルは、指定された文字列が名前に含まれている組織についての情報を表示します。
ほとんどの組織はサービスを提供します。JAXR には、組織のサービスおよびサービスバインディングを取得するメソッドがあります。
Service オブジェクトは、ほかのレジストリオブジェクトの属性をすべて持っています。さらに、通常は、サービスへのアクセス方法に関する情報を提供する「サービスバインディング」も持ちます。ServiceBinding は通常、ほかの属性に加えてアクセス URI と仕様リンクも持ちます。仕様リンクは、サービスバインディングと技術仕様をリンクします。技術仕様には、サービスバインディングを通してサービスを使用する方法が記述されています。仕様リンクには次の属性があります。
仕様オブジェクト。通常は ExtrinsicObject
使用法の説明。InternationalString オブジェクト
使用法パラメータの Collection。String 値
Service.getProvidingOrganization メソッドを使用して、サービスを提供している組織を取得できます。また、ServiceBinding.getService メソッドを使用して、サービスバインディングのサービスを取得できます。
次のコードは、組織 org のサービスを取得します。続いて、各サービスのサービスバインディングを取得し、各サービスバインディングについてそのアクセス URI と仕様リンクを取得します。
Collection services = org.getServices(); Iterator svcIter = services.iterator(); while (svcIter.hasNext()) { Service svc = (Service) svcIter.next(); System.out.println(" Service name: " + getName(svc)); System.out.println(" Service description: " + getDescription(svc)); Collection serviceBindings = svc.getServiceBindings(); Iterator sbIter = serviceBindings.iterator(); while (sbIter.hasNext()) { ServiceBinding sb = (ServiceBinding) sbIter.next(); System.out.println(" Binding name: " + getName(sb)); System.out.println(" Binding description: " + getDescription(sb)); System.out.println(" Access URI: " + sb.getAccessURI()); Collection specLinks = sb.getSpecificationLinks(); Iterator slIter = specLinks.iterator(); while (slIter.hasNext()) { SpecificationLink sl = (SpecificationLink) slIter.next(); RegistryObject ro = sl.getSpecificationObject(); System.out.println("Specification link " + "object of type " + ro.getObjectType()); System.out.println("Usage description: " + sl.getUsageDescription().getValue()); Collection ups = sl.getUsageParameters(); Iterator upIter = ups.iterator(); while (upIter.hasNext()) { String up = (String) upIter.next(); System.out.println("Usage parameter: " + up); } } } }
「組織の属性の取得: 例」のサンプルは、検索した組織のサービスおよびサービスバインディングも表示します。
サービスは組織から独立して存在することも多くあります。BusinessQueryManagerImpl.findObjects メソッドを使用すると、そのようなサービスを直接検索できます。
JAXR では、組織をファミリーにグループ化することができます。組織はほかの組織をその子として持つことができます。子の組織もまた、子を持つことができます。したがって、組織は親、子、子孫を持つ場合があります。
Organization.getParentOrganization メソッドは、組織の親を取得します。次のコードで、chorg は子組織を表しています。
Organization porg = chorg.getParentOrganization();
Organization.getChildOrganizations メソッドは、組織の子の Collection を取得します。次のコードで、org は親組織を表しています。
Collection children = org.getChildOrganizations();
Organization.getDescendantOrganizations メソッドは、複数の世代の子孫を取得します。Organization.getRootOrganization メソッドは、任意の子孫の、親を持たない祖先を取得します。
組織の階層を取得する例については、「組織階層の作成と取得: 例」を参照してください。
オブジェクトが Service Registry に発行されるたび、およびオブジェクトに何らかの変更が加えられるたびに、AuditableEvent と呼ばれる別のオブジェクトが JAXR プロバイダによって作成されます。JAXR プロバイダは、発行されたオブジェクトの監査証跡に AuditableEvent オブジェクトを追加します。監査証跡には、そのオブジェクトに関するすべてのイベントのリストが含まれています。監査証跡を取得するには、RegistryObject.getAuditTrail を呼び出します。監査証跡内の個別のイベントを取得し、そのイベントタイプを調べることもできます。JAXR では、「オブジェクトの監査証跡の取得」に示されたイベントタイプがサポートされています。
表 3–4 AuditableEvent のタイプ
イベントタイプ |
説明 |
---|---|
EVENT_TYPE_CREATED |
オブジェクトが作成され、レジストリに発行されました。 |
EVENT_TYPE_DELETED |
LifeCycleManager または BusinessLifeCycleManager のいずれかの削除メソッドによってオブジェクトが削除されました。 |
EVENT_TYPE_DEPRECATED |
LifeCycleManager.deprecateObjects メソッドによってオブジェクトが非推奨にされました。 |
EVENT_TYPE_UNDEPRECATED |
LifeCycleManager.unDeprecateObjects メソッドによってオブジェクトが非推奨解除されました。 |
EVENT_TYPE_VERSIONED |
オブジェクトの新しいバージョンが作成されました。このイベントは通常、オブジェクトのいずれかの属性が変更されたときに発生します。 |
EVENT_TYPE_UPDATED |
オブジェクトが更新されました。 |
EVENT_TYPE_APPROVED |
LifeCycleManagerImpl.approveObjects メソッドによってオブジェクトが承認されました (実装に固有)。 |
EVENT_TYPE_DOWNLOADED |
オブジェクトがダウンロードされました (実装に固有)。 |
EVENT_TYPE_RELOCATED |
オブジェクトが再配置されました (実装に固有)。 |
次のコードは、レジストリオブジェクトの監査証跡を取得し、各イベントのタイプとタイムスタンプを表示します。
Collection events = obj.getAuditTrail(); String objName = obj.getName().getValue(); Iterator eventIter = events.iterator(); while (eventIter.hasNext()) { AuditableEventImpl ae = (AuditableEventImpl) eventIter.next(); int eType = ae.getEventType(); if (eType == AuditableEvent.EVENT_TYPE_CREATED) { System.out.print(objName + " created "); } else if (eType == AuditableEvent.EVENT_TYPE_DELETED) { System.out.print(objName + " deleted "); } else if (eType == AuditableEvent.EVENT_TYPE_DEPRECATED) { System.out.print(objName + " deprecated "); } else if (eType == AuditableEvent.EVENT_TYPE_UNDEPRECATED) { System.out.print(objName + " undeprecated "); } else if (eType == AuditableEvent.EVENT_TYPE_UPDATED) { System.out.print(objName + " updated "); } else if (eType == AuditableEvent.EVENT_TYPE_VERSIONED) { System.out.print(objName + " versioned "); } else if (eType == AuditableEventImpl.EVENT_TYPE_APPROVED) { System.out.print(objName + " approved "); } else if (eType == AuditableEventImpl.EVENT_TYPE_DOWNLOADED) { System.out.print(objName + " downloaded "); } else if (eType == AuditableEventImpl.EVENT_TYPE_RELOCATED) { System.out.print(objName + " relocated "); } else { System.out.print("Unknown event for " + objName + " "); }System.out.println(ae.getTimestamp().toString()); }
一部のサンプルには、これに似たコードを使用する showAuditTrail メソッドがあります。たとえば、<INSTALL>/registry/samples/search-name/src ディレクトリにある JAXRSearchByName.java を参照してください。
レジストリオブジェクトの状態を変更する方法については、「レジストリ内のオブジェクトの状態の変更」を参照してください。
レジストリオブジェクトの属性を変更すると、Service Registry によってオブジェクトの新しいバージョンが作成されます。この仕組みの詳細については、「レジストリ内のオブジェクトの状態の変更」を参照してください。オブジェクトを最初に作成したとき、そのオブジェクトのバージョンは 1.1 になります。
オブジェクトのバージョンを取得するには、レジストリオブジェクト用の実装に固有の getVersionInfo メソッドを使用します。このメソッドは、VersionInfoType オブジェクトを返します。このメソッドのシグニチャーは次のとおりです。
public VersionInfoType getVersionInfo() throws JAXRException
たとえば、組織 org のバージョン番号を取得するには、メソッドを呼び出すときに org を RegistryObjectImpl にキャストします。次に、String を返す VersionInfoType.getVersionName メソッドを呼び出します。
import org.oasis.ebxml.registry.bindings.rim.VersionInfoType; ... VersionInfoType vInfo = ((RegistryObjectImpl)org).getVersionInfo(); if (vInfo != null) { System.out.println("Org version: " + vInfo.getVersionName()); }
一部のサンプルでは、このコードに似たコードが使用されています。たとえば、<INSTALL >/registry/samples/search-name/src ディレクトリにある JAXRSearchByName.java を参照してください。
BusinessQueryManager インタフェースの代わりに DeclarativeQueryManager インタフェースを使用して、Service Registry に対するクエリーを作成および実行できます。SQL に習熟している場合は、宣言型クエリーの方が使いやすいことがあります。DeclarativeQueryManager インタフェースは、Query という別のインタフェースに依存しています。
DeclarativeQueryManager インタフェースには、createQuery と executeQuery の 2 つのメソッドがあります。createQuery メソッドは、クエリータイプおよびクエリーを含む文字列を 2 つの引数として取ります。次のコードは、レジストリ内のすべての Service オブジェクトのリストを要求する SQL クエリーを作成します。ここで、rs は RegistryService オブジェクトです。
DeclarativeQueryManager qm = rs.getDeclarativeQueryManager(); String qString = "select s.* from Service s"; Query query = qm.createQuery(Query.QUERY_TYPE_SQL, qString);
クエリーを作成したら、次のようにクエリーを実行します。
BulkResponse response = qm.executeQuery(query); Collection objects = response.getCollection();
次に、通常のクエリーの場合と同じ方法で、応答からオブジェクトを抽出します。
SQL クエリーの構文の詳細と例については、ebRS 3.0 仕様の第 6 章「Query Management Protocols」、特にセクション 6.6 を参照してください。
宣言型クエリーの使用例については、<INSTALL>/registry/samples/query-declarative/src ディレクトリにある JAXRQueryDeclarative.java および JAXRGetAllSchemes.java を参照してください。どちらのサンプルも、SQL クエリーを作成して実行します。クエリー文字列は JAXRExamples.properties ファイルで定義されています。
JAXRQueryDeclarative の SQL クエリー文字列は次のようになります。これは全体を 1 行に記述してください。
SELECT ro.* from RegistryObject ro, Name nm, Description d WHERE upper(nm.value) LIKE upper(’%free%’) AND upper(d.value) LIKE upper(’%free%’) AND (ro.id = nm.parent AND ro.id = d.parent) |
このクエリーは、名前と説明の属性の両方に文字列 "free" を持つすべてのオブジェクトを検索します。
JAXRGetAllSchemes の SQL クエリー文字列は次のようになります。
SELECT * FROM ClassScheme s order by s.id |
このクエリーは、レジストリ内のすべての分類スキーマを検索します。
<INSTALL>/registry/samples/query-declarative ディレクトリに移動します。
JAXRQueryDeclarative サンプルを実行するには、次のコマンドを入力します。
asant get-free |
JAXRGetAllSchemes サンプルを実行するには、次のコマンドを入力します。
asant get-schemes |
宣言型クエリーでは非常に大きな結果セットが返されると予測される場合には、実装に固有の繰り返し型クエリー機能を使用できます。DeclarativeQueryManagerImpl.executeQuery メソッドには、一連のパラメータを指定する引数を 1 つ指定できます。このメソッドのシグニチャーは、次のとおりです。
public BulkResponse executeQuery(Query query, java.util.Map queryParams, IterativeQueryParams iterativeParams) throws JAXRException
結果セットのうち、各クエリーでそれぞれ異なるサブセットを要求するように、パラメータを指定できます。1 つのクエリーで結果セット全体を取得する代わりに、個々のクエリーで扱いやすい分量の結果セットを取得できます。
最大 100 個の結果を返すクエリー文字列があるとします。一連のパラメータを作成して、このクエリーで一度に 10 個の結果を返すようにすることができます。まず、IterativeQueryParams クラスのインスタンスを作成します。このクラスは、org.freebxml.omar.common パッケージで定義されています。このクラスの 2 つのフィールドは、配列の開始インデックスを表す startIndex と、返す結果の最大数を表す maxResults です。これらのフィールドの初期値はコンストラクタで指定します。
int maxResults = 10; int startIndex = 0; IterativeQueryParams iterativeQueryParams = new IterativeQueryParams(startIndex, maxResults);
for ループで各クエリを実行します。このループは、クエリーごとに maxResults の値だけ増加し、予測される最大結果数に達すると終了します。ループの繰り返しごとに startIndex フィールドを増分します。
for (int i = 0; i < 100; i += maxResults) { // Execute query with iterative query params Query query = dqm.createQuery(Query.QUERY_TYPE_SQL, queryStr); iterativeQueryParams.startIndex = i; BulkResponse br = dqm.executeQuery(query, null, iterativeQueryParams); Collection objects = br.getCollection(); // retrieve individual objects ... }
Service Registry では、クエリーの繰り返しの間にトランザクションの整合性や状態を維持する必要はありません。したがって、繰り返しの間に、完全な結果セットに対して新しいオブジェクトを追加することや既存のオブジェクトを削除することも可能です。そのため、繰り返しの間に結果セットの要素が抜けたり重複したりすることもあります。
繰り返し型クエリーの使用例については、<INSTALL>/registry/samples/query-iterative/src ディレクトリにある JAXRQueryIterative.java を参照してください。このプログラムは、特定の文字列に一致する名前を持つすべてのレジストリオブジェクトを検索し、最初の 100 個を繰り返し処理します。
<INSTALL>/registry/samples/query-iterative ディレクトリに移動します。
次のコマンドを入力して string 値を指定します。
asant run -Dname=string |
RegistryObjectImpl クラスを拡張した、実装に固有の AdhocQueryImpl クラスを使用すると、Service Registry に保存されているクエリーを呼び出すことができます。Service Registry には、呼び出し可能なデフォルトの AdhocQueryImpl オブジェクトがいくつかあります。最も役に立つのは FindAllMyObjects と GetCallersUser です。
FindAllMyObjects は、「発行したオブジェクトの検索」で説明されている QueryManager.getRegistryObjects() メソッドと同等の働きをします。
GetCallersUser は、「私は誰ですか」という質問と同じです。このクエリーは、それを実行したクライアントに関連付けられている User オブジェクトを返します。呼び出し元が Service Registry にログインしていない場合、このクエリーは「Registry Guest」という名前のユーザーを返します。
ストアドクエリーを見つける最も簡単な方法は、一意の識別子でクエリーを検索することです。GetCallersUser クエリーには、このクエリー用に定義された標準的な定数がありますので「ストアドクエリーに対する定数」を参照してください。標準的な定数を持たないクエリーは、一意の識別子の文字列値を使用して検索できます。
String queryId = CanonicalConstants.CANONICAL_QUERY_GetCallersUser; AdhocQueryImpl aq = (AdhocQueryImpl) bqm.getRegistryObject(queryId);
次に、AdhocQuery に関連付けられているクエリー文字列を取得し、その文字列を使用してクエリーを作成して実行します。これには DeclarativeQueryManager のメソッドを使用します。
if (aq != null) { int qType = aq.getType(); String qString = aq.toString(); Query query = dqm.createQuery(qType, qString); BulkResponse br = dqm.executeQuery(query); Collection objects = br.getCollection(); ...
ストアドクエリーの使用例については、<INSTALL>/registry/samples/query-stored/src ディレクトリにある JAXRQueryStored.java を参照してください。このサンプルは、ユーザーを認証し、そのユーザーのレジストリログイン名を返します。
クエリーを実行している対象のレジストリが、1 つまたは複数のレジストリ連携 (「レジストリとリポジトリについて」を参照) の一部である場合、そのレジストリメンバーとして含んでいるすべての連携内のすべてのレジストリに対して、あるいは 1 つの連携内のすべてのレジストリに対して、宣言型クエリーを実行できます。
レジストリをメンバーとして含んでいるすべての連携内のすべてのレジストリに対してクエリーを実行するには、実装に固有の setFederated メソッドを QueryImpl オブジェクトに対して呼び出します。このメソッドのシグニチャーは次のとおりです。
public void setFederated(boolean federated) throws JAXRException
このメソッドを次のように呼び出します。
QueryImpl query = (QueryImpl) dqm.createQuery(Query.QUERY_TYPE_SQL, qString); query.setFederated(true);
レジストリが 1 つの連携だけのメンバーであることがわかっている場合、クエリーを実行する前に呼び出す必要があるのはこのメソッドだけです。
1 つの連携内のレジストリにクエリーを限定するには、実装に固有の setFederation メソッドも追加で呼び出す必要があります。このメソッドは、クエリーを実行する連携の一意識別子を引数として取ります。
public void setFederation(java.lang.String federationId) throws JAXRException
したがって、このメソッドを呼び出す前に、一意の識別子の値を取得する必要があります。そのためには、まず BusinessQueryManagerImpl.findObjects を呼び出して、連携を名前で特定します。このコードで、文字列 "NameOfFederation" を連携の実際の名前に置き換えます。
Collection namePatterns = new ArrayList(); namePatterns.add("NameOfFederation"); // Find objects with name NameOfFederation BulkResponse response = bqm.findObjects("Federation", null, namePatterns, null, null, null, null);
次に、メンバーを 1 つだけ持っているコレクションを繰り返し処理して、キーの値を取得します。
String fedId = federation.getKey().getId();
最後に、クエリーを作成し、setFederated と setFederation を呼び出し、クエリーを実行します。
QueryImpl query = (QueryImpl) dqm.createQuery(Query.QUERY_TYPE_SQL, qString); query.setFederated(true); query.setFederation(fedId); response = dqm.executeQuery(query);
連携クエリーの使用例については、<INSTALL>/registry/samples/query-federation/src ディレクトリにある JAXRQueryFederation.java を参照してください。このサンプルは、見つかった各連携 (Service Registry に付属のデータベースに 1 つだけ含まれている) に対して、宣言型クエリーとストアドクエリーを実行します。
宣言型クエリーは、「宣言型クエリーの使用: 例」で実行したものです。ストアドクエリーは FindAllMyObjects クエリーです。このサンプルでユーザーの認証は行われないので、クエリーを実行するユーザーは RegistryGuest となります。RegistryGuest ユーザーが所有するオブジェクトは、それ自体の 1 つだけです。したがって、FindAllMyObjects クエリーによって返される結果は RegistryGuest ユーザーの 1 つだけです。