private <T> CompletableFuture<LoaderStatus> initLoaders(String commitId, int totalDownloads,
                                                          Map<String, Map<String, BuildTargetState>> commitSourcesState,
                                                          Map<String, Map<String, BuildTargetState>> currentSourcesState) {
    JpsLoaderContext loaderContext =
      JpsLoaderContext.createNewContext(totalDownloads, myCanceledStatus, commitId, myNettyClient, commitSourcesState, currentSourcesState);
    List<JpsOutputLoader<?>> loaders = getLoaders();
    loaders.forEach(loader -> loader.setContext(loaderContext));
    // Start loaders with own context
    List<CompletableFuture<LoaderStatus>> completableFutures = ContainerUtil.map(loaders, loader ->
      CompletableFuture.supplyAsync(() -> loader.extract(loader.load()), INSTANCE));

    // Reduce loaders statuses into the one
    CompletableFuture<LoaderStatus> initialFuture = completableFutures.get(0);
    if (completableFutures.size() > 1) {
      for (int i = 1; i < completableFutures.size(); i++) {
        initialFuture = initialFuture.thenCombine(completableFutures.get(i), JpsOutputLoaderManager::combine);
      }
    }
    return initialFuture;
  }
private <T> CompletableFuture<LoaderStatus> initLoaders(String commitId, int totalDownloads,
                                                          Map<String, Map<String, BuildTargetState>> commitSourcesState,
                                                          Map<String, Map<String, BuildTargetState>> currentSourcesState)