Apache Directory LDAP - Paged searches

徘徊边缘 提交于 2019-12-09 17:09:27

问题


I've looking for information to perform paged searches using the Apache Directory API, but I haven't found any example or any information about how build a SearchRequest with the proper PagedResults control and then perform the search.

Any of you have some tip? Or knows where to find such information?

Or, maybe you should recommend me to use some other API, like unboundid sdk

Thanks in advance and kind regards.


回答1:


Take a look at this http://markmail.org/message/43qjepg6shvfvqud OTOH, it is always recommended to post ApacheDS related questions on the user mailing list for getting a quick reply, we may not always monitor SO




回答2:


Today I struggled with making the linked example from kayyagara work.

It has some problems:

  • a special System Variable is needed, to make this work at all
  • the bad cookie breaks the whole thing
  • some settings/lines of code were not needed

The following is working example:

        //Without this you get a class Cast Exception:
        //java.lang.ClassCastException: org.apache.directory.api.ldap.codec.BasicControlDecorator cannot be cast to org.apache.directory.api.ldap.model.message.controls.PagedResults
        System.setProperty(StandaloneLdapApiService.CONTROLS_LIST,
            PagedResultsFactory.class.getName());

        PagedResults pagedSearchControl = new PagedResultsDecorator(
                connection.getCodecService());
        pagedSearchControl.setSize(300);

        // Loop over all the elements
        List<Entry> results = new ArrayList<Entry>();
        boolean hasUnwillingToPerform = false;

        //inspired by http://markmail.org/message/43qjepg6shvfvqud
        while (true) {
            EntryCursor cursor = null;

            try {
                SearchRequest searchRequest = new SearchRequestImpl();
                searchRequest.setBase(new Dn(searchRoot));
                searchRequest.setFilter(searchFilter);
                searchRequest.setScope(SearchScope.SUBTREE);
                searchRequest.addAttributes("*");
                searchRequest.addControl(pagedSearchControl);

                cursor = new EntryCursorImpl(
                        connection.search(searchRequest));

                while (cursor.next()) {
                    Entry result = cursor.get();
                    results.add(result);
                }

                SearchResultDone result = cursor.getSearchResultDone();
                pagedSearchControl = (PagedResults) result
                        .getControl(PagedResults.OID);

                if (result.getLdapResult().getResultCode() == ResultCodeEnum.UNWILLING_TO_PERFORM) {
                    hasUnwillingToPerform = true;
                    break;
                }
            } finally {
                if (cursor != null) {
                    cursor.close();
                }
            }

            // check if this is over
            byte[] cookie = pagedSearchControl.getCookie();

            if (Strings.isEmpty(cookie)) {
                // If so, exit the loop
                break;
            }

            // Prepare the next iteration
            pagedSearchControl.setSize(300);
        }

        if (hasUnwillingToPerform) {
            throw new IllegalStateException("AD can't handle paging");
        }

        // Cleanup the session
        connection.unBind();
        connection.close();



回答3:


This file contains a demonstration of the simple paged results control extension as described in RFC2696. To compile and run, the UnboundID LDAP SDK is required.

see also

  • LDAP: Simple Paged Results Request Control
  • LDAP: Programming Practices


来源:https://stackoverflow.com/questions/17963975/apache-directory-ldap-paged-searches

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!