UDDI(Universal Description Discovery and Integration)は、Webサービス・プロバイダ、WebサービスおよびそれらのWebサービスの技術的な特徴の記述および検索がサポートされているWebサービスのセットです。
UDDI APIセットは、一般的なユースケースによって2組に分けることができます。Inquiry APIセットは、UDDIレジストリ内のエンティティに関する詳細を検索および取得する場合に使用します。たとえば、指定したWebサービスのエンドポイントを検索する場合に使用します。Publication APIセットは、UDDIレジストリ内の情報を公開および更新する場合に使用します。
この項では、Oracle Service Registry APIの使用方法について説明します。例は、UDDI Version 3仕様に基づいています。
Inquiry APIを使用するには、次の手順を実行します。この部分のすべてのコードは、例1を参照してください。
スタブからAPIの実装を取得します。
String url = "http://localhost:8888/registry/uddi/inquiry"; UDDI_Inquiry_PortType inquiry = UDDIInquiryStub.getInstance(url);
照会パラメータを収集します。
String serviceKey = "uddi:systinet.com:demo:hr:employeesList"; String tModelKey = "uddi:systinet.com:demo:employeeList:binding"; Find_binding find_binding = new Find_binding(); find_binding.setServiceKey(serviceKey); find_binding.addTModelKey(tModelKey); find_binding.setMaxRows(new Integer(10));
照会メソッドをコールします。
BindingDetail bindingDetail = inquiry.find_binding(find_binding);
照会の結果を処理します。
ListDescription listDescription = bindingDetail.getListDescription(); if (listDescription != null) { int includeCount = listDescription.getIncludeCount(); int actualCount = listDescription.getActualCount(); int listHead = listDescription.getListHead(); System.out.println("Displaying " + includeCount + " of " + actualCount+ ", starting at position " + listHead); }
![]() | 注意 |
---|---|
java.lang.reflect.UndeclaredThrowableExceptionという例外を取得した場合は、Oracle Service Registryが実行されているかどうかをチェックします。 |
Publishing APIを使用するには、次の手順を実行します。この部分のすべてのコードは、例2を参照してください。
セキュリティ・スタブのAPIを取得します。
String securityUrl = "http://localhost:8888/registry/uddi/security"; UDDI_Security_PortType security = UDDISecurityStub.getInstance(securityUrl); String publishingUrl = "http://localhost:8888/registry/uddi/publishing"; UDDI_Publication_PortType publishing = UDDIPublishStub.getInstance(publishingUrl);
認証トークンを取得します。
AuthToken authToken = security.get_authToken(new Get_authToken(userName, password)); String authInfo = authToken.getAuthInfo();
saveオブジェクトを作成します。
String businessKey = "uddi:systinet.com:demo:it"; String serviceKey = ""; // serviceKey is optional int count = 1; String[] serviceNames = new String[count]; String[] languageCodes = new String[count]; languageCodes[0] = null; // can set an array of language codes serviceNames[0] = "Requests Service"; //service name String serviceDescription = "Saved by Example"; //service description BusinessService businessService = new BusinessService(); businessService.setBusinessKey(businessKey); if (serviceKey != null && serviceKey.length() > 0) businessService.setServiceKey(serviceKey); businessService.addName(new Name(serviceNames[0], languageCodes[0])); businessService.addDescription(new Description(serviceDescription)); Save_service save = new Save_service(); save.addBusinessService(businessService); save.setAuthInfo(authInfo);
公開メソッドをコールします。
ServiceDetail serviceDetail = publishing.save_service(save);
公開の結果を処理します。
BusinessServiceArrayList businessServiceArrayList = serviceDetail.getBusinessServiceArrayList(); int position = 1; for (Iterator iterator = businessServiceArrayList.iterator(); iterator.hasNext();) { BusinessService service = (BusinessService) iterator.next(); System.out.println("Service " + position + " : " + service.getServiceKey()); System.out.println(service.toXML()); position++; }
認証トークンを廃棄します。
security.discard_authToken(new Discard_authToken(authInfo));
例1 FindBinding v3
package example.inquiry; import org.systinet.uddi.client.v3.UDDIInquiryStub; import org.systinet.uddi.client.v3.UDDI_Inquiry_PortType; import org.systinet.uddi.client.v3.struct.*; import java.util.Iterator; public class PrincipleFindBinding { public static void main(String args[]) throws Exception { //1. Get API implementation from stub String url = "http://localhost:8888/registry/uddi/inquiry"; System.out.print("Using Inquiry at url " + url + " .."); UDDI_Inquiry_PortType inquiry = UDDIInquiryStub.getInstance(url); System.out.println(" done"); //2. Collect inquiry parameters String serviceKey = "uddi:systinet.com:demo:hr:employeesList"; String tModelKey = "uddi:systinet.com:demo:employeeList:binding"; Find_binding find_binding = new Find_binding(); find_binding.setServiceKey(serviceKey); find_binding.addTModelKey(tModelKey); find_binding.setMaxRows(new Integer(10)); //3. Call inquiry method System.out.print("Search in progress .."); BindingDetail bindingDetail = inquiry.find_binding(find_binding); System.out.println(" done"); //4. Operate with result ListDescription listDescription = bindingDetail.getListDescription(); if (listDescription != null) { int includeCount = listDescription.getIncludeCount(); int actualCount = listDescription.getActualCount(); int listHead = listDescription.getListHead(); System.out.println("Displaying " + includeCount + " of " + actualCount + ", starting at position " + listHead); } BindingTemplateArrayList bindingTemplateArrayList = bindingDetail.getBindingTemplateArrayList(); if (bindingTemplateArrayList == null) { System.out.println("Nothing found"); return; } int position = 1; for (Iterator iterator = bindingTemplateArrayList.iterator(); iterator.hasNext();) { BindingTemplate bindingTemplate = (BindingTemplate) iterator.next(); System.out.println("Binding " + position + " : " + bindingTemplate.getBindingKey()); System.out.println(bindingTemplate.toXML()); position++; } } }
例2 SaveService v3
package example.publishing; import org.systinet.uddi.InvalidParameterException; import org.systinet.uddi.client.v3.UDDIException; import org.systinet.uddi.client.v3.UDDIPublishStub; import org.systinet.uddi.client.v3.UDDISecurityStub; import org.systinet.uddi.client.v3.UDDI_Publication_PortType; import org.systinet.uddi.client.v3.UDDI_Security_PortType; import org.systinet.uddi.client.v3.struct.AuthToken; import org.systinet.uddi.client.v3.struct.BusinessService; import org.systinet.uddi.client.v3.struct.BusinessServiceArrayList; import org.systinet.uddi.client.v3.struct.Description; import org.systinet.uddi.client.v3.struct.Discard_authToken; import org.systinet.uddi.client.v3.struct.DispositionReport; import org.systinet.uddi.client.v3.struct.Get_authToken; import org.systinet.uddi.client.v3.struct.Name; import org.systinet.uddi.client.v3.struct.Save_service; import org.systinet.uddi.client.v3.struct.ServiceDetail; import javax.xml.soap.SOAPException; import java.util.Iterator; public class PrincipleSaveService { public static void main(String[] args) throws UDDIException, InvalidParameterException, SOAPException { String userName = "demo_john"; String password = "demo_john"; //1. Get API implementation from stub String securityUrl = "http://localhost:8888/registry/uddi/security"; System.out.print("Using Security at url " + securityUrl + " .."); UDDI_Security_PortType security = UDDISecurityStub.getInstance(securityUrl); System.out.println(" done"); String publishingUrl = "http://localhost:8888/registry/uddi/publishing"; System.out.print("Using Publishing at url " + publishingUrl + " .."); UDDI_Publication_PortType publishing = UDDIPublishStub.getInstance(publishingUrl); System.out.println(" done"); //2. Get authentication token System.out.print("Logging in .."); AuthToken authToken = security.get_authToken(new Get_authToken(userName, password)); System.out.println(" done"); String authInfo = authToken.getAuthInfo(); //3. Create save object String businessKey = "uddi:systinet.com:demo:it"; String serviceKey = ""; // serviceKey is optional int count = 1; String[] serviceNames = new String[count]; String[] languageCodes = new String[count]; languageCodes[0] = null; // can set an array of language codes serviceNames[0] = "Requests Service"; //service name String serviceDescription = "Saved by Example"; //service description BusinessService businessService = new BusinessService(); businessService.setBusinessKey(businessKey); if (serviceKey != null && serviceKey.length() > 0) businessService.setServiceKey(serviceKey); businessService.addName(new Name(serviceNames[0], languageCodes[0])); businessService.addDescription(new Description(serviceDescription)); Save_service save = new Save_service(); save.addBusinessService(businessService); save.setAuthInfo(authInfo); //4. Call publishing method System.out.print("Save in progress ..."); ServiceDetail serviceDetail = publishing.save_service(save); System.out.println(" done"); //5. Operate with publishing result BusinessServiceArrayList businessServiceArrayList = serviceDetail.getBusinessServiceArrayList(); int position = 1; for (Iterator iterator = businessServiceArrayList.iterator(); iterator.hasNext();) { BusinessService service = (BusinessService) iterator.next(); System.out.println("Service " + position + " : " + service.getServiceKey()); System.out.println(service.toXML()); position++; } //6. Discard authentication token System.out.print("Logging out .."); security.discard_authToken(new Discard_authToken(authInfo)); System.out.println(" done"); } }
UDDI Version 1仕様が後続のバージョンの基礎となっています。
WSDL: inquire_v1.wsdl
APIエンドポイント: http://<ホスト名>:<ポート>/<コンテキスト>/uddi/inquiry
Java API: org.systinet.uddi.client.v1.InquireSoap
デモ: Inquiryのデモv1
WSDL: publish_v1.wsdl
APIエンドポイント: http://<ホスト名>:<ポート>/<コンテキスト>/uddi/publishing
Java API: org.systinet.uddi.client.v1.PublishSoap
デモ: Publishingのデモv1
UDDI Version 2仕様では、既存の概念が改善され、サービス予測などの新規機能が数多く導入されています。
仕様: Inquiry API機能
WSDL: inquire_v2.wsdl
APIエンドポイント: http://<ホスト名>:<ポート>/<コンテキスト>/uddi/inquiry
Java API: org.systinet.uddi.client.v2.Inquire
デモ: Inquiryのデモv2
仕様: Publishing API機能
WSDL: publish_v2.wsdl
APIエンドポイント: http://<ホスト名>:<ポート>/<コンテキスト>/uddi/publishing
Java API: org.systinet.uddi.client.v2.Publish
デモ: Publishingのデモv2
UDDI Version 3仕様によって、パブリックおよびプライベートの両方のデプロイメントで有効なXML Webサービス・レジストリの構築および問合せに関する業界標準が大きく進歩しました。
仕様: Inquiry APIセット
APIエンドポイント: http://<ホスト名>:<ポート>/<コンテキスト>/uddi/inquiry
デモ: Inquiryのデモv3
APIエンドポイント: http://<ホスト名>:<ポート>/<コンテキスト>/uddi/publishing
Java API: org.systinet.uddi.client.v3.UDDI_Publication_PortType
デモ: Publishingのデモv3
仕様: Security APIセット
APIエンドポイント: http://<ホスト名>:<ポート>/<コンテキスト>/uddi/security
Java API: org.systinet.uddi.client.v3.UDDI_Security_PortType
Custody and Ownership Transfer APIは、UDDIノード間のUDDI構造の転送およびその所有権の変更に使用します。ユースケースの1つとして、通常、ビジネスの再編成後に、選択したUDDI構造に対する責務をパブリッシャが別のユーザーに移譲する場合をあげることができます。
APIエンドポイント: http://<ホスト名>:<ポート>/<コンテキスト>/uddi/custody
Java API: org.systinet.uddi.client.custody.v3.UDDI_CustodyTransfer_PortType
デモ: Custodyのデモ
Subscription APIは、変更の対象をレジストリに登録したユーザーに、非同期で通知を送信するサービスです。これらのユーザーは、必要な情報のみを受信するように一致条件を指定するための一連のオプションを使用できます。
APIエンドポイント: http://<ホスト名>:<ポート>/<コンテキスト>/uddi/custody
Java API: org.systinet.uddi.client.subscription.v3.UDDI_Subscription_PortType
デモ: Subscriptionのデモ
UDDI Version 3の拡張は、UDDI Version 3仕様を拡張したものです。次のデータ構造は、レジストリ・コントロール用のAPIおよびUDDIの仕様の正式なテクニカル・ノートとして承認されるAPIで使用されます。
この構造は、パフォーマンスを向上させるために、レジストリ・コントロールで使用されます。この構造は、businessEntityを拡張したものです。追加された要素は、関連するbusinessEntityを指すuddi:assertionStatusItemです。
この構造は、operationalInfo構造を拡張したものです。追加された要素は、uddi:nameです。entityKeyV2は、UDDI v2のキー値を保持します。
この構造は、ACL機能で使用されます。追加された要素は、ユーザーが所有はしていないが変更権限は持っているUDDIエンティティを指すuddi:serviceInfosおよびuddi:bindingTemplatesです。
この構造は、serviceInfoを拡張したものです。この構造は、パフォーマンスを向上させるために、Webインタフェースで使用されます。追加された要素は、uddi:descriptionおよびuddi:bindingTemplatesです。
UDDI V3の仕様では、ベンダーが新しい検索修飾子を定義できます。 表12「Oracle Service Registryの追加の検索修飾子のサマリー」は、Oracle Service Registryの追加の検索修飾子およびそれをサポートするfind_xx操作のサマリーです。Inquiry APIの操作の詳細は、「Inquiry」を参照してください。
表12「Oracle Service Registryの追加の検索修飾子のサマリー」内の各短縮名は、後続の項目にリンクしています。tModelキーは、uddi:systinet.com:findQualifier:が前に付いている短縮名であることに注意してください。
表12 Oracle Service Registryの追加の検索修飾子のサマリー
短縮名 | サポートされている操作 | ||||
---|---|---|---|---|---|
find_business | find_service | find_binding | find_tModel | find_relatedBusinesses | |
deletedTModels | 可 | ||||
foreignEntities | 可 | 可 | 可 | 可 | |
keyNameMatch | 可 | 可 | 可 | 可 | 可 |
myEntities | 可 | 可 | 可 | 可 | |
omitKeyNameMatch | 可 | 可 | 可 | 可 | 可 |
omitKeyValueMatch | 可 | 可 | 可 | 可 | 可 |
omitTModelKeyMatch | 可 | 可 | 可 | 可 | 可 |
tModelKeyApproximateMatch | 可 | 可 | 可 | 可 | 可 |
この検索修飾子では、非表示のtModelのみが戻されるため、管理者は、不要なtModelを検索して完全に削除できます。
レジストリの設定によって、delete_tModelで次のいずれの操作が実行されるかが決定されます。
find_tModel操作でのtModelの非表示(仕様で必須とされるデフォルトの動作)
tModelの実際の削除(tModelに対する依存性がない場合)
「管理者ガイド」の「Node」を参照してください。
tModelキー | uddi:systinet.com:findQualifier:deletedTModels |
サポートされている操作 | find_tModel |
この検索修飾子は、コール元に属さないエンティティに結果を制限します。
![]() | 注意 |
---|---|
匿名のコール元の場合、問合せですべてのエンティティが戻されるため、この修飾子は有効ではありません。 |
tModelキー | uddi:systinet.com:findQualifier:foreignEntities |
サポートされている操作 | find_relatedBusinessesを除くすべてのfind_xx操作 |
この検索識別子は、一致するkeyedReferencesのデフォルトのルールを変更します。デフォルトでは、keyNamesは、一般キーワードtModelKeyが指定されている場合にのみ比較されます。この検索修飾子を使用すると、keyNamesの比較が強制的に実行されます。
keyNameMatchとomitKeyNameMatch findQualifiersは相互排他的です。
tModelキー | uddi:systinet.com:findQualifier:keyNameMatch |
サポートされている操作 | すべてのfind_xx操作 |
この検索修飾子は、コール元に属するエンティティに結果を制限します。
![]() | 注意 |
---|---|
匿名のコール元の場合、この修飾子は有効ではありません。この場合、すべてのエンティティが戻されます。 |
tModelキー | uddi:systinet.com:findQualifier:myEntities |
サポートされている操作 | find_relatedBusinessesを除くすべてのfind_xx操作 |
この検索識別子は、一致するkeyedReferencesのデフォルトのルールを変更します。デフォルトでは、keyNamesは、一般キーワードtModelKeyが指定されている場合にのみ比較されます。この検索修飾子を使用すると、keyNamesの比較がスキップされます。
keyNameMatchとomitKeyNameMatch findQualifiersは相互排他的です。
tModelキー | uddi:systinet.com:findQualifier:omitKeyNameMatch |
サポートされている操作 | すべてのfind_xx操作 |
この検索識別子は、一致するkeyedReferencesのデフォルトのルールを変更します。デフォルトでは、keyValuesが比較されます。この検索修飾子を使用すると、keyValuesの比較がスキップされます。
omitKeyValueMatchとomitTModelKeyMatch findQualifiersは相互排他的です。
tModelキー | uddi:systinet.com:findQualifier:omitKeyValueMatch |
サポートされている操作 | すべてのfind_xx操作 |
この検索識別子は、一致するkeyedReferencesのデフォルトのルールを変更します。デフォルトでは、tModelKeysが比較されます。この検索修飾子を使用すると、tModelKeysの比較がスキップされます。
omitKeyValueMatchとomitTModelKeyMatch findQualifiersは相互排他的です。
tModelキー | uddi:systinet.com:findQualifier:omitTModelKeyMatch |
サポートされている操作 | すべてのfind_xx操作 |
この検索識別子は、一致するkeyedReferencesのデフォルトのルールを変更します。デフォルトでは、ワイルド・カードを使用せず、大/小文字を区別しないでtModelKeyが比較されます。この検索修飾子を使用すると、問合せ内のtModelKeyにワイルド・カードを含めることができます。
%は、ゼロ個以上の任意の文字と解釈されます。
_は、任意の1文字と解釈されます。
この動作は、approximateMatch検索修飾子と類似しています。
tModelキー | uddi:systinet.com:findQualifier:tModelKeyApproximateMatch |
サポートされている操作 | すべてのfind_xx操作 |