/*
GeoGebra - Dynamic Mathematics for Everyone
http://www.geogebra.org
This file is part of GeoGebra.
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation.
*/
package org.geogebra.common.jre.util;
import java.io.BufferedInputStream;
import java.io.Closeable;
import java.io.File;
import java.io.FileOutputStream;
import java.net.URL;
import java.net.URLConnection;
import org.geogebra.common.util.debug.Log;
/**
* Helper for downloading files
*
*/
public class DownloadManager {
// size of byte buffer to download / copy files
private static final int BYTE_BUFFER_SIZE = 65536;
/**
* Copies or downloads url to destination file.
*
* @param src
* source file
* @param dest
* target file
* @throws Exception
* if URL can't be opened or writing fails
*/
public static void copyURLToFile(URL src, File dest) throws Exception {
BufferedInputStream in = null;
FileOutputStream out = null;
try {
// open input stream to src URL
URLConnection srcConnection = src.openConnection();
// Application.debug(srcConnection.getLastModified() + " " +
// dest.lastModified() + " " +
// srcConnection.getContentLength() + " " + dest.length());
if (srcConnection.getContentLength() == 0) {
// eg running from Eclipse
Log.debug(src.getFile() + " not found");
return;
}
// Check if this file has already been downloaded:
if (srcConnection.getLastModified() <= dest.lastModified()
&& srcConnection.getContentLength() == dest.length()) {
// Yes. No extra download is required. :-)
Log.debug(src.getFile() + " has already been downloaded to "
+ dest.toString());
return;
}
// Creating a user readable filename (trimming the directory name):
boolean done = false;
int i;
for (i = src.getFile().length() - 1; i > 0 && !done; i--) {
char c = src.getFile().charAt(i);
// maybe DIRECTORY_SEPARATOR would be better
if (c == '/' || c == '\\') {
done = true;
}
}
in = new BufferedInputStream(srcConnection.getInputStream());
// if (in == null)
// throw new NullPointerException("URL not found: " + src);
// create output file
out = new FileOutputStream(dest);
byte[] buf = new byte[BYTE_BUFFER_SIZE];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
out.close();
boolean ok = dest.setLastModified(srcConnection.getLastModified());
if (!ok) {
Log.warn("Problem downloading " + src);
}
in.close();
} catch (Exception e) {
closeSilent(in);
closeSilent(out);
throw e;
}
}
/**
* Closes stream without errors
*
* @param c
* stream or null
*/
public static void closeSilent(Closeable c) {
try {
if (c != null) {
c.close();
}
} catch (Exception ex) {
Log.error(ex.toString());
}
}
}