Java tutorial
/******************************************************************************* * Copyright 2014 JHC Systems Limited * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *******************************************************************************/ /****************************************************************************** * This file contains code modified by JHC from code by Ardesco and included in Ebselen * https://github.com/Ardesco/Ebselen * Licenced as below: * Copyright (c) 2010-2011 Ardesco Solutions - http://www.ardescosolutions.com * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jhc.redsniff.webdriver.download; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.Set; import org.apache.commons.httpclient.Cookie; import org.apache.commons.httpclient.HostConfiguration; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpMethod; import org.apache.commons.httpclient.HttpState; import org.apache.commons.httpclient.cookie.CookiePolicy; import org.apache.commons.httpclient.methods.GetMethod; import org.openqa.selenium.WebDriver; public class FileDownloader { private static final int HTTP_SUCCESS_CODE = 200; private static final int MAX_ATTEMPTS = 5; private final WebDriver driver; public FileDownloader(WebDriver driver) { this.driver = driver; } public File downloadFrom(String downloadLocation, String extension) throws IOException { String fileName = "temp" + extension; String downloadDir = new File(".\\").getCanonicalPath() + "\\"; String downloadFilePath = downloadDir + fileName; File file = new File(downloadFilePath); ensureFileNotPresent(file); doDownload(downloadFilePath, createAbsoluteUrl(downloadLocation)); return file; } private void ensureFileNotPresent(File file) throws AssertionError { if (file.exists()) if (!file.delete()) throw new AssertionError("File exists and could not be deleted"); } private HttpState mimicCookieState(Set<org.openqa.selenium.Cookie> seleniumCookieSet) { HttpState mimicWebDriverCookieState = new HttpState(); for (org.openqa.selenium.Cookie seleniumCookie : seleniumCookieSet) { Cookie httpClientCookie = new Cookie(seleniumCookie.getDomain(), seleniumCookie.getName(), seleniumCookie.getValue(), seleniumCookie.getPath(), seleniumCookie.getExpiry(), seleniumCookie.isSecure()); mimicWebDriverCookieState.addCookie(httpClientCookie); } return mimicWebDriverCookieState; } private HostConfiguration mimicHostConfiguration(String hostURL, int hostPort) { HostConfiguration hostConfig = new HostConfiguration(); hostConfig.setHost(hostURL, hostPort); return hostConfig; } private String createAbsoluteUrl(String relativePath) { String basePart = ""; if (!relativePath.startsWith("http")) basePart += driver.getCurrentUrl(); if (!relativePath.toLowerCase().contains("jsessionid")) basePart += getJSessionString(); return basePart + relativePath; } private String getJSessionString() { for (org.openqa.selenium.Cookie cookie : driver.manage().getCookies()) { if (cookie.getName().equalsIgnoreCase("jsessionid")) { return ";jsessionid=" + cookie.getValue(); } } return null; } private void doDownload(String filePath, String downloadLocation) { URL downloadURL = createURL(downloadLocation); File downloadedFile = new File(filePath); try { doDownloadUrlToFile(downloadURL, downloadedFile); } catch (Exception e) { throw new RuntimeException(e); } } protected URL createURL(String downloadLocation) { try { return new URL(downloadLocation); } catch (MalformedURLException e) { throw new RuntimeException(e); } } private void doDownloadUrlToFile(URL downloadURL, File downloadFile) throws Exception { HttpClient client = createHttpClient(downloadURL); HttpMethod getRequest = new GetMethod(downloadURL.toString()); try { int status = -1; for (int attempts = 0; attempts < MAX_ATTEMPTS && status != HTTP_SUCCESS_CODE; attempts++) status = client.executeMethod(getRequest); if (status != HTTP_SUCCESS_CODE) throw new Exception("Got " + status + " status trying to download file " + downloadURL.toString() + " to " + downloadFile.toString()); BufferedInputStream in = new BufferedInputStream(getRequest.getResponseBodyAsStream()); BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(downloadFile)); int offset = 0; int len = 4096; int bytes = 0; byte[] block = new byte[len]; while ((bytes = in.read(block, offset, len)) > -1) { out.write(block, 0, bytes); } out.close(); in.close(); } catch (Exception e) { throw e; } finally { getRequest.releaseConnection(); } } private HttpClient createHttpClient(URL downloadURL) { HttpClient client = new HttpClient(); client.getParams().setCookiePolicy(CookiePolicy.RFC_2965); client.setHostConfiguration(mimicHostConfiguration(downloadURL.getHost(), downloadURL.getPort())); client.setState(mimicCookieState(driver.manage().getCookies())); return client; } }