Example usage for io.vertx.core Future compose

List of usage examples for io.vertx.core Future compose

Introduction

In this page you can find the example usage for io.vertx.core Future compose.

Prototype

default <U> Future<U> compose(Function<T, Future<U>> mapper) 

Source Link

Document

Compose this future with a mapper function.

When this future (the one on which compose is called) succeeds, the mapper will be called with the completed value and this mapper returns another future object.

Usage

From source file:com.github.ithildir.airbot.AirBotVerticle.java

License:Open Source License

@Override
public void start(Future<Void> startFuture) throws Exception {
    ConfigRetriever configRetriever = ConfigRetriever.create(vertx);

    Future<JsonObject> configFuture = ConfigRetriever.getConfigAsFuture(configRetriever);

    Future<HttpServer> httpServerFuture = configFuture.compose(this::_startHttpServer);

    CompositeFuture compositeFuture = CompositeFuture.all(
            _deployVerticle(AirNowMeasurementServiceVerticle.class), _deployVerticle(GeoServiceVerticle.class),
            _deployVerticle(UserServiceVerticle.class), _deployVerticle(WaqiMeasurementServiceVerticle.class),
            httpServerFuture);/*from  ww  w  .  j a v a2 s  . c o m*/

    compositeFuture.setHandler(asyncResult -> {
        if (asyncResult.failed()) {
            startFuture.fail(asyncResult.cause());

            return;
        }

        if (_logger.isInfoEnabled()) {
            _logger.info("AirBot started succesfully");
        }

        startFuture.complete();
    });
}

From source file:com.github.ithildir.airbot.BaseMeasurementServiceVerticle.java

License:Open Source License

@Override
protected Future<Void> start(JsonObject configJsonObject) {
    Future<Void> future = super.start(configJsonObject);

    future = future.compose(v -> _init());

    long initInterval = getInitInterval();

    if (initInterval > 0) {
        vertx.setPeriodic(initInterval, timerId -> _init());
    }//from ww  w  .  j  a v  a2 s.com

    return future;
}

From source file:com.github.ithildir.airbot.server.api.ai.AirQualityApiAiFulfillmentBuilder.java

License:Open Source License

private Future<Fulfillment> _buildFulfillment(Location location, String locationString, Locale locale) {

    Future<String> messageFuture = _airQualityMessageBuilder.getMessage(location, locationString, locale);

    return messageFuture.compose(message -> {
        Fulfillment fulfillment = new Fulfillment();

        fulfillment.setSpeech(message);//from  w  w  w  .jav a  2 s  . c o  m

        return Future.succeededFuture(fulfillment);
    });
}

From source file:com.github.ithildir.airbot.server.api.ai.AirQualityApiAiFulfillmentBuilder.java

License:Open Source License

private Future<Fulfillment> _buildLocationFulfillment(String locationString, Locale locale) {

    Future<Location> locationFuture = Future.future();

    _geoService.getLocationByQuery(locationString, locationFuture);

    return locationFuture.compose(location -> _buildFulfillment(location, locationString, locale));
}

From source file:com.github.ithildir.airbot.server.api.ai.AirQualityApiAiFulfillmentBuilder.java

License:Open Source License

private Future<Fulfillment> _buildUserFulfillment(Locale locale, AIResponse aiResponse,
        JsonObject responseJsonObject) {

    String userId = aiResponse.getSessionId();

    Future<Location> locationFuture = _getReponseLocation(responseJsonObject);

    locationFuture = locationFuture.compose(location -> {
        if (location != null) {
            return Future.succeededFuture(location);
        }//from ww w  . ja  va2s  . co  m

        Future<Location> future = Future.future();

        _userService.getUserLocation(userId, future);

        return future;
    });

    return locationFuture.compose(location -> {
        if (location == null) {
            Fulfillment fulfillment = ApiAiUtil.buildGooglePermissionFulfillment(
                    "in-order-to-get-information-about-the-air-" + "quality-around-you",
                    "DEVICE_PRECISE_LOCATION", locale);

            return Future.succeededFuture(fulfillment);
        }

        _updateUserLocation(userId, location);

        return _buildFulfillment(location, null, locale);
    });
}

From source file:org.dfr.dfr.worker.MemberWorker.java

@Override
public void start(Future<Void> fut) {
    JsonObject config = new JsonObject();
    config.put("url", "jdbc:mysql://localhost:3306/latihan");
    config.put("driver_class", "com.mysql.jdbc.Driver");
    config.put("user", "root");
    config.put("password", "admin");
    JDBCClient client = JDBCClient.createShared(vertx, config, "memberds");
    final Validator v = Validation.buildDefaultValidatorFactory().getValidator();
    SimpleDateFormat mysqlFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    vertx.eventBus().consumer("MemberWorker#Register").handler(h -> {
        MemberRegisterRequest req = null;
        try {//from  w ww . java  2 s .  c om
            req = Json.decodeValue(h.body().toString(), MemberRegisterRequest.class);
        } catch (Exception e) {
            h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON)));
            return;
        }
        Set<ConstraintViolation<MemberRegisterRequest>> vr = v.validate(req);
        if (!vr.isEmpty()) {
            h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON)
                    .setMessage(vr.iterator().next().getMessage())));
            return;
        }
        final MemberRegisterRequest r = req;
        final HashMap<String, Object> smap = new HashMap();

        client.getConnection(ch -> {
            if (ch.succeeded()) {
                SQLConnection c = ch.result();
                Future<Void> f1 = Future.future();
                c.setAutoCommit(false, f1.completer());
                f1.compose(o -> {
                    Future<ResultSet> f2 = Future.future();
                    c.queryWithParams("select username from member where username=?",
                            new JsonArray().add(r.getUsername()), f2.completer());
                    return f2;
                }).compose(res -> {
                    Future<ResultSet> f2 = Future.future();
                    if (res.getNumRows() != 0) {
                        f2.fail(ErrorCode.USER_EXIST);
                    } else {
                        c.queryWithParams("select email from member where email=?",
                                new JsonArray().add(r.getEmail()), f2.completer());
                    }
                    return f2;
                }).compose(res -> {
                    if (res.getNumRows() > 0) {
                        return Future.failedFuture(ErrorCode.EMAIL_EXIST);
                    } else {
                        try {
                            r.setPassword(hash(r.getPassword()));
                        } catch (Exception e) {
                            return Future.failedFuture(ErrorCode.SERVER_ERROR);
                        }
                        Future<UpdateResult> f2 = Future.future();
                        c.updateWithParams("insert into member(username,password,email) values (?,?,?)",
                                new JsonArray().add(r.getUsername()).add(r.getPassword()).add(r.getEmail()),
                                f2.completer());
                        return f2;
                    }
                }).compose(res -> {
                    Future<UpdateResult> f2 = Future.future();
                    c.updateWithParams("insert into profile(member_id) values(?)",
                            new JsonArray().add(res.getKeys().getLong(0)), f2.completer());
                    return f2;
                }).compose(res -> {
                    Future<Void> cfut = Future.future();
                    c.commit(cfut.completer());
                    return cfut;
                }).setHandler(ch1 -> {
                    if (ch1.succeeded()) {
                        c.close(close -> {
                            h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.COMPLETE)));
                        });
                    } else {
                        c.rollback(rr -> {
                            c.close(close -> {
                                h.reply(Json.encode(new GeneralResponse().setCode(ch1.cause().getMessage())
                                        .setMessage(ErrorCode.getMessage(ch1.cause().getMessage()))));
                            });
                        });
                    }
                });
            } else {
                h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.SERVER_ERROR)
                        .setMessage(ErrorCode.getMessage(ErrorCode.SERVER_ERROR))));
            }
        });
    });

    vertx.eventBus().consumer("MemberWorker#ProfileUpdate").handler(h -> {
        ProfileUpdateRequest req = null;
        try {
            req = Json.decodeValue(h.body().toString(), ProfileUpdateRequest.class);
        } catch (Exception e) {
            h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON)));
            return;
        }
        Set<ConstraintViolation<ProfileUpdateRequest>> vr = v.validate(req);
        if (!vr.isEmpty()) {
            h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON)
                    .setMessage(vr.iterator().next().getMessage())));
            return;
        }

        ProfileUpdateRequest rq = req;

        client.getConnection(connection -> {
            if (connection.succeeded()) {
                HashMap<String, Object> sm = new HashMap<String, Object>();
                SQLConnection con = connection.result();
                Future<Void> ac = Future.future();
                con.setAutoCommit(false, ac.completer());
                ac.compose(rv -> {
                    Future<ResultSet> lock = Future.future();
                    con.queryWithParams(
                            "select p.* from profile p inner join member m on p.member_id=m.member_id where m.username=? and m.password=? for update",
                            new JsonArray().add(rq.getUsername()).add(rq.getPassword()), lock.completer());
                    return lock;
                }).compose(r -> {
                    if (r.getNumRows() == 0) {
                        return Future.failedFuture(ErrorCode.USERNAME_PASSWORD_NOT_MATCH);
                    }
                    long member_id = r.getRows().iterator().next().getLong("member_id");
                    Future<UpdateResult> up = Future.future();
                    con.updateWithParams(
                            "update profile set name=?, phone=?, address=?, company_name=?, company_address=? where member_id=?",
                            new JsonArray().add(rq.getName()).add(rq.getPhone()).add(rq.getAddress())
                                    .add(rq.getCompanyName()).add(rq.getCompanyAddress()).add(member_id),
                            up.completer());
                    return up;
                }).compose(ok -> {
                    Future<Void> commitFu = Future.future();
                    con.commit(commitFu.completer());
                    return commitFu;
                }).setHandler(th -> {
                    if (th.succeeded()) {
                        con.close(cr -> {
                            h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.COMPLETE)));
                        });
                    } else {
                        con.rollback(rh -> {
                            con.close(cl -> {
                                h.reply(Json.encode(new GeneralResponse().setCode(th.cause().getMessage())
                                        .setMessage(ErrorCode.getMessage(th.cause().getMessage()))));
                            });
                        });
                    }
                });
            } else {
                h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.SERVER_ERROR)
                        .setMessage(ErrorCode.getMessage(ErrorCode.SERVER_ERROR))));
            }
        });
    });

    vertx.eventBus().consumer("MemberWorker#GetProfile").handler(h -> {
        ProfileRequest req = null;
        try {
            req = Json.decodeValue(h.body().toString(), ProfileRequest.class);
        } catch (Exception e) {
            h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON)));
            return;
        }

        Set<ConstraintViolation<ProfileRequest>> rV = v.validate(req);

        if (!rV.isEmpty()) {
            h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON)));
            return;
        }

        final ProfileRequest r = req;

        client.getConnection(cH -> {
            if (cH.succeeded()) {
                SQLConnection c = cH.result();
                Future<Void> f = Future.future();
                c.setAutoCommit(true, f.completer());
                f.compose(res -> {
                    Future<ResultSet> f0 = Future.future();
                    c.queryWithParams("select member_id from member m where m.username=? and m.password=?",
                            new JsonArray().add(r.getUsername()).add(r.getPassword()), f0.completer());
                    return f0;
                }).compose(res -> {
                    Future<ResultSet> f0 = Future.future();
                    if (res.getNumRows() <= 0) {
                        f0.fail(ErrorCode.USERNAME_PASSWORD_NOT_MATCH);
                    } else {
                        c.queryWithParams("select * from profile where member_id=?",
                                new JsonArray().add(res.getRows().iterator().next().getLong("member_id")),
                                f0.completer());
                    }
                    return f0;
                }).setHandler(rh -> {
                    c.close();
                    if (rh.succeeded()) {
                        h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.COMPLETE)
                                .setData(rh.result().getRows().get(0))));
                    } else {
                        h.reply(Json.encode(new GeneralResponse().setCode(rh.cause().getMessage())
                                .setMessage(ErrorCode.getMessage(rh.cause().getMessage()))));
                    }
                });
            } else {
                h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.SERVER_ERROR)
                        .setMessage(ErrorCode.getMessage(ErrorCode.SERVER_ERROR))));
            }
        });
    });

    vertx.eventBus().consumer("MemberWorker#ChangePassword").handler(h -> {
        ChangePasswordRequest req = null;
        try {
            req = Json.decodeValue(h.body().toString(), ChangePasswordRequest.class);
        } catch (Exception e) {
            h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON)));
            return;
        }
        Set<ConstraintViolation<ChangePasswordRequest>> rV = v.validate(req);
        if (!rV.isEmpty()) {
            h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON)));
            return;
        }
        final ChangePasswordRequest r = req;

        client.getConnection(connection -> {
            if (connection.succeeded()) {
                SQLConnection c = connection.result();
                Future<Void> f1 = Future.future();
                c.setAutoCommit(false, f1.completer());
                f1.compose(vo -> {
                    Future<ResultSet> f = Future.future();
                    c.queryWithParams("select member_id from member where username=? and password=? for update",
                            new JsonArray().add(r.getUsername()).add(r.getPassword()), f.completer());
                    return f;
                }).compose(res -> {
                    Future<UpdateResult> f0 = Future.future();
                    if (res.getNumRows() <= 0) {
                        f0.fail(ErrorCode.USERNAME_PASSWORD_NOT_MATCH);
                    } else {
                        long member_id = res.getRows().iterator().next().getLong("member_id");
                        String hash = null;
                        try {
                            hash = hash(r.getNewPassword());
                        } catch (Exception e) {
                            return Future.failedFuture(ErrorCode.SERVER_ERROR);
                        }
                        c.updateWithParams("update member set password=? where member_id=?",
                                new JsonArray().add(hash).add(member_id), f0.completer());
                    }
                    return f0;
                }).compose(res -> {
                    Future<Void> cf = Future.future();
                    c.commit(cf.completer());
                    return cf;
                }).setHandler(ch -> {
                    if (ch.succeeded()) {
                        c.close();
                        h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.COMPLETE)));
                    } else {
                        ch.cause().printStackTrace();
                        c.rollback(rh -> {
                            c.close();
                            h.reply(Json.encode(new GeneralResponse().setCode(ch.cause().getMessage())
                                    .setMessage(ErrorCode.getMessage(ch.cause().getMessage()))));
                        });
                    }
                });
            } else {
                h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.SERVER_ERROR)
                        .setMessage(ErrorCode.getMessage(ErrorCode.SERVER_ERROR))));
            }
        });
    });

    vertx.eventBus().consumer("MembrWorker#AddAsset").handler(h -> {
        AddAssetRequest req = null;
        try {
            req = Json.decodeValue(h.body().toString(), AddAssetRequest.class);
        } catch (Exception e) {
            h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON)));
            return;
        }
        Set<ConstraintViolation<AddAssetRequest>> res = v.validate(req);
        if (!res.isEmpty()) {
            h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON)
                    .setMessage(res.iterator().next().getMessage())));
            return;
        }

        AddAssetRequest r = req;

        client.getConnection(connection -> {
            if (connection.succeeded()) {
                SQLConnection con = connection.result();
                Future<Void> f = Future.future();
                con.setAutoCommit(false, f.completer());
                f.compose(vo -> {
                    Future<ResultSet> f1 = Future.future();
                    con.queryWithParams("select * from member where username=? and password=?",
                            new JsonArray().add(r.getUsername()).add(r.getPassword()), f1.completer());
                    return f1;
                }).compose(re -> {
                    Future<UpdateResult> f1 = Future.future();
                    if (re.getNumRows() <= 0) {
                        System.out.println(Json.encode(re));
                        System.out.println(Json.encode(r));
                        f1.fail(ErrorCode.USERNAME_PASSWORD_NOT_MATCH);
                    } else {
                        long member_id = re.getRows().iterator().next().getLong("member_id");
                        con.updateWithParams(
                                "insert into assets (member_id,debit_credit,asset_name,asset_value,date_time,description) values(?,?,?,?,?,?)",
                                new JsonArray().add(member_id).add(r.getDebitCredit()).add(r.getAssetName())
                                        .add(r.getAssetValue()).add(mysqlFormat.format(new Date()))
                                        .add(r.getDescription()),
                                f1.completer());
                    }
                    return f1;
                }).compose(re -> {
                    Future<Void> end = Future.future();
                    con.commit(end.completer());
                    return end;
                }).setHandler(ch -> {
                    if (ch.succeeded()) {
                        con.close();
                        h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.COMPLETE)));
                    } else {
                        con.rollback(rh -> {
                            con.close();
                            h.reply(Json.encode(new GeneralResponse().setCode(ch.cause().getMessage())
                                    .setMessage(ErrorCode.getMessage(ch.cause().getMessage()))));
                        });
                    }
                });
            } else {
                h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.SERVER_ERROR)
                        .setMessage(ErrorCode.getMessage(ErrorCode.SERVER_ERROR))));
            }
        });
    });

    vertx.eventBus().consumer("AssetWorker#GetAsset").handler(h -> {

        GetAssetRequest req = null;
        try {
            req = Json.decodeValue(h.body().toString(), GetAssetRequest.class);
        } catch (Exception e) {
            h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON)));
            return;
        }
        Set<ConstraintViolation<GetAssetRequest>> res = v.validate(req);
        if (!res.isEmpty()) {
            h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON)
                    .setMessage(res.iterator().next().getMessage())));
            return;
        }

        GetAssetRequest r = req;

        client.getConnection(connection -> {
            if (connection.succeeded()) {
                SQLConnection c = connection.result();
                Future<Void> vo = Future.future();
                c.setAutoCommit(true, vo.completer());
                vo.compose(re -> {
                    Future<ResultSet> f0 = Future.future();
                    c.queryWithParams("select member_id from member where username=? and password=?",
                            new JsonArray().add(r.getUsername()).add(r.getPassword()), f0.completer());
                    return f0;
                }).compose(re -> {
                    Future<ResultSet> f0 = Future.future();
                    if (re.getNumRows() <= 0) {
                        f0.fail(ErrorCode.USERNAME_PASSWORD_NOT_MATCH);
                    } else {
                        long member_id = re.getRows().iterator().next().getLong("member_id");
                        c.queryWithParams("select * from assets where member_id=?",
                                new JsonArray().add(member_id), f0.completer());
                    }
                    return f0;
                }).setHandler(resp -> {
                    if (resp.succeeded()) {
                        h.reply(Json.encodePrettily(new GeneralResponse().setCode(ErrorCode.COMPLETE)
                                .setData(resp.result().getRows())));
                    } else {
                        h.reply(Json.encode(new GeneralResponse().setCode(resp.cause().getMessage())
                                .setMessage(ErrorCode.getMessage(resp.cause().getMessage()))));
                    }
                    c.close();
                });
            } else {
                h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.SERVER_ERROR)
                        .setMessage(connection.cause().getMessage())));
            }
        });
    });

    vertx.eventBus().consumer("AssetWorker#UpdateAsset").handler(h -> {

        UpdateAssetRequest req = null;
        try {
            req = Json.decodeValue(h.body().toString(), UpdateAssetRequest.class);
        } catch (Exception e) {
            h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON)));
            return;
        }

        Set<ConstraintViolation<UpdateAssetRequest>> res = v.validate(req);

        if (!res.isEmpty()) {
            h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON)
                    .setMessage(res.iterator().next().getMessage())));
            return;
        }

        final UpdateAssetRequest r = req;

        client.getConnection(connection -> {
            if (connection.succeeded()) {
                SQLConnection con = connection.result();
                Future<Void> f = Future.future();
                con.setAutoCommit(false, f.completer());
                f.compose(vo -> {
                    Future<ResultSet> f0 = Future.future();
                    con.queryWithParams("select member_id from member where username=? and password=?",
                            new JsonArray().add(r.getUsername()).add(r.getPassword()), f0.completer());
                    return f0;
                }).compose(rs -> {
                    Future<ResultSet> f0 = Future.future();
                    if (rs.getNumRows() <= 0) {
                        f0.fail(ErrorCode.USERNAME_PASSWORD_NOT_MATCH);
                    } else {
                        long member_id = rs.getRows().iterator().next().getLong("member_id");
                        con.queryWithParams("select * from assets where asset_id=? and member_id=? for update",
                                new JsonArray().add(r.getAssetId()).add(member_id), f0.completer());
                    }
                    return f0;
                }).compose(rs -> {
                    Future<UpdateResult> f0 = Future.future();
                    con.updateWithParams(
                            "update assets set debit_credit=?,asset_name=?,asset_value=?,date_time=?,description=? where asset_id=?",
                            new JsonArray().add(r.getDebitCredit()).add(r.getAssetName()).add(r.getAssetValue())
                                    .add(mysqlFormat.format(new Date())).add(r.getDescription())
                                    .add(r.getAssetId()),
                            f0.completer());
                    return f0;
                }).compose(rs -> {
                    Future<Void> cf = Future.future();
                    con.commit(cf.completer());
                    return cf;
                }).setHandler(sh -> {
                    if (sh.succeeded()) {
                        con.close();
                        h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.COMPLETE)));
                    } else {
                        con.rollback(rh -> {
                            con.close();
                            h.reply(Json.encode(new GeneralResponse().setCode(sh.cause().getMessage())
                                    .setMessage(ErrorCode.getMessage(sh.cause().getMessage()))));
                        });
                    }
                });
            } else {
                h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.SERVER_ERROR)));
            }
        });
    });

    fut.complete();
}

From source file:org.eclipse.hono.deviceregistry.FileBasedTenantService.java

License:Open Source License

Future<Void> loadTenantData() {

    if (getConfig().getFilename() == null) {
        return Future.succeededFuture();
    } else {//www.ja  v  a2 s.  c  o m
        final Future<Buffer> readResult = Future.future();
        vertx.fileSystem().readFile(getConfig().getFilename(), readResult.completer());
        return readResult.compose(buffer -> {
            return addAll(buffer);
        }).recover(t -> {
            log.debug("cannot load tenants from file [{}]: {}", getConfig().getFilename(), t.getMessage());
            return Future.succeededFuture();
        });
    }
}

From source file:org.entcore.directory.services.impl.DefaultUserBookService.java

License:Open Source License

private Future<Boolean> cacheAvatarFromUserBook(String userId, Optional<String> pictureId, Boolean remove) {
    // clean avatar when changing or when removing
    Future<Boolean> futureClean = (pictureId.isPresent() || remove) ? cleanAvatarCache(userId)
            : Future.succeededFuture();
    return futureClean.compose(res -> {
        if (!pictureId.isPresent()) {
            return Future.succeededFuture();
        }// w ww. j a  v  a2  s  . c o m
        Future<Boolean> futureCopy = Future.future();
        this.wsHelper.getDocument(pictureId.get(), resDoc -> {
            if (resDoc.succeeded() && "ok".equals(resDoc.result().body().getString("status"))) {
                JsonObject document = resDoc.result().body().getJsonObject("result");
                String fileId = document.getString("file");
                // Extensions are not used by storage
                String defaultFilename = avatarFileNameFromUserId(userId, Optional.empty());
                //
                JsonObject thumbnails = document.getJsonObject("thumbnails", new JsonObject());
                Map<String, String> filenamesByIds = new HashMap<>();
                filenamesByIds.put(fileId, defaultFilename);

                for (String size : thumbnails.fieldNames()) {
                    filenamesByIds.put(thumbnails.getString(size),
                            avatarFileNameFromUserId(userId, Optional.of(size)));
                }
                // TODO avoid buffer to improve performances and avoid cache every time
                List<Future> futures = new ArrayList<>();
                for (Entry<String, String> entry : filenamesByIds.entrySet()) {
                    String cFileId = entry.getKey();
                    String cFilename = entry.getValue();
                    Future<JsonObject> future = Future.future();
                    futures.add(future);
                    this.wsHelper.readFile(cFileId, buffer -> {
                        if (buffer != null) {
                            this.avatarStorage.writeBuffer(FileUtils.stripExtension(cFilename), buffer, "",
                                    cFilename, wRes -> {
                                        future.complete(wRes);
                                    });
                        } else {
                            future.fail("Cannot read file from workspace storage. ID =: " + cFileId);
                        }
                    });
                }
                //
                CompositeFuture.all(futures)
                        .setHandler(finishRes -> futureCopy.complete(finishRes.succeeded()));
            }
        });
        return futureCopy;
    });

}