package ru.qatools.gridrouter; import org.apache.commons.io.FilenameUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import ru.qatools.beanloader.BeanChangeListener; import ru.qatools.beanloader.BeanLoader; import ru.qatools.beanloader.BeanWatcher; import ru.qatools.gridrouter.config.Browsers; import javax.annotation.PostConstruct; import java.io.File; import java.io.IOException; import java.nio.file.Path; import java.util.HashMap; import java.util.Map; /** * @author Alexander Andyashin aandryashin@yandex-team.ru * @author Dmitry Baev charlie@yandex-team.ru * @author Innokenty Shuvalov innokenty@yandex-team.ru */ public class ConfigRepositoryXml implements ConfigRepository, BeanChangeListener<Browsers> { private static final Logger LOGGER = LoggerFactory.getLogger(ConfigRepositoryXml.class); private static final String XML_GLOB = "*.xml"; @Value("${grid.config.quota.directory}") private File quotaDirectory; @Value("${grid.config.quota.hotReload}") private boolean quotaHotReload; private Map<String, Browsers> userBrowsers = new HashMap<>(); private Map<String, String> routes = new HashMap<>(); @PostConstruct public void init() { try { if (quotaHotReload) { LOGGER.debug("Starting quota watcher"); BeanWatcher.watchFor(Browsers.class, quotaDirectory.toPath(), XML_GLOB, this); } else { LOGGER.debug("Loading quota configuration"); BeanLoader.loadAll(Browsers.class, quotaDirectory.toPath(), XML_GLOB, this); } } catch (IOException e) { LOGGER.error("Quota configuration loading failed", e); } } @Override public void beanChanged(Path filename, Browsers browsers) { if (browsers == null) { LOGGER.info("Configuration file [{}] was deleted. " + "It is not purged from the running gridrouter process though.", filename); } else { LOGGER.info("Loading quota configuration file [{}]", filename); String user = FilenameUtils.getBaseName(filename.toString()); userBrowsers.put(user, browsers); routes.putAll(browsers.getRoutesMap()); LOGGER.info("Loaded quota configuration for [{}] from [{}]: \n\n{}", user, filename, browsers.toXml()); } } @Override public Map<String, Browsers> getQuotaMap() { return userBrowsers; } @Override public String getRoute(String routeId) { return routes.get(routeId); } }