Service Registry 3 2005Q4 開発者ガイド

第 4 章 Service Registry へのオブジェクトの発行

適切な権限を持っているクライアントは、Service Registry へのオブジェクトの送信、オブジェクトの変更、および削除ができます。クライアントは、BusinessLifeCycleManager インタフェースを使ってこれらのタスクを実行します。

通常、レジストリがクライアントにオブジェクトの変更または削除を許可するのは、そのクライアントのユーザーが、変更または削除しようとしているオブジェクトを最初に送信したユーザーと同じである場合だけです。アクセス制御ポリシーを使えば、オブジェクトを発行したり、それらのオブジェクトに対してアクションを実行したりする権限を、どのユーザーに対して与えるかを制御できます。

レジストリオブジェクトの発行には、次のタスクが含まれます。

オブジェクトの送信は複数の手順から成るタスクです。オブジェクトを作成し、それらの属性を設定したあとで、オブジェクトを保存します。オブジェクトを保存しないと、レジストリ内に表示されません。

分類や外部識別子などによってオブジェクトを検索する際に、検索で使用する分類やその他のオブジェクトの作成を思い出してください 。(たとえば、「分類によるオブジェクトの検索」を参照)。ただし、このオブジェクトは保存されません。このオブジェクトは検索のためにのみ作成され、検索が終了すれば削除されます。オブジェクトを作成する際には Service Registry からの権限は必要ありませんが、オブジェクトを保存する際には権限が必要になります。

Service Registry の認証

Service Registry では証明書による認証が使用されるため、Service Registry にデータを送信するには証明書を持っている必要があります。また、レジストリにデータを送信できるユーザーを、Web コンソールのユーザー登録ウィザードを使って作成する必要もあります。詳細については、「Service Registry へのアクセス」を参照してください。

データを送信するには、クライアントはまず、その証明書を一連の「資格」に追加して Service Registry に送信する必要があります。次のコードは、その実行方法を示したものです。資格を取得するには、次の必須の値を指定する必要があります。

通常、これら 4 つの必須の値はリソースバンドルから取得し、メソッド内にコードの大部分をカプセル化します。

String keystorePath = "myKeystorePath";
String storepass = "myStorepass";
String alias = "myAlias";
String keypass = myKeypass");

Set credentials = new HashSet();
KeyStore keyStore = KeyStore.getInstance("JKS");
keyStore.load(new BufferedInputStream(
    new FileInputStream(keystorePath)),
     storepass.toCharArray());
X509Certificate cert = (X509Certificate)
     keyStore.getCertificate(alias);
PrivateKey privateKey =
     (PrivateKey) keyStore.getKey(alias, keypass.toCharArray());
credentials.add(new X500PrivateCredential(cert, privateKey,
    alias));
connection.setCredentials(credentials);

setCredentials メソッドが成功すると、ユーザーは Service Registry にログインした状態になり、オブジェクトを発行できるようになります。

Service Registry に対して認証するサンプルプログラムはすべて、このコードを含む getCredentialsFromKeystore という名前のメソッドを呼び出しています。このメソッドは、ファイル <INSTALL>/registry/samples/common/src/RegistryCredentials.java に定義されています。

オブジェクトの作成

クライアントは、オブジェクトを作成し、データを設定したあとで、そのオブジェクトを発行します。次のタイプの 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 オブジェクトとして追加します。

レジストリへのオブジェクトの保存

オブジェクトを作成し、その属性の設定が完了したら、そのオブジェクトを Service Registry に発行します。それには、LifeCycleManager.saveObjects メソッドを呼び出すか、BusinessLifeCycleManager.saveOrganizationsBusinessLifeCycleManager.saveServices などの、オブジェクトに固有の保存メソッドを呼び出します。単一のオブジェクトではなく、常にオブジェクトのコレクションを発行します。保存メソッドは、保存されたオブジェクトのキー (すなわち、一意の識別子) を含む BulkResponse オブジェクトを返します。次のコードでは、ある組織を保存したあと、そのキーを取得しています。

// Add organization and submit to registry
// Retrieve key if successful
Collection orgs = new ArrayList();
orgs.add(org);
BulkResponse response = blcm.saveOrganizations(orgs);
Collection exceptions = response.getExceptions();
if (exceptions == null) {
    System.out.println("Organization saved");

    Collection keys = response.getCollection();
    Iterator keyIter = keys.iterator();
    if (keyIter.hasNext()) {
        javax.xml.registry.infomodel.Key orgKey =
             (javax.xml.registry.infomodel.Key) keyIter.next();
        String id = orgKey.getId();
        System.out.println("Organization key is " + id);
    }
}

オブジェクトのいずれかがすでに存在しており、そのデータの一部が更新されている場合、保存メソッドはそのデータを更新して置換します。通常は、これによって、オブジェクトの新しいバージョンが作成されます (「レジストリ内のオブジェクトの状態の変更」を参照)。