package org.arquillian.cube.docker.drone.util; import java.io.InputStream; import java.net.URL; import java.util.Enumeration; import java.util.HashSet; import java.util.Set; import java.util.jar.Attributes; import java.util.jar.Manifest; import java.util.logging.Level; import java.util.logging.Logger; /** * Utility class for Selenium. */ public class SeleniumVersionExtractor { private static final Logger logger = Logger.getLogger(SeleniumVersionExtractor.class.getName()); private static final String SELENIUM_VERSION = "latest"; /** * Returns current selenium version from JAR set in classpath. * * @return Version of Selenium. */ public static String fromClassPath() { Set<String> versions = new HashSet<>(); try { ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); Enumeration<URL> manifests = classLoader.getResources("META-INF/MANIFEST.MF"); while (manifests.hasMoreElements()) { URL manifestURL = manifests.nextElement(); try (InputStream is = manifestURL.openStream()) { Manifest manifest = new Manifest(); manifest.read(is); Attributes buildInfo = manifest.getAttributes("Build-Info"); if (buildInfo != null) { if (buildInfo.getValue("Selenium-Version") != null) { versions.add(buildInfo.getValue("Selenium-Version")); } else { // might be in build-info part if (manifest.getEntries() != null) { if (manifest.getEntries().containsKey("Build-Info")) { final Attributes attributes = manifest.getEntries().get("Build-Info"); if (attributes.getValue("Selenium-Version") != null) { versions.add(attributes.getValue("Selenium-Version")); } } } } } } } } catch (Exception e) { logger.log(Level.WARNING, "Exception {0} occurred while resolving selenium version and latest image is going to be used.", e.getMessage()); return SELENIUM_VERSION; } if (versions.isEmpty()) { logger.log(Level.INFO, "No version of Selenium found in classpath. Using latest image."); return SELENIUM_VERSION; } String foundVersion = versions.iterator().next(); if (versions.size() > 1) { logger.log(Level.WARNING, "Multiple versions of Selenium found in classpath. Using the first one found {0}.", foundVersion); } return foundVersion; } }