// Path: SeleniumGridExtras/src/main/java/com/groupon/seleniumgridextras/config/RuntimeConfig.java
// public class RuntimeConfig {
// 
//   public static String configFile = "selenium_grid_extras_config.json";
//   private static Config config = null;
//   private static OS currentOS = new OS();
//   private static Logger logger = Logger.getLogger(RuntimeConfig.class);
//   private static WebDriverReleaseManager releaseManager;
//   private static SessionTracker sessionTracker;
// 
//   public static int getGridExtrasPort() {
//     if(getConfig() == null) {
//       return 3000;
//     } else {
//       return getConfig().getGridExtrasPort();
//     }
//   }
// 
//   public static WebDriverReleaseManager getReleaseManager() {
//     if (releaseManager == null) {
//       releaseManager =
//           loadWebDriverReleaseManager("https://selenium-release.storage.googleapis.com/",
//                                       "https://chromedriver.storage.googleapis.com/LATEST_RELEASE",
//                                       "https://api.github.com/repos/mozilla/geckodriver/releases");
//     }
// 
//     return releaseManager;
//   }
// 
// 
//   private static WebDriverReleaseManager loadWebDriverReleaseManager(String webDriverAndIEDriverURL,
//                                                                      String chromeDriverUrl,
//                                                                      String geckoDriverUrl) {
//     try {
//       return new WebDriverReleaseManager(new URL(webDriverAndIEDriverURL),
//                                          new URL(chromeDriverUrl),
//                                          new URL(geckoDriverUrl));
//     } catch (MalformedURLException e) {
//       logger.error("Seems that " + webDriverAndIEDriverURL + " is malformed");
//       logger.error(e.toString());
//       e.printStackTrace();
//     } catch (DocumentException e) {
//       logger.error("Something went wrong loading webdriver versions");
//       logger.error(e.toString());
//       e.printStackTrace();
//     }
// 
//     return null;
//   }
// 
//   public RuntimeConfig() {
//     config = new Config();
//   }
// 
// 
//   protected static void clearConfig() {
//     //Use only for tests, don't use for any other reason
//     config = null;
//   }
// 
//   public static String getConfigFile() {
//     return configFile;
//   }
// 
//   public static void setConfigFile(String file) {
//     configFile = file;
//   }
// 
//   public static Config load(boolean UpdateConfigsFromHub) {
//     Map overwriteValues;
//     config = DefaultConfig.getDefaultConfig();
//     logger.debug(config);
// 
//     if (UpdateConfigsFromHub) {
//       new ConfigPuller().updateFromRemote();
//     }
// 
//     ConfigFileReader configFileObject = new ConfigFileReader(configFile);
// 
//     logger.debug(configFileObject.toHashMap());
// 
//     if (!configFileObject.hasContent()) {
//       logger.info("Previous config was not found, will ask input from user");
//       Config userInput = Config.initilizedFromUserInput();
//       logger.debug(userInput);
//     }
// 
//     // Read the primary config file
//     configFileObject.readConfigFile();
//     overwriteValues = configFileObject.toHashMap();
//     logger.debug(overwriteValues);
// 
//     //Overwrite default configs
//     config.overwriteConfig(overwriteValues);
// 
//     //Load node info from the node classes
//     config.loadNodeClasses();
//     config.loadHubClasses(); // TODO added for Hub
// 
//     //Write out all of the possible examples into an example file
//     config.writeToDisk(RuntimeConfig.getConfigFile() + ".example");
// 
//     logger.debug(config);
//     return config;
//   }
// 
// 
//   public static Config load() {
//     return load(false);
//   }
// 
//   public static File getSeleniumGridExtrasJarFile() {
//     try {
//       return new File(
//           SeleniumGridExtras.class.getProtectionDomain().getCodeSource().getLocation().toURI());
//     } catch (URISyntaxException e) {
//       logger.error("Could not get jar file");
//       logger.error(e);
//       throw new RuntimeException(e);
//     }
//   }
// 
// 
//   public static String getSeleniungGridExtrasHomePath() {
//     return FilenameUtils
//         .getFullPathNoEndSeparator(getSeleniumGridExtrasJarFile().getAbsolutePath());
//   }
// 
// 
//   public static Config getConfig() {
//     return config;
//   }
// 
//   public static OS getOS() {
//     return currentOS;
//   }
// 
//   public static String getHostIp() {
//     String ip = null;
//     if (config != null) {
//         if (config.getHostIp() != null) {
//             ip = config.getHostIp();
//         } else if (config.getDefaultRole().equals("hub") && config.getHubs().size() > 0) {
//             ip = config.getHubs().get(0).getConfiguration().getHost();
//         } else if (config.getDefaultRole().equals("node") && config.getNodes().size() > 0) {
//             ip = config.getNodes().get(0).getConfiguration() != null ? config.getNodes().get(0).getConfiguration().getHost() : config.getNodes().get(0).getHost();
//         }
//     }
//     if (ip == null) {
//         ip = currentOS.getHostIp();
//     }
//     return ip;
//   }
// 
// 
//   public static SessionTracker getTestSessionTracker() {
//     if (sessionTracker == null) {
//       sessionTracker = new SessionTracker();
//     }
// 
//     return sessionTracker;
//   }
// 
// }


import com.groupon.seleniumgridextras.config.RuntimeConfig;
import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import org.apache.log4j.Logger;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URI;
package com.groupon.seleniumgridextras;




public class VideoHttpExecutor implements HttpHandler {

    private static Logger logger = Logger.getLogger(VideoHttpExecutor.class);
    public static final String GET_VIDEO_FILE_ENDPOINT = "/download_video";
    private File outputDir;


    @Override
    public void handle(HttpExchange t) throws IOException {

        if (outputDir == null) {
// Path: SeleniumGridExtras/src/main/java/com/groupon/seleniumgridextras/config/RuntimeConfig.java
// public class RuntimeConfig {
// 
//   public static String configFile = "selenium_grid_extras_config.json";
//   private static Config config = null;
//   private static OS currentOS = new OS();
//   private static Logger logger = Logger.getLogger(RuntimeConfig.class);
//   private static WebDriverReleaseManager releaseManager;
//   private static SessionTracker sessionTracker;
// 
//   public static int getGridExtrasPort() {
//     if(getConfig() == null) {
//       return 3000;
//     } else {
//       return getConfig().getGridExtrasPort();
//     }
//   }
// 
//   public static WebDriverReleaseManager getReleaseManager() {
//     if (releaseManager == null) {
//       releaseManager =
//           loadWebDriverReleaseManager("https://selenium-release.storage.googleapis.com/",
//                                       "https://chromedriver.storage.googleapis.com/LATEST_RELEASE",
//                                       "https://api.github.com/repos/mozilla/geckodriver/releases");
//     }
// 
//     return releaseManager;
//   }
// 
// 
//   private static WebDriverReleaseManager loadWebDriverReleaseManager(String webDriverAndIEDriverURL,
//                                                                      String chromeDriverUrl,
//                                                                      String geckoDriverUrl) {
//     try {
//       return new WebDriverReleaseManager(new URL(webDriverAndIEDriverURL),
//                                          new URL(chromeDriverUrl),
//                                          new URL(geckoDriverUrl));
//     } catch (MalformedURLException e) {
//       logger.error("Seems that " + webDriverAndIEDriverURL + " is malformed");
//       logger.error(e.toString());
//       e.printStackTrace();
//     } catch (DocumentException e) {
//       logger.error("Something went wrong loading webdriver versions");
//       logger.error(e.toString());
//       e.printStackTrace();
//     }
// 
//     return null;
//   }
// 
//   public RuntimeConfig() {
//     config = new Config();
//   }
// 
// 
//   protected static void clearConfig() {
//     //Use only for tests, don't use for any other reason
//     config = null;
//   }
// 
//   public static String getConfigFile() {
//     return configFile;
//   }
// 
//   public static void setConfigFile(String file) {
//     configFile = file;
//   }
// 
//   public static Config load(boolean UpdateConfigsFromHub) {
//     Map overwriteValues;
//     config = DefaultConfig.getDefaultConfig();
//     logger.debug(config);
// 
//     if (UpdateConfigsFromHub) {
//       new ConfigPuller().updateFromRemote();
//     }
// 
//     ConfigFileReader configFileObject = new ConfigFileReader(configFile);
// 
//     logger.debug(configFileObject.toHashMap());
// 
//     if (!configFileObject.hasContent()) {
//       logger.info("Previous config was not found, will ask input from user");
//       Config userInput = Config.initilizedFromUserInput();
//       logger.debug(userInput);
//     }
// 
//     // Read the primary config file
//     configFileObject.readConfigFile();
//     overwriteValues = configFileObject.toHashMap();
//     logger.debug(overwriteValues);
// 
//     //Overwrite default configs
//     config.overwriteConfig(overwriteValues);
// 
//     //Load node info from the node classes
//     config.loadNodeClasses();
//     config.loadHubClasses(); // TODO added for Hub
// 
//     //Write out all of the possible examples into an example file
//     config.writeToDisk(RuntimeConfig.getConfigFile() + ".example");
// 
//     logger.debug(config);
//     return config;
//   }
// 
// 
//   public static Config load() {
//     return load(false);
//   }
// 
//   public static File getSeleniumGridExtrasJarFile() {
//     try {
//       return new File(
//           SeleniumGridExtras.class.getProtectionDomain().getCodeSource().getLocation().toURI());
//     } catch (URISyntaxException e) {
//       logger.error("Could not get jar file");
//       logger.error(e);
//       throw new RuntimeException(e);
//     }
//   }
// 
// 
//   public static String getSeleniungGridExtrasHomePath() {
//     return FilenameUtils
//         .getFullPathNoEndSeparator(getSeleniumGridExtrasJarFile().getAbsolutePath());
//   }
// 
// 
//   public static Config getConfig() {
//     return config;
//   }
// 
//   public static OS getOS() {
//     return currentOS;
//   }
// 
//   public static String getHostIp() {
//     String ip = null;
//     if (config != null) {
//         if (config.getHostIp() != null) {
//             ip = config.getHostIp();
//         } else if (config.getDefaultRole().equals("hub") && config.getHubs().size() > 0) {
//             ip = config.getHubs().get(0).getConfiguration().getHost();
//         } else if (config.getDefaultRole().equals("node") && config.getNodes().size() > 0) {
//             ip = config.getNodes().get(0).getConfiguration() != null ? config.getNodes().get(0).getConfiguration().getHost() : config.getNodes().get(0).getHost();
//         }
//     }
//     if (ip == null) {
//         ip = currentOS.getHostIp();
//     }
//     return ip;
//   }
// 
// 
//   public static SessionTracker getTestSessionTracker() {
//     if (sessionTracker == null) {
//       sessionTracker = new SessionTracker();
//     }
// 
//     return sessionTracker;
//   }
// 
// }


// Path: SeleniumGridExtras/src/main/java/com/groupon/seleniumgridextras/VideoHttpExecutor.java
import com.groupon.seleniumgridextras.config.RuntimeConfig;
import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import org.apache.log4j.Logger;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URI;

package com.groupon.seleniumgridextras;




public class VideoHttpExecutor implements HttpHandler {

    private static Logger logger = Logger.getLogger(VideoHttpExecutor.class);
    public static final String GET_VIDEO_FILE_ENDPOINT = "/download_video";
    private File outputDir;


    @Override
    public void handle(HttpExchange t) throws IOException {

        if (outputDir == null) {
            outputDir = RuntimeConfig.getConfig().getVideoRecording().getOutputDir();