変更済みエンティティーの検索

統合リポジトリーに対して特定のチェックポイント以降に変更されたエンティティーを照会するには、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 に含まれます。)リポジトリー・チェックポイントは、変更タイプおよび検索ベースに依存しません。チェックポイントは、リポジトリー全体に適用されます。

ChangeControl を処理できないアダプターに ChangeControl が渡されないようにするため、wimconfig.xml 内の各リポジトリー ID は supportChangeLog プロパティーに関連付けられています。 supportChangeLog プロパティーの有効な値は次のとおりです。
  • none- このリポジトリーで変更トラッキングがサポートされていないことを示します。この値は、supportChangeLog が設定されていない場合のデフォルト値です。
  • native - Virtual member manager が、リポジトリーのネイティブ変更トラッキング・メカニズムを使用して変更済みエンティティーを戻すことを示します。
プロファイル・マネージャーは、要求を対応するアダプターに渡す前にこの値を参照します。supportChangeLog 値が none の場合、変更済みエンティティーを取得するためにこのリポジトリーが呼び出されることはありません。supportChangeLog プロパティーを設定するには、wsadmin コマンド createIdMgrLDAPRepository、updateIdMgrLDAPRepository、または updateIdMgrRepository を使用します。これらのコマンドについて詳しくは、AdminTask オブジェクトの IdMgrRepositoryConfig コマンド・グループ を参照してください。
LDAP アダプターでサポートされているリポジトリーを次に示します。
  • IBM Tivoli Directory Server
  • Active Directory
重要: この機能をサポートしているアダプターに対して変更済みエンティティーを照会する前に、必ずリポジトリーの変更トラッキング機能を使用可能にしておきます。例えば、IBM Tivoli Directory Server で変更トラッキングを使用可能にするには、IBM Tivoli Directory Server のインフォメーション・センターの「Server Utilities, idscfgchglg」トピックを参照してください。

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);

この例での変更済みエンティティーの検索処理のステップを次に説明します。

  1. 空の ChangeControl の送信

    変更済みエンティティーの初回検索時に、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>
  2. チェックポイントを含む ChangeResponseControl を戻す
    1. プロファイル・マネージャー・インターフェースが、検索ベースと、リポジトリーが変更トラッキングをサポートしているかどうかに基づいて、関連アダプターに要求を渡します。
    2. 各アダプターが、後続の検索でそのアダプターに対して使用される現行チェックポイント・ストリングで応答します。
    3. プロファイル・マネージャー・インターフェースが、すべてのアダプターから戻されたチェックポイント・ストリングを統合し、応答コントロールに入れて送り戻します。
    この例では、ファイル・リポジトリーが変更要求をサポートしていないため、ファイル・リポジトリーのチェックポイントが応答コントロールに表示されません。IBM Tivoli Directory Server に 20 個の変更があり、Active Directory に 40 個の変更がある場合、結果の出力データ・グラフは次のようになります。
    <?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>
  3. チェックポイントを含む ChangeControl が含まれる検索要求の送信

    後続の変更済みエンティティーの検索では、この統合チェックポイントが 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>
  4. 検索結果と、更新後のチェックポイントを含む ChangeResponseControl を戻す

    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 での検索結果の相違

IBM Tivoli Directory Server と Active Directory では、変更済みエンティティーの検索結果が異なります。2 つの重要な相違点について説明します。

名前変更操作
  • IBM Tivoli Directory Server:

    名前変更済みエンティティーは、changeType rename で戻されます。 変更前のエンティティーを識別するため、Virtual member manager クライアント・アプリケーションは、古いエンティティーと新しいエンティティーの uniqueID を関連付ける必要があります (これらの uniqueID は、ibm-entryUUID 属性から取得されます)。

  • Active Directory:

    名前変更済みエンティティーは、changeType modify で戻されます。 Virtual member manager クライアント・アプリケーションは、そのコピーに存在しない識別名 (DN) に対する変更操作を検出すると、その操作が名前変更操作であると識別することがあります。ただし変更操作は、アプリケーションのコピーに一度も存在したことがない、新規の DN の場合にも報告されます。 変更操作は、同じ同期サイクルの間にエンティティーが追加されてから変更された場合も報告されます。したがって、Virtual member manager クライアント・アプリケーションは、古いエンティティーと新しいエンティティーの固有 ID を関連付ける必要があります (これらの固有 ID は Active Directory の objectGUID 属性から取得されます)。 uniqueID が見つからない場合は追加操作となり、見つかった場合は既存のエンティティーに対する名前変更操作となります。

同じ同期サイクルにおけるエンティティーの複数回の変更
  • IBM Tivoli Directory Server:

    同期サイクルでエンティティーが変更される回数と同じ回数だけ、その変更済みエンティティーの最終バージョンが、changeType modify で報告されます。例えば、同じ同期サイクル内でエンティティーの変更が 4 回行われる場合、変更されたエンティティーの最終バージョンは、変更済みエンティティーとして changeType modify で 4 回戻されます。この例外として、同じ同期サイクルでエンティティーが後で削除される場合があります。この場合、エンティティー削除前のエンティティーに対するその他の操作はすべて無視され、Virtual member manager に戻されません。

    Virtual member manager により保持される属性キャッシュは、変更済みエンティティーを検索するたびに更新されます。これは、同じ同期サイクルでエンティティーが変更された後で削除された場合でも同様です。

  • Active Directory:

    エンティティーの最終更新のみが戻されます。 例えば、同じ同期サイクルでエンティティーが追加された後に削除された場合、Virtual member manager クライアントは、そのコピーに存在しないエンティティーについて changeType delete を受け取ります。この場合、Virtual member manager アプリケーションに、変更通知を無視するロジックが組み込まれている必要があります。

    Virtual member manager により保持される属性キャッシュは、変更済みエンティティーを検索するたびに更新されます。 ただし、同じ同期サイクルでエンティティーが変更された後にリポジトリーから削除された場合は、属性キャッシュは更新されません。

エンドツーエンド・サンプル・コードについては、「変更済みエンティティーの検索のためのサンプル・コード」および「変更および削除済みエンティティーの検索のためのサンプル・コード」トピックを参照してください。



利用条件 | フィードバック