Service Registry 3 2005Q4 開発者ガイド

オブジェクトに関する情報の取得

目的のオブジェクトを取得した後は、そのオブジェクトの属性や、そのオブジェクトに属しているほかのオブジェクトも取得できます。

組織については、次の属性も取得できます。

サービスの場合は、サービスバインディングを取得できます。

任意のオブジェクトについて、監査証跡も取得できます。監査証跡には、オブジェクトの状態を変更したイベントやバージョンが含まれています。オブジェクトのバージョン番号も取得できます。バージョン番号は、オブジェクトの属性のいずれかに変更が加えられるたびに更新されます。

ここでは、次の項目について説明します。

オブジェクトの ID 値の取得

オブジェクトの一意の識別子は Key オブジェクトに格納されています。Key は、String 値である id 属性の形式で識別子を格納する構造体です。識別子を取得するには、RegistryObject.getKey().getId() メソッドを呼び出します。

JAXR プロバイダには、lid と呼ばれる論理識別子を取得するための、実装に固有のメソッドもあります。lid RegistryObjectString 属性です。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() + ")");
}

PostalAddressTelephoneNumberPersonName、および EmailAddress オブジェクトの属性はすべて String 値です。「JAXR 情報モデルのインタフェース」で説明しているとおり、これらのオブジェクトは RegistryObject インタフェースを拡張しないため、ほかのレジストリオブジェクトの属性は持っていません。

組織の属性の取得: 例

組織、およびその主担当者である User の属性を取得するについては、<INSTALL>/registry/samples/organizations/src ディレクトリにある JAXRSearchOrg.java を参照してください。このサンプルは、指定された文字列が名前に含まれている組織についての情報を表示します。

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

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

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


    asant search-org -Dorg=string
    

組織のサービスおよびサービスバインディングの取得

ほとんどの組織はサービスを提供します。JAXR には、組織のサービスおよびサービスバインディングを取得するメソッドがあります。

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

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 のバージョン番号を取得するには、メソッドを呼び出すときに orgRegistryObjectImpl にキャストします。次に、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 を参照してください。