Apache Directory LDAP - Paged searches

谁都会走 提交于 2019-12-04 04:01:36

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

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

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

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