So I have it working fine with this code :

        EntryCursor cursor = connection.search( "ou=system",
"(objectclass=*)",
            SearchScope.ONELEVEL,
            "*", "+" );
        int count = 0;

        for ( Entry entry : cursor )
        {
            assertNotNull( entry );
            count++;
        }

        SearchResultDone done = cursor.getSearchResultDone();

As you can see, I also use an iterator, I don't user a SearchRequest,
and I get 5 entries back (count == 5 at the end).

EntryCursorImpl is Iterable, and uses a CursorIterator to handle
iteration, which move forward immediately when created, so that the
first get() works (available() will succeed).

AFAICT, it works properly.

The only annoying problem is that a cursor is never going to give you a
result if you don't move forward beforehand : its position is always
*before* the first element. It may sound weird, but it's because we need
to be able to move forward and backward properly.


Le 07/03/2018 à 01:53, George S. a écrit :
> It's definitely a problem.
> 
> 
> On 3/6/2018 5:03 PM, George S. wrote:
>> I looked at
>> LdapNetworkConnection.search(String,String,SearchScope,String...) and
>> it's a wrapper around a call to search using a SearchRequest, and
>> constructing a EntryCursorImpl from the SearchCursor.
>>
>> There seems to be something wrong in EntryCursorImpl. If I change my
>> code to use a SearchRequest, then I get results in a SearchCursor and
>> I can iterate over them.
> 
> Looking at the code, EntryCursorImpl implicitly calls
> searchCursor.available(), which is returning false because it appears
> response is not set until a call to next(). See SearchResultImpl line
> 117 or so.
> 
> 
>>
>> public  Collection<Response>search(String  base,String...
>> attributeNames)throws  LdapException{
>>
>>     if  (attributeNames.length ==0){
>>         attributeNames =new  String[]{
>> "distinguishedName","objectClass","name",
>> prop.getProperty("emailAddress","mail")};
>>     }
>>     Collection<Response> entries =new  ArrayList<>();
>>     SearchRequest sr=new  SearchRequestImpl();
>>     sr.setBase(new  Dn(base));
>>     sr.setTimeLimit(Integer.MAX_VALUE);
>>     sr.setFilter("(objectclass=*)");
>>     sr.addAttributes(attributeNames);
>>     sr.setScope(SearchScope.ONELEVEL);
>>     sr.setDerefAliases(AliasDerefMode.DEREF_ALWAYS);
>>
>>     SearchCursor cursor = lc.search(sr);
>>     // EntryCursor cursor=new EntryCursorImpl(scursor);
>>
>>     if  (isDebugMode()){
>>         System.err.print("search(\""+base+"\"");
>>         for  (String  s : attributeNames){
>>             System.err.print(",\""+s+"\"");
>>         }
>>         System.err.println(");");
>>     }
>>         if  (true  || cursor.available()){
>>         for  (Response entry: cursor){
>>             entries.add(entry);
>>         }
>>     }  else  {
>>         if  (isDebugMode()){
>>             System.err.println("SearchResults came back null!");
>>         }
>>     }
>>     try  {
>>         cursor.close();
>>     }  catch  (IOException ioeClose){
>>         ioeClose.printStackTrace(System.err);
>>     }
>>     return  entries;
>> }
>>
>>
>> On 3/6/2018 4:27 PM, Emmanuel Lécharny wrote:
>>>
>>> Le 07/03/2018 à 00:08, George S. a écrit :
>>>> and, just to throw in another point, I've got some other code using the
>>>> Novell LDAP API library and it is able to do the query, and I can use
>>>> JXplorer to browse the tree.
>>>>
>>>> It's really looking like there's something wrong in the library.
>>> Sorry, I missed the point. Removed the 'if ( cursor.available() )', it
>>> should work.
>>>
>>
> 

-- 
Emmanuel Lecharny

Symas.com
directory.apache.org

Reply via email to