JNDI-LDAP пейджинг - PullRequest
       5

JNDI-LDAP пейджинг

3 голосов
/ 21 апреля 2011

Мне удалось получить нумерацию страниц, как описано здесь . Проблема в том, что мне нужно предоставить API, который будет выглядеть следующим образом: getUsers(pageSize, pageNumber), который не совсем соответствует тому, как JNDI / LDAP выполняет пейджинг (с файлом cookie, который вы передаете каждый раз методу поиска). Код выглядит так:

private NamingEnumeration ldapPagedSearch(String filter, int pageSize, int pageNumber){
    InitialLdapContext ctx = getInitialContext();

    //TODO: get the id also, need to spec it in UI
    // Create the search controls
    SearchControls searchCtls = new SearchControls();
    searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);

    //keep a session
    byte[] cookie = null;

    //Request the paged results control
    Control[] ctls = new Control[]{new PagedResultsControl(pageSize, true)};
    ctx.setRequestControls(ctls);

    //Specify the search scope
    NamingEnumeration results = null;
    int currentPage = 1;
    do {
        results = ctx.search(getConfiguration().get(BASEDN_KEY), filter, searchCtls);

        //we got to the right page, return this page
        if(currentPage == pageNumber) {
            return results;
        }

        // loop through this page, because we cannot get a proper cookie otherwise
        // WARN: this could be a problem of performance
        while (results.hasMore()) results.next();

        // examine the paged results control response
        Control[] controls = ctx.getResponseControls();
        if (controls != null) {
            for (Control control : controls) {
                if (control instanceof PagedResultsResponseControl) {
                    cookie = ((PagedResultsResponseControl) control).getCookie();
                } 
            }
        }

        // pass the cookie back to the server for the next page
        ctx.setRequestControls(new Control[]{new PagedResultsControl(pageSize, cookie, Control.CRITICAL) });

        //increment page
        currentPage++;
    } while (cookie != null);


    ctx.close();

    //if we get here, means it is an empty set(consumed by the inner loop)
    return results;
}

Кажется, мне нужно перебрать все страницы, чтобы получить нужную страницу. Более того, мне нужно перебрать все записи на странице, чтобы получить доступ к следующей странице.

Есть ли лучший способ? Я беспокоюсь о проблемах с производительностью.

Ответы [ 2 ]

1 голос
/ 21 ноября 2011

Существует нечто, называемое «Просмотр виртуального списка».Он поддерживается парой серверов LDAP.Не уверен, что реализация все еще находится в JNDI.Если нет, вы можете рассмотреть возможность реализовать его самостоятельно.Вы должны использовать его вместе с серверной сортировкой.

См. Также http://tools.ietf.org/html/draft-ietf-ldapext-ldapv3-vlv-04 и http://www.cs.rit.edu/usr/local/pub/jeh/rit/java/lib/doc/ldapcontrols/com/sun/jndi/ldap/ctl/VirtualListViewControl.html

0 голосов
/ 23 апреля 2011

Вы правы.API не желе.Вам необходимо изменить интерфейс API, который вы должны предоставлять.

...