001/*
002 *   Licensed to the Apache Software Foundation (ASF) under one
003 *   or more contributor license agreements.  See the NOTICE file
004 *   distributed with this work for additional information
005 *   regarding copyright ownership.  The ASF licenses this file
006 *   to you under the Apache License, Version 2.0 (the
007 *   "License"); you may not use this file except in compliance
008 *   with the License.  You may obtain a copy of the License at
009 *
010 *     http://www.apache.org/licenses/LICENSE-2.0
011 *
012 *   Unless required by applicable law or agreed to in writing,
013 *   software distributed under the License is distributed on an
014 *   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 *   KIND, either express or implied.  See the License for the
016 *   specific language governing permissions and limitations
017 *   under the License.
018 *
019 */
020package org.apache.directory.ldap.client.api;
021
022
023import java.io.Closeable;
024import java.io.IOException;
025import java.util.List;
026
027import org.apache.directory.api.asn1.util.Oid;
028import org.apache.directory.api.ldap.codec.api.BinaryAttributeDetector;
029import org.apache.directory.api.ldap.codec.api.LdapApiService;
030import org.apache.directory.api.ldap.model.cursor.EntryCursor;
031import org.apache.directory.api.ldap.model.cursor.SearchCursor;
032import org.apache.directory.api.ldap.model.entry.Entry;
033import org.apache.directory.api.ldap.model.entry.Modification;
034import org.apache.directory.api.ldap.model.entry.ModificationOperation;
035import org.apache.directory.api.ldap.model.entry.Value;
036import org.apache.directory.api.ldap.model.exception.LdapException;
037import org.apache.directory.api.ldap.model.message.AbandonRequest;
038import org.apache.directory.api.ldap.model.message.AddRequest;
039import org.apache.directory.api.ldap.model.message.AddResponse;
040import org.apache.directory.api.ldap.model.message.BindRequest;
041import org.apache.directory.api.ldap.model.message.BindResponse;
042import org.apache.directory.api.ldap.model.message.CompareRequest;
043import org.apache.directory.api.ldap.model.message.CompareResponse;
044import org.apache.directory.api.ldap.model.message.Control;
045import org.apache.directory.api.ldap.model.message.DeleteRequest;
046import org.apache.directory.api.ldap.model.message.DeleteResponse;
047import org.apache.directory.api.ldap.model.message.ExtendedRequest;
048import org.apache.directory.api.ldap.model.message.ExtendedResponse;
049import org.apache.directory.api.ldap.model.message.ModifyDnRequest;
050import org.apache.directory.api.ldap.model.message.ModifyDnResponse;
051import org.apache.directory.api.ldap.model.message.ModifyRequest;
052import org.apache.directory.api.ldap.model.message.ModifyResponse;
053import org.apache.directory.api.ldap.model.message.SearchRequest;
054import org.apache.directory.api.ldap.model.message.SearchScope;
055import org.apache.directory.api.ldap.model.name.Dn;
056import org.apache.directory.api.ldap.model.name.Rdn;
057import org.apache.directory.api.ldap.model.schema.SchemaManager;
058
059
060// TODO: all the SASL bind methods are not declared in this interface, but implemented in LdapNetworkConnection. Is that intended?
061// TODO: why do connect() and close() return a boolean? What is the difference between false and an Exception?
062// TODO: think about usage of abbrevisions (Dn/Rdn) vs. spelled out (relative distinguished name) in javadoc
063// TODO: describe better which type of LdapException are thrown in which case?
064// TODO: remove the "we" language in javadoc
065// TODO: does method getCodecService() belong into the interface? It returns a LdapApiService, should it be renamed?
066// TODO: does method doesFutureExistFor() belong into the interface? Move to LdapAsyncConnection?
067
068/**
069 * The root interface for all the LDAP connection implementations. All operations defined in this interface are blocking (synchronous).
070 *
071 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
072 */
073public interface LdapConnection extends Closeable
074{
075    /**
076     * Check if we are connected.
077     *
078     * @return <code>true</code> if we are connected.
079     */
080    boolean isConnected();
081
082
083    /**
084     * Check if we are authenticated.
085     *
086     * @return <code>true</code> if we are connected.
087     */
088    boolean isAuthenticated();
089
090
091    /**
092     * Connect to the remote LDAP server.
093     *
094     * @return <code>true</code> if the connection is established, false otherwise
095     * @throws LdapException if some error occurred
096     */
097    boolean connect() throws LdapException;
098
099
100    /**
101     * Disconnect from the remote LDAP server.
102     *
103     * @throws IOException if some I/O error occurs
104     */
105    void close() throws IOException;
106
107
108    //------------------------ The LDAP operations ------------------------//
109    // Add operations                                                      //
110    //---------------------------------------------------------------------//
111    /**
112     * Add an entry to the server.
113     *
114     * @param entry The entry to add
115     * @throws LdapException if some error occurred
116     */
117    void add( Entry entry ) throws LdapException;
118
119
120    /**
121     * Add an entry present in the {@link AddRequest} to the server.
122     *
123     * @param addRequest the request object containing an entry and controls (if any)
124     * @return the add operation's response
125     * @throws LdapException if some error occurred
126     */
127    AddResponse add( AddRequest addRequest ) throws LdapException;
128
129
130    /**
131     * Abandons a request submitted to the server for performing a particular operation.
132     *
133     * The abandonRequest is always non-blocking, because no response is expected
134     *
135     * @param messageId the ID of the request message sent to the server
136     */
137    void abandon( int messageId );
138
139
140    /**
141     * An abandon request essentially with the request message ID of the operation to be canceled
142     * and/or potentially some controls and timeout (the controls and timeout are not mandatory).
143     *
144     * The abandonRequest is always non-blocking, because no response is expected.
145     *
146     * @param abandonRequest the abandon operation's request
147     */
148    void abandon( AbandonRequest abandonRequest );
149
150
151    /**
152     * Bind on a server, using the {@link LdapConnectionConfig} information of this connection.
153     *
154     * @throws LdapException if some error occurred
155     * @throws IOException if an I/O exception occurred
156     */
157    void bind() throws LdapException;
158
159
160    /**
161     * Anonymous bind on a server.
162     *
163     * @throws LdapException if some error occurred
164     */
165    void anonymousBind() throws LdapException;
166
167
168    /**
169     * Unauthenticated authentication bind on a server.
170     *
171     * @param name The name we use to authenticate the user. It must be a
172     * valid {@link Dn}
173     * @throws LdapException if some error occurred
174     */
175    void bind( String name ) throws LdapException;
176
177
178    /**
179     * Simple bind on a server.
180     *
181     * @param name The name we use to authenticate the user. It must be a
182     * valid {@link Dn}
183     * @param credentials The password, it can't be <code>null</code>
184     * @throws LdapException if some error occurred
185     */
186    void bind( String name, String credentials ) throws LdapException;
187
188
189    /**
190     * SASL PLAIN Bind on a server.
191     *
192     * @param authcid The Authentication identity
193     * @param credentials The password, it can't be null
194     * @return The BindResponse LdapResponse
195     * @throws LdapException if some error occurred
196     */
197    // Not yet available on the CoreConnection
198    //BindResponse bindSaslPlain( String authcid, String credentials ) throws LdapException;
199
200    /**
201     * SASL PLAIN Bind on a server.
202     *
203     * @param authzid The Authorization identity
204     * @param authcid The Authentication identity
205     * @param credentials The password. It can't be null
206     * @return The BindResponse LdapResponse
207     * @throws LdapException if some error occurred
208     */
209    // Not yet available on the CoreConnection
210    //BindResponse bindSaslPlain( String authzid, String authcid, String credentials ) throws LdapException;
211
212    /**
213     * Unauthenticated authentication bind on a server.
214     *
215     * @param name The name we use to authenticate the user.
216     * @throws LdapException if some error occurred
217     */
218    void bind( Dn name ) throws LdapException;
219
220
221    /**
222     * Simple bind on a server.
223     *
224     * @param name The name we use to authenticate the user.
225     * @param credentials The password, it can't be null
226     * @throws LdapException if some error occurred
227     */
228    void bind( Dn name, String credentials ) throws LdapException;
229
230
231    /**
232     * Bind to the server using a bind request object.
233     *
234     * @param bindRequest The bind request object containing all the needed parameters
235     * @return A {@link BindResponse} containing the result
236     * @throws LdapException if some error occurred
237     */
238    BindResponse bind( BindRequest bindRequest ) throws LdapException;
239
240
241    /**
242     * Do a search, on the base object, using the given filter and scope. The
243     * SearchRequest parameters default to
244     * <ul>
245     * <li> DerefAlias : ALWAYS
246     * <li> SizeLimit : none
247     * <li> TimeLimit : none
248     * <li> TypesOnly : false
249     * </ul>
250     * 
251     * @param baseDn The base for the search. It must be a valid distinguished name and can't be emtpy
252     * @param filter The filter to use for this search. It can't be empty
253     * @param scope The search scope : OBJECT, ONELEVEL or SUBTREE
254     * @param attributes The attributes to use for this search
255     * @return An {@link EntryCursor} on the result.
256     * @throws LdapException if some error occurred
257     */
258    EntryCursor search( Dn baseDn, String filter, SearchScope scope, String... attributes )
259        throws LdapException;
260
261
262    /**
263     * Do a search, on the base object, using the given filter and scope. The
264     * SearchRequest parameters default to
265     * <ul>
266     * <li> DerefAlias : ALWAYS
267     * <li> SizeLimit : none
268     * <li> TimeLimit : none
269     * <li> TypesOnly : false
270     * </ul>
271     *
272     * @param baseDn The base for the search. It must be a valid distinguished name, and can't be emtpy
273     * @param filter The filter to use for this search. It can't be empty
274     * @param scope The search scope : OBJECT, ONELEVEL or SUBTREE
275     * @param attributes The attributes to use for this search
276     * @return An {@link EntryCursor} on the result.
277     * @throws LdapException if some error occurred
278     */
279    EntryCursor search( String baseDn, String filter, SearchScope scope, String... attributes )
280        throws LdapException;
281
282
283    /**
284     * Performs search using a search request object.
285     *
286     * @param searchRequest The search request object containing all the needed information
287     * @return a search cursor on the result.
288     * @throws LdapException if some error occurred
289     */
290    SearchCursor search( SearchRequest searchRequest ) throws LdapException;
291
292
293    //------------------------ The LDAP operations ------------------------//
294    // Unbind operations                                                   //
295    //---------------------------------------------------------------------//
296    /**
297     * UnBind from a server. This is a request which expects no response.
298     * 
299     * @throws LdapException if some error occurred
300     */
301    void unBind() throws LdapException;
302
303
304    /**
305     * Set the timeout for the responses. We won't wait longer than this
306     * value.
307     *
308     * @param timeOut The timeout, in milliseconds
309     */
310    void setTimeOut( long timeOut );
311
312
313    /**
314     * Applies all the modifications to the entry specified by its distinguished name.
315     *
316     * @param dn The entry's distinguished name
317     * @param modifications The list of modifications to be applied
318     * @throws LdapException in case of modify operation failure or timeout happens
319     */
320    void modify( Dn dn, Modification... modifications ) throws LdapException;
321
322
323    /**
324     * Applies all the modifications to the entry specified by its distinguished name.
325     *
326     * @param dn The entry's distinguished name, it must be a valid {@link Dn}
327     * @param modifications The list of modifications to be applied
328     * @return the modify operation's response
329     * @throws LdapException in case of modify operation failure or timeout happens
330     */
331    void modify( String dn, Modification... modifications ) throws LdapException;
332
333
334    /**
335     * Modifies all the attributes present in the entry by applying the same operation.
336     *
337     * @param entry the entry with the attributes to be modified
338     * @param modOp the operation to be applied on all the attributes of the above entry
339     * @return the modify operation's response
340     * @throws LdapException in case of modify operation failure or timeout happens
341     */
342    void modify( Entry entry, ModificationOperation modOp ) throws LdapException;
343
344
345    /**
346     * Performs an modify operation based on the modifications present in
347     * the modify request.
348     *
349     * @param modRequest the modify request object
350     * @return the modify operation's response
351     * @throws LdapException in case of modify operation failure or timeout happens
352     */
353    ModifyResponse modify( ModifyRequest modRequest ) throws LdapException;
354
355
356    /**
357     * Renames the given entryDn with new Rdn and deletes the old Rdn.
358     *
359     * @param entryDn the target Dn
360     * @param newRdn new Rdn for the target Dn
361     * @throws LdapException if some error occurred
362     * @see #rename(String, String, boolean)
363     */
364    void rename( String entryDn, String newRdn ) throws LdapException;
365
366
367    /**
368     * Renames the given entryDn with new Rdn and deletes the old Rdn.
369     *
370     * @param entryDn the target Dn
371     * @param newRdn new Rdn for the target Dn
372     * @throws LdapException if some error occurred
373     * @see #rename(Dn, Rdn, boolean)
374     */
375    void rename( Dn entryDn, Rdn newRdn ) throws LdapException;
376
377
378    /**
379     * Renames the given entryDn with new Rdn and deletes the old Rdn if
380     * deleteOldRdn is set to true.
381     *
382     * @param entryDn the target Dn
383     * @param newRdn new Rdn for the target Dn
384     * @param deleteOldRdn flag to indicate whether to delete the old Rdn
385     * @throws LdapException if some error occurred
386     * @see #rename(Dn, Rdn, boolean)
387     */
388    void rename( String entryDn, String newRdn, boolean deleteOldRdn ) throws LdapException;
389
390
391    /**
392     * Renames the given entryDn with new Rdn and deletes the old Rdn if
393     * deleteOldRdn is set to true.
394     *
395     * @param entryDn the target Dn
396     * @param newRdn new Rdn for the target Dn
397     * @param deleteOldRdn flag to indicate whether to delete the old Rdn
398     * @return modifyDn operation's response
399     * @throws LdapException if some error occurred
400     */
401    void rename( Dn entryDn, Rdn newRdn, boolean deleteOldRdn ) throws LdapException;
402
403
404    /**
405     * Moves the given entry Dn under the new superior Dn.
406     *
407     * @param entryDn the Dn of the target entry
408     * @param newSuperiorDn Dn of the new parent/superior
409     * @throws LdapException if some error occurred
410     * @see #move(Dn, Dn)
411     */
412    void move( String entryDn, String newSuperiorDn ) throws LdapException;
413
414
415    /**
416     * Moves the given entry Dn under the new superior Dn.
417     *
418     * @param entryDn the Dn of the target entry
419     * @param newSuperiorDn Dn of the new parent/superior
420     * @throws LdapException if some error occurred
421     */
422    void move( Dn entryDn, Dn newSuperiorDn ) throws LdapException;
423
424
425    /**
426     * Moves and renames the given entryDn. The old Rdn will be deleted.
427     *
428     * @param entryDn The original entry Dn
429     * @param newDn The new entry Dn
430     * @throws LdapException if some error occurred
431     * @see #moveAndRename(Dn, Dn, boolean)
432     */
433    void moveAndRename( Dn entryDn, Dn newDn ) throws LdapException;
434
435
436    /**
437     * Moves and renames the given entryDn.The old Rdn will be deleted
438     *
439     * @param entryDn The original entry Dn
440     * @param newDn The new entry Dn
441     * @throws LdapException if some error occurred
442     * @see #moveAndRename(Dn, Dn, boolean)
443     */
444    void moveAndRename( String entryDn, String newDn ) throws LdapException;
445
446
447    /**
448     * Moves and renames the given entryDn. The old Rdn will be deleted if requested.
449     *
450     * @param entryDn The original entry Dn
451     * @param newDn The new entry Dn
452     * @param deleteOldRdn Tells if the old Rdn must be removed
453     * @throws LdapException if some error occurred
454     */
455    void moveAndRename( Dn entryDn, Dn newDn, boolean deleteOldRdn ) throws LdapException;
456
457
458    /**
459     * Moves and renames the given entryDn. The old Rdn will be deleted if requested.
460     *
461     * @param entryDn The original entry Dn
462     * @param newDn The new entry Dn
463     * @param deleteOldRdn Tells if the old Rdn must be removed
464     * @throws LdapException if some error occurred
465     */
466    void moveAndRename( String entryDn, String newDn, boolean deleteOldRdn )
467        throws LdapException;
468
469
470    /**
471     * Performs the modifyDn operation based on the given request object.
472     *
473     * @param modDnRequest the request object
474     * @return modifyDn operation's response
475     * @throws LdapException if some error occurred
476     */
477    ModifyDnResponse modifyDn( ModifyDnRequest modDnRequest ) throws LdapException;
478
479
480    /**
481     * Deletes the entry with the given distinguished name.
482     *
483     * @param dn the target entry's distinguished name, it must be a valid {@link Dn}
484     * @throws LdapException If the Dn is not valid or if the deletion failed
485     */
486    void delete( String dn ) throws LdapException;
487
488
489    /**
490     * Deletes the entry with the given distinguished name.
491     *
492     * @param dn the target entry's distinguished name
493     * @throws LdapException If the Dn is not valid or if the deletion failed
494     */
495    void delete( Dn dn ) throws LdapException;
496
497
498    /**
499     * Performs a delete operation based on the delete request object.
500     *
501     * @param deleteRequest the delete operation's request
502     * @return delete operation's response
503     * @throws LdapException If the Dn is not valid or if the deletion failed
504     */
505    DeleteResponse delete( DeleteRequest deleteRequest ) throws LdapException;
506
507
508    /**
509     * Compares whether a given attribute's value matches that of the
510     * existing value of the attribute present in the entry with the given distinguished name.
511     *
512     * @param dn the target entry's distinguished name, it must be a valid {@link Dn}
513     * @param attributeName the attribute's name
514     * @param value a String value with which the target entry's attribute value to be compared with
515     * @return <code>true</code> if the value matches, <code>false</code> otherwise
516     * @throws LdapException if some error occurred
517     */
518    boolean compare( String dn, String attributeName, String value ) throws LdapException;
519
520
521    /**
522     * Compares whether a given attribute's value matches that of the
523     * existing value of the attribute present in the entry with the given distinguished name.
524     *
525     * @param dn the target entry's distinguished name, it must be a valid {@link Dn}
526     * @param attributeName the attribute's name
527     * @param value a byte[] value with which the target entry's attribute value to be compared with
528     * @return <code>true</code> if the value matches, <code>false</code> otherwise
529     * @throws LdapException if some error occurred
530     */
531    boolean compare( String dn, String attributeName, byte[] value ) throws LdapException;
532
533
534    /**
535     * Compares whether a given attribute's value matches that of the
536     * existing value of the attribute present in the entry with the given distinguished name.
537     *
538     * @param dn the target entry's distinguished name, it must be a valid {@link Dn}
539     * @param attributeName the attribute's name
540     * @param value a Value<?> value with which the target entry's attribute value to be compared with
541     * @return <code>true</code> if the value matches, <code>false</code> otherwise
542     * @throws LdapException if some error occurred
543     */
544    boolean compare( String dn, String attributeName, Value<?> value ) throws LdapException;
545
546
547    /**
548     * Compares whether a given attribute's value matches that of the
549     * existing value of the attribute present in the entry with the given distinguished name.
550     *
551     * @param dn the target entry's distinguished name
552     * @param attributeName the attribute's name
553     * @param value a String value with which the target entry's attribute value to be compared with
554     * @return <code>true</code> if the value matches, <code>false</code> otherwise
555     * @throws LdapException if some error occurred
556     */
557    boolean compare( Dn dn, String attributeName, String value ) throws LdapException;
558
559
560    /**
561     * Compares whether a given attribute's value matches that of the
562     * existing value of the attribute present in the entry with the given distinguished name.
563     *
564     * @param dn the target entry's distinguished name
565     * @param attributeName the attribute's name
566     * @param value a byte[] value with which the target entry's attribute value to be compared with
567     * @return <code>true</code> if the value matches, <code>false</code> otherwise
568     * @throws LdapException if some error occurred
569     */
570    boolean compare( Dn dn, String attributeName, byte[] value ) throws LdapException;
571
572
573    /**
574     * Compares whether a given attribute's value matches that of the
575     * existing value of the attribute present in the entry with the given distinguished name.
576     *
577     * @param dn the target entry's distinguished name
578     * @param attributeName the attribute's name
579     * @param value a Value<?> value with which the target entry's attribute value to be compared with
580     * @return <code>true</code> if the value matches, <code>false</code> otherwise
581     * @throws LdapException if some error occurred
582     */
583    boolean compare( Dn dn, String attributeName, Value<?> value ) throws LdapException;
584
585
586    /**
587     * Compares an entry's attribute's value with that of the given value.
588     *
589     * @param compareRequest the compare request which contains the target Dn, attribute name and value
590     * @return compare operation's response
591     * @throws LdapException if some error occurred
592     */
593    CompareResponse compare( CompareRequest compareRequest ) throws LdapException;
594
595
596    /**
597     * Sends a extended operation request to the server with the given OID and no value.
598     *
599     * @param oid the object identifier of the extended operation
600     * @return extended operation's response
601     * @throws LdapException if some error occurred
602     * @see #extended(org.apache.directory.api.asn1.util.Oid, byte[])
603     */
604    ExtendedResponse extended( String oid ) throws LdapException;
605
606
607    /**
608     * Sends a extended operation request to the server with the given OID and value.
609     *
610     * @param oid the object identifier of the extended operation
611     * @param value value to be used by the extended operation, can be a null value
612     * @return extended operation's response
613     * @throws LdapException if some error occurred
614     * @see #extended(org.apache.directory.api.asn1.util.Oid, byte[])
615     */
616    ExtendedResponse extended( String oid, byte[] value ) throws LdapException;
617
618
619    /**
620     * Sends a extended operation request to the server with the given OID and no value.
621     *
622     * @param oid the object identifier of the extended operation
623     * @return extended operation's response
624     * @throws LdapException if some error occurred
625     * @see #extended(org.apache.directory.api.asn1.util.Oid, byte[])
626     */
627    ExtendedResponse extended( Oid oid ) throws LdapException;
628
629
630    /**
631     * Sends a extended operation request to the server with the given OID and value.
632     *
633     * @param oid the object identifier of the extended operation
634     * @param value value to be used by the extended operation, can be a null value
635     * @return extended operation's response
636     * @throws LdapException if some error occurred
637     */
638    ExtendedResponse extended( Oid oid, byte[] value ) throws LdapException;
639
640
641    /**
642     * Performs an extended operation based on the extended request object.
643     *
644     * @param extendedRequest the extended operation's request
645     * @return Extended operation's response
646     * @throws LdapException if the extended operation failed
647     */
648    ExtendedResponse extended( ExtendedRequest extendedRequest ) throws LdapException;
649
650
651    /**
652     * Tells if an entry exists in the server.
653     * 
654     * @param dn The distinguished name of the entry we want to check the existence, must be a valid {@link Dn}
655     * @return <code>true</code> if the entry exists, <code>false</code> otherwise.
656     * Note that if the entry exists but if the user does not have the permission to
657     * read it, <code>false</code> will also be returned
658     * @throws LdapException if some error occurred
659     */
660    boolean exists( String dn ) throws LdapException;
661
662
663    /**
664     * Tells if an Entry exists in the server.
665     * 
666     * @param dn The distinguished name of the entry we want to check the existence
667     * @return <code>true</code> if the entry exists, <code>false</code> otherwise.
668     * Note that if the entry exists but if the user does not have the permission to
669     * read it, <code>false</code> will also be returned
670     * @throws LdapException if some error occurred
671     */
672    boolean exists( Dn dn ) throws LdapException;
673
674
675    /**
676     * Get back the RooDSE from the connected server. Only the user attributes are returned.
677     * 
678     * @return The Entry containing all the information about the rootDSE
679     * @throws LdapException If the rootDSE can't be read
680     */
681    Entry getRootDse() throws LdapException;
682
683
684    /**
685     * Get back the RooDSE from the connected server. The user can provide the
686     * list of attributes he wants to get back. Sending "*" will return all the
687     * user attributes, sending "+" will return all the operational attributes.
688     * 
689     * @param attributes The list of attributes to return
690     * @return The Entry containing all the information about the rootDSE
691     * @throws LdapException If the rootDSE can't be read
692     */
693    Entry getRootDse( String... attributes ) throws LdapException;
694
695
696    /**
697     * Searches for an entry having the given Dn.
698     *
699     * @param dn the Dn of the entry to be fetched
700     * @return the Entry with the given Dn or null if no entry exists with that Dn
701     * @throws LdapException in case of any problems while searching for the Dn or if the returned response contains a referral
702     * @see #lookup(org.apache.directory.api.ldap.model.name.Dn, String...)
703     */
704    Entry lookup( Dn dn ) throws LdapException;
705
706
707    /**
708     * Searches for an entry having the given Dn.
709     *
710     * @param dn the Dn of the entry to be fetched
711     * @return the Entry with the given Dn or null if no entry exists with that Dn
712     * @throws LdapException in case of any problems while searching for the Dn or if the returned response contains a referral
713     * @see #lookup(String, String...)
714     */
715    Entry lookup( String dn ) throws LdapException;
716
717
718    /**
719     * Searches for an entry having the given Dn.
720     *
721     * @param dn the Dn of the entry to be fetched
722     * @param attributes the attributes to be returned along with entry
723     * @return the Entry with the given Dn or null if no entry exists with that Dn
724     * @throws LdapException in case of any problems while searching for the Dn or if the returned response contains a referral
725     */
726    Entry lookup( Dn dn, String... attributes ) throws LdapException;
727
728
729    /**
730     * Searches for an entry having the given Dn.
731     *
732     * @param dn the Dn of the entry to be fetched
733     * @param controls the controls to use
734     * @param attributes the attributes to be returned along with entry
735     * @return the Entry with the given Dn or null if no entry exists with that Dn
736     * @throws LdapException in case of any problems while searching for the Dn or if the returned response contains a referral
737     */
738    Entry lookup( Dn dn, Control[] controls, String... attributes ) throws LdapException;
739
740
741    /**
742     * Searches for an entry having the given Dn.
743     *
744     * @param dn the Dn of the entry to be fetched
745     * @param attributes the attributes to be returned along with entry
746     * @return the Entry with the given Dn or null if no entry exists with that Dn
747     * @throws LdapException in case of any problems while searching for the Dn or if the returned response contains a referral
748     * @see #lookup(org.apache.directory.api.ldap.model.name.Dn, String...)
749     */
750    Entry lookup( String dn, String... attributes ) throws LdapException;
751
752
753    /**
754     * Searches for an entry having the given Dn.
755     *
756     * @param dn the Dn of the entry to be fetched
757     * @param controls the controls to use
758     * @param attributes the attributes to be returned along with entry
759     * @return the Entry with the given Dn or null if no entry exists with that Dn
760     * @throws LdapException in case of any problems while searching for the Dn or if the returned response contains a referral
761     * @see #lookup(org.apache.directory.api.ldap.model.name.Dn, String...)
762     */
763    Entry lookup( String dn, Control[] controls, String... attributes ) throws LdapException;
764
765
766    /**
767     * Checks if a control with the given OID is supported.
768     *
769     * @param controlOID the OID of the control
770     * @return true if the control is supported, false otherwise
771     * @throws LdapException if some error occurred
772     */
773    boolean isControlSupported( String controlOID ) throws LdapException;
774
775
776    /**
777     * Get the Controls supported by server.
778     *
779     * @return a list of control OIDs supported by server
780     * @throws LdapException if some error occurred
781     */
782    List<String> getSupportedControls() throws LdapException;
783
784
785    /**
786     * Loads all the default schemas that are bundled with the API.<br><br>
787     * <b>Note:</b> This method enables <b>all</b> schemas prior to loading.
788     * 
789     * @throws LdapException in case of problems while loading the schema
790     */
791    void loadSchema() throws LdapException;
792
793
794    /**
795     * @return The SchemaManager associated with this LdapConection if any
796     */
797    SchemaManager getSchemaManager();
798
799
800    /**
801     * Gets the LDAP CODEC service responsible for encoding and decoding
802     * messages.
803     * 
804     * @return The LDAP CODEC service.
805     */
806    LdapApiService getCodecService();
807
808
809    /**
810     * Checks if there is a ResponseFuture associated with the given message ID.
811     *
812     * @param messageId ID of the request
813     * @return true if there is a non-null future exists, false otherwise
814     */
815    boolean doesFutureExistFor( int messageId );
816
817
818    /**
819     * @return the object responsible for the detection of binary attributes
820     */
821    BinaryAttributeDetector getBinaryAttributeDetector();
822
823
824    /**
825     * Sets the object responsible for the detection of binary attributes.
826     */
827    void setBinaryAttributeDetector( BinaryAttributeDetector binaryAttributeDetecter );
828
829
830    /**
831     * sets a SchemaManager to be used by this connection
832     */
833    void setSchemaManager( SchemaManager schemaManager );
834}