| | |
| | | |
| | | |
| | | |
| | | private ExtendedResultHandlerHolder( |
| | | final ExtendedRequest<R> request, |
| | | private ExtendedResultHandlerHolder(final ExtendedRequest<R> request, |
| | | final ResultHandler<? super R> resultHandler) |
| | | { |
| | | this.request = request; |
| | |
| | | |
| | | |
| | | protected RequestContextImpl( |
| | | final ServerConnectionImpl<?> clientConnection, |
| | | final H resultHandler, final int messageID, |
| | | final boolean isCancelSupported) |
| | | final ServerConnectionImpl<?> clientConnection, final H resultHandler, |
| | | final int messageID, final boolean isCancelSupported) |
| | | { |
| | | this.clientConnection = clientConnection; |
| | | this.resultHandler = resultHandler; |
| | |
| | | * {@inheritDoc} |
| | | */ |
| | | @Override |
| | | public void addCancelRequestListener( |
| | | final CancelRequestListener listener) |
| | | public void addCancelRequestListener(final CancelRequestListener listener) |
| | | throws NullPointerException |
| | | { |
| | | Validator.ensureNotNull(listener); |
| | |
| | | break; |
| | | case CANCEL_REQUESTED: |
| | | // Don't change state: let the handler ack the cancellation request. |
| | | throw (CancelledResultException) newErrorResult( |
| | | ResultCode.CANCELLED, cancelRequestReason.toString()); |
| | | throw (CancelledResultException) newErrorResult(ResultCode.CANCELLED, |
| | | cancelRequestReason.toString()); |
| | | case TOO_LATE: |
| | | // Already too late. Nothing to do. |
| | | break; |
| | |
| | | * {@inheritDoc} |
| | | */ |
| | | @Override |
| | | public void removeCancelRequestListener( |
| | | final CancelRequestListener listener) |
| | | public void removeCancelRequestListener(final CancelRequestListener listener) |
| | | throws NullPointerException |
| | | { |
| | | Validator.ensureNotNull(listener); |
| | |
| | | { |
| | | final Result result = Responses |
| | | .newGenericExtendedResult(ResultCode.CANNOT_CANCEL); |
| | | cancelResultHandler |
| | | .handleErrorResult(newErrorResult(result)); |
| | | cancelResultHandler.handleErrorResult(newErrorResult(result)); |
| | | } |
| | | return; |
| | | } |
| | |
| | | if (cancelResultHandler != null) |
| | | { |
| | | cancelResultHandlers = new LinkedList<ExtendedResultHandlerHolder<?>>(); |
| | | cancelResultHandlers |
| | | .add(new ExtendedResultHandlerHolder<R>( |
| | | cancelRequest, cancelResultHandler)); |
| | | cancelResultHandlers.add(new ExtendedResultHandlerHolder<R>( |
| | | cancelRequest, cancelResultHandler)); |
| | | } |
| | | tmpListeners = cancelRequestListeners; |
| | | cancelRequestListeners = null; |
| | |
| | | { |
| | | cancelResultHandlers = new LinkedList<ExtendedResultHandlerHolder<?>>(); |
| | | } |
| | | cancelResultHandlers |
| | | .add(new ExtendedResultHandlerHolder<R>( |
| | | cancelRequest, cancelResultHandler)); |
| | | cancelResultHandlers.add(new ExtendedResultHandlerHolder<R>( |
| | | cancelRequest, cancelResultHandler)); |
| | | } |
| | | break; |
| | | case TOO_LATE: |
| | |
| | | final SearchResultHandler resultHandler, final int messageID, |
| | | final boolean isCancelSupported) |
| | | { |
| | | super(clientConnection, resultHandler, messageID, |
| | | isCancelSupported); |
| | | super(clientConnection, resultHandler, messageID, isCancelSupported); |
| | | } |
| | | |
| | | |
| | |
| | | * {@inheritDoc} |
| | | */ |
| | | @Override |
| | | public boolean handleReference( |
| | | final SearchResultReference reference) |
| | | public boolean handleReference(final SearchResultReference reference) |
| | | { |
| | | return resultHandler.handleReference(reference); |
| | | } |
| | |
| | | ServerConnection<Integer> |
| | | { |
| | | private final RequestHandler<RequestContext> requestHandler; |
| | | |
| | | private final AtomicBoolean isClosed = new AtomicBoolean(); |
| | | |
| | | private final ConcurrentHashMap<Integer, RequestContextImpl<?, ?>> pendingRequests = |
| | | new ConcurrentHashMap<Integer, RequestContextImpl<?, ?>>(); |
| | | new ConcurrentHashMap<Integer, RequestContextImpl<?, ?>>(); |
| | | |
| | | |
| | | |
| | |
| | | */ |
| | | @Override |
| | | public void handleAbandon(final Integer messageID, |
| | | final AbandonRequest request) |
| | | throws UnsupportedOperationException |
| | | final AbandonRequest request) throws UnsupportedOperationException |
| | | { |
| | | final RequestContextImpl<?, ?> abandonedRequest = getPendingRequest(request |
| | | .getRequestID()); |
| | |
| | | * {@inheritDoc} |
| | | */ |
| | | @Override |
| | | public void handleAdd(final Integer messageID, |
| | | final AddRequest request, |
| | | final ResultHandler<? super Result> resultHandler, |
| | | final IntermediateResponseHandler intermediateResponseHandler) |
| | | public void handleAdd(final Integer messageID, final AddRequest request, |
| | | final IntermediateResponseHandler intermediateResponseHandler, |
| | | final ResultHandler<? super Result> resultHandler) |
| | | throws UnsupportedOperationException |
| | | { |
| | | final RequestContextImpl<Result, ResultHandler<? super Result>> requestContext = |
| | | new RequestContextImpl<Result, ResultHandler<? super Result>>( |
| | | new RequestContextImpl<Result, ResultHandler<? super Result>>( |
| | | this, resultHandler, messageID, true); |
| | | if (addPendingRequest(requestContext)) |
| | | { |
| | | requestHandler.handleAdd(requestContext, request, |
| | | requestContext, intermediateResponseHandler); |
| | | intermediateResponseHandler, requestContext); |
| | | } |
| | | } |
| | | |
| | |
| | | * {@inheritDoc} |
| | | */ |
| | | @Override |
| | | public void handleBind(final Integer messageID, |
| | | final int version, final BindRequest request, |
| | | final ResultHandler<? super BindResult> resultHandler, |
| | | final IntermediateResponseHandler intermediateResponseHandler) |
| | | public void handleBind(final Integer messageID, final int version, |
| | | final BindRequest request, |
| | | final IntermediateResponseHandler intermediateResponseHandler, |
| | | final ResultHandler<? super BindResult> resultHandler) |
| | | throws UnsupportedOperationException |
| | | { |
| | | final RequestContextImpl<BindResult, ResultHandler<? super BindResult>> requestContext = |
| | | new RequestContextImpl<BindResult, ResultHandler<? super BindResult>>( |
| | | new RequestContextImpl<BindResult, ResultHandler<? super BindResult>>( |
| | | this, resultHandler, messageID, false); |
| | | if (addPendingRequest(requestContext)) |
| | | { |
| | | requestHandler.handleBind(requestContext, version, request, |
| | | requestContext, intermediateResponseHandler); |
| | | intermediateResponseHandler, requestContext); |
| | | } |
| | | } |
| | | |
| | |
| | | @Override |
| | | public void handleCompare(final Integer messageID, |
| | | final CompareRequest request, |
| | | final ResultHandler<? super CompareResult> resultHandler, |
| | | final IntermediateResponseHandler intermediateResponseHandler) |
| | | final IntermediateResponseHandler intermediateResponseHandler, |
| | | final ResultHandler<? super CompareResult> resultHandler) |
| | | throws UnsupportedOperationException |
| | | { |
| | | final RequestContextImpl<CompareResult, ResultHandler<? super CompareResult>> requestContext = |
| | | new RequestContextImpl<CompareResult, ResultHandler<? super CompareResult>>( |
| | | new RequestContextImpl<CompareResult, ResultHandler<? super CompareResult>>( |
| | | this, resultHandler, messageID, true); |
| | | if (addPendingRequest(requestContext)) |
| | | { |
| | | requestHandler.handleCompare(requestContext, request, |
| | | requestContext, intermediateResponseHandler); |
| | | intermediateResponseHandler, requestContext); |
| | | } |
| | | } |
| | | |
| | |
| | | * {@inheritDoc} |
| | | */ |
| | | @Override |
| | | public void handleConnectionDisconnected( |
| | | final ResultCode resultCode, final String message) |
| | | public void handleConnectionDisconnected(final ResultCode resultCode, |
| | | final String message) |
| | | { |
| | | final LocalizableMessage cancelReason = INFO_CANCELED_BY_SERVER_DISCONNECT |
| | | .get(); |
| | |
| | | @Override |
| | | public void handleDelete(final Integer messageID, |
| | | final DeleteRequest request, |
| | | final ResultHandler<? super Result> resultHandler, |
| | | final IntermediateResponseHandler intermediateResponseHandler) |
| | | final IntermediateResponseHandler intermediateResponseHandler, |
| | | final ResultHandler<? super Result> resultHandler) |
| | | throws UnsupportedOperationException |
| | | { |
| | | final RequestContextImpl<Result, ResultHandler<? super Result>> requestContext = |
| | | new RequestContextImpl<Result, ResultHandler<? super Result>>( |
| | | new RequestContextImpl<Result, ResultHandler<? super Result>>( |
| | | this, resultHandler, messageID, true); |
| | | if (addPendingRequest(requestContext)) |
| | | { |
| | | requestHandler.handleDelete(requestContext, request, |
| | | requestContext, intermediateResponseHandler); |
| | | intermediateResponseHandler, requestContext); |
| | | } |
| | | } |
| | | |
| | |
| | | @Override |
| | | public <R extends ExtendedResult> void handleExtendedRequest( |
| | | final Integer messageID, final ExtendedRequest<R> request, |
| | | final ResultHandler<? super R> resultHandler, |
| | | final IntermediateResponseHandler intermediateResponseHandler) |
| | | final IntermediateResponseHandler intermediateResponseHandler, |
| | | final ResultHandler<? super R> resultHandler) |
| | | throws UnsupportedOperationException |
| | | { |
| | | if (request.getOID().equals(CancelExtendedRequest.OID)) |
| | |
| | | CancelExtendedRequest cancelRequest; |
| | | try |
| | | { |
| | | cancelRequest = CancelExtendedRequest.DECODER |
| | | .decodeExtendedRequest(request, new DecodeOptions()); |
| | | cancelRequest = CancelExtendedRequest.DECODER.decodeExtendedRequest( |
| | | request, new DecodeOptions()); |
| | | } |
| | | catch (final DecodeException e) |
| | | { |
| | |
| | | // this request cannot be cancelled, it is important to do this in |
| | | // order to monitor the number of pending operations. |
| | | final RequestContextImpl<R, ResultHandler<? super R>> requestContext = |
| | | new RequestContextImpl<R, ResultHandler<? super R>>( |
| | | new RequestContextImpl<R, ResultHandler<? super R>>( |
| | | this, resultHandler, messageID, false); |
| | | if (addPendingRequest(requestContext)) |
| | | { |
| | |
| | | { |
| | | final LocalizableMessage cancelReason = INFO_CANCELED_BY_CANCEL_REQUEST |
| | | .get(messageID); |
| | | cancelledRequest.cancel(cancelReason, request, |
| | | requestContext, true); |
| | | cancelledRequest |
| | | .cancel(cancelReason, request, requestContext, true); |
| | | } |
| | | else |
| | | { |
| | |
| | | |
| | | if (addPendingRequest(requestContext)) |
| | | { |
| | | requestHandler.handleExtendedRequest(requestContext, |
| | | request, requestContext, intermediateResponseHandler); |
| | | requestHandler.handleExtendedRequest(requestContext, request, |
| | | intermediateResponseHandler, requestContext); |
| | | } |
| | | } |
| | | } |
| | |
| | | @Override |
| | | public void handleModify(final Integer messageID, |
| | | final ModifyRequest request, |
| | | final ResultHandler<? super Result> resultHandler, |
| | | final IntermediateResponseHandler intermediateResponseHandler) |
| | | final IntermediateResponseHandler intermediateResponseHandler, |
| | | final ResultHandler<? super Result> resultHandler) |
| | | throws UnsupportedOperationException |
| | | { |
| | | final RequestContextImpl<Result, ResultHandler<? super Result>> requestContext = |
| | | new RequestContextImpl<Result, ResultHandler<? super Result>>( |
| | | new RequestContextImpl<Result, ResultHandler<? super Result>>( |
| | | this, resultHandler, messageID, true); |
| | | if (addPendingRequest(requestContext)) |
| | | { |
| | | requestHandler.handleModify(requestContext, request, |
| | | requestContext, intermediateResponseHandler); |
| | | intermediateResponseHandler, requestContext); |
| | | } |
| | | } |
| | | |
| | |
| | | @Override |
| | | public void handleModifyDN(final Integer messageID, |
| | | final ModifyDNRequest request, |
| | | final ResultHandler<? super Result> resultHandler, |
| | | final IntermediateResponseHandler intermediateResponseHandler) |
| | | final IntermediateResponseHandler intermediateResponseHandler, |
| | | final ResultHandler<? super Result> resultHandler) |
| | | throws UnsupportedOperationException |
| | | { |
| | | final RequestContextImpl<Result, ResultHandler<? super Result>> requestContext = |
| | | new RequestContextImpl<Result, ResultHandler<? super Result>>( |
| | | new RequestContextImpl<Result, ResultHandler<? super Result>>( |
| | | this, resultHandler, messageID, true); |
| | | if (addPendingRequest(requestContext)) |
| | | { |
| | | requestHandler.handleModifyDN(requestContext, request, |
| | | requestContext, intermediateResponseHandler); |
| | | intermediateResponseHandler, requestContext); |
| | | } |
| | | } |
| | | |
| | |
| | | @Override |
| | | public void handleSearch(final Integer messageID, |
| | | final SearchRequest request, |
| | | final SearchResultHandler resultHandler, |
| | | final IntermediateResponseHandler intermediateResponseHandler) |
| | | final IntermediateResponseHandler intermediateResponseHandler, |
| | | final SearchResultHandler resultHandler) |
| | | throws UnsupportedOperationException |
| | | { |
| | | final SearchRequestContextImpl requestContext = new SearchRequestContextImpl( |
| | |
| | | if (addPendingRequest(requestContext)) |
| | | { |
| | | requestHandler.handleSearch(requestContext, request, |
| | | requestContext, intermediateResponseHandler); |
| | | intermediateResponseHandler, requestContext); |
| | | } |
| | | } |
| | | |
| | |
| | | |
| | | if (isClosed.get()) |
| | | { |
| | | final LocalizableMessage message = INFO_CLIENT_CONNECTION_CLOSING |
| | | .get(); |
| | | final LocalizableMessage message = INFO_CLIENT_CONNECTION_CLOSING.get(); |
| | | requestContext.handleErrorResult(newErrorResult( |
| | | ResultCode.UNWILLING_TO_PERFORM, message.toString())); |
| | | return false; |
| | |
| | | // it will have only been notified for cancellation. |
| | | pendingRequests.remove(messageID); |
| | | |
| | | final LocalizableMessage message = INFO_CLIENT_CONNECTION_CLOSING |
| | | .get(); |
| | | final LocalizableMessage message = INFO_CLIENT_CONNECTION_CLOSING.get(); |
| | | requestContext.handleErrorResult(newErrorResult( |
| | | ResultCode.UNWILLING_TO_PERFORM, message.toString())); |
| | | return false; |
| | |
| | | .values().iterator(); |
| | | while (iterator.hasNext()) |
| | | { |
| | | final RequestContextImpl<?, ?> pendingRequest = iterator |
| | | .next(); |
| | | final RequestContextImpl<?, ?> pendingRequest = iterator.next(); |
| | | pendingRequest.cancel(cancelReason, null, null, false); |
| | | iterator.remove(); |
| | | } |
| | |
| | | * The message ID associated with the request context. |
| | | * @return The pending request context. |
| | | */ |
| | | private RequestContextImpl<?, ?> getPendingRequest( |
| | | final Integer messageID) |
| | | private RequestContextImpl<?, ?> getPendingRequest(final Integer messageID) |
| | | { |
| | | return pendingRequests.get(messageID); |
| | | } |