diff --git a/src/main/java/io/github/bonigarcia/wdm/WebDriverManager.java b/src/main/java/io/github/bonigarcia/wdm/WebDriverManager.java index dc55fe219..0e40d7591 100644 --- a/src/main/java/io/github/bonigarcia/wdm/WebDriverManager.java +++ b/src/main/java/io/github/bonigarcia/wdm/WebDriverManager.java @@ -59,9 +59,11 @@ import java.util.Optional; import java.util.regex.Matcher; +import javax.xml.namespace.NamespaceContext; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; +import javax.xml.xpath.XPath; import org.apache.commons.codec.binary.Base64; import org.apache.commons.io.IOUtils; @@ -819,7 +821,11 @@ protected List getDriversFromMirror(URL driverUrl) throws IOException { } } - protected List getDriversFromXml(URL driverUrl, String xpath) + protected NamespaceContext getNamespaceContext() { + return null; + } + + protected List getDriversFromXml(URL driverUrl, String xpath, NamespaceContext namespaceContext) throws IOException { logSeekRepo(driverUrl); List urls = new ArrayList<>(); @@ -827,9 +833,12 @@ protected List getDriversFromXml(URL driverUrl, String xpath) try (CloseableHttpResponse response = httpClient .execute(httpClient.createHttpGet(driverUrl))) { Document xml = loadXML(response.getEntity().getContent()); - NodeList nodes = (NodeList) newInstance().newXPath() + XPath xPath = newInstance().newXPath(); + if (namespaceContext != null){ + xPath.setNamespaceContext(namespaceContext); + } + NodeList nodes = (NodeList) xPath .evaluate(xpath, xml.getDocumentElement(), NODESET); - for (int i = 0; i < nodes.getLength(); ++i) { Element e = (Element) nodes.item(i); urls.add(new URL(driverUrl.toURI().resolve(".") @@ -849,6 +858,7 @@ private void logSeekRepo(URL driverUrl) { protected Document loadXML(InputStream inputStream) throws SAXException, IOException, ParserConfigurationException { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setNamespaceAware(true); DocumentBuilder builder = factory.newDocumentBuilder(); return builder.parse(new InputSource( new ByteArrayInputStream(IOUtils.toByteArray(inputStream)))); diff --git a/src/main/java/io/github/bonigarcia/wdm/managers/ChromeDriverManager.java b/src/main/java/io/github/bonigarcia/wdm/managers/ChromeDriverManager.java index 87895fbb9..1ba3e62f5 100644 --- a/src/main/java/io/github/bonigarcia/wdm/managers/ChromeDriverManager.java +++ b/src/main/java/io/github/bonigarcia/wdm/managers/ChromeDriverManager.java @@ -24,11 +24,15 @@ import java.net.URL; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; +import java.util.Iterator; import java.util.List; import java.util.Optional; import io.github.bonigarcia.wdm.WebDriverManager; import io.github.bonigarcia.wdm.config.DriverManagerType; +import io.github.bonigarcia.wdm.online.S3BucketListNamespaceContext; + +import javax.xml.namespace.NamespaceContext; /** * Manager for Chrome. @@ -38,6 +42,8 @@ */ public class ChromeDriverManager extends WebDriverManager { + private static final S3BucketListNamespaceContext S3_BUCKET_LIST_NAMESPACE_CONTEXT = new S3BucketListNamespaceContext(); + @Override public DriverManagerType getDriverManagerType() { return CHROME; @@ -94,7 +100,7 @@ protected List getDriverUrls() throws IOException { if (mirrorUrl.isPresent() && config().isUseMirror()) { return getDriversFromMirror(mirrorUrl.get()); } else { - return getDriversFromXml(getDriverUrl(), "//Contents/Key"); + return getDriversFromXml(getDriverUrl(), "//s3:Contents/s3:Key"); } } @@ -145,4 +151,9 @@ protected Charset getVersionCharset() { return StandardCharsets.UTF_8; } + @Override + protected NamespaceContext getNamespaceContext() { + return S3_BUCKET_LIST_NAMESPACE_CONTEXT; + } + } diff --git a/src/main/java/io/github/bonigarcia/wdm/managers/InternetExplorerDriverManager.java b/src/main/java/io/github/bonigarcia/wdm/managers/InternetExplorerDriverManager.java index 0ff295456..2053b30ec 100644 --- a/src/main/java/io/github/bonigarcia/wdm/managers/InternetExplorerDriverManager.java +++ b/src/main/java/io/github/bonigarcia/wdm/managers/InternetExplorerDriverManager.java @@ -26,6 +26,9 @@ import io.github.bonigarcia.wdm.WebDriverManager; import io.github.bonigarcia.wdm.config.DriverManagerType; +import io.github.bonigarcia.wdm.online.S3BucketListNamespaceContext; + +import javax.xml.namespace.NamespaceContext; /** * Manager for Internet Explorer. @@ -35,6 +38,8 @@ */ public class InternetExplorerDriverManager extends WebDriverManager { + private static final S3BucketListNamespaceContext S3_BUCKET_LIST_NAMESPACE_CONTEXT = new S3BucketListNamespaceContext(); + @Override public DriverManagerType getDriverManagerType() { return IEXPLORER; @@ -87,7 +92,7 @@ protected void setDriverUrl(URL url) { @Override protected List getDriverUrls() throws IOException { - return getDriversFromXml(getDriverUrl(), "//Contents/Key"); + return getDriversFromXml(getDriverUrl(), "//s3:Contents/s3:Key"); } @Override @@ -101,4 +106,9 @@ protected Optional getDriverVersionFromRepository( return empty(); } + @Override + protected NamespaceContext getNamespaceContext() { + return S3_BUCKET_LIST_NAMESPACE_CONTEXT; + } + } diff --git a/src/main/java/io/github/bonigarcia/wdm/managers/SeleniumServerStandaloneManager.java b/src/main/java/io/github/bonigarcia/wdm/managers/SeleniumServerStandaloneManager.java index de59b8f51..ce2d988cc 100644 --- a/src/main/java/io/github/bonigarcia/wdm/managers/SeleniumServerStandaloneManager.java +++ b/src/main/java/io/github/bonigarcia/wdm/managers/SeleniumServerStandaloneManager.java @@ -27,6 +27,9 @@ import io.github.bonigarcia.wdm.WebDriverManager; import io.github.bonigarcia.wdm.config.DriverManagerType; +import io.github.bonigarcia.wdm.online.S3BucketListNamespaceContext; + +import javax.xml.namespace.NamespaceContext; /** * Manager for selenium-server-standalone. @@ -36,6 +39,8 @@ */ public class SeleniumServerStandaloneManager extends WebDriverManager { + private static final S3BucketListNamespaceContext S3_BUCKET_LIST_NAMESPACE_CONTEXT = new S3BucketListNamespaceContext(); + @Override public DriverManagerType getDriverManagerType() { return SELENIUM_SERVER_STANDALONE; @@ -88,7 +93,7 @@ protected Optional getBrowserVersionFromTheShell() { @Override protected List getDriverUrls() throws IOException { - return getDriversFromXml(getDriverUrl(), "//Contents/Key"); + return getDriversFromXml(getDriverUrl(), "//s3:Contents/s3:Key"); } @Override @@ -107,4 +112,9 @@ protected void setBrowserVersion(String browserVersion) { // Nothing required } + @Override + protected NamespaceContext getNamespaceContext() { + return S3_BUCKET_LIST_NAMESPACE_CONTEXT; + } + } diff --git a/src/main/java/io/github/bonigarcia/wdm/online/S3BucketListNamespaceContext.java b/src/main/java/io/github/bonigarcia/wdm/online/S3BucketListNamespaceContext.java new file mode 100644 index 000000000..f9e0ca6ab --- /dev/null +++ b/src/main/java/io/github/bonigarcia/wdm/online/S3BucketListNamespaceContext.java @@ -0,0 +1,39 @@ +package io.github.bonigarcia.wdm.online; + +import javax.xml.namespace.NamespaceContext; +import java.util.Collections; +import java.util.Iterator; +import java.util.NoSuchElementException; + +public class S3BucketListNamespaceContext implements NamespaceContext { + + private static final String S3_BUCKET_LIST_NS = "http://doc.s3.amazonaws.com/2006-03-01"; + + private static final String S3_PREFIX = "s3"; + + @Override + public String getNamespaceURI(String prefix) { + if (S3_PREFIX.equals(prefix)) { + return S3_BUCKET_LIST_NS; + } + throw new IllegalArgumentException("Unsupported prefix"); + } + + @Override + public String getPrefix(String namespaceURI) { + if (S3_BUCKET_LIST_NS.equals(namespaceURI)) { + return S3_PREFIX; + } + throw new IllegalArgumentException("Unsupported namespace URI"); + } + + @Override + public Iterator getPrefixes(String namespaceURI) { + if (S3_BUCKET_LIST_NS.equals(namespaceURI)) { + return Collections.singletonList(S3_PREFIX).iterator(); + } else { + return Collections.EMPTY_LIST.iterator(); + } + } + +} diff --git a/src/test/java/io/github/bonigarcia/wdm/test/other/NamespaceContextTest.java b/src/test/java/io/github/bonigarcia/wdm/test/other/NamespaceContextTest.java new file mode 100644 index 000000000..61c4d0217 --- /dev/null +++ b/src/test/java/io/github/bonigarcia/wdm/test/other/NamespaceContextTest.java @@ -0,0 +1,137 @@ +package io.github.bonigarcia.wdm.test.other; + +import io.github.bonigarcia.wdm.WebDriverManager; +import io.github.bonigarcia.wdm.config.DriverManagerType; +import io.github.bonigarcia.wdm.online.HttpClient; +import io.github.bonigarcia.wdm.online.S3BucketListNamespaceContext; +import org.hamcrest.Matchers; +import org.junit.Test; + +import javax.xml.namespace.NamespaceContext; +import java.io.IOException; +import java.net.URL; +import java.util.Iterator; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.Optional; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; +import static org.hamcrest.core.Is.is; +import static org.hamcrest.core.IsNot.not; +import static org.junit.Assert.fail; + +public class NamespaceContextTest { + + public static final S3BucketListNamespaceContext S_3_BUCKET_LIST_NAMESPACE_CONTEXT = new S3BucketListNamespaceContext(); + + public static final String S3_URI = "http://doc.s3.amazonaws.com/2006-03-01"; + + @Test + public void testS3BucketListNamespaceContextUrls() throws IOException { + TestWebDriverManager testManager = new TestWebDriverManager(); + List urls = testManager.getDriverUrls(); + assertThat(urls, is(not(empty()))); + } + + @Test + public void testS3BucketListNamespaceContextPrefixes() { + assertThat(S_3_BUCKET_LIST_NAMESPACE_CONTEXT.getNamespaceURI("s3"), equalTo(S3_URI)); + assertThat(S_3_BUCKET_LIST_NAMESPACE_CONTEXT.getPrefix(S3_URI), equalTo("s3")); + Iterator prefixes = S_3_BUCKET_LIST_NAMESPACE_CONTEXT.getPrefixes(S3_URI); + assertThat(prefixes.next(), equalTo("s3")); + assertThat(prefixes.hasNext(), equalTo(false)); + } + + + @Test + public void testS3BucketListNamespaceContextInvalidPrefixes() { + try { + S_3_BUCKET_LIST_NAMESPACE_CONTEXT.getNamespaceURI("xmlns"); + fail("IllegalArgumentException should be thrown"); + } catch (IllegalArgumentException e) { + assertThat(e.getMessage(), equalTo("Unsupported prefix")); + } + try { + S_3_BUCKET_LIST_NAMESPACE_CONTEXT.getPrefix("http://www.w3.org/2000/xmlns/"); + fail("IllegalArgumentException should be thrown"); + } catch (IllegalArgumentException e) { + assertThat(e.getMessage(), equalTo("Unsupported namespace URI")); + } + assertThat( + S_3_BUCKET_LIST_NAMESPACE_CONTEXT.getPrefixes("http://www.w3.org/2000/xmlns/").hasNext(), + is(false) + ); + } + + private static final class TestWebDriverManager extends WebDriverManager { + + @Override + protected NamespaceContext getNamespaceContext() { + return S_3_BUCKET_LIST_NAMESPACE_CONTEXT; + } + + @Override + protected List getDriverUrls() throws IOException { + httpClient = new HttpClient(config()); + return getDriversFromXml(getDriverUrl(), "//s3:Contents/s3:Key"); + } + + @Override + protected Optional getBrowserVersionFromTheShell() { + return Optional.empty(); + } + + @Override + protected String getDriverName() { + return null; + } + + @Override + protected String getDriverVersion() { + return null; + } + + @Override + protected void setDriverVersion(String driverVersion) { + + } + + @Override + protected String getBrowserVersion() { + return null; + } + + @Override + protected void setBrowserVersion(String browserVersion) { + + } + + @Override + protected URL getDriverUrl() { + return getDriverUrlCkeckingMirror(config().getChromeDriverUrl()); + } + + @Override + protected void setDriverUrl(URL url) { + + } + + @Override + protected Optional getMirrorUrl() { + return Optional.empty(); + } + + @Override + protected Optional getExportParameter() { + return Optional.empty(); + } + + @Override + public DriverManagerType getDriverManagerType() { + return null; + } + + } + +}