/* * 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 legal-notices/CDDLv1_0.txt * or http://forgerock.org/license/CDDLv1.0.html. * 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 legal-notices/CDDLv1_0.txt. * 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 2012 ForgeRock AS */ package org.forgerock.opendj.ldap; import org.forgerock.opendj.ldap.requests.AbandonRequest; import org.forgerock.opendj.ldap.requests.AddRequest; import org.forgerock.opendj.ldap.requests.BindRequest; import org.forgerock.opendj.ldap.requests.CompareRequest; import org.forgerock.opendj.ldap.requests.DeleteRequest; import org.forgerock.opendj.ldap.requests.ExtendedRequest; import org.forgerock.opendj.ldap.requests.ModifyDNRequest; import org.forgerock.opendj.ldap.requests.ModifyRequest; import org.forgerock.opendj.ldap.requests.SearchRequest; import org.forgerock.opendj.ldap.responses.BindResult; import org.forgerock.opendj.ldap.responses.CompareResult; import org.forgerock.opendj.ldap.responses.ExtendedResult; import org.forgerock.opendj.ldap.responses.Result; import com.forgerock.opendj.util.CompletedFutureResult; /** * An abstract connection whose asynchronous methods are implemented in terms of * synchronous methods. *

* NOTE: this implementation does not support intermediate response * handlers except for extended operations, because they are not supported by * the equivalent synchronous methods. */ public abstract class AbstractSynchronousConnection extends AbstractConnection { /** * Creates a new abstract synchronous connection. */ protected AbstractSynchronousConnection() { // No implementation required. } /** * Abandon operations are not supported because operations are performed * synchronously and the ID of the request to be abandoned cannot be * determined. Thread interruption must be used in order to cancel a blocked * request. * * @param request * {@inheritDoc} * @return {@inheritDoc} * @throws UnsupportedOperationException * Always thrown: abandon requests are not supported for * synchronous connections. */ @Override public FutureResult abandonAsync(final AbandonRequest request) { throw new UnsupportedOperationException( "Abandon requests are not supported for synchronous connections"); } @Override public FutureResult addAsync(final AddRequest request, final IntermediateResponseHandler intermediateResponseHandler, final ResultHandler resultHandler) { try { return onSuccess(add(request), resultHandler); } catch (final ErrorResultException e) { return onFailure(e, resultHandler); } } @Override public FutureResult bindAsync(final BindRequest request, final IntermediateResponseHandler intermediateResponseHandler, final ResultHandler resultHandler) { try { return onSuccess(bind(request), resultHandler); } catch (final ErrorResultException e) { return onFailure(e, resultHandler); } } @Override public FutureResult compareAsync(final CompareRequest request, final IntermediateResponseHandler intermediateResponseHandler, final ResultHandler resultHandler) { try { return onSuccess(compare(request), resultHandler); } catch (final ErrorResultException e) { return onFailure(e, resultHandler); } } @Override public FutureResult deleteAsync(final DeleteRequest request, final IntermediateResponseHandler intermediateResponseHandler, final ResultHandler resultHandler) { try { return onSuccess(delete(request), resultHandler); } catch (final ErrorResultException e) { return onFailure(e, resultHandler); } } @Override public FutureResult extendedRequestAsync( final ExtendedRequest request, final IntermediateResponseHandler intermediateResponseHandler, final ResultHandler resultHandler) { try { return onSuccess(extendedRequest(request, intermediateResponseHandler), resultHandler); } catch (final ErrorResultException e) { return onFailure(e, resultHandler); } } @Override public FutureResult modifyAsync(final ModifyRequest request, final IntermediateResponseHandler intermediateResponseHandler, final ResultHandler resultHandler) { try { return onSuccess(modify(request), resultHandler); } catch (final ErrorResultException e) { return onFailure(e, resultHandler); } } @Override public FutureResult modifyDNAsync(final ModifyDNRequest request, final IntermediateResponseHandler intermediateResponseHandler, final ResultHandler resultHandler) { try { return onSuccess(modifyDN(request), resultHandler); } catch (final ErrorResultException e) { return onFailure(e, resultHandler); } } @Override public FutureResult searchAsync(final SearchRequest request, final IntermediateResponseHandler intermediateResponseHandler, final SearchResultHandler resultHandler) { try { return onSuccess(search(request, resultHandler), resultHandler); } catch (final ErrorResultException e) { return onFailure(e, resultHandler); } } private FutureResult onFailure(final ErrorResultException e, final ResultHandler resultHandler) { if (resultHandler != null) { resultHandler.handleErrorResult(e); } return new CompletedFutureResult(e); } private FutureResult onSuccess(final R result, final ResultHandler resultHandler) { if (resultHandler != null) { resultHandler.handleResult(result); } return new CompletedFutureResult(result); } }