docs: public Collection<String> downloadFeatureFeatureManager(Set<String> featureNames, File toDir, DownloadOption downloadOption, ExistsAction action, String user,
                                                              String password) throws InstallException {
          fireProgressEvent(InstallProgressEvent.CHECK, 1, Messages.INSTALL_KERNEL_MESSAGES.getLogMessage("STATE_CHECKING"));
  
          if (featureNames == null || featureNames.isEmpty()) {
              throw ExceptionUtils.createByKey("ERROR_FEATURES_LIST_INVALID");
          }
  
          List<List<RepositoryResource>> installResources = getResolveDirector().resolve(featureNames, downloadOption, user, password);
          if (isEmpty(installResources)) {
              if (downloadOption == DownloadOption.required)
                  throw ExceptionUtils.createByKey(InstallException.ALREADY_EXISTS, "ERROR_DOWNLOAD_ALREADY_INSTALLED",
                                                   InstallUtils.getShortNames(product.getFeatureDefinitions(), featureNames).toString());
              else
                  throw ExceptionUtils.createByKey("ERROR_FAILED_TO_RESOLVE_FEATURES", InstallUtils.getFeatureListOutput(featureNames));
          }
  
          Collection<String> downloaded = new ArrayList<String>(installResources.size());
          int progress = 10;
          int interval1 = installResources.size() == 0 ? 90 : 90 / installResources.size();
          for (List<RepositoryResource> mrList : installResources) {
              int interval2 = mrList.size() == 0 ? interval1 : interval1 / mrList.size();
              for (RepositoryResource installResource : mrList) {
                  fireDownloadProgressEvent(progress, installResource);
                  progress += interval2;
                  if (installResource.getType().equals(ResourceType.FEATURE)) {
                      String name = ((EsaResource) installResource).getProvideFeature();
                      File targetFile = new File(toDir, name + ".esa");
                      if (targetFile.exists()) {
                          if (action == ExistsAction.ignore) {
                              log(Level.FINEST, "Existing file " + name + ".esa" + " is found in the directory " + toDir.getAbsolutePath()
                                                + ", the feature is skipped for download.");
                          } else if (action == ExistsAction.replace) {
                              if (targetFile.delete()) {
                                  try {
                                      File d = InstallUtils.download(installResource, toDir);
                                      downloaded.add(d.getAbsolutePath());
                                      log(Level.FINEST, "Downloaded " + installResource.getName() + " to " + d.getAbsolutePath());
                                  } catch (InstallException e) {
                                      throw e;
                                  } catch (Exception e) {
                                      throw ExceptionUtils.createByKey(InstallException.IO_FAILURE, e, "ERROR_FAILED_TO_DOWNLOAD_FEATURE",
                                                                       installResource.getName(), toDir.getAbsolutePath());
                                  }
                              } else
                                  throw ExceptionUtils.createByKey(InstallException.IO_FAILURE, "ERROR_FAILED_TO_DOWNLOAD_FEATURE",
                                                                   name, targetFile.getAbsolutePath());
                          } else {
                              throw new InstallException(Messages.PROVISIONER_MESSAGES.getLogMessage("tool.install.file.exists", targetFile), InstallException.IO_FAILURE);
                          }
                      } else {
                          try {
                              File d = InstallUtils.download(installResource, toDir);
                              downloaded.add(d.getAbsolutePath());
                              log(Level.FINEST, "Downloaded " + installResource.getName() + " to " + d.getAbsolutePath());
                          } catch (InstallException e) {
                              throw e;
                          } catch (Exception e) {
                              throw ExceptionUtils.createByKey(InstallException.IO_FAILURE, e, "ERROR_FAILED_TO_DOWNLOAD_FEATURE",
                                                               installResource.getName(), toDir.getAbsolutePath());
                          }
                      }
  
                  } else {
                      log(Level.FINEST, installResource.getName() + " is an unsupported type " + installResource.getType() + " to be downloaded.");
                  }
              }
          }
          return downloaded;
      }