/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at * trunk/opends/resource/legal-notices/OpenDS.LICENSE * or https://OpenDS.dev.java.net/OpenDS.LICENSE. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, * add the following below this CDDL HEADER, with the fields enclosed * by brackets "[]" replaced with your own identifying information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Copyright 2009 Sun Microsystems, Inc. */ package org.opends.sdk; import java.io.Closeable; import java.util.Collection; import org.opends.sdk.requests.*; import org.opends.sdk.responses.BindResult; import org.opends.sdk.responses.CompareResult; import org.opends.sdk.responses.Result; import org.opends.sdk.responses.SearchResultEntry; import org.opends.sdk.schema.Schema; /** * An asynchronous connection with a Directory Server over which read * and update operations may be performed. See RFC 4511 for the LDAPv3 * protocol specification and more information about the types of * operations defined in LDAP. *
*
* All operations are performed asynchronously and return a * {@link FutureResult} or sub-type thereof which can be used for * retrieving the result using the {@link FutureResult#get} method. * Operation failures, for whatever reason, are signalled by the * {@link FutureResult#get()} method throwing an * {@link ErrorResultException}. *
* Synchronous operations are easily simulated by immediately getting * the result: * *
* Connection connection = ...; * AddRequest request = ...; * // Will block until operation completes, and * // throws exception on failure. * connection.add(request).get(); ** * Operations can be performed in parallel while taking advantage of the * simplicity of a synchronous application design: * *
* Connection connection1 = ...; * Connection connection2 = ...; * AddRequest request = ...; * // Add the entry to the first server (don't block). * FutureResult future1 = connection1.add(request); * // Add the entry to the second server (in parallel). * FutureResult future2 = connection2.add(request); * // Total time = is O(1) instead of O(n). * future1.get(); * future2.get(); ** * More complex client applications can take advantage of a fully * asynchronous event driven design using {@link ResultHandler}s: * *
* Connection connection = ...; * SearchRequest request = ...; * // Process results in the search result handler * // in a separate thread. * SearchResponseHandler handle = ...; * connection.search(request, handler); **
*
* Applications must ensure that a connection is closed by calling * {@link #close()} even if a fatal error occurs on the connection. Once * a connection has been closed by the client application, any attempts * to continue to use the connection will result in an * {@link IllegalStateException} being thrown. Note that, if a fatal * error is encountered on the connection, then the application can * continue to use the connection. In this case all requests subsequent * to the failure will fail with an appropriate * {@link ErrorResultException} when their result is retrieved. *
*
* Applications can choose to be notified when a connection is closed by * the application, receives an unsolicited notification, or experiences * a fatal error by registering a {@link ConnectionEventListener} with * the connection using the {@link #addConnectionEventListener} method. *
*
*
* Note: a more convenient approach to abandoning unfinished
* operations is provided via the {@link FutureResult#cancel(boolean)}
* method.
*
* @param request
* The request identifying the operation to be abandoned.
* @throws UnsupportedOperationException
* If this connection does not support abandon operations.
* @throws IllegalStateException
* If this connection has already been closed, i.e. if
* {@code isClosed() == true}.
* @throws NullPointerException
* If {@code request} was {@code null}.
*/
void abandon(AbandonRequest request)
throws UnsupportedOperationException, IllegalStateException,
NullPointerException;
/**
* Adds an entry to the Directory Server using the provided add
* request.
*
* @param request
* The add request.
* @param handler
* A result handler which can be used to asynchronously
* process the operation result when it is received, may be
* {@code null}.
* @return A future representing the result of the operation.
* @throws UnsupportedOperationException
* If this connection does not support add operations.
* @throws IllegalStateException
* If this connection has already been closed, i.e. if
* {@code isClosed() == true}.
* @throws NullPointerException
* If {@code request} was {@code null}.
*/
FutureResult
* Other connection implementations may behave differently, and may
* choose not to send an unbind request if its use is inappropriate
* (for example a pooled connection will be released and returned to
* its connection pool without ever issuing an unbind request).
*
* This method is semantically equivalent to the following code:
*
*
* Other connection implementations may behave differently, and may
* choose to ignore the provided unbind request if its use is
* inappropriate (for example a pooled connection will be released and
* returned to its connection pool without ever issuing an unbind
* request).
*
* Calling {@code close} on a connection that is already closed has no
* effect.
*
* @param request
* The unbind request to use in the case where a physical
* connection is closed.
* @param reason
* A reason describing why the connection was closed.
* @throws NullPointerException
* If {@code request} was {@code null}.
*/
void close(UnbindRequest request, String reason);
/**
* Compares an entry in the Directory Server using the provided
* compare request.
*
* @param request
* The compare request.
* @param handler
* A result handler which can be used to asynchronously
* process the operation result when it is received, may be
* {@code null}.
* @return A future representing the result of the operation.
* @throws UnsupportedOperationException
* If this connection does not support compare operations.
* @throws IllegalStateException
* If this connection has already been closed, i.e. if
* {@code isClosed() == true}.
* @throws NullPointerException
* If {@code request} was {@code null}.
*/
FutureResult
* If the requested entry is not returned by the Directory Server then
* the request will fail with an {@link EntryNotFoundException}. More
* specifically, the returned future will never return {@code null}.
*
* This method is equivalent to the following code:
*
*
* If the Root DSE is not returned by the Directory Server then the
* request will fail with an {@link EntryNotFoundException}. More
* specifically, the returned future will never return {@code null}.
*
* @param handler
* A result handler which can be used to asynchronously
* process the operation result when it is received, may be
* {@code null}.
* @return A future representing the result of the operation.
* @throws UnsupportedOperationException
* If this connection does not support search operations.
* @throws IllegalStateException
* If this connection has already been closed, i.e. if
* {@code isClosed() == true}.
*/
FutureResult
* If the requested schema is not returned by the Directory Server
* then the request will fail with an {@link EntryNotFoundException}.
* More specifically, the returned future will never return {@code
* null}.
*
* Implementations may choose to perform optimizations such as
* caching.
*
* @param name
* The distinguished name of the subschema sub-entry.
* @param handler
* A result handler which can be used to asynchronously
* process the operation result when it is received, may be
* {@code null}.
* @return A future representing the result of the operation.
* @throws UnsupportedOperationException
* If this connection does not support search operations.
* @throws IllegalStateException
* If this connection has already been closed, i.e. if
* {@code isClosed() == true}.
*/
FutureResult
* If the requested entry or its associated schema are not returned by
* the Directory Server then the request will fail with an
* {@link EntryNotFoundException}. More specifically, the returned
* future will never return {@code null}.
*
* A typical implementation will first read the {@code
* subschemaSubentry} attribute of the entry in order to locate the
* schema. However, implementations may choose to perform other
* optimizations, such as caching.
*
* @param name
* The distinguished name of the entry whose schema is to be
* located.
* @param handler
* A result handler which can be used to asynchronously
* process the operation result when it is received, may be
* {@code null}. Optional additional handler parameter.
* @return A future representing the result of the operation.
* @throws UnsupportedOperationException
* If this connection does not support search operations.
* @throws IllegalStateException
* If this connection has already been closed, i.e. if
* {@code isClosed() == true}.
*/
FutureResult
* If the requested entry is not returned by the Directory Server then
* the request will fail with an {@link EntryNotFoundException}. More
* specifically, the returned future will never return {@code null}.
* If multiple matching entries are returned by the Directory Server
* then the request will fail with an
* {@link MultipleEntriesFoundException}.
*
* @param request
* The search request.
* @param handler
* A result handler which can be used to asynchronously
* process the operation result when it is received, may be
* {@code null}.
* @return A future representing the result of the operation.
* @throws UnsupportedOperationException
* If this connection does not support search operations.
* @throws IllegalStateException
* If this connection has already been closed, i.e. if
* {@code isClosed() == true}.
* @throws NullPointerException
* If the {@code request} was {@code null}.
*/
FutureResult
* UnbindRequest request = Requests.newUnbindRequest();
* connection.close(request);
*
*
* Calling {@code close} on a connection that is already closed has no
* effect.
*/
void close();
/**
* Releases any resources associated with this connection. For
* physical connections to a Directory Server this will mean that the
* provided unbind request is sent and the underlying socket is
* closed.
*
* SearchRequest request = new SearchRequest(name,
* SearchScope.BASE_OBJECT, "(objectClass=*)", attributeDescriptions);
* connection.searchSingleEntry(request, resultHandler, p);
*
*
* @param name
* The distinguished name of the entry to be read.
* @param attributeDescriptions
* The names of the attributes to be included with the entry,
* which may be {@code null} or empty indicating that all
* user attributes should be returned.
* @param handler
* A result handler which can be used to asynchronously
* process the operation result when it is received, may be
* {@code null}.
* @return A future representing the result of the operation.
* @throws UnsupportedOperationException
* If this connection does not support search operations.
* @throws IllegalStateException
* If this connection has already been closed, i.e. if
* {@code isClosed() == true}.
* @throws NullPointerException
* If the {@code name} was {@code null}.
*/
FutureResult