/** Starts as a standalone file server and waits for Enter. */
  public static void main(String[] args) {
    // Defaults
    int port = 8080;

    String host = "127.0.0.1";
    List<File> rootDirs = new ArrayList<File>();
    boolean quiet = false;
    Map<String, String> options = new HashMap<String, String>();

    // Parse command-line, with short and long versions of the options.
    for (int i = 0; i < args.length; ++i) {
      if (args[i].equalsIgnoreCase("-h") || args[i].equalsIgnoreCase("--host")) {
        host = args[i + 1];
      } else if (args[i].equalsIgnoreCase("-p") || args[i].equalsIgnoreCase("--port")) {
        port = Integer.parseInt(args[i + 1]);
      } else if (args[i].equalsIgnoreCase("-q") || args[i].equalsIgnoreCase("--quiet")) {
        quiet = true;
      } else if (args[i].equalsIgnoreCase("-d") || args[i].equalsIgnoreCase("--dir")) {
        rootDirs.add(new File(args[i + 1]).getAbsoluteFile());
      } else if (args[i].equalsIgnoreCase("--licence")) {
        System.out.println(LICENCE + "\n");
      } else if (args[i].startsWith("-X:")) {
        int dot = args[i].indexOf('=');
        if (dot > 0) {
          String name = args[i].substring(0, dot);
          String value = args[i].substring(dot + 1, args[i].length());
          options.put(name, value);
        }
      }
    }

    if (rootDirs.isEmpty()) {
      rootDirs.add(new File(".").getAbsoluteFile());
    }

    options.put("host", host);
    options.put("port", "" + port);
    options.put("quiet", String.valueOf(quiet));
    StringBuilder sb = new StringBuilder();
    for (File dir : rootDirs) {
      if (sb.length() > 0) {
        sb.append(":");
      }
      try {
        sb.append(dir.getCanonicalPath());
      } catch (IOException ignored) {
      }
    }
    options.put("home", sb.toString());

    ServiceLoader<WebServerPluginInfo> serviceLoader =
        ServiceLoader.load(WebServerPluginInfo.class);
    for (WebServerPluginInfo info : serviceLoader) {
      String[] mimeTypes = info.getMimeTypes();
      for (String mime : mimeTypes) {
        String[] indexFiles = info.getIndexFilesForMimeType(mime);
        if (!quiet) {
          System.out.print("# Found plugin for Mime type: \"" + mime + "\"");
          if (indexFiles != null) {
            System.out.print(" (serving index files: ");
            for (String indexFile : indexFiles) {
              System.out.print(indexFile + " ");
            }
          }
          System.out.println(").");
        }
        registerPluginForMimeType(indexFiles, mime, info.getWebServerPlugin(mime), options);
      }
    }

    ServerRunner.executeInstance(new SimpleWebServer(host, port, rootDirs, quiet));
  }