From c58366090f5db06a899521a23357d6b2eff4f984 Mon Sep 17 00:00:00 2001 From: ghubstan <36207203+ghubstan@users.noreply.github.com> Date: Wed, 10 Mar 2021 15:07:34 -0300 Subject: [PATCH] Derive AvailabilityResult from Task errorMessage --- .../daemon/grpc/GrpcErrorMessageHandler.java | 36 ++++++++++++++----- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/daemon/src/main/java/bisq/daemon/grpc/GrpcErrorMessageHandler.java b/daemon/src/main/java/bisq/daemon/grpc/GrpcErrorMessageHandler.java index 8b5c81f39c..5ca79bb785 100644 --- a/daemon/src/main/java/bisq/daemon/grpc/GrpcErrorMessageHandler.java +++ b/daemon/src/main/java/bisq/daemon/grpc/GrpcErrorMessageHandler.java @@ -30,6 +30,8 @@ import org.slf4j.Logger; import lombok.Getter; import static bisq.proto.grpc.TradesGrpc.getTakeOfferMethod; +import static java.lang.String.format; +import static java.util.Arrays.stream; /** * An implementation of bisq.common.handlers.ErrorMessageHandler that avoids @@ -76,7 +78,7 @@ public class GrpcErrorMessageHandler implements ErrorMessageHandler { log.error(errorMessage); if (isTakeOfferError()) { - handleTakeOfferError(); + handleTakeOfferError(errorMessage); } else { exceptionHandler.handleErrorMessage(log, errorMessage, @@ -85,17 +87,33 @@ public class GrpcErrorMessageHandler implements ErrorMessageHandler { } } - private void handleTakeOfferError() { + private void handleTakeOfferError(String errorMessage) { // Send the AvailabilityResult to the client instead of throwing an exception. // The client should look at the grpc reply object's AvailabilityResult // field if reply.hasTrade = false, and use it give the user a human readable msg. - StreamObserver takeOfferResponseObserver = (StreamObserver) responseObserver; - var availabilityResult = AvailabilityResult.valueOf("MAKER_DENIED_API_USER"); - var reply = TakeOfferReply.newBuilder() - .setAvailabilityResult(availabilityResult) - .build(); - takeOfferResponseObserver.onNext(reply); - takeOfferResponseObserver.onCompleted(); + try { + AvailabilityResult availabilityResult = getAvailabilityResult(errorMessage); + var reply = TakeOfferReply.newBuilder() + .setAvailabilityResult(availabilityResult) + .build(); + @SuppressWarnings("unchecked") + var takeOfferResponseObserver = (StreamObserver) responseObserver; + takeOfferResponseObserver.onNext(reply); + takeOfferResponseObserver.onCompleted(); + } catch (IllegalArgumentException ex) { + log.error("", ex); + exceptionHandler.handleErrorMessage(log, + errorMessage, + responseObserver); + } + } + + private AvailabilityResult getAvailabilityResult(String errorMessage) { + return stream(AvailabilityResult.values()) + .filter((e) -> errorMessage.toUpperCase().contains(e.name())) + .findFirst().orElseThrow(() -> + new IllegalArgumentException( + format("Could not find an AvailabilityResult in error message:%n%s", errorMessage))); } private boolean isTakeOfferError() {