Search in sources :

Example 11 with Result

use of org.folio.circulation.support.results.Result in project mod-circulation by folio-org.

the class RequestFromRepresentationService method validateRequestLevel.

private Result<Request> validateRequestLevel(Request request) {
    JsonObject representation = request.getRequestRepresentation();
    String requestLevelRaw = representation.getString(REQUEST_LEVEL);
    RequestLevel requestLevel = RequestLevel.from(requestLevelRaw);
    boolean tlrEnabled = request.getTlrSettingsConfiguration().isTitleLevelRequestsFeatureEnabled();
    List<RequestLevel> allowedStatuses = tlrEnabled ? List.of(ITEM, TITLE) : List.of(ITEM);
    if (!allowedStatuses.contains(requestLevel)) {
        String allowedStatusesJoined = allowedStatuses.stream().map(existingLevel -> StringUtils.wrap(existingLevel.getValue(), '"')).collect(Collectors.joining(", "));
        return failedValidation("requestLevel must be one of the following: " + allowedStatusesJoined, "requestLevel", requestLevelRaw);
    }
    return succeeded(request);
}
Also used : UserRepository(org.folio.circulation.infrastructure.storage.users.UserRepository) INSTANCE_DOES_NOT_EXIST(org.folio.circulation.resources.handlers.error.CirculationErrorType.INSTANCE_DOES_NOT_EXIST) LoanRepository(org.folio.circulation.infrastructure.storage.loans.LoanRepository) JsonPropertyFetcher.getDateTimeProperty(org.folio.circulation.support.json.JsonPropertyFetcher.getDateTimeProperty) ConfigurationRepository(org.folio.circulation.infrastructure.storage.ConfigurationRepository) CompletableFuture.completedFuture(java.util.concurrent.CompletableFuture.completedFuture) MappingFunctions.when(org.folio.circulation.support.results.MappingFunctions.when) RequestQueueRepository(org.folio.circulation.infrastructure.storage.requests.RequestQueueRepository) ItemStatus(org.folio.circulation.domain.ItemStatus) StringUtils(org.apache.commons.lang3.StringUtils) Item(org.folio.circulation.domain.Item) REQUEST_LEVEL(org.folio.circulation.domain.representations.RequestProperties.REQUEST_LEVEL) ServicePointRepository(org.folio.circulation.infrastructure.storage.ServicePointRepository) Map(java.util.Map) JsonObject(io.vertx.core.json.JsonObject) ItemRepository(org.folio.circulation.infrastructure.storage.inventory.ItemRepository) REQUEST_DATE(org.folio.circulation.domain.representations.RequestProperties.REQUEST_DATE) Result.of(org.folio.circulation.support.results.Result.of) AsynchronousResult.fromFutureResult(org.folio.circulation.support.results.AsynchronousResult.fromFutureResult) Result.succeeded(org.folio.circulation.support.results.Result.succeeded) Collection(java.util.Collection) Loan(org.folio.circulation.domain.Loan) ATTEMPT_TO_CREATE_TLR_LINKED_TO_AN_ITEM(org.folio.circulation.resources.handlers.error.CirculationErrorType.ATTEMPT_TO_CREATE_TLR_LINKED_TO_AN_ITEM) INVALID_INSTANCE_ID(org.folio.circulation.resources.handlers.error.CirculationErrorType.INVALID_INSTANCE_ID) PageLimit.limit(org.folio.circulation.support.http.client.PageLimit.limit) UUID(java.util.UUID) Result(org.folio.circulation.support.results.Result) Collectors(java.util.stream.Collectors) Objects(java.util.Objects) INVALID_ITEM_ID(org.folio.circulation.resources.handlers.error.CirculationErrorType.INVALID_ITEM_ID) ServicePointPickupLocationValidator(org.folio.circulation.domain.validation.ServicePointPickupLocationValidator) List(java.util.List) StringUtils.isNotBlank(org.apache.commons.lang3.StringUtils.isNotBlank) TITLE(org.folio.circulation.domain.RequestLevel.TITLE) InstanceRepository(org.folio.circulation.infrastructure.storage.inventory.InstanceRepository) RequestStatus(org.folio.circulation.domain.RequestStatus) Optional(java.util.Optional) BadRequestFailure(org.folio.circulation.support.BadRequestFailure) Request(org.folio.circulation.domain.Request) HashMap(java.util.HashMap) CompletableFuture(java.util.concurrent.CompletableFuture) ATTEMPT_HOLD_OR_RECALL_TLR_FOR_AVAILABLE_ITEM(org.folio.circulation.resources.handlers.error.CirculationErrorType.ATTEMPT_HOLD_OR_RECALL_TLR_FOR_AVAILABLE_ITEM) ITEM(org.folio.circulation.domain.RequestLevel.ITEM) INVALID_HOLDINGS_RECORD_ID(org.folio.circulation.resources.handlers.error.CirculationErrorType.INVALID_HOLDINGS_RECORD_ID) RequestAndRelatedRecords(org.folio.circulation.domain.RequestAndRelatedRecords) String.join(java.lang.String.join) PageLimit(org.folio.circulation.support.http.client.PageLimit) INSTANCE_ID(org.folio.circulation.domain.representations.RequestProperties.INSTANCE_ID) Result.failed(org.folio.circulation.support.results.Result.failed) INVALID_PICKUP_SERVICE_POINT(org.folio.circulation.resources.handlers.error.CirculationErrorType.INVALID_PICKUP_SERVICE_POINT) MultipleRecords(org.folio.circulation.domain.MultipleRecords) RequestFulfilmentPreference(org.folio.circulation.domain.RequestFulfilmentPreference) ItemByInstanceIdFinder(org.folio.circulation.storage.ItemByInstanceIdFinder) NO_AVAILABLE_ITEMS_FOR_TLR(org.folio.circulation.resources.handlers.error.CirculationErrorType.NO_AVAILABLE_ITEMS_FOR_TLR) Result.ofAsync(org.folio.circulation.support.results.Result.ofAsync) ITEM_ID(org.folio.circulation.domain.representations.RequestProperties.ITEM_ID) ValidationErrorFailure.failedValidation(org.folio.circulation.support.ValidationErrorFailure.failedValidation) User(org.folio.circulation.domain.User) Collectors.toList(java.util.stream.Collectors.toList) CirculationErrorHandler(org.folio.circulation.resources.handlers.error.CirculationErrorHandler) StringUtils.isBlank(org.apache.commons.lang3.StringUtils.isBlank) RequestLevel(org.folio.circulation.domain.RequestLevel) ProxyRelationshipValidator(org.folio.circulation.domain.validation.ProxyRelationshipValidator) INVALID_PROXY_RELATIONSHIP(org.folio.circulation.resources.handlers.error.CirculationErrorType.INVALID_PROXY_RELATIONSHIP) AllArgsConstructor(lombok.AllArgsConstructor) JsonPropertyFetcher.getProperty(org.folio.circulation.support.json.JsonPropertyFetcher.getProperty) RequestLevel(org.folio.circulation.domain.RequestLevel) JsonObject(io.vertx.core.json.JsonObject)

Example 12 with Result

use of org.folio.circulation.support.results.Result in project mod-circulation by folio-org.

the class RequestQueueResource method getQueue.

private void getQueue(RoutingContext routingContext, RequestQueueType requestQueueType) {
    final var context = new WebContext(routingContext);
    final var clients = Clients.create(context, client);
    final var itemRepository = new ItemRepository(clients);
    final var userRepository = new UserRepository(clients);
    final var loanRepository = new LoanRepository(clients, itemRepository, userRepository);
    final var requestQueueRepository = new RequestQueueRepository(RequestRepository.using(clients, itemRepository, userRepository, loanRepository));
    final RequestRepresentation requestRepresentation = new RequestRepresentation();
    CompletableFuture<Result<RequestQueue>> requestQueue = getRequestQueueByType(routingContext, requestQueueType, requestQueueRepository);
    requestQueue.thenApply(r -> r.map(queue -> new MultipleRecords<>(queue.getRequests(), queue.size()))).thenApply(r -> r.map(requests -> requests.asJson(requestRepresentation::extendedRepresentation, "requests"))).thenApply(r -> r.map(JsonHttpResponse::ok)).thenAccept(context::writeResultToHttpResponse);
}
Also used : FOR_INSTANCE(org.folio.circulation.resources.context.RequestQueueType.FOR_INSTANCE) UserRepository(org.folio.circulation.infrastructure.storage.users.UserRepository) Clients(org.folio.circulation.support.Clients) UpdateRequestQueue(org.folio.circulation.domain.UpdateRequestQueue) LoanRepository(org.folio.circulation.infrastructure.storage.loans.LoanRepository) ConfigurationRepository(org.folio.circulation.infrastructure.storage.ConfigurationRepository) CompletableFuture.completedFuture(java.util.concurrent.CompletableFuture.completedFuture) WebContext(org.folio.circulation.support.http.server.WebContext) Request(org.folio.circulation.domain.Request) RequestQueueRepository(org.folio.circulation.infrastructure.storage.requests.RequestQueueRepository) Router(io.vertx.ext.web.Router) CompletableFuture(java.util.concurrent.CompletableFuture) ValidationErrorFailure.singleValidationError(org.folio.circulation.support.ValidationErrorFailure.singleValidationError) RoutingContext(io.vertx.ext.web.RoutingContext) ReorderRequestContext(org.folio.circulation.resources.context.ReorderRequestContext) JsonHttpResponse(org.folio.circulation.support.http.server.JsonHttpResponse) TlrSettingsConfiguration(org.folio.circulation.domain.configuration.TlrSettingsConfiguration) RequestUpdateLogEventMapper.mapToRequestLogEventJson(org.folio.circulation.domain.representations.logs.RequestUpdateLogEventMapper.mapToRequestLogEventJson) ServicePointRepository(org.folio.circulation.infrastructure.storage.ServicePointRepository) RequestQueueType(org.folio.circulation.resources.context.RequestQueueType) RequestQueueValidation(org.folio.circulation.domain.validation.RequestQueueValidation) JsonObject(io.vertx.core.json.JsonObject) RequestQueue(org.folio.circulation.domain.RequestQueue) ItemRepository(org.folio.circulation.infrastructure.storage.inventory.ItemRepository) RequestRepresentation(org.folio.circulation.domain.RequestRepresentation) LogEventType(org.folio.circulation.domain.representations.logs.LogEventType) MultipleRecords(org.folio.circulation.domain.MultipleRecords) Result.succeeded(org.folio.circulation.support.results.Result.succeeded) Result(org.folio.circulation.support.results.Result) Collectors(java.util.stream.Collectors) String.format(java.lang.String.format) EventPublisher(org.folio.circulation.services.EventPublisher) FOR_ITEM(org.folio.circulation.resources.context.RequestQueueType.FOR_ITEM) RouteRegistration(org.folio.circulation.support.RouteRegistration) List(java.util.List) ReorderQueueRequest(org.folio.circulation.domain.reorder.ReorderQueueRequest) RequestRepository(org.folio.circulation.infrastructure.storage.requests.RequestRepository) HttpClient(io.vertx.core.http.HttpClient) WebContext(org.folio.circulation.support.http.server.WebContext) JsonHttpResponse(org.folio.circulation.support.http.server.JsonHttpResponse) RequestRepresentation(org.folio.circulation.domain.RequestRepresentation) LoanRepository(org.folio.circulation.infrastructure.storage.loans.LoanRepository) Result(org.folio.circulation.support.results.Result) ItemRepository(org.folio.circulation.infrastructure.storage.inventory.ItemRepository) UserRepository(org.folio.circulation.infrastructure.storage.users.UserRepository) RequestQueueRepository(org.folio.circulation.infrastructure.storage.requests.RequestQueueRepository)

Example 13 with Result

use of org.folio.circulation.support.results.Result in project mod-circulation by folio-org.

the class CirculationRulesResource method proceedWithUpdate.

private void proceedWithUpdate(Map<String, Set<String>> existingPoliciesIds, RoutingContext routingContext, Clients clients) {
    final WebContext webContext = new WebContext(routingContext);
    JsonObject rulesInput;
    try {
        // try to convert, do not safe if conversion fails
        rulesInput = routingContext.getBodyAsJson();
        Text2Drools.convert(rulesInput.getString("rulesAsText"), (policyType, policies, token) -> validatePolicy(existingPoliciesIds, policyType, policies, token));
    } catch (CirculationRulesException e) {
        processingError(routingContext.response(), e);
        return;
    } catch (DecodeException e) {
        decodingError(routingContext.response(), e);
        return;
    } catch (Exception e) {
        internalError(routingContext.response(), getStackTrace(e));
        return;
    }
    clients.circulationRulesStorage().put(rulesInput.copy()).thenApply(this::failWhenResponseOtherThanNoContent).thenApply(result -> result.map(response -> noContent())).thenAccept(webContext::writeResultToHttpResponse);
    CirculationRulesCache.getInstance().clearCache(webContext.getTenantId());
}
Also used : Clients(org.folio.circulation.support.Clients) Response(org.folio.circulation.support.http.client.Response) DecodeException(io.vertx.core.json.DecodeException) WebContext(org.folio.circulation.support.http.server.WebContext) Collectors.groupingBy(java.util.stream.Collectors.groupingBy) Token(org.antlr.v4.runtime.Token) Router(io.vertx.ext.web.Router) HashMap(java.util.HashMap) CompletableFuture(java.util.concurrent.CompletableFuture) CollectionResourceClient(org.folio.circulation.support.CollectionResourceClient) RoutingContext(io.vertx.ext.web.RoutingContext) BodyHandler(io.vertx.ext.web.handler.BodyHandler) Function(java.util.function.Function) JsonHttpResponse.ok(org.folio.circulation.support.http.server.JsonHttpResponse.ok) ForwardOnFailure(org.folio.circulation.support.ForwardOnFailure) CirculationRulesParser(org.folio.circulation.rules.CirculationRulesParser) Text2Drools(org.folio.circulation.rules.Text2Drools) Collectors.mapping(java.util.stream.Collectors.mapping) Map(java.util.Map) PageLimit(org.folio.circulation.support.http.client.PageLimit) JsonObject(io.vertx.core.json.JsonObject) Collectors.toSet(java.util.stream.Collectors.toSet) MapUtils(org.apache.commons.collections4.MapUtils) CirculationRulesCache(org.folio.circulation.rules.cache.CirculationRulesCache) MultipleRecords(org.folio.circulation.domain.MultipleRecords) Result.of(org.folio.circulation.support.results.Result.of) MethodHandles(java.lang.invoke.MethodHandles) ExceptionUtils.getStackTrace(org.apache.commons.lang3.exception.ExceptionUtils.getStackTrace) Set(java.util.Set) Result(org.folio.circulation.support.results.Result) ForwardResponse(org.folio.circulation.support.http.server.ForwardResponse) NoContentResponse.noContent(org.folio.circulation.support.http.server.NoContentResponse.noContent) List(java.util.List) CollectionUtils.isNotEmpty(org.apache.commons.collections4.CollectionUtils.isNotEmpty) Logger(org.apache.logging.log4j.Logger) CirculationRulesException(org.folio.circulation.rules.CirculationRulesException) HttpServerResponse(io.vertx.core.http.HttpServerResponse) JsonHttpResponse.unprocessableEntity(org.folio.circulation.support.http.server.JsonHttpResponse.unprocessableEntity) LogManager(org.apache.logging.log4j.LogManager) JsonPropertyFetcher.getProperty(org.folio.circulation.support.json.JsonPropertyFetcher.getProperty) ServerErrorResponse.internalError(org.folio.circulation.support.http.server.ServerErrorResponse.internalError) HttpClient(io.vertx.core.http.HttpClient) WebContext(org.folio.circulation.support.http.server.WebContext) CirculationRulesException(org.folio.circulation.rules.CirculationRulesException) JsonObject(io.vertx.core.json.JsonObject) DecodeException(io.vertx.core.json.DecodeException) DecodeException(io.vertx.core.json.DecodeException) CirculationRulesException(org.folio.circulation.rules.CirculationRulesException)

Example 14 with Result

use of org.folio.circulation.support.results.Result in project mod-circulation by folio-org.

the class CirculationRulesResource method getPolicyIdsByType.

private CompletableFuture<Result<Map<String, Set<String>>>> getPolicyIdsByType(Clients clients) {
    CollectionResourceClient loanPolicyClient = clients.loanPoliciesStorage();
    CollectionResourceClient noticePolicyClient = clients.patronNoticePolicesStorageClient();
    CollectionResourceClient requestPolicyClient = clients.requestPoliciesStorage();
    CollectionResourceClient overdueFinePolicyClient = clients.overdueFinesPoliciesStorage();
    CollectionResourceClient lostItemFeePolicyClient = clients.lostItemPoliciesStorage();
    Map<String, Set<String>> ids = new HashMap<>();
    return Result.ofAsync(() -> ids).thenCombineAsync(getPolicyIdsByType(loanPolicyClient, "loanPolicies", "l"), (resultTotalIds, resultNewIds) -> resultTotalIds.combine(resultNewIds, this::getTotalMap)).thenCombineAsync(getPolicyIdsByType(noticePolicyClient, "patronNoticePolicies", "n"), (resultTotalIds, resultNewIds) -> resultTotalIds.combine(resultNewIds, this::getTotalMap)).thenCombineAsync(getPolicyIdsByType(requestPolicyClient, "requestPolicies", "r"), (resultTotalIds, resultNewIds) -> resultTotalIds.combine(resultNewIds, this::getTotalMap)).thenCombineAsync(getPolicyIdsByType(overdueFinePolicyClient, "overdueFinePolicies", "o"), (resultTotalIds, resultNewIds) -> resultTotalIds.combine(resultNewIds, this::getTotalMap)).thenCombineAsync(getPolicyIdsByType(lostItemFeePolicyClient, "lostItemFeePolicies", "i"), (resultTotalIds, resultNewIds) -> resultTotalIds.combine(resultNewIds, this::getTotalMap));
}
Also used : Clients(org.folio.circulation.support.Clients) Response(org.folio.circulation.support.http.client.Response) DecodeException(io.vertx.core.json.DecodeException) WebContext(org.folio.circulation.support.http.server.WebContext) Collectors.groupingBy(java.util.stream.Collectors.groupingBy) Token(org.antlr.v4.runtime.Token) Router(io.vertx.ext.web.Router) HashMap(java.util.HashMap) CompletableFuture(java.util.concurrent.CompletableFuture) CollectionResourceClient(org.folio.circulation.support.CollectionResourceClient) RoutingContext(io.vertx.ext.web.RoutingContext) BodyHandler(io.vertx.ext.web.handler.BodyHandler) Function(java.util.function.Function) JsonHttpResponse.ok(org.folio.circulation.support.http.server.JsonHttpResponse.ok) ForwardOnFailure(org.folio.circulation.support.ForwardOnFailure) CirculationRulesParser(org.folio.circulation.rules.CirculationRulesParser) Text2Drools(org.folio.circulation.rules.Text2Drools) Collectors.mapping(java.util.stream.Collectors.mapping) Map(java.util.Map) PageLimit(org.folio.circulation.support.http.client.PageLimit) JsonObject(io.vertx.core.json.JsonObject) Collectors.toSet(java.util.stream.Collectors.toSet) MapUtils(org.apache.commons.collections4.MapUtils) CirculationRulesCache(org.folio.circulation.rules.cache.CirculationRulesCache) MultipleRecords(org.folio.circulation.domain.MultipleRecords) Result.of(org.folio.circulation.support.results.Result.of) MethodHandles(java.lang.invoke.MethodHandles) ExceptionUtils.getStackTrace(org.apache.commons.lang3.exception.ExceptionUtils.getStackTrace) Set(java.util.Set) Result(org.folio.circulation.support.results.Result) ForwardResponse(org.folio.circulation.support.http.server.ForwardResponse) NoContentResponse.noContent(org.folio.circulation.support.http.server.NoContentResponse.noContent) List(java.util.List) CollectionUtils.isNotEmpty(org.apache.commons.collections4.CollectionUtils.isNotEmpty) Logger(org.apache.logging.log4j.Logger) CirculationRulesException(org.folio.circulation.rules.CirculationRulesException) HttpServerResponse(io.vertx.core.http.HttpServerResponse) JsonHttpResponse.unprocessableEntity(org.folio.circulation.support.http.server.JsonHttpResponse.unprocessableEntity) LogManager(org.apache.logging.log4j.LogManager) JsonPropertyFetcher.getProperty(org.folio.circulation.support.json.JsonPropertyFetcher.getProperty) ServerErrorResponse.internalError(org.folio.circulation.support.http.server.ServerErrorResponse.internalError) HttpClient(io.vertx.core.http.HttpClient) CollectionResourceClient(org.folio.circulation.support.CollectionResourceClient) Collectors.toSet(java.util.stream.Collectors.toSet) Set(java.util.Set) HashMap(java.util.HashMap)

Example 15 with Result

use of org.folio.circulation.support.results.Result in project mod-circulation by folio-org.

the class DeclareLostResource method declareItemLostWhenClaimedReturned.

private CompletableFuture<Result<Loan>> declareItemLostWhenClaimedReturned(Loan loan, DeclareItemLostRequest request, Clients clients) {
    final NotesRepository notesRepository = NotesRepository.createUsing(clients);
    final NoteCreator creator = new NoteCreator(notesRepository);
    return ofAsync(() -> declareItemLost(loan, request)).thenCompose(r -> r.after(l -> creator.createGeneralUserNote(loan.getUserId(), "Claimed returned item marked declared lost"))).thenCompose(r -> r.after(note -> completedFuture(succeeded(loan))));
}
Also used : UserRepository(org.folio.circulation.infrastructure.storage.users.UserRepository) Clients(org.folio.circulation.support.Clients) DeclareItemLostRequest(org.folio.circulation.domain.representations.DeclareItemLostRequest) LoanRepository(org.folio.circulation.infrastructure.storage.loans.LoanRepository) CompletableFuture.completedFuture(java.util.concurrent.CompletableFuture.completedFuture) WebContext(org.folio.circulation.support.http.server.WebContext) MappingFunctions.when(org.folio.circulation.support.results.MappingFunctions.when) Router(io.vertx.ext.web.Router) CompletableFuture(java.util.concurrent.CompletableFuture) ValidationErrorFailure.singleValidationError(org.folio.circulation.support.ValidationErrorFailure.singleValidationError) LostItemFeeChargingService(org.folio.circulation.services.LostItemFeeChargingService) RoutingContext(io.vertx.ext.web.RoutingContext) Function(java.util.function.Function) NotesRepository(org.folio.circulation.infrastructure.storage.notes.NotesRepository) LoanValidator(org.folio.circulation.domain.validation.LoanValidator) ItemRepository(org.folio.circulation.infrastructure.storage.inventory.ItemRepository) LostItemFeeRefundService(org.folio.circulation.services.LostItemFeeRefundService) NoteCreator(org.folio.circulation.domain.notes.NoteCreator) Result.succeeded(org.folio.circulation.support.results.Result.succeeded) Loan(org.folio.circulation.domain.Loan) MappingFunctions.toFixedValue(org.folio.circulation.support.results.MappingFunctions.toFixedValue) Result(org.folio.circulation.support.results.Result) Result.ofAsync(org.folio.circulation.support.results.Result.ofAsync) EventPublisher(org.folio.circulation.services.EventPublisher) StringUtils.defaultIfBlank(org.apache.commons.lang.StringUtils.defaultIfBlank) CompletionStage(java.util.concurrent.CompletionStage) StoreLoanAndItem(org.folio.circulation.StoreLoanAndItem) NoContentResponse(org.folio.circulation.support.http.server.NoContentResponse) HttpClient(io.vertx.core.http.HttpClient) NotesRepository(org.folio.circulation.infrastructure.storage.notes.NotesRepository) NoteCreator(org.folio.circulation.domain.notes.NoteCreator)

Aggregations

Result (org.folio.circulation.support.results.Result)65 CompletableFuture (java.util.concurrent.CompletableFuture)42 Result.succeeded (org.folio.circulation.support.results.Result.succeeded)35 Clients (org.folio.circulation.support.Clients)31 Loan (org.folio.circulation.domain.Loan)30 JsonObject (io.vertx.core.json.JsonObject)29 LoanRepository (org.folio.circulation.infrastructure.storage.loans.LoanRepository)29 CompletableFuture.completedFuture (java.util.concurrent.CompletableFuture.completedFuture)28 RoutingContext (io.vertx.ext.web.RoutingContext)26 UserRepository (org.folio.circulation.infrastructure.storage.users.UserRepository)24 WebContext (org.folio.circulation.support.http.server.WebContext)24 LogManager (org.apache.logging.log4j.LogManager)23 Logger (org.apache.logging.log4j.Logger)23 HttpClient (io.vertx.core.http.HttpClient)22 Router (io.vertx.ext.web.Router)22 List (java.util.List)21 ItemRepository (org.folio.circulation.infrastructure.storage.inventory.ItemRepository)21 EventPublisher (org.folio.circulation.services.EventPublisher)21 MethodHandles (java.lang.invoke.MethodHandles)20 Result.ofAsync (org.folio.circulation.support.results.Result.ofAsync)19