private static void pipeStaticResourcesHandlers(
      final Configuration conf,
      final PathHandler paths,
      final IdentityManager identityManager,
      final AccessManager accessManager) {
    // pipe the static resources specified in the configuration file
    if (conf.getStaticResourcesMounts() != null) {
      conf.getStaticResourcesMounts()
          .stream()
          .forEach(
              sr -> {
                try {
                  String path = (String) sr.get(Configuration.STATIC_RESOURCES_MOUNT_WHAT_KEY);
                  String where = (String) sr.get(Configuration.STATIC_RESOURCES_MOUNT_WHERE_KEY);
                  String welcomeFile =
                      (String) sr.get(Configuration.STATIC_RESOURCES_MOUNT_WELCOME_FILE_KEY);
                  boolean embedded =
                      (Boolean) sr.get(Configuration.STATIC_RESOURCES_MOUNT_EMBEDDED_KEY);
                  boolean secured =
                      (Boolean) sr.get(Configuration.STATIC_RESOURCES_MOUNT_SECURED_KEY);

                  if (where == null || !where.startsWith("/")) {
                    LOGGER.error(
                        "Cannot bind static resources to {}. parameter 'where' must start with /",
                        where);
                    return;
                  }

                  if (welcomeFile == null) {
                    welcomeFile = "index.html";
                  }

                  File file;

                  if (embedded) {
                    if (path.startsWith("/")) {
                      LOGGER.error(
                          "Cannot bind embedded static resources to {}. parameter 'where'"
                              + "cannot start with /. the path is relative to the jar root dir or classpath directory",
                          where);
                      return;
                    }

                    try {
                      file = ResourcesExtractor.extract(path);

                      if (ResourcesExtractor.isResourceInJar(path)) {
                        TMP_EXTRACTED_FILES.put(path, file);
                        LOGGER.info(
                            "Embedded static resources {} extracted in {}", path, file.toString());
                      }
                    } catch (URISyntaxException | IOException ex) {
                      LOGGER.error("Error extracting embedded static resource {}", path, ex);
                      return;
                    } catch (IllegalStateException ex) {
                      LOGGER.error("Error extracting embedded static resource {}", path, ex);

                      if ("browser".equals(path)) {
                        LOGGER.error(
                            "**** Did you downloaded the browser submodule before building?");
                        LOGGER.error(
                            "**** to fix, run this command: $ git submodule update --init --recursive");
                      }
                      return;
                    }
                  } else {
                    if (!path.startsWith("/")) {
                      // this is to allow specifying the configuration file path relative to the jar
                      // (also working when running from classes)
                      URL location =
                          Bootstrapper.class.getProtectionDomain().getCodeSource().getLocation();
                      File locationFile = new File(location.getPath());
                      file = new File(locationFile.getParent() + File.separator + path);
                    } else {
                      file = new File(path);
                    }
                  }

                  ResourceHandler handler =
                      resource(new FileResourceManager(file, 3))
                          .addWelcomeFiles(welcomeFile)
                          .setDirectoryListingEnabled(false);

                  if (secured) {
                    paths.addPrefixPath(
                        where,
                        new SecurityHandlerDispacher(
                            new PipedWrappingHandler(null, handler),
                            identityManager,
                            accessManager));
                  } else {
                    paths.addPrefixPath(where, handler);
                  }

                  LOGGER.info(
                      "URL {} bound to static resources {}. access manager: {}",
                      where,
                      path,
                      secured);

                } catch (Throwable t) {
                  LOGGER.error(
                      "Cannot bind static resources to {}",
                      sr.get(Configuration.STATIC_RESOURCES_MOUNT_WHERE_KEY),
                      t);
                }
              });
    }
  }
  private static void stopServer(boolean silent, boolean removePid) {
    if (!silent) {
      LOGGER.info("Stopping RESTHeart...");
    }

    if (shutdownHandler != null) {
      if (!silent) {
        LOGGER.info("Waiting for pending request to complete (up to 1 minute)...");
      }
      try {
        shutdownHandler.shutdown();
        shutdownHandler.awaitShutdown(60 * 1000); // up to 1 minute
      } catch (InterruptedException ie) {
        LOGGER.error("Error while waiting for pending request to complete", ie);
      }
    }

    if (server != null) {
      if (!silent) {
        LOGGER.info("Stopping the Undertow server...");
      }
      try {
        server.stop();
      } catch (Throwable t) {
        LOGGER.error("Error stopping the Undertow server", t);
      }
    }

    try {
      if (!silent) {
        LOGGER.info("Flushing and closing the MongoDB client...");
      }
      if (MongoDBClientSingleton.isInitialized()) {
        MongoClient client = MongoDBClientSingleton.getInstance().getClient();
        client.fsync(false);
        client.close();
      }
    } catch (Throwable t) {
      LOGGER.error("Error flushing and closing the MongoDB client", t);
    }

    Path pidFilePath = FileUtils.getPidFilePath(FileUtils.getFileAbsoultePathHash(CONF_FILE_PATH));

    if (removePid && pidFilePath != null) {
      if (!silent) {
        LOGGER.info("Removing the pid file {}", pidFilePath.toString());
      }
      try {
        Files.deleteIfExists(pidFilePath);
      } catch (IOException ex) {
        LOGGER.error("Can't delete pid file {}", pidFilePath.toString(), ex);
      }
    }

    if (!silent) {
      LOGGER.info("Cleaning up temporary directories...");
    }
    TMP_EXTRACTED_FILES
        .keySet()
        .forEach(
            k -> {
              try {
                ResourcesExtractor.deleteTempDir(k, TMP_EXTRACTED_FILES.get(k));
              } catch (URISyntaxException | IOException ex) {
                LOGGER.error(
                    "Error cleaning up temporary directory {}",
                    TMP_EXTRACTED_FILES.get(k).toString(),
                    ex);
              }
            });

    if (!silent) {
      LOGGER.info(ansi().fg(GREEN).bold().a("RESTHeart stopped").reset().toString());
    }
  }