統合リポジトリーに対して特定のチェックポイント以降に変更されたエンティティーを照会するには、search(DataObject) メソッドおよび ChangeControl DataObject を使用します。
ChangeControl DataObject により、変更済みエンティティーの検索が、標準的な検索操作と区別されます。検索結果として戻される各エンティティーは、changeType プロパティーに関連付けられています。
Entity DataObject の changeType プロパティーは、変更済みエンティティーの検索に対する応答としてのみ設定されるオプションのプロパティーです。changeType プロパティーは、発生した変更のタイプを示します。変更の例には、新規エンティティーの追加、既存のエンティティーの変更、エンティティーの削除、エンティティーの名前変更があります。
changeType プロパティーの有効な値とストリング定数は、add (CHANGETYPE_ADD)、delete (CHANGETYPE_DELETE)、modify (CHANGETYPE_MODIFY)、および rename (CHANGETYPE_RENAME) です。
追加、変更、または名前変更されたエンティティーの場合、リポジトリー内の現行エンティティーが戻されます。 削除されたエンティティーの場合、外部名と固有名からなるエンティティー ID のみが戻されます。(IBM® Tivoli® Directory Server バージョン 6.1 以前では、リポジトリー固有の UUID は戻されるエンティティー ID に含まれていませんが、IBM Tivoli Directory Server バージョン 6.2 以降では、リポジトリー固有の UUID のほかに外部名および固有名もエンティティー ID に含まれます。)リポジトリー・チェックポイントは、変更タイプおよび検索ベースに依存しません。チェックポイントは、リポジトリー全体に適用されます。
IBM Tivoli Directory Server の場合は、プログラム診断依頼書 (APAR) 1IO10107 のフィックスもインストールしておきます。
3 つのリポジトリー (IBM Tivoli Directory Server、Active Directory、およびファイル・リポジトリー) を使用して Virtual member manager アプリケーションが構成されているシナリオについて説明します。アプリケーションが Virtual member manager と同期すると、チェックポイントが取得され、保存されます。 保存されたチェックポイントは、次回の同期インターバルにおいて ChangeControl で使用されます。現行チェックポイントを取得するサンプル・コードを以下に示します。
DataObject root = com.ibm.websphere.wim.util.SDOHelper.createRootDataObject();
com.ibm.websphere.wim.util.SDOHelper.createControlDataObject(root, WIM_NS_URI, DO_CHANGE_CONTROL);
return service.search(root);
この例での変更済みエンティティーの検索処理のステップを次に説明します。
変更済みエンティティーの初回検索時に、Virtual member manager クライアント・アプリケーションが、チェックポイントが含まれていない ChangeControl を送信します。入力データ・グラフを以下に示します。
<?xml version="1.0" encoding="UTF-8"?>
<sdo:datagraph xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:sdo="commonj.sdo" xmlns:wim="http://www.ibm.com/websphere/wim">
<wim:Root>
<wim:controls xsi:type="wim:ChangeControl" changeTypes="*"/>
</wim:Root>
</sdo:datagraph><?xml version="1.0" encoding="UTF-8"?>
<sdo:datagraph xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:sdo="commonj.sdo" xmlns:wim="http://www.ibm.com/websphere/wim">
<wim:Root>
<wim:controls xsi:type="wim:ChangeControl"/>
</wim:Root>
</sdo:datagraph>
<?xml version="1.0" encoding="UTF-8"?>
<sdo:datagraph xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:sdo="commonj.sdo" xmlns:wim="http://www.ibm.com/websphere/wim">
<wim:Root>
<wim:controls xsi:type="wim:ChangeResponseControl">
<wim:checkPoint>
<wim:repositoryId>TDS_LDAP</wim:repositoryId>
<wim:repositoryCheckPoint>21</wim:repositoryCheckPoint>
</wim:checkPoint>
<wim:checkPoint>
<wim:repositoryId>AD_LDAP</wim:repositoryId>
<wim:repositoryCheckPoint>41</wim:repositoryCheckPoint>
</wim:checkPoint>
</wim:controls>
</wim:Root>
</sdo:datagraph>
後続の変更済みエンティティーの検索では、この統合チェックポイントが Virtual member manager に戻され、プロファイル・マネージャー・インターフェースが適切なチェックポイントを対応するアダプターに渡します。
以前の ChangeResponseControl から入力 ChangeControl にチェックポイントをコピーするには、次のサンプル・コードをアプリケーション・コードに追加して、変数 を実際に使用する値に置き換えます。
/**
* リポジトリーの現行チェックポイントの取得
* @return DataObject: 変更トラッキングをサポートするリポジトリーのチェックポイントを含む
* ChangeResponseControl が含まれる DataObject
*/
public DataObject searchGetCurrentCheckpoint() throws WIMException
{
DataObject root = com.ibm.websphere.wim.util.SDOHelper.createRootDataObject();
com.ibm.websphere.wim.util.SDOHelper.createControlDataObject(root, WIM_NS_URI, DO_CHANGE_CONTROL);
return service.search(root);
}
/**
* searchGetCurrentCheckpoint によって戻されたチェックポイント以降に変更されたエンティティーの検索
* @param prevRoot: searchGetCurrentCheckpoint から戻された DataObject
* @return DataObject: 変更済みエンティティーと ChangeResponseControl が含まれる DataObject
*/
public DataObject searchGetChangedEntities(final DataObject prevRoot) throws WIMException
{
DataObject root = com.ibm.websphere.wim.util.SDOHelper.createRootDataObject();
DataObject changeCtrl = com.ibm.websphere.wim.util.SDOHelper.createControlDataObject(root, null, DO_CHANGE_CONTROL);
changeCtrl.setString(SchemaConstants.PROP_SEARCH_EXPRESSION, "@xsi:type='PersonAccount'");
changeCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("uid");
changeCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("cn");
changeCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("sn");
changeCtrl.getList(PROP_CHANGETYPES).add(SchemaConstants.CHANGETYPE_ALL);
com.ibm.websphere.wim.util.SDOHelper.createChangeCtrlFromChangeRespCtrl(root, prevRoot);
return service.search(root);
}
/**
* searchGetCurrentCheckpoint および searchChangedEntities を呼び出すメソッド
*/
public void search() throws WIMException
{
/* 現行チェックポイントの取得 */
DataObject result = searchGetCurrentCheckpoint();
/* エンティティーの追加、変更、名前変更、または削除 */
/* searchGetCurrentCheckpoint によって戻されたチェックポイント以降に変更されたエンティティーの検索 */
result = searchGetChangedEntities(result);
}
上記のコードでは、search() メソッドが最初に searchGetCurrentChekpoint() メソッドを呼び出し、現行チェックポイントを取得します。 searchGetCurrentCheckpoint() から戻される結果が 2 番目のメソッド searchGetChangedEntities() に渡されます。このメソッドは SDOHelper.createChangeCtrlFromChangeRespCtrl() ユーティリティー・メソッドを使用して、searchGetCurrentCheckpoint によって戻された ChangeResponseControl の保存済みチェックポイントを含む更新後の ChangeControl を取得します。
保存済みチェックポイントを含む後続の検索の入力データ・グラフを以下に示します。
<?xml version="1.0" encoding="UTF-8"?>
<sdo:datagraph xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:sdo="commonj.sdo" xmlns:wim="http://www.ibm.com/websphere/wim">
<wim:Root>
<wim:controls xsi:type="wim:ChangeControl" expression="@xsi:type='PersonAccount' and cn='tuser*'">
<wim:checkPoint>
<wim:repositoryId>TDS_LDAP</wim:repositoryId>
<wim:repositoryCheckPoint>21</wim:repositoryCheckPoint>
</wim:checkPoint>
<wim:checkPoint>
<wim:repositoryId>AD_LDAP</wim:repositoryId>
<wim:repositoryCheckPoint>41</wim:repositoryCheckPoint>
</wim:checkPoint>
<wim:changeTypes>add</wim:changeTypes>
</wim:controls>
</wim:Root>
</sdo:datagraph>
IBM Tivoli Directory Server に 3 つの新規エンティティーが追加され、Active Directory に 2 つの新規エンティティーが追加された場合、結果の出力データ・グラフは次のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<sdo:datagraph xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:sdo="commonj.sdo" xmlns:wim="http://www.ibm.com/websphere/wim">
<wim:Root>
<wim:entities xsi:type="wim:PersonAccount">
<wim:identifier externalName="cn=tuser1,o=tds" repositoryId="TDS_LDAP" uniqueId="13f1c1c8-ff43-433c-b0ca-02fb5a56b522"
uniqueName="cn=tuser1,o=tds"/>
<wim:changeType>add</wim:changeType>
</wim:entities>
<wim:entities xsi:type="wim:PersonAccount">
<wim:identifier externalName="cn=tuser3,o=tds" repositoryId="TDS_LDAP" uniqueId="25641e84-b17b-48ee-b9cb-d7eea2496005"
uniqueName="cn=tuser3,o=tds"/>
<wim:changeType>add</wim:changeType>
</wim:entities>
<wim:entities xsi:type="wim:PersonAccount">
<wim:identifier externalName="cn=tuser5,o=tds" repositoryId="TDS_LDAP" uniqueId="a3316b8d-f496-4a5b-93eb-ba59f47aa2ab"
uniqueName="cn=tuser5,o=tds"/>
<wim:changeType>add</wim:changeType>
</wim:entities>
<wim:entities xsi:type="wim:PersonAccount">
<wim:identifier externalName="CN=tuser4,DC=vmm-server11,DC=in,DC=ibm,DC=com"
repositoryId="AD_LDAP" uniqueId="855c13b14a2e5e448af0699d4b2aaf47" uniqueName="CN=tuser4,o=ad"/>
<wim:changeType>add</wim:changeType>
</wim:entities>
<wim:entities xsi:type="wim:PersonAccount">
<wim:identifier externalName="CN=tuser2,DC=vmm-server11,DC=in,DC=ibm,DC=com"
repositoryId="AD_LDAP" uniqueId="725199db56ac8342b7c6a08ae3cb93e3" uniqueName="CN=tuser2,o=ad"/>
<wim:changeType>add</wim:changeType>
</wim:entities>
<wim:controls xsi:type="wim:ChangeResponseControl">
<wim:checkPoint>
<wim:repositoryId>TDS_LDAP</wim:repositoryId>
<wim:repositoryCheckPoint>24</wim:repositoryCheckPoint>
</wim:checkPoint>
<wim:checkPoint>
<wim:repositoryId>AD_LDAP</wim:repositoryId>
<wim:repositoryCheckPoint>43</wim:repositoryCheckPoint>
</wim:checkPoint>
</wim:controls>
</wim:Root>
</sdo:datagraph
IBM Tivoli Directory Server と Active Directory では、変更済みエンティティーの検索結果が異なります。2 つの重要な相違点について説明します。
名前変更済みエンティティーは、changeType rename で戻されます。 変更前のエンティティーを識別するため、Virtual member manager クライアント・アプリケーションは、古いエンティティーと新しいエンティティーの uniqueID を関連付ける必要があります (これらの uniqueID は、ibm-entryUUID 属性から取得されます)。
名前変更済みエンティティーは、changeType modify で戻されます。 Virtual member manager クライアント・アプリケーションは、そのコピーに存在しない識別名 (DN) に対する変更操作を検出すると、その操作が名前変更操作であると識別することがあります。ただし変更操作は、アプリケーションのコピーに一度も存在したことがない、新規の DN の場合にも報告されます。 変更操作は、同じ同期サイクルの間にエンティティーが追加されてから変更された場合も報告されます。したがって、Virtual member manager クライアント・アプリケーションは、古いエンティティーと新しいエンティティーの固有 ID を関連付ける必要があります (これらの固有 ID は Active Directory の objectGUID 属性から取得されます)。 uniqueID が見つからない場合は追加操作となり、見つかった場合は既存のエンティティーに対する名前変更操作となります。
同期サイクルでエンティティーが変更される回数と同じ回数だけ、その変更済みエンティティーの最終バージョンが、changeType modify で報告されます。例えば、同じ同期サイクル内でエンティティーの変更が 4 回行われる場合、変更されたエンティティーの最終バージョンは、変更済みエンティティーとして changeType modify で 4 回戻されます。この例外として、同じ同期サイクルでエンティティーが後で削除される場合があります。この場合、エンティティー削除前のエンティティーに対するその他の操作はすべて無視され、Virtual member manager に戻されません。
Virtual member manager により保持される属性キャッシュは、変更済みエンティティーを検索するたびに更新されます。これは、同じ同期サイクルでエンティティーが変更された後で削除された場合でも同様です。
エンティティーの最終更新のみが戻されます。 例えば、同じ同期サイクルでエンティティーが追加された後に削除された場合、Virtual member manager クライアントは、そのコピーに存在しないエンティティーについて changeType delete を受け取ります。この場合、Virtual member manager アプリケーションに、変更通知を無視するロジックが組み込まれている必要があります。
Virtual member manager により保持される属性キャッシュは、変更済みエンティティーを検索するたびに更新されます。 ただし、同じ同期サイクルでエンティティーが変更された後にリポジトリーから削除された場合は、属性キャッシュは更新されません。
エンドツーエンド・サンプル・コードについては、「変更済みエンティティーの検索のためのサンプル・コード」および「変更および削除済みエンティティーの検索のためのサンプル・コード」トピックを参照してください。