/*
* Copyright (c) 2006-2008 Chris Smith, Shane Mc Cormack, Gregory Holmes
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
//package com.dmdirc.util;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* Allows easy downloading of files from HTTP sites.
*
* @author Chris
*/
public class Downloader {
/** Creates a new instance of Downloader. */
private Downloader() {
// Shouldn't be used
}
/**
* Retrieves the specified page.
*
* @param url The URL to retrieve
* @return A list of lines received from the server
* @throws java.net.MalformedURLException If the URL is malformed
* @throws java.io.IOException If there's an I/O error while downloading
*/
public static List getPage(final String url)
throws MalformedURLException, IOException {
return getPage(url, "");
}
/**
* Retrieves the specified page, sending the specified post data.
*
* @param url The URL to retrieve
* @param postData The raw POST data to send
* @return A list of lines received from the server
* @throws java.net.MalformedURLException If the URL is malformed
* @throws java.io.IOException If there's an I/O error while downloading
*/
public static List getPage(final String url, final String postData)
throws MalformedURLException, IOException {
final List res = new ArrayList();
final URLConnection urlConn = getConnection(url, postData);
final BufferedReader in = new BufferedReader(
new InputStreamReader(urlConn.getInputStream()));
String line;
do {
line = in.readLine();
if (line != null) {
res.add(line);
}
} while (line != null);
in.close();
return res;
}
/**
* Retrieves the specified page, sending the specified post data.
*
* @param url The URL to retrieve
* @param postData A map of post data that should be sent
* @return A list of lines received from the server
* @throws java.net.MalformedURLException If the URL is malformed
* @throws java.io.IOException If there's an I/O error while downloading
*/
public static List getPage(final String url, final Map postData)
throws MalformedURLException, IOException {
final StringBuilder data = new StringBuilder();
try {
for (Map.Entry entry : postData.entrySet()) {
data.append('&');
data.append(URLEncoder.encode(entry.getKey(), "UTF-8"));
data.append('=');
data.append(URLEncoder.encode(entry.getValue(), "UTF-8"));
}
} catch (UnsupportedEncodingException ex) {
System.out.println("URLEncoder doesn't support UTF-8");
}
return getPage(url, data.length() == 0 ? "" : data.substring(1));
}
/**
* Downloads the specified page to disk.
*
* @param url The URL to retrieve
* @param file The file to save the page to
* @throws java.io.IOException If there's an I/O error while downloading
*/
public static void downloadPage(final String url, final String file)
throws IOException {
downloadPage(url, file, null);
}
/**
* Downloads the specified page to disk.
*
* @param url The URL to retrieve
* @param file The file to save the page to
* @param listener The progress listener for this download
* @throws java.io.IOException If there's an I/O error while downloading
*/
public static void downloadPage(final String url, final String file,
final DownloadListener listener) throws IOException {
final URLConnection urlConn = getConnection(url, "");
final File myFile = new File(file);
final FileOutputStream output = new FileOutputStream(myFile);
final InputStream input = urlConn.getInputStream();
final int length = urlConn.getContentLength();
int current = 0;
final byte[] buffer = new byte[512];
int count;
do {
count = input.read(buffer);
if (count > 0) {
current += count;
output.write(buffer, 0, count);
if (listener != null) {
listener.downloadProgress(100 * current / length);
}
}
} while (count > 0);
input.close();
output.close();
}
/**
* Creates an URL connection for the specified URL and data.
*
* @param url The URL to connect to
* @param postData The POST data to pass to the URL
* @return An URLConnection for the specified URL/data
* @throws java.net.MalformedURLException If the specified URL is malformed
* @throws java.io.IOException If an I/O exception occurs while connecting
*/
private static URLConnection getConnection(final String url, final String postData)
throws MalformedURLException, IOException {
final URL myUrl = new URL(url);
final URLConnection urlConn = myUrl.openConnection();
urlConn.setUseCaches(false);
urlConn.setDoInput(true);
urlConn.setDoOutput(postData.length() > 0);
urlConn.setConnectTimeout(10000);
if (postData.length() > 0) {
urlConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
final DataOutputStream out = new DataOutputStream(urlConn.getOutputStream());
out.writeBytes(postData);
out.flush();
out.close();
}
return urlConn;
}
}
/**
* Defines the method that objects interested in receiving download progress
* updates should implement.
*
* @author chris
*/
interface DownloadListener {
/**
* Called when the progress of the download has changed.
*
* @param percent The percentage of the file that has been downloaded
*/
void downloadProgress(float percent);
}