-1

I have a function which I'm trying to reduce complexity of.

public Future<JsonArray> getAllCompanies() {

        String url = ...

        return Future.future(
                promise -> webClient.getAbs(url).putHeader(String.valueOf(HttpHeaders.ACCEPT), APPLICATION_JSON)
                .putHeader(String.valueOf(HttpHeaders.CONTENT_TYPE), APPLICATION_JSON)
                .basicAuthentication(username, password).send(ar -> {
                    if (ar.succeeded()) {
                        HttpResponse<Buffer> response = ar.result();
                        if (response.statusCode() == 200 || response.statusCode() == 201) {
                            logger.info("getAllCompanies API call succeeded with code 200");
                            JsonObject json = null;
                            try {
                                json = response.bodyAsJsonObject();
                            } catch (DecodeException e) {
                                logger.error(ERROR_GETTING_RESPONSE_BODY_AS_JSON, e);
                                logger.error(response.bodyAsString());
                                promise.fail(JSON_DECODE_FAILED);
                            }
                            if (json != null) {
                                JsonArray results = json.getJsonArray(RESULT);

                                logger.info("FINISHED! Returned {} companies", results.size());
                                promise.complete(results);
                            }
                        } else {
                            logger.error("getAllCompanies call failed with HTTP status code: {}",
                                    response.statusCode());
                            logger.error(response.bodyAsString());
                            promise.fail(HTTP_STATUS_CODE_FAILURE);
                        }
                    } else {
                        logger.error("getAllCompanies call failed to complete!", ar.cause());
                        promise.fail(HTTP_REQUEST_FAILED);
                    }
                }));
    }

And I'm doing it by bringing false conditions to the top and removing else block which brings down the nested code.

This is the updated code:

public Future<JsonArray> getAllCompanies() {

        String url = ...

        return Future.future(
                promise -> webClient.getAbs(url).putHeader(String.valueOf(HttpHeaders.ACCEPT), APPLICATION_JSON)
                .putHeader(String.valueOf(HttpHeaders.CONTENT_TYPE), APPLICATION_JSON)
                .basicAuthentication(username, password).send(ar -> {
                    if (!ar.succeeded()) {
                        logger.error("getAllCompanies call failed to complete!", ar.cause());
                        promise.fail(HTTP_REQUEST_FAILED);
                    }
                    HttpResponse<Buffer> response = ar.result();
                    if (response.statusCode() != 200 && response.statusCode() != 201) {
                        logger.error("getAllCompanies call failed with HTTP status code: {}",
                                response.statusCode());
                        logger.error(response.bodyAsString());
                        promise.fail(HTTP_STATUS_CODE_FAILURE);
                    }
                    logger.info("getAllCompanies API call succeeded with code 200");
                    JsonObject json = null;
                    try {
                        json = response.bodyAsJsonObject();
                    } catch (DecodeException e) {
                        logger.error(ERROR_GETTING_RESPONSE_BODY_AS_JSON, e);
                        logger.error(response.bodyAsString());
                        promise.fail(JSON_DECODE_FAILED);
                    }
                    if (json != null) {
                        JsonArray results = json.getJsonArray(RESULT);

                        logger.info("FINISHED! Returned {} companies", results.size());
                        promise.complete(results);
                    }
                }));
    }

If the program comes inside the updated code's first if condition !ar.succeeded() and promise.fail is called promise.fail(HTTP_REQUEST_FAILED); Do program continues or just returns it? Because I have removed else block, I don't want it to continute, perhaps I use return; statement? I would like to know how Vertx Future and promise works!

1
  • you should be using return after each promise.fail() Commented Aug 6, 2023 at 13:48

1 Answer 1

0

Well, java executes each line of a method one by one until 1) return called 2) an exception is thrown 3) method ends.

Since promise.fail just sets the failure to the promise it doesn't meet any of 3 conditions, so you program would be executed further. Though, you could easily test it by yourself.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.