Transfering the mail to the list, I wrongly replied to George directly...

-------- Message transféré --------
Delivered-To: elecha...@gmail.com
Received: by 10.74.89.138 with SMTP id k10csp5256341ood;        Wed, 7
Mar 2018 07:34:15 -0800 (PST)
X-Google-Smtp-Source:
AG47ELuBKBRbZd39urfnGs0cFwHBOKH1PpuyzbwKkgWnrd7ILew2InXuQsW0i2Kko5myIGHyrbZC
X-Received: by 10.36.98.195 with SMTP id
d186mr23436935itc.88.1520436855183;        Wed, 07 Mar 2018 07:34:15
-0800 (PST)
ARC-Seal: i=1; a=rsa-sha256; t=1520436855; cv=none;        d=google.com;
s=arc-20160816;
b=SJkpAosxfiHg6uhlkNqd2WORu4QCmQySwSCNW9ubEDNx6h20632OB294WbTfNQTcQV
    9/xg4Lw7U0oGA8knGvcrPpozdcQ+VDgAZXebGwbQRURa/s6tU7D1Y8nQdJesCs5vDERh

HoZd0haeYIEGYLALToVSoSlJi26d/lNg0jIg0tUuQinp0KK+n44H6UJkhwQKFGuo3sKH
    WYm6ro+mvQKOq1L8DxToPVxxPl8B5j9ia7801YYqOXV+Ybkewt+nSmJyBuW+9pqizSN1

y+ZZhk0dLPgoB/unUqfvZirULfICPsEEBo+KFA4ja3ylPiLz4qx5pyRKU6PhkLL+5A5v
    m5wg==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed;
d=google.com; s=arc-20160816;
h=content-language:in-reply-to:mime-version:user-agent:date
:message-id:from:references:to:subject:arc-authentication-results;
 bh=gaN9v+1ST2YnYxFchkHEnlO3FZ4i5oOFtNJlB2rL0GQ=;
b=H014lBolj+v7V2/UKGUhLI/THfpI2b7xyq08vdzt5N6wtC7JHHK5zOWm8pl1PQYZ6R
    6eC5Nz3RD9wgMWm6xuyP7FsK6VVj2jVA7fJaKneoyJjYsjeO0BAuTLJR6kMPm45dKp2t

tT5bWJCGz0dI1NvPBROd4V1+SH+R6Ia2cvYk3OIgLY5aL6HbKS475jzR4DWVeUDKBoYy
    ovXr1O9WEYk2ws5nGgGuuu26upBMXSr1FctPp2IscsJiBLp7Kw3bvAlMWetLuo6Sos3H

oQWdcQN1MOleVf2BlI8s9q+g1AlHqXjAxMOzDkzDNw8REA3wKMjSnfOmgnRPgltzwaDX
    j7+A==
ARC-Authentication-Results: i=1; mx.google.com;       spf=pass
(google.com: domain of geor...@mhsoftware.com designates 204.144.128.66
as permitted sender) smtp.mailfrom=geor...@mhsoftware.com
Return-Path: <geor...@mhsoftware.com>
Received: from mail.mhsoftware.com (mail.mhsoftware.com.
[204.144.128.66])        by mx.google.com with ESMTPS id
x132si5364717iod.40.2018.03.07.07.34.14        for <elecha...@gmail.com>
       (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
       Wed, 07 Mar 2018 07:34:15 -0800 (PST)
Received-SPF: pass (google.com: domain of geor...@mhsoftware.com
designates 204.144.128.66 as permitted sender) client-ip=204.144.128.66;
Authentication-Results: mx.google.com;       spf=pass (google.com:
domain of geor...@mhsoftware.com designates 204.144.128.66 as permitted
sender) smtp.mailfrom=geor...@mhsoftware.com
Received: from localhost (localhost [127.0.0.1]) by mail.mhsoftware.com
(Postfix) with ESMTP id 1B02430091D for <elecha...@gmail.com>; Wed,  7
Mar 2018 08:34:14 -0700 (MST)
X-Virus-Scanned: amavisd-new at mhsoftware.com
Received: from mail.mhsoftware.com ([127.0.0.1]) by localhost
(mail.mhsoftware.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP
id Stw0M0HWx-Q3 for <elecha...@gmail.com>; Wed,  7 Mar 2018 08:34:10
-0700 (MST)
Received: from [192.168.1.120] (c-67-190-58-109.hsd1.co.comcast.net
[67.190.58.109]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256
(128/128 bits)) (Client did not present a certificate) by
mail.mhsoftware.com (Postfix) with ESMTPSA id 8952330091C for
<elecha...@gmail.com>; Wed,  7 Mar 2018 08:34:10 -0700 (MST)
Subject: Re: LdapConnection.search() Help
To: Emmanuel Lécharny <elecha...@gmail.com>
References: <a79dc37c-f730-06bf-b78e-1776de6b8...@mhsoftware.com>
<452c958c-1182-62fa-5ea5-716725808...@gmail.com>
<c5b99d86-d9fb-6352-59a3-7974b0859...@mhsoftware.com>
<e9f7376a-b227-b1ee-015c-594ba95cf...@gmail.com>
<e8fa95a1-e838-ca39-148a-43953c779...@mhsoftware.com>
<56806966-dffc-711a-4db0-d04dcfd72...@mhsoftware.com>
<523805e1-eefb-06ab-da26-722e7b2fe...@gmail.com>
From: George S. <geor...@mhsoftware.com>
Message-ID: <8da5b63e-949d-9b9a-e6d9-251ade97a...@mhsoftware.com>
Date: Wed, 7 Mar 2018 08:33:50 -0700
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101
Thunderbird/52.6.0
MIME-Version: 1.0
In-Reply-To: <523805e1-eefb-06ab-da26-722e7b2fe...@gmail.com>
Content-Type: multipart/alternative;
boundary="------------26CF65067D378379E4A0FED9"
Content-Language: en-US

Using 1.0.0 If I run this code:

EntryCursor cursor=lc.search(base,"(objectclass=*)",SearchScope.ONELEVEL);
for  (Entry entry : cursor){
   entries.add(entry);
} I get this exception:

Exception in thread "main" java.lang.RuntimeException:
ERR_02002_FAILURE_ON_UNDERLYING_CURSOR Failure on underlying Cursor.
         at
org.apache.directory.api.ldap.model.cursor.CursorIterator.next(CursorIterator.java:89)
         at
com.mhsoftware.ldap.BoundConnection.search(BoundConnection.java:360)
         at
com.mhsoftware.ldap.LDAPConnectionFactory.main(LDAPConnectionFactory.java:265)
Caused by:
org.apache.directory.api.ldap.model.cursor.CursorLdapReferralException
         at
org.apache.directory.ldap.client.api.EntryCursorImpl.get(EntryCursorImpl.java:174)
\       lda        at
org.apache.directory.ldap.client.api.EntryCursorImpl.get(EntryCursorImpl.java:52)
         at
org.apache.directory.api.ldap.model.cursor.CursorIterator.next(CursorIterator.java:82)
         ... 2 more

If I run this code, it works.


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


for (Response response: cursor) {
if (response instanceof SearchResultEntry) {
Entry resultEntry = ((SearchResultEntry)response).getEntry();
entries.add(resultEntry);
}
}


On 3/7/2018 8:18 AM, Emmanuel Lécharny wrote:
> 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.
>>>>

-- 
George S.
*MH Software, Inc.*
Voice: 303 438 9585
http://www.mhsoftware.com

Reply via email to