UDDI4J API (UDDI4J APIの参考文献、およびこの記事で参照されているその他の参考文献へのリンクについては、参考文献を参照) がリリースされたことにより、UDDI対応アプリケーションの作成が可能になり、オープン・ソースのAPIからpublish、unpublish、およびfind 操作を行なえるようになりました。
WSDL文書 (リンクについては、参考文献を参照) をこの環境の一部として使用できるようにするために、Service Registry Proxy (SRP) APIという、UDDI4Jの最上部に置かれる新規レイヤーが考案されました。
SRP APIエレメントは、UDDI4J API内にあるクラスと、WSDL4J APIによって定義されたいくつかのクラスをカプセル化し、UDDIレジストリーとインターフェースするための包括的なメソッドのセットを提供します。このモデルにより、抽象化のレベルが高まり、開発者はWebサービス・アーキテクチャー・ドメインに直接関係するエンティティーの作業に専念できるようになりますので、アプリケーションの開発が簡素化されます。
SRP APIは、図1に示すように、Service Provider (SP)、Service Definition (SD)、Service Implementation (SIMP)、およびService Interface (SITF) を主要なエレメントとして構成されています。
図1: SRP APIの主要エレメント
-
SP: Service Providerは、サービスを提供することのできるエンティティーを表します。これは、UDDI4Jクラス
BusinessEntityへの参照をカプセル化します。 - SD: Service Definitionは、サービスをインプリメンテーション (SIMP) とインプリメントされたインターフェースのリスト (SITF) の、2つの部分に分割して記述します。
-
SIMP: Service Implementationには2つの役割があります。関連するWSDLインプリメンテーション文書 (参考文献を参照) を公開することと、UDDI4Jクラス
BusinessServiceへの参照を提供することです。 -
SINT: Service Interfaceも2つのエンティティー、すなわちWSDLインターフェース文書 (参考文献を参照) と、UDDI4Jクラス
TModelへの参照をカプセル化します。
SIMPおよびSINTによって提供されるWSDL機能は、それらの親クラスであるWSDLServiceInfo から継承されます。
このように編成されていることにより、SRPはUDDIエレメントとWSDLエレメントを結び付け、またそれと同時にそれらの概念を抽象化することができますので、Webサービスの作成効率が向上します。
内部的には、SRPは表1 に示す主要属性を備えています。これらの属性は、UDDI4J APIとのインターフェースを処理し、関連するUDDIレジストリー接続情報を維持するものです。
表1: SRPの属性
| 属性 | 説明 |
| protected int maxRowsReturned = 100; | 戻される最大行数 |
| protected int numRowsToSearch = 100; | 検索される最大行数 |
| protected String inquiryURL; | Find操作で使用されるURL |
| protected String publishURL; | Publish操作で使用されるURL |
| protected String userId; | UDDIレジストリーに接続するためのユーザーID |
| protected String cred; | UDDIレジストリーに接続するためのパスワード |
| protected UDDIProxy uddiProxy; | UDDI4Jプロキシー・オブジェクト |
SRP APIは、表2 に示すように、Publish、Unpublish、およびFindの各機能グループからなります。SRP APIの完全なjavadocについては、参考文献のリンクを参照してください。
表2: SRPの機能グループ
| API | サブAPI | メソッド呼び出し | 説明 |
| Publish | ServiceProviders、ServiceDefinition、およびServiceInterfaceオブジェクトを公開する | ||
| publish (ServiceProvider) : ServiceProvider | |||
| publish (ServiceProvider, ServiceDefinition) : ServiceDefinition | |||
| publish (ServiceInterface) : ServiceInterface | |||
| Unpublish | ServiceProviders、ServiceDefinition、およびServiceInterfaceオブジェクトを公開停止する | ||
| unpublish (ServiceProvider) : void | |||
| unpublish (ServiceInterface) : void | |||
| unpublish (ServiceProvider, ServiceDefinition) : void | |||
| Find | |||
| Service Provider | 特定の検索基準に基づいてServiceProviderオブジェクトを検索する | ||
| findAllServiceProviders (FindQualifiers, boolean) : ServiceProvider[] | |||
| findServiceProvider (ServiceDefinition) : ServiceProvider | |||
| findServiceProvider (String) : ServiceProvider | |||
| findServiceProviders (FindQualifiers, DiscoveryURLs) : ServiceProvider[] | |||
| findServiceProviders (FindQualifiers, TModelBag) : ServiceProvider[] | |||
| findServiceProviders (String, boolean) : ServiceProvider[] | |||
| findServiceProviders (CategoryList) : ServiceProvider[] | |||
| findServiceProviders (IdentifierList) : ServiceProvider[] | |||
| Service Definition | 特定の検索基準に基づいてServiceDefinitionオブジェクトを検索する | ||
| findAllServices (FindQualifiers, boolean) : ServiceDefinition[] | |||
| findService (String) : ServiceDefinition | |||
| findService (FindQualifiers, ServiceProvider, ServiceImplementation) : ServiceDefinition | |||
| findServices (FindQualifiers, TModelBag) : ServiceDefinition[] | |||
| findServices (String, boolean) : ServiceDefinition[] | |||
| findServices (FindQualifiers, ServiceInterface) : ServiceDefinition[] | |||
| findServices (ServiceInterface, String) : ServiceDefinition[] | |||
| findServices (ServiceInterface, CategoryList) : ServiceDefinition[] | |||
| findServices (ServiceProvider, String) : ServiceDefinition[] | |||
| findServices (FindQualifiers, ServiceProvider) : ServiceDefinition[] | |||
| findServices (FindQualifiers, ServiceProvider, CategoryList) : ServiceDefinition[] | |||
| findServices (FindQualifiers, CategoryList) : ServiceDefinition[] | |||
| findServices (ServiceList) : ServiceDefinition[] | |||
| Service Interface | 特定の検索基準に基づいてServiceInterfaceオブジェクトを検索する | ||
| findAllServiceInterfaces (FindQualifiers, boolean) : ServiceInterface[] | |||
| findServiceInterface (String) : ServiceInterface | |||
| findServiceInterfaces (String, boolean) : ServiceInterface[] | |||
| findServiceInterfaces (FindQualifiers, IdentifierList) : ServiceInterface[] | |||
| findServiceInterfaces (FindQualifiers, CategoryList) : ServiceInterface[] | |||
| findServiceInterfaces (ServiceImplementation) : ServiceInterface[] | |||
| findServiceInterfaces (ServiceImplementation, String) : ServiceInterface[] | |||
| findServiceInterfaces (ServiceImplementation, IdentifierList) : ServiceInterface[] | |||
| findServiceInterfaces (ServiceImplementation, CategoryList) : ServiceInterface[] |
この記事に含まれるデモでは、Service Providerエレメントを公開し、検索し、最後に公開停止して、SRP APIの機能を示しています。ソース・コードは、リスト1、2、および3 に示してあります。このコードを自由に使用し、ユーザー自身のプロジェクトに合わせて調整してください。
ServiceProviderPublishDemo は、初期化フェーズで、公開および照会の対象となる特定のURL、およびターゲットUDDIレジストリーに事前登録されているユーザーIDとパスワードを使用して、SRPオブジェクトを作成します。CategoryList クラスは、インスタンス化されServiceProviderの作成をサポートします。このServiceProviderには名前と説明も必要になります。
ServiceProviderが正常に作成されると、SRP公開メソッドが起動し、このオブジェクトを唯一のパラメーターとして受け取ります。このコードは実行中に、起こりうるエラー条件が発生しているかどうかを検査し、適切なメッセージを発行します。
リスト1: Service Provider公開のデモ
import com.ibm.wstk.service.provider.*;
import com.ibm.wstk.service.registry.*;
import com.ibm.wstk.service.util.*;
import com.ibm.wstk.uddi.*;
public class ServiceProviderPublishDemo
{
public static String UDDI_TEST_REGISTRY_INQUIRY
= "http://www-3.ibm.com/services/uddi/testregistry/inquiryapi";
public static String UDDI_TEST_REGISTRY_PUBLISH
= "https://www-3.ibm.com/services/uddi/testregistry/protect/publishapi";
public static String UDDI_USER = "srpuser";
public static String UDDI_PASSWD = "srppwd";
public static String SERVICE_PROVIDER_NAME = "demo provider";
public static String SERVICE_PROVIDER_DESC = "SRP provider demo";
public static String TMODEL_KEY = "NAICS";
public static String KEY_NAME = "Greeting Card Publishers";
public static String KEY_VALUE = "511191";
public static void main(String args[])
{
try
{
//////////////////// INITIALIZATION
/////////////////////////////////
// Create Service Registry Proxy
ServiceRegistryProxy srp =
new ServiceRegistryProxy(UDDI_TEST_REGISTRY_INQUIRY,
UDDI_TEST_REGISTRY_PUBLISH,
UDDI_USER, UDDI_PASSWD);
// Create category list
CategoryList categoryList =
new CategoryList(TModelKeyTable.getTModelKey(TMODEL_KEY),
KEY_NAME, KEY_VALUE);
// Create service provider
ServiceProvider serviceProvider =
new ServiceProvider(SERVICE_PROVIDER_NAME,
SERVICE_PROVIDER_DESC,
categoryList);
//////////////////// PUBLISH
////////////////////////////////////////
// Publish the service provider
srp.publish(serviceProvider);
// Display publish completed message
System.out.println("Service provider " + "\"" +
SERVICE_PROVIDER_NAME + "\"" + " was published.");
}
catch (ServiceRegistryProxyException e)
{
System.out.println("ServiceRegistryProxyException: " + e.getMessage());
}
catch (InvalidCategoryException e)
{
System.out.println("InvalidCategoryException: " + e.getMessage());
}
}
}
|
ServiceProviderを検索するデモは、前のデモで使用されたものと同じパラメーターを使用してSRPインスタンスを作成します。
そして、SRP検索メソッドの1つを使用して、前に公開されたServiceProviderが検出され、実行中に適切なメッセージが生成されます。
リスト2: Service Provider検索のデモ
import com.ibm.wstk.service.provider.*;
import com.ibm.wstk.service.registry.*;
import com.ibm.wstk.service.util.*;
import com.ibm.wstk.uddi.*;
public class ServiceProviderFindDemo
{
public static String UDDI_TEST_REGISTRY_INQUIRY
= "http://www-3.ibm.com/services/uddi/testregistry/inquiryapi";
public static String UDDI_TEST_REGISTRY_PUBLISH
= "https://www-3.ibm.com/services/uddi/testregistry/protect/publishapi";
public static String UDDI_USER = "srpuser";
public static String UDDI_PASSWD = "srppwd";
public static String SERVICE_PROVIDER_NAME = "demo provider";
public static void main(String args[])
{
try
{
//////////////////// INITIALIZATION
/////////////////////////////////
// Create Service Registry Proxy
ServiceRegistryProxy srp =
new ServiceRegistryProxy(UDDI_TEST_REGISTRY_INQUIRY,
UDDI_TEST_REGISTRY_PUBLISH,
UDDI_USER, UDDI_PASSWD);
//////////////////// FIND
///////////////////////////////////////////
// Find the published service provider
ServiceProvider[] serviceProviderList =
srp.findServiceProviders(SERVICE_PROVIDER_NAME, true);
// Display find completed message
if (serviceProviderList == null)
System.out.println("Service provider " + "\"" +
SERVICE_PROVIDER_NAME
+ "\"" + " was not found.");
else
{
System.out.println("Service Provider Name: " +
serviceProviderList[0].getBusinessEntity
().getNameString());
System.out.println(" Description: " +
serviceProviderList[0].getBusinessEntity
().getDefaultDescriptionString());
}
}
catch (ServiceRegistryProxyException e)
{
System.out.println("ServiceRegistryProxyException: " + e.getMessage());
}
}
}
|
最後に、公開停止を行います。初期化の方法は、前の場合と同じです。そして、該当のSRP公開停止メソッドによって、ターゲットのServiceProviderが検索され、公開停止になります。この場合も、エラーがモニターされ、報告されます。
リスト3: Service Provider公開停止のデモ
import com.ibm.wstk.service.provider.*;
import com.ibm.wstk.service.registry.*;
import com.ibm.wstk.service.util.*;
import com.ibm.wstk.uddi.*;
public class ServiceProviderUnpublishDemo
{
public static String UDDI_TEST_REGISTRY_INQUIRY
= "http://www-3.ibm.com/services/uddi/testregistry/inquiryapi";
public static String UDDI_TEST_REGISTRY_PUBLISH
= "https://www-3.ibm.com/services/uddi/testregistry/protect/publishapi";
public static String UDDI_USER = "srpuser";
public static String UDDI_PASSWD = "srppwd";
public static String SERVICE_PROVIDER_NAME = "demo provider";
public static void main(String args[])
{
try
{
//////////////////// INITIALIZATION
/////////////////////////////////
// Create Service Registry Proxy
ServiceRegistryProxy srp =
new ServiceRegistryProxy(UDDI_TEST_REGISTRY_INQUIRY,
UDDI_TEST_REGISTRY_PUBLISH,
UDDI_USER, UDDI_PASSWD);
//////////////////// UNPUBLISH
//////////////////////////////////////
// Find the published service provider
ServiceProvider[] serviceProviderList =
srp.findServiceProviders(SERVICE_PROVIDER_NAME, true);
if (serviceProviderList != null)
{
// Unpublish the service provider
srp.unpublish(serviceProviderList[0]);
// Display unpublish completed message
System.out.println("Service provider " + "\"" +
SERVICE_PROVIDER_NAME + "\"" + " was unpublished.");
}
else
// Display error message
System.out.println("Service provider " + "\"" +
SERVICE_PROVIDER_NAME + "\"" + " not found.");
}
catch (ServiceRegistryProxyException e)
{
System.out.println("ServiceRegistryProxyException: " + e.getMessage());
}
}
}
|
これらのデモは、IBM UDDIテスト・レジストリーを使用して対話を行ないます。テスト・レジストリーには、定義済みのログインおよびパスワードがすでに登録されています。
SRP、UDDI4J、およびWSDL4Jは、IBM Web Services Toolkit (WSTK) の一部としても使用することができます (参考文献のリンクを参照)。WSTKをインストールおよび構成した後で、以下の手順に従って、Microsoft Windows 2000環境でService Providerをコンパイルし、実行してください (LinuxまたはUnixとの違いは、コードのコンパイルおよび実行に使用するコマンドの構文だけです)。
シェル・ウィンドウをオープンし、デモがあるディレクトリーに移動して、プロンプトから次のように入力します。
%WSTK_HOME%\bin\wstkenv.bat javac -classpath .;%WSTK_CP%;%WSTK_HOME%\uddi4j\lib\uddi4j.jar *.java |
同じシェル・ウィンドウで、次のように入力します。
java -cp .;%WSTK_CP%;%WSTK_HOME%\uddi4j\lib\uddi4j.jar ServiceProviderXXXDemo |
(このXXXは、Publish、Find、またはUnpublishです。)
これらのデモが正常に実行されると、表3 に示す出力が得られます。
表3: デモの出力
| デモ | 出力 |
| ServiceProviderPublishDemo | Service provider "demo provider" was published |
| ServiceProviderFindDemo | Service Provider Name: demo provider Description: SRP provider demo |
| ServiceProviderUnpublishDemo | Service provider "demo provider" was unpublished |
これでSRPは習得しました。このツールが便利だと感じていただければ幸いです。ここで紹介したコードは、読者の作業に自由に使用してください。また、読者の役に立つと思われる、他のタイプの記事やツールがありましたら、Web Servicesチームにぜひお知らせください。下記の参考文献セクションには、WSTKページ (およびプロジェクト・チームについてのフィードバック・フォーム) へのリンクが記載されています。
- alphaWorksからIBM Web Services Toolkit をダウンロードしてください。
-
WSDL 1.0仕様の最初のリリースに目を通してください。

Alfredo da SilvaはIBMのソフトウェア開発者です。彼は、IBM Web Services Toolkit (WSTK) を担当するグループのメンバーです。Alfredoの連絡先は、afdasilv@us.ibm.com です。