0

ContentSyncRequestControlUnboundid sdkを使用して変更 (追加、削除、変更) されたエントリを検索する必要がありますが、変更されたエントリの状態のすべてのエントリが表示されます。

私が今までやってきたこと

LDAPConnection ldapConnection = null;
    try {
        /*Apache LDAP*/
        ldapConnection = new LDAPConnection("192.168.0.0", 389);
        ldapConnection.bind("uid=test,ou=system", "mypassword");
        Scanner sc = new Scanner(System.in);
        ASN1OctetString cookie = null;
        int choice = 3;
        while (true) {
            SearchRequest searchRequest = new SearchRequest(ldapConnection
                    .getRootDSE().getAttributeValue("namingContexts"),
                    SearchScope.SUB, "(&(objectclass=person))",
                    "createTimestamp","modifyTimestamp","sn","mobile","givenName","ucMiddleName","mail",
                    "isDeleted");
            ContentSyncRequestControl control = new ContentSyncRequestControl(ContentSyncRequestMode.REFRESH_AND_PERSIST);
                    //added control to request
            searchRequest.addControl(control);
            final SearchResult searchResult = ldapConnection.search(searchRequest);
            java.util.List<SearchResultEntry> entries = searchResult
                    .getSearchEntries();
            int count = 0;
            for (SearchResultEntry entry : entries) {
                System.out.println(entry.getAttributes());
                ++count;
            }
            System.out.println("Press 0 for exit");
            choice = sc.nextInt();
            if (choice == 0) {
                System.exit(0);
            }
        }
    } catch (LDAPSearchException e) {
        e.printStackTrace();
    } catch (LDAPException e) {
        e.printStackTrace();
    }

しかし、これは、変更されたエントリの状態のすべてのエントリを表示します。

また、ContentSyncRequestControlクラスAPI のドキュメントに目を通すと、次の点に注意する必要があることがわかりました。しかし、私はこれを次のように設定する方法がわかりません

1] 関連付けられた検索リクエストには SearchResultListener が必要です。これにより、検索が完了するのを待つ必要がなく、エントリをリストに格納して大量のメモリを消費するのではなく、エントリが返されたらすぐに利用できるようになります。検索が完了したときにのみ使用可能になります。

2] 検索から返されるエントリと参照には、関連する entryUUID を持つ ContentSyncStateControl と、場合によっては更新された同期セッション状態を持つ Cookie が含まれている必要があります。同期状態情報を含むコントロールを取得するには、検索結果のエントリと参照に対して getControl(ContentSyncStateControl.SYNC_STATE_OID) を呼び出す必要があります。

3] 検索が完了した場合、SearchResult には、更新された同期状態情報を含む ContentSyncDoneControl が含まれる場合があります。getResponseControl(ContentSyncDoneControl.SYNC_DONE_OID) を呼び出して、同期状態情報を含むコントロールを取得する必要があります。

誰でもこれについて私を助けることができますか? ありがとう...

編集

コントロールを追加した後も、変更されたエントリの状態ですべてのエントリを取得しています。

今私は使用しています

ContentSyncRequestControl(ContentSyncRequestMode mode) 

コンストラクターでは、この形式のコンストラクターをどのように使用できますか?誰かが私を助けることができますか

ContentSyncRequestControl(boolean isCritical, ContentSyncRequestMode mode, ASN1OctetString cookie, boolean reloadHint) 

使用しContentSyncRequestMode.REFRESH_ONLYているときはすべてのエントリが表示されますが、ContentSyncRequestMode.REFRESH_AND_PERSISTモードを使用しているときは無限ループに入ります

だから誰かがこれについて私を助けることができます...?

4

2 に答える 2