package ru.qatools.gridrouter.utils;
import org.apache.commons.io.FilenameUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.qatools.beanloader.BeanLoader;
import ru.qatools.gridrouter.ConfigRepository;
import ru.qatools.gridrouter.config.Browsers;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.net.URISyntaxException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;
import static java.util.Collections.unmodifiableMap;
import static javax.xml.bind.JAXB.marshal;
import static javax.xml.bind.JAXB.unmarshal;
/**
* @author Ilya Sadykov
*/
public class TestConfigRepository implements ConfigRepository {
protected static final String XML_GLOB = "*.xml";
private static final Logger LOGGER = LoggerFactory.getLogger(TestConfigRepository.class);
private static Map<String, Browsers> initialBrowsers = new HashMap<>();
private static Map<String, String> initialRoutes = new HashMap<>();
private static Map<String, Browsers> userBrowsers = new HashMap<>();
private static Map<String, String> routes = new HashMap<>();
static {
try {
final Path quotaDir = Paths.get(TestConfigRepository.class.getClassLoader().getResource("quota").toURI());
LOGGER.debug("Loading quota configuration");
initialBrowsers = new HashMap<>();
initialRoutes = new HashMap<>();
BeanLoader.loadAll(Browsers.class, quotaDir, XML_GLOB, (path, quota) -> {
String user = FilenameUtils.getBaseName(path.toString());
initialBrowsers.put(user, quota);
initialRoutes.putAll(quota.getRoutesMap());
});
initialBrowsers = unmodifiableMap(initialBrowsers);
initialRoutes = unmodifiableMap(initialRoutes);
resetConfig();
} catch (IOException | URISyntaxException e) {
LOGGER.error("Quota configuration loading failed", e);
}
}
private static Browsers copy(Browsers quota) {
StringWriter writer = new StringWriter();
marshal(quota, writer);
return unmarshal(new StringReader(writer.toString()), Browsers.class);
}
public static synchronized void resetConfig() {
userBrowsers.clear();
initialBrowsers.entrySet().forEach(e -> {
userBrowsers.put(e.getKey(), copy(e.getValue()));
});
routes.clear();
routes.putAll(initialRoutes);
}
public static synchronized void changePort(int from, int to) {
userBrowsers.keySet().forEach(quotaName ->
userBrowsers.get(quotaName).getBrowsers().forEach(browser ->
browser.getVersions().forEach(version ->
version.getRegions().forEach(region ->
region.getHosts().forEach(host -> {
if (host.getPort() == from) {
LOGGER.info("Changing port of {} from {} to {} for user {}",
host, from, to, quotaName);
host.setPort(to);
routes.putAll(userBrowsers.get(quotaName).getRoutesMap());
}
})))));
}
@Override
public Map<String, Browsers> getQuotaMap() {
return userBrowsers;
}
@Override
public String getRoute(String routeId) {
return routes.get(routeId);
}
}