ヘッダをスキップ
Oracle® WebLogic Communication Services 開発者ガイド
11g リリース 1 (11.1.1)
B55506-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

8 Parlay X Presence Web Services

この章では、アプリケーション開発用の Parlay X 2.0 Presence Web Services インタフェースのサポートについて説明します。 Web サービスは、Web サービスのユーザに代わって通知をパブリッシュ、サブスクライブおよびリスンできるプレゼンス ネットワーク エージェントとして機能します。 この章の内容は以下のとおりです。

8.1 概要

OWLCS では、「Open Service Access, Parlay X Presence Web Services, Part 14, Presence ETSI ES 202 391-14」仕様で定義された Parlay X Presence Web Service のパート 14 をサポートします。 OWLCS Parlay X Web Service は、「Open Service Access, Mapping of Parlay X Presence Web Services to Parlay/OSA APIs, Part 14, Presence Mapping, Subpart 2, Mapping to SIP/IMS Networks, ETSI TR 102 397-14-2」仕様に従って、Parlay X Webサービスを SIP/IMS ネットワークにマップします。


注意 :

Web サービスの同期性により、Webサービスからコールバックを受信するには、クライアントは Web サービス コールバック インタフェースを実装する必要があります。プレゼンスの場合、必要なインタフェースは、「Open Service Access, Parlay X Presence Web Services, Part 14, Presence ETSI ES 202 391-14」で説明されている PresenceNotification インタフェースです。

Presence Web Service をホストする HTTP サーバーは、プレゼンス ネットワーク エージェントまたはParlay X から SIP へのゲートウェイです。

8.2 Web サービスのインストール

Web サービスは標準の .ear ファイルとしてパッケージ化されており、他の Web サービスと同様に管理コンソールでデプロイできます。 .ear ファイルには、2 つのインタフェースを実装する 2 つの .war ファイルが含まれています。Web サービスは Oracle SDP プラットフォーム、クライアント、およびプレゼンス共通の共有ライブラリを使用します。

8.3 Web サービスのコンフィグレーション

Presence Supplier Web サービスにコンフィグレーション可能な以下の 4 つの Mbean 属性があります。

Presence Consumer にコンフィグレーション可能な 3 つの Mbean 属性があります。

8.4 Presence Web Services インタフェースの説明

Presence Web Services は以下の 3 つのインタフェースで構成されます。

表 8-1 PresenceConsumer インタフェース

操作 説明

subscribePresence

Web サービスは、プレゼンス サーバに SUBSCRIBE を送信します。

getUserPresence

プレゼンティティのステータス変更が、SIP NOTIFY によって非同期で Web サービスに送信されるため、キャッシュされたプレゼンス ステータスを返します。Web サービスに実際に存在するのは、Web サービス クライアントではなくサブスクリプションです。

startPresenceNotification

プレゼンティティによってプレゼンスのステータスまたはプレゼンス ルール ドキュメントが変更されるたびに Web サービス クライアントが通知を非同期に受信できるようにします。

endPresenceNotification

Web サービス クライアントによる通知の非同期受信を無効にします。


表 8-2 PresenceNotification インタフェース

操作 説明

statusChanged

非同期操作は、通知を要求した属性が変更されると、Web サービスによって呼び出されます。

statusEnd

このメソッドは、コリレータによって識別される通知期間が終了したときに呼び出されます。 エラーが発生した場合や endPresenceNotification を明示的に呼び出した場合、このメソッドは呼び出されません。

notifySubscription

この非同期メソッドは、プレゼンティティが保留中のサブスクリプションを処理したことをウォッチャに通知します。

subscriptionEnded

この非同期操作は Web サービスによって呼び出され、サブスクリプションが終了したことをウォッチャに通知します。


表 8-3 PresenceSupplier インタフェース

操作 説明

publish

SIP PUBLISH に直接マップします。

getOpenSubscriptions

ウォッチャがプレゼンス データをサブスクライブするかどうかを確認するために、プレゼンティティ (サプライヤ) によって呼び出されます。このメソッドにマップされる SIP メッセージはありません。Web サービス サーバで現在保留中のサブスクリプションを返します。

updateSubscriptionAuthorization

サプライヤはこのメソッドを使用して、オープン状態の保留中のサブスクリプションに応答します。XCAP PUT メッセージは、presence-rule ドキュメントを更新するために XDMS サーバに送信されます。

getMyWatchers

Web サービス サーバからウォッチャのローカル リストを取得します。

getSubscribedAttributes

Web サービス サーバからサブスクライブされた属性のローカル リストを取得します。現在は、Activity のみを返します。

blockSubscription

XDMS サーバーで XCAP ドキュメントを変更して (ブロック リストにウォッチャを追加して)、Web サービス サーバーでのウォッチャ サブスクリプションを終了させます。


8.5 Presence Web Services インタフェースの使用

ここでは、インタフェースの各操作の使用方法を、コード例を使用して説明します。

8.5.1 インタフェース : PresenceConsumer、操作 : subscribePresence

これは、このインタフェースで別の操作を使用する前に、アプリケーションが呼び出す必要のある最初の操作です。この操作は次の 2 つの目的を果します。

  • Web サービスで、現在の HTTP セッションとユーザを関連付けられるようにします。

  • 少なくとも 1 つのプレゼンティティ (SUBSCRIBE プレゼンス イベント) をサブスクライブして、このインタフェースで他のすべての操作にコンテキストを提供します。

8.5.1.1 コード例

// アクティビティの属性を設定する
PresenceAttributeType pa = PresenceAttributeType.ACTIVITY;
List<PresenceAttributeType> pat = new ArrayList<PresenceAttributeType>();
pat.add(pa);

SimpleReference sr = new SimpleReference();
sr.setCorrelator("");
sr.setInterfaceName("");
sr.setEndpoint("");
consumer.subscribePresence ("sip.presentity@test.example.com" , pat, "unused", sr);

8.5.2 インタフェース : PresenceConsumer、操作 : getUserPresence

サブスクライブされたプレゼンティティのプレゼンスを取得するには、この操作を呼び出します。そのユーザーがオフラインの場合、ActivityNone が返され、PresenceAttribute.note にハードステートが書き込まれます。ActivityOther が返される場合、OtherValue フィールドにアクティビティの説明が返されます。

Name フィールドの値が "ServiceAndDeviceNote" である場合、OtherValue は、サービス メモとデバイス メモを結合したものになります。プレゼンティティが複数のクライアントに記録される場合、複数の ServiceAndDeviceNote が存在する可能性があることに注意してください。

8.5.2.1 コード例

PresenceAttributeType pat = 
  PresenceAttributeType.ACTIVITY;
List<PresenceAttribute> result = 
  consumer.getUserPresence(presentity, pat);
for (PresenceAttribute pa : result) {
  // アクティビティ タイプであるかどうかを確認する。
  if (pa.getTypeAndValue().getUnionElement() ==
              PresenceAttributeType.ACTIVITY){
     // プレゼンスのステータスを取得する。
     System.out.println("ACTIVITY: " +
         pa.getTypeAndValue().getActivity().toString());
     // カスタマイズしたプレゼンス メモを取得する。
     if (pa.getNote().length() > 0){
        System.out.println("Note: " + pa.getNote());
    }
  }
  // タイプが OTHER の場合、
  // 別のタイプの情報を抽出する必要がある。
  if (pa.getTypeAndValue().getUnionElement() ==
              PresenceAttributeType.OTHER){
    // タイプがカスタム プレゼンス ステータス、"Activity_Other" の場合。
    if (pa.getTypeAndValue().getOther()
             .getName().compareToIgnoreCase("ACTIVITY_OTHER") == 0){
   System.out.println("Other Activity->" + 
          pa.getTypeAndValue().getOther().getValue() + "\n");
 } else {
    // 現在、ACTIVITY_OTHER 以外の値は
    // サービス メモ + デバイス メモを表す
    // "ServiceAndDeviceNote" のみ。
    System.out.println("Combined Note->" +
        pa.getTypeAndValue().getOther().getValue() + "\n");
    }
  }
}

8.5.3 インタフェース : PresenceNotification、操作 : statusChanged

この非同期操作は、通知を要求した属性が変更されると、Web サービスによって呼び出されます。

8.5.3.1 コード例

public void
statusChanged(String context, String correlator, String uri,
List<PresenceAttribute> presenceAttributes) {
System.out.println("statusChanged Called:-");
System.out.println("Context = " + context);
System.out.println("Correlator = " + correlator);
System.out.println("Presentity = " + uri);
}

8.5.4 インタフェース : PresenceNotification、操作 : statusEnd

このメソッドは、コリレータによって識別される通知期間が終了したときに呼び出されます。 エラーが発生した場合や endPresenceNotification を明示的に呼び出した場合、このメソッドは呼び出されません。

8.5.4.1 コード例

public void statusEnd(String context, String correlator) 
System.out.println("statusEnd Called:-");
System.out.println("Context = " + context);
System.out.println("Correlator = " + correlator);
}

8.5.5 インタフェース : PresenceNotification、操作 : notifySubscription

この非同期メソッドは、プレゼンティティが保留中のサブスクリプションを処理したことをウォッチャに通知します。

8.5.5.1 コード例

public void notifySubscription(String context, String uri,
List<PresencePermission> presencePermissions) {
System.out.println("notifySubscription Called:-");
System.out.println("Context = " + context);
System.out.println("Uri = " + uri);
if (presencePermissions.size() > 0){
for (PresencePermission p:presencePermissions){
System.out.println("Permission " + 
p.getPresenceAttribute().value()
+ "->" + p.isDecision());
}
}
}

8.5.6 インタフェース : PresenceNotification、操作 : subscriptionEnded

この非同期操作は Web サービスによって呼び出され、サブスクリプションが終了したことをウォッチャに通知します。

8.5.6.1 コード例

public void subscriptionEnded(String context, String uri, String reason) {
System.out.println("subscriptionEnded Called:-");
System.out.println("Context = " + context);
System.out.println("Uri = " + uri);
System.out.println("Reason = " + reason);
}

8.5.7 インタフェース PresenceSupplier、操作 : publish および Oracle 固有の "Unpublish"

これは、このインタフェースで別の操作を使用する前に、アプリケーションが呼び出す必要のある最初の操作です。この操作は次の 3 つの目的を果します。

  • Web サービスで、現在の HTTP セッションとユーザを関連付けられるようにします。

  • ユーザのプレゼンス ステータスをパブリッシュします。

  • Web サービスがウォッチャ要求を追跡できるように watcher-info をサブスクライブします。

PUBLISH を実行する際、関連する属性が 3 つあります。これらの属性を PresenceAttribute 構造に設定して、PUBLISH メソッドに渡すことができます。

  • カスタマイズ メモのあるプレゼンス ステータス : これは Oracle Communicator の [My Presence] テキスト ボックスにコンフィグレーションされたカスタマイズ メモです。 <note> 要素は、プレゼンス情報データ フォーマット (PIDF) XML ファイルの <person> 要素に含まれています。

  • デバイス メモ : Oracle Communicator によって暗黙的に挿入されます。または Web サービスから挿入されます。 <note> 要素は、プレゼンス情報データ フォーマット (PIDF) XML ファイルの <device> 要素に含まれています。

  • サービス メモ : Oracle Communicator プリファレンスの [Presence] タブにコンフィグレーションされています。 <note> 要素は、プレゼンス情報データ フォーマット (PIDF) XML ファイルの <tuple> 要素に含まれています。

8.5.7.1 コード例

// プレゼンス ステータスをパブリッシュする単純な方法
PresenceAttribute pa = new PresenceAttribute();
OtherValue other = new OtherValue();
//名前を "DeviceNote" に設定して、デバイス メモに使用する値であることを示す。
other.setName("DeviceNote");
other.setValue("Device Name");
//ServiceNote などに別の値を定義することも可能
CommunicationValue comm = new CommunicationValue();
AttributeTypeAndValue typeValue = new AttributeTypeAndValue();
typeValue.setUnionElement(PresenceAttributeType.ACTIVITY);
typeValue.setActivity(activity);
typeValue.setPlace(PlaceValue.PLACE_NONE);
typeValue.setPrivacy(PrivacyValue.PRIVACY_NONE);
typeValue.setSphere(SphereValue.SPHERE_NONE);
typeValue.setCommunication(comm);
typeValue.setOther(other);
pa.setTypeAndValue(typeValue);
String note = "My Note";
pa.setNote(note);
XMLGregorianCalendar dateTime = null;
dateTime = DatatypeFactory.newInstance().newXMLGregorianCalendar(new GregorianCalendar());
pa.setLastChange(dateTime);
List<PresenceAttribute> pat = new ArrayList<PresenceAttribute>();
pat.add(pa);
supplier.publish(pat);
 
//アンパブリッシュするには、OtherValue に (Expires, 0) を設定する
OtherValue other = new OtherValue();
other.setName("Expires");
other.setValue(0);

8.5.8 インタフェース : PresenceSupplier、操作 : getOpenSubscriptions

この操作では、ウォッチャ リストに追加する新しい要求のリストを取得します。

8.5.8.1 コード例

List<SubscriptionRequest> srList = getOpenSubscriptions();
for (SubscriptionRequest sr :srList) {
System.out.println(sr.getWatcher() .toString());
}

8.5.9 インタフェース : PresenceSupplier、操作 : updateSubscriptionAuthorization

この操作では、ブロック リストまたは許可リストにウォッチャを追加することができます。

8.5.9.1 コード例

PresencePermission p = new PresencePermission();
p.setDecision(true);
List<PresencePermission> pp = new ArrayList<PresencePermission>();
p.setPresenceAttribute(PresenceAttributeType.ACTIVITY);
pp.add(p);
updateSubscriptionAuthorization("sip:allow@test.example.com",pp);

8.5.10 インタフェース : PresenceSupplier、操作 : getMyWatchers

この操作では、許可リストのウォッチャのリストを取得します。

8.5.10.1 コード例

List<String> watchers = getMyWatchers();
 
for(String watcher: watchers){
System.out.println(watcher);
}

8.5.11 インタフェース : PresenceSupplier、操作 : getSubscribedAttributes

この操作では、PresenceTypeAttribute.Activity の 1 つの項目のみが返されます。 既存のサブスクリプションが存在しない場合、例外がスローされます。

8.5.11.1 コード例

List<PresenceAttributeType> pat = getSubscribedAttributes("sip:watcher@test.example.com");

8.5.12 インタフェース : PresenceSupplier、操作 : blockSubscription

この操作は、ブロック リストにウォッチャを追加します。

8.5.12.1 コード例

blockSubscription("sip:block.this.watcher@test.example.com");

8.6 OWLCS Parlay X Presence のカスタム エラー コード

表 8-4表 8-5 では、エラー コードと関連するエラー メッセージについて説明しています。

表 8-4 OWLCS Parlay X Presence のカスタム エラー コード : PolicyException

エラー コード エラー メッセージ

POL0001

General Policy Exception (一般的なポリシー例外)。この例外には以下のタイプがあります。

SDP20201 Watcher is on the block, polite-block or pending list (ウォッチャがブロック、polite-block、または保留リストに存在する)。

SDP20202 Subscription is pending (サブスクリプションは保留中)。

POL0002

Privacy verification failed for address <address>, request is refused (アドレス <アドレス> のプライバシーの確認が失敗し、要求が拒否された)。

POL0003

Too many addresses specified in message part (メッセージ パートに指定したアドレスが多すぎる)。


表 8-5 OWLCS Parlay X Presence のカスタム エラー コード : ServiceException

エラー コード エラー メッセージ

SVC0001

General Service Exception (一般的なサービス例外)。この例外には以下のタイプがあります。

SDP20101 Invalid result from XDMS server (XDMS サーバから無効な結果が返された)。

SDP20102 Invalid HTTP session data (無効な HTTP セッション データ)。

SDP20103 Invalid uri (無効な URI)。

SDP20104 Peer unavaliable (ピアが使用不可状態)。

SDP20105 Unknown host (不明なホスト)。

SDP20106 Service not avaliable (サービスが使用不可状態)。

SDP20107 Internal error (内部エラー)。

SDP20108 User unauthenticated (ユーザが認証されていない)。

SVC0002

Invalid input value for message part (メッセージ パートに入力した値が無効)。

SVC0003

Invalid input value for message part, valid values are <values> (メッセージ パートに入力した値が無効。有効な値は <値>)。

SVC0004

No valid addresses provided in message part (メッセージ パートに有効なアドレスが指定されていない)。

SVC0005

Correlator <correlator> specified in message part is a duplicate (メッセージ パートに指定したコリレータ <コリレータ> が重複している)。

SVC0220

No subscription request from watcher <watcher> for attribute <attribute> (属性 <属性> に対するウォッチャ <ウォッチャ> からのサブスクリプション要求が存在しない)。

SVC0221

<watcher> is not a watcher (<ウォッチャ> はウォッチャではない)。


8.7 バディ リスト マネージャ API

Contact Management API (CMAPI) は、resource-lists (「バディ リスト」とも呼ばれる) および presence-rules ドキュメントを操作する API です。 この高度な API を使用して、ユーザに代わってバディ リストのバディを追加または削除したり、他のユーザ (ウォッチャ) にプレゼンス情報の参照を許可またはブロックしたりするなどの操作を行うことができます。 CMAPI には、XDMS (XML Document Management Server) に保存されたリソースをクエリおよび操作する機能があります。 CMAPI は Web サービス : XML Document Management Client (XDMC) サービスと、oracle.sdp.client 共有ライブラリに含まれる Java クライアント スタブで構成されます。

8.7.1 API の使用

CMAPI は oracle.sdp.client 共有ライブラリに含まれます。 このライブラリが使用可能であれば、パッケージをインポートして API を使用できます。

import oracle.sdp.presence.integration.Buddy;
import oracle.sdp.presence.integration.BuddyListManager;
import oracle.sdp.presence.integration.BuddyListManagerFactory;
import oracle.sdp.presence.integrationimpl.BuddyListManagerImpl;

8.7.1.1 BuddyListManagerFactory の取得

BuddyListManagerFactory はシングルトン パターンに従い、ファクトリのインスタンスが XDMS/XDMC の組み合わせごとに 1 つのみ存在します。 そのため、BuddyListManagerFactory を作成する場合は、ドキュメントのダウンロード元となる XDMS に XCAP のルート URL を指定し、クライアント側で動作している XDM クライアント サービスにも URL を指定する必要があります。XDMC サービスの URL を渡すには、BindingProvider.ENDPOINT_ADDRESS_PROPERTY プロパティを使用します。 このような XCAP のルート URL と XDM クライアント サービス エンドポイントの組み合わせごとに生成可能な BuddyListManagerFactory インスタンスは 1 つのみです。 そのため、異なる XDMS/XDMC サービスの組み合わせを示すファクトリを作成することができます。

例 8-1 BuddyListManagerFactory のインスタンスの取得

// XDMS を示す URI を作成する。
URI xcapRoot = new URI("http://localhost:8001/services");
// XDM クライアント Web サービスが存在する場所。
String wsUrl = "http://localhost:8001/XdmClientService/services/XdmClient";
String sWsSecurityPolicy = new String[]{"oracle/wss11_saml_token_with_message_protection_client_policy"};
Map<String, Object> params = new HashMap<String,Object>();
params.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, wsUrl);
params.put(BindingProvider.USERNAME_PROPERTY, "alice");
params.put(ParlayXConstants.POLICIES, sWsSecurityPolicy);
// Obtain the instance to the factory 
BuddyListManagerFactory factory = BuddyListManagerFactory.getInstance(xcapRoot, params);

例 8-1 に、localhost:8001/ サービスの XCAP ルートを示すファクトリへの参照を取得する方法を示します。 このファクトリで実行する各操作は、ここで指定した XCAP ルートのコンテキストに存在します。 そのため、特定ユーザの BuddyListManager を作成する場合、その BuddyListManager の XCAP ルートは BuddyListManager の作成に使用したファクトリのいずれかになります。

8.7.1.2 BuddyListManager の作成

BuddyListManager (BLM) は特定ユーザの代わりに操作を実行する機能であることを理解しておくことが重要です。 したがって、たとえばユーザ Alice の BLM を作成した場合、この BLM は Alice の代理で Alice のドキュメントを操作します。 例 8-2 に、前節で作成したファクトリを使用して Alice の BLM を作成する方法を示します。

例 8-2 ユーザ Alice の BuddyListManager の取得

URI user = new URI("sip:alice@example.com");
Map<String, Object> params = new HashMap<String,Object>();
params.put(XDMClientFactory.PROP_ASSERTED_IDENTITY, assertedId);
BuddyListManager manager = factory.createBuddyListManager(user, params);

例 8-2 に、SIP アドレス sip:alice@example.com を指定してユーザ Alice の BLM を作成する方法を示します。 他のユーザのバディ リストおよびプレゼンス ルール ドキュメントを操作しなければならない場合は、適切な SIP アドレスを指定して別の BLM を作成する必要があります。

8.7.1.3 バディ リストへのバディの追加とリストの取得

バディ リストにバディを追加するには、バディを作成し、そのバディに必要な情報を設定してから、BLM を使用してバディ リストにバディを追加します。 例 8-3 に、Alice を表す BLM を使用して、Alice の新しいバディとして Bob を追加し、更新されたリストを取得する方法を示します。

例 8-3 バディ リストへの Alice の新しいバディの追加

URI uri = new URI("sip:bob@example.com");
Buddy bob = manager.createBuddy(uri);
// 追加情報を設定する (省略可)。
manager.setDisplayname("Bobby");
VCard vcard = bob.getVCard();
vcard.setCity("San Francisco");
vcard.setCountry("USA");
// VCard をバディに設定することが重要
bob.setVCard(vcard);
// BLM を使用してバディ情報を更新する
manager.updateBuddy(bob);
// 更新されたバディリストを取得する
List<Buddy> buddies = manager.getBuddies();

例 8-3 に、新しいバディ Bob を作成し、Alice の BLM を使用してこのバディを Alice のバディ リストに追加する方法を示します。 アドレスなど、ユーザ Bob の詳細情報を追加するには、Bob の Vcard 情報にアクセスして適切なプロパティを設定します。


注意 :

getVCard() メソッドで返されるのは VCard のクローンであるため、対象バディに対して setVCard() メソッドを呼び出して情報を更新する必要があります。

8.7.1.4 バディ リストからのバディの削除

バディの削除方法は、バディを追加する場合とほぼ同様です。removeBuddy メソッドに削除するバディを渡します。 複数のバディを削除する場合は removeBuddies メソッドに削除するバディのリストを渡します。 例 8-4 に、Aliceのバディ リストから Bob を削除する方法を示します。

例 8-4 バディの削除

URI uri = new URI("sip:bob@example.com");
Buddy bob = manager.createBuddy(uri);
manager.removeBuddy(bob);

8.7.1.5 プレゼンス ルール ドキュメントの操作

ウォッチャがプレゼンスのステータスを参照できるようにするには、allowWatcher(String watcher) メソッドを使用して対象ウォッチャを許可リストに追加します。 特定ユーザに対してプレゼンス ステータスの参照をブロックするには、blockWatcher(String watcher) を使用します。

例 8-5 ウォッチャの許可またはブロック

manager.allowWatcher("sip:bob@example.com");
manager.blockWatcher("sip:carol@example.com");

8.7.2 例外

BuddyListException は基本例外です。プログラムで特定の例外の登録を設定しなければ、この例外でキャッチされます。

XDMException は、リモート XDMS との通信に関するすべての例外の基本例外です。 XDMException は、XDMS との通信中に発生したエラー (接続の問題、XCAP ルートのパスの間違いなど) を通知します。

DocumentConflictException は、XDMException のサブクラスです。この例外は解決できない競合が検出されたことを通知します。 この例外は、XDMS 上の同一ドキュメントに複数のクライアントがアクセスしたときに発生します。 BuddyListManager は、このような競合の解決を試行した結果、解決できなかった場合にこの例外をスローします。