private boolean addPendingRequest(final RequestContextImpl<?, ?> requestContext) { final Integer messageID = requestContext.getMessageID(); if (isClosed.get()) { final LocalizableMessage message = INFO_CLIENT_CONNECTION_CLOSING.get(); requestContext.handleException( newLdapException(ResultCode.UNWILLING_TO_PERFORM, message.toString())); return false; } else if (pendingRequests.putIfAbsent(messageID, requestContext) != null) { final LocalizableMessage message = WARN_CLIENT_DUPLICATE_MESSAGE_ID.get(requestContext.getMessageID()); requestContext.handleException( newLdapException(ResultCode.PROTOCOL_ERROR, message.toString())); return false; } else if (isClosed.get()) { /* * A concurrent close may have already removed the pending * request but it will have only been notified for cancellation. */ pendingRequests.remove(messageID); final LocalizableMessage message = INFO_CLIENT_CONNECTION_CLOSING.get(); requestContext.handleException( newLdapException(ResultCode.UNWILLING_TO_PERFORM, message.toString())); return false; } else { /* * If the connection is closed now then we just have to pay the * cost of invoking the request in the request handler. */ return true; } }
/** * Deregister a request context once it has completed. * * @param requestContext The request context. * @return {@code true} if the request context was found and removed. */ private boolean removePendingRequest(final RequestContextImpl<?, ?> requestContext) { return pendingRequests.remove(requestContext.getMessageID()) != null; }