Service Registry 3 2005Q4 開発者ガイド

オブジェクトの作成

クライアントは、オブジェクトを作成し、データを設定したあとで、そのオブジェクトを発行します。次のタイプの RegistryObject は、任意に作成および発行できます。

次のタイプの RegistryObject は、単独では発行できませんが、別のオブジェクトの一部として作成および保存することはできます。

オブジェクトによっては、特殊なカテゴリに分類されるものもあります。それらを次に示します。

次の節では、最初に、すべてのレジストリオブジェクトの作成および保存に共通するタスクについて説明します。それから、特定のオブジェクト型に固有のタスクについて説明します。

オブジェクトの作成メソッドの使用

LifeCycleManager インタフェースは、すべてのタイプの RegistryObject に対する作成メソッドをサポートしています。ただし、AuditableEventNotification は除きます。これらを作成できるのは Service Registry だけです。

さらに、LifeCycleManager.createObject ファクトリメソッドを使って特定のタイプのオブジェクトを作成することもできます。このメソッドは、LifeCycleManager インタフェースがサポートする static フィールドのいずれかを含む String 引数を取ります。次のコード内の blcm は、BusinessLifeCycleManager オブジェクトです。

Organization org = (Organization)
    blcm.createObject(blcm.ORGANIZATION);

オブジェクトに固有の作成メソッドは通常、オブジェクトのいくつかの属性を設定する 1 つまたは複数のパラメータを取ります。たとえば、createOrganization メソッドは組織名を設定します。

Organization org = blcm.createOrganization("MyOrgName");

これに対し、createExtrinsicObject メソッドは通常、付帯オブジェクトに対するリポジトリ項目を設定する DataHandler 引数を取ります。

オブジェクトへの名前と説明の追加

すべてのオブジェクトで、設定メソッドを呼び出すことで名前属性と説明属性を設定できます。これらの属性のタイプは、InternationalString です。InternationalString には一連の LocalizedString オブジェクトが含まれていますが、これらは、ユーザーが 1 つまたは複数のロケールで名前や説明を表示できるようにするためのものです。デフォルトで、InternationalString 値はデフォルトのロケールを使用します。

たとえば、次のコードでは、地域対応された 2 つの文字列を使用する説明を作成します。1 つの文字列はデフォルトロケールの言語です。もう一方の文字列はフランス語 (カナダ) です。

InternationalString is =
    blcm.createInternationalString("What We Do"));
Locale loc = new Locale("fr", "CA");
LocalizedString ls = blcm.createLocalizedString(loc,
     "ce que nous faisons");
is.addLocalizedString(ls);
org.setDescription(is);

オブジェクトの識別

「一意の識別子によるオブジェクトの検索」で説明したように、Service Registry 内のすべてのオブジェクトには、一意の識別子と論理識別子の 2 つの識別子があります。オブジェクト作成時にこれらの識別子を設定しなかった場合は、レジストリによって一意の値が生成され、その値が一意の識別子と論理識別子の両方に割り当てられます。

新しいバージョンのオブジェクトが作成される場合は常に、論理識別子は元の識別子と同じですが、一意の識別子については、元の識別子にコロンとバージョン番号が付加された新しい一意の識別子が Service Registry によって生成されます。詳細については、「オブジェクトのバージョンの取得」および 「オブジェクト間の関係の作成: 関連付け」を参照してください。

独自の識別スキーマを使用する場合、オブジェクト識別子を設定するための API メソッドを使用できます。

JAXR API では、一意の識別子は Key オブジェクトと呼ばれます。LifeCycleManager.createKey メソッドを使用して、String オブジェクトから一意の識別子を作成できます。その後、RegistryObject.setKey メソッドを使用してキーを設定できます。

論理識別子は lid と呼ばれます。Service Registry の JAXR プロバイダには、この識別子を設定するための、実装に固有の RegistryObjectImpl.setLidメソッドが用意されています。このメソッドも String 引数を取ります。このメソッドのシグニチャーは次のとおりです。

public void setLid(java.lang.String lid)
    throws JAXRException

指定する識別子はすべて、有効かつグローバルで一意な URN (Uniform Resource Name) である必要があります。JAXR API がオブジェクトのキーを生成するとき、そのキーの形式は DCE 128 UUID (Universal Unique IDentifier) になります。

分類スキーマと Concept の作成と使用

レジストリオブジェクトを分類するために、独自の分類スキーマと Concept の階層を作成できます。階層を作成するには、次の手順に従います。

  1. LifeCycleManager.createClassificationScheme メソッドを使って分類スキーマを作成します。

  2. LifeCycleManager.createConcept メソッドを使って Concept を作成します。

  3. ClassificationScheme.addChildConcept メソッドを使って分類スキーマに Concept を追加します。

  4. より深い階層を作成する場合は、Concept.addChildConcept メソッドを使って Concept に子 Concept を追加します。

  5. 分類スキーマを保存します。

LifeCycleManager.createClassificationScheme メソッドにはいくつかの形式があります。名前と説明の 2 つの引数を、String 値または InternationalString 値として指定できます。たとえば、図書館における本の収納方法を記述する分類スキーマを作成する場合、次のようなコードを使用できます。


ClassificationScheme cs =
     blcm.createClassificationScheme("LibraryFloors",
         "Scheme for Shelving Books");

別の形式の createClassificationScheme メソッドは、1 つの引数 Concept を取り、Concept を ClassificationScheme に変換します。

createConcept メソッドは 3 つの引数を取ります。親、名前、および値です。親は、createClassificationScheme または別の Concept のいずれかです。値は指定するが名前は指定しない、ということも可能です。

次のコードでは、図書館のフロアの名前が格納された静的な String 配列を使用して、各フロアに対応する Concept を作成します。続いて、その Concept を分類スキーマに追加します。


for (int i = 0; i < floors.length; i++) {
    Concept con = blcm.createConcept(cs, floors[i], floors[i]);
    cs.addChildConcept(con);
    ...

各 Concept について、新しい Concept をさらに作成して Concept.addChildConcept を呼び出し、階層レベルを 1 つ増やすこともできます。分類スキーマを保存すると、その Concept 階層の全体も保存されます。

分類スキーマの作成と表示: 例

分類スキーマの作成のサンプルについては、<INSTALL>/registry/samples/classification-schemes/src ディレクトリにある JAXRPublishScheme.java を参照してください。このサンプルは、LibraryFloors という名前の分類スキーマを作成するとともに、図書館の各フロアとそこで見つけることのできる主題領域を含む Concept 階層を作成します。

Concept 階層を表示するには、同じディレクトリ内のプログラム JAXRSearchScheme.java を使用します。このサンプルは、ユーザーが指定した任意の分類スキーマに対する Concept 階層を表示します。

分類スキーマと Concept を削除するには、同じディレクトリ内のプログラム JAXRDeleteScheme.java を使用します。

ProcedureJAXRPublishScheme サンプルを実行するには

手順
  1. <INSTALL>/registry/samples/classification-schemes ディレクトリに移動します。

  2. 次のコマンドを入力します。


    asant pub-scheme
    

ProcedureJAXRSearchScheme サンプルを実行するには

手順
  1. <INSTALL>/registry/samples/classification-schemes ディレクトリに移動します。

  2. 次のコマンドを入力します。


    asant search-scheme -Dname=LibraryFloors
    

ProcedureJAXRDeleteScheme サンプルを実行するには

手順
  1. <INSTALL>/registry/samples/classification-schemes ディレクトリに移動します。

  2. 次のコマンドを入力します。


    asant del-scheme -Dname=LibraryFloors
    

オブジェクトへの分類の追加

オブジェクトは、1 つまたは複数の分類スキーマ (分類方式) に基づく分類を、 1 つまたは複数持つことができます。オブジェクトの分類を確立する場合、クライアントはまず、使用する分類方式を特定します。続いて、クライアントは、分類スキーマと分類スキーマ内の Concept (分類方式の要素) を使って分類を作成します。

Concept の階層を備えた新しい分類スキーマを作成する方法については、「オブジェクト間の関係の作成: 関連付け」を参照してください。Concept 階層を持つ分類スキーマは「内部分類スキーマ」と呼ばれます。

既存の分類スキーマを使用する分類を追加するには、通常は BusinessQueryManager.findClassificationSchemeByName メソッドを呼び出します。このメソッドは 2 つの引数を取ります。1 つは FindQualifier オブジェクトの Collection、もう 1 つは名前パターンを指定する String です。このメソッドから複数の結果が返されるとエラーになるため、検索は的確に定義する必要があります。たとえば、次のコードでは、AssociationType という名前の分類スキーマを検索しています。

String schemeName = "AssociationType";
ClassificationScheme cScheme =
     bqm.findClassificationSchemeByName(null, schemeName);

分類スキーマを特定したら、3 つの引数を指定して LifeCycleManager.createClassification メソッドを呼び出します。引数は、分類スキーマ、Concept の名前、および Concept の値です。

Classification classification =
     blcm.createClassification(cScheme, "Extends", "Extends");

もう 1 つの方法として、BusinessQueryManager.findConcepts を呼び出すか、 Concept 引数を指定して BusinessQueryManagerImpl.findObjects を呼び出し、使用する Concept を検索してから、Concept を唯一の引数として取る別の形式の createClassification を呼び出す、という方法があります。

Classification classification =
     blcm.createClassification(concept);

分類の作成が完了したら、RegistryObject.addClassification を呼び出して、分類をオブジェクトに追加します。

object.addClassification(classification);

複数の分類を追加するには、Collection を作成し、Collection に分類を追加したあと、RegistryObject.addClassifications を呼び出して Collection をオブジェクトに追加します。

分類の追加: 例

分類をオブジェクトに追加する例については、<INSTALL>/registry/samples/publish-object/src ディレクトリにある JAXRPublishObject.java を参照してください。このサンプルは、組織を 1 つ作成し、それにいくつかのオブジェクトを追加します。

ProcedureJAXRPublishObject サンプルを実行するには

手順
  1. <INSTALL>/registry/samples/publish-object ディレクトリに移動します。

  2. 次のコマンドを入力します。


    asant run
    

オブジェクトへの外部識別子の追加

オブジェクトに外部識別子を追加するには、次の手順に従います。

  1. 使用する分類スキーマを検索または作成します。

  2. その分類スキーマを使って外部識別子を作成します。

外部識別子を作成するには、Concept 階層を持たない分類スキーマである「外部分類スキーマ」を使用します。外部識別子に名前と値を指定します。

Service Registry に付属しているデータベースには、外部分類スキーマは含まれていません。外部分類スキーマを使用するには、次のようなコードを使って事前にそれらを作成する必要があります。


ClassificationScheme extScheme =
     blcm.createClassificationScheme("NASDAQ",
         "OTC Stock Exchange");

通常、既存の分類スキーマを検索するには、「オブジェクトへの分類の追加」で説明したように BusinessQueryManager.findClassificationSchemeByName メソッドを呼び出します。

たとえば、次のコードでは、前の手順で作成した外部分類スキーマを検索しています。


ClassificationScheme extScheme =
     bqm.findClassificationSchemeByName(null,
         "NASDAQ");

外部識別子を追加するには、LifeCycleManager.createExternalIdentifier メソッドを呼び出します。このメソッドは分類スキーマ、外部識別子の名前、外部識別子の値の 3 つの引数を取ります。続いて、その外部識別子をオブジェクトに追加します。


ExternalIdentifier extId =
     blcm.createExternalIdentifier(extScheme, "Sun",
         "SUNW);
object.addExternalIdentifier(extId);

「分類の追加: 例」で説明したサンプル <INSTALL>/registry/samples/publish-object/src/JAXRPublishObject.java は、オブジェクトへの外部識別子の追加も行います。

オブジェクトへの外部リンクの追加

オブジェクトに外部リンクを追加するには、LifeCycleManager.createExternalLink メソッドを呼び出します。このメソッドはリンクの URI とリンクの説明の 2 つの引数を取ります。続いて、その外部リンクをオブジェクトに追加します。

String eiURI = "http://java.sun.com/";
String eiDescription = "Java Technology";
ExternalLink extLink =
     blcm.createExternalLink(eiURI, eiDescription);
object.addExternalLink(extLink);

この URI は有効な URI でなければならず、JAXR プロバイダがその有効性をチェックします。ファイアウォールの外側へのリンクを指定する場合は、JAXR で URI の有効性を確認できるように、プログラムの実行時にシステムプロパティー http.proxyHost および http.proxyPort を指定する必要があります。

現在アクティブでないリンクを指定する場合などに URI の検証を無効にするには、リンクを作成する前に ExternalLink.setValidateURI メソッドを呼び出します。

extLink.setValidateURI(false);

「分類の追加: 例」で説明したサンプル <INSTALL>/registry/samples/publish-object/src/JAXRPublishObject.java は、オブジェクトへの外部リンクの追加も行います。このサンプルの build.xml ファイルには、システムプロパティー http.proxyHost および http.proxyPort が指定されています。

オブジェクトへのスロットの追加

スロットは任意の属性であるため、API を使用すると、最大限の柔軟性をもってスロットを作成できます。ユーザーは、1 つの名前、1 つまたは複数の値、および 1 つの型を設定できます。名前と型は String オブジェクトです。これらの値は String オブジェクトの Collection として格納されますが、LifeCycleManager.createSlot メソッドには、単一の String 値を指定できる形式も用意されています。たとえば、次のコードでは、String 値を使ってスロットを作成したあとで、そのスロットをオブジェクトに追加しています。

String slotName = "Branch";
String slotValue = "Paris";
String slotType = "City";
Slot slot = blcm.createSlot(slotName, slotValue, slotType);
org.addSlot(slot);

「分類の追加: 例」で説明したサンプル <INSTALL>/registry/samples/publish-object/src/JAXRPublishObject.java は、オブジェクトへのスロットの追加も行います。

組織の作成

Organization オブジェクトはおそらく、最も複雑なレジストリオブジェクトです。このオブジェクトには通常、すべてのオブジェクトに共通する属性のほかに、次の属性が含まれます。

組織は 1 つまたは複数の子組織を持つこともでき、それらの子組織もまた子を持つことができます。こうして、組織の階層が形成されます。

次のコードでは、組織を 1 つ作成し、その名前、説明、住所、および電話番号を指定しています。

// Create organization name and description
Organization org =
     blcm.createOrganization("The ebXML Coffee Break");
InternationalString is =
    blcm.createInternationalString("Purveyor of " +
        "the finest coffees. Established 1905");
org.setDescription(is);

// create postal address for organization
String streetNumber = "99";
String street = "Imaginary Ave. Suite 33";
String city = "Imaginary City";
String state = "NY");
String country = "USA");
String postalCode = "00000";
String type = "Type US";
PostalAddress postAddr =
     blcm.createPostalAddress(streetNumber, street, city, state,
        country, postalCode, type);
org.setPostalAddress(postAddr);

// create telephone number for organization
TelephoneNumber tNum = blcm.createTelephoneNumber();
tNum.setCountryCode("1");
tNum.setAreaCode("100");
tNum.setNumber("100-1000");
tNum.setType("OfficePhone");
Collection tNums = new ArrayList();
tNums.add(tNum);
org.setTelephoneNumbers(tNums);

電話番号のタイプは、PhoneType 分類スキーマに含まれる Concept の値です。"OfficePhone""MobilePhone" "HomePhone""FAX"、または "Beeper" のいずれかです。

組織の階層を作成するには、Organization.addChildOrganization メソッドを使ってある組織を別の組織に追加するか、Organization.addChildOrganizations メソッドを使って組織の Collection を別の組織に追加します。

組織の作成: 例

組織の作成方法のサンプルについては、 <INSTALL>/registry/samples/organizations/src ディレクトリにある JAXRPublishOrg.javaJAXRPublishOrgNoPC.java を参照してください。

JAXRPublishOrg サンプルは、1 つの組織とその主担当者、および 1 つのサービスとそのサービスバインディングを作成します。サンプルでは組織、ユーザー、およびサービスに対する一意の識別子が表示され、ユーザーはあとでオブジェクトを削除する際にそれらの識別子を使うことができます。このサンプルは、組織の主担当者として架空の User を作成します。

もう 1 つのサンプル JAXRPublishOrgNoPC.java は、組織の主担当者を設定しません。この場合、主担当者はデフォルトで、プログラム実行時に認証された User になります。

ProcedureJAXRPublishOrg および JAXRPublishOrgNoPC サンプルを実行するには

手順
  1. <INSTALL >/registry/samples/organizations ディレクトリに移動します。

  2. 次のコマンドを入力します。


    asant pub-org
    asant pub-org-nopc
    

組織階層の作成と取得: 例

組織階層を発行および取得する方法のサンプルについては、<INSTALL>/registry/samples/organizations/src ディレクトリにある JAXRPublishOrgFamily.java および JAXRSearchOrgFamily.java を参照してください。

ProcedureJAXRPublishOrgFamily および JAXRSearchOrgFamily サンプルを実行するには

手順
  1. <INSTALL>/registry/samples/organizations ディレクトリに移動します。

  2. 組織を発行するには、次のコマンドを入力します。


    asant pub-fam
    
  3. 発行した組織を取得するには、次のコマンドを入力します。


    asant search-fam
    

ユーザーの作成

主担当者を指定せずに組織を作成する場合、デフォルトの主担当者は、その組織を作成した User オブジェクト、つまり、Service Registry への接続確立時に設定した資格の所有者であるユーザーになります。もちろん、それとは異なるユーザーを主担当者として指定することもできます。User もまた、複雑なレジストリオブジェクトです。これには通常、すべてのオブジェクトに共通する属性のほかに、次の属性が含まれます。

次のコードでは、User を作成し、その User を組織の主担当者として設定しています。この User には、電話番号と電子メールアドレスは設定されていますが、住所は設定されていません。

// Create primary contact, set name
User primaryContact = blcm.createUser();
String userId = primaryContact.getKey().getId();
System.out.println("User URN is " + userId);
PersonName pName =
     blcm.createPersonName("Jane", "M.", "Doe");
primaryContact.setPersonName(pName);

// Set primary contact phone number
TelephoneNumber pctNum = blcm.createTelephoneNumber();
pctNum.setCountryCode("1");
pctNum.setAreaCode("100");
pctNum.setNumber("100-1001");
pctNum.setType("MobilePhone");
Collection phoneNums = new ArrayList();
phoneNums.add(pctNum);
primaryContact.setTelephoneNumbers(phoneNums);

// Set primary contact email address
EmailAddress emailAddress =
blcm.createEmailAddress("jane.doe@TheCoffeeBreak.com");
emailAddress.setType("OfficeEmail"));
Collection emailAddresses = new ArrayList();
emailAddresses.add(emailAddress);
primaryContact.setEmailAddresses(emailAddresses);

URL pcUrl = new URL((bundle.getString("person.url"));
primaryContact.setUrl(pcUrl);

// Set primary contact for organization
org.setPrimaryContact(primaryContact);

主担当者の電話番号のタイプは、PhoneType 分類スキーマに含まれる Concept の値です。値は "OfficePhone""MobilePhone""HomePhone" "FAX"、または "Beeper" のいずれかです。主担当者の電子メールアドレスのタイプは、EmailType 分類スキーマに含まれる Concept の値です。値は "OfficeEmail" または "HomeEmail" です。

サービスとサービスバインディングの作成

ほとんどの組織は、サービスを提供するために自らをレジストリに発行します。このため、JAXR には、サービスやサービスバインディングを組織に追加する機能が用意されています。

また、どの組織にも関連付けられていないサービスを作成することもできます。

Service オブジェクトには Organization オブジェクトと同じく、名前、説明、およびサービス登録時にレジストリによって生成される一意のキーがあります。Service オブジェクトは分類を持つこともできます。

サービスには通常、すべてのオブジェクトに共通する属性のほかに、サービスへのアクセス方法に関する情報を提供する「サービスバインディング」があります。ServiceBinding オブジェクトには通常、説明、アクセス URI、および仕様リンクがあります。仕様リンクは、サービスバインディングと技術仕様をリンクします。技術仕様には、サービスバインディングを用いてサービスを使用する方法が記述されています。

次のコードは、サービスのコレクションを作成し、サービスにサービスバインディングを追加したあと、サービスを組織に追加する方法を示したものです。ここでは、アクセス URI は指定されていますが、仕様リンクは指定されていません。このアクセス URI は実際には存在しませんが、JAXR はデフォルトで、発行されたすべての URI の有効性をチェックします。このため、このバインディングでは validateURI 属性が false に設定されています。

// Create services and service
Collection services = new ArrayList();
Service service = blcm.createService("My Service Name");
InternationalString is =
     blcm.createInternationalString("My Service Description");
service.setDescription(is);

// Create service bindings
Collection serviceBindings = new ArrayList();
ServiceBinding binding =
     blcm.createServiceBinding();
is = blcm.createInternationalString("My Service Binding " +
     "Name"));
binding.setName(is);
is = blcm.createInternationalString("My Service Binding " +
    "Description");
binding.setDescription(is);
// allow us to publish a fictitious URI without an error
binding.setValidateURI(false);
binding.setAccessURI("http://TheCoffeeBreak.com:8080/sb/");
...
serviceBindings.add(binding);

// Add service bindings to service
service.addServiceBindings(serviceBindings);

// Add service to services, then add services to organization
services.add(service);
org.addServices(services);

サービスバインディングには通常、サービスへのアクセス方法を記述した技術仕様があります。そのような仕様の一例として、WSDL 文書が挙げられます。サービスの仕様が WSDL 文書である場合、その格納場所を発行するには、ExtrinsicObject を参照する SpecificationLink オブジェクトを作成します。詳細は、「リポジトリへの項目の格納」を参照してください。

この機構は、仕様の場所を UDDI レジストリに発行する方法とは異なります。UDDI レジストリの場合、Concept オブジェクトを作成したあと、その Concept オブジェクトに、WSDL 文書の URL を ExternalLink オブジェクトとして追加します。