Today I tried my best to make a connected example with the work of kayyagara.
He has some problems:
- a special system variable is needed to make this work at all
- bad cookie breaks it all
- some settings / lines of code are not needed
The following is a 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();
source share