/* Copyright (C) 2003-2011 JabRef contributors. 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; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ package net.sf.jabref.net; import net.sf.jabref.Globals; import net.sf.jabref.imports.ImportFormatReader; import java.awt.Component; import java.io.*; import java.net.URL; import java.net.URLConnection; import java.net.CookieHandler; import javax.swing.ProgressMonitorInputStream; /** * @author Erik Putrycz erik.putrycz-at-nrc-cnrc.gc.ca */ public class URLDownload { private URL source; private URLConnection con = null; private File dest; private Component parent; private String mimeType = null; private String content = null; private String encoding = null; private CookieHandler cm; /** * URL download to a string. After construction, call download() and then getStringContent(). * @param _source The URL to download. */ public URLDownload(URL _source) { this.source = _source; this.dest = null; this.parent = null; setCookieHandler(); } /** * URL download to a file. After construction, call download(). * @param _parent Parent component. * @param _source The URL to download. * @param _dest The file to download into. */ public URLDownload(Component _parent, URL _source, File _dest) { source = _source; dest = _dest; parent = _parent; setCookieHandler(); } public void setEncoding(String encoding) { this.encoding = encoding; } private void setCookieHandler() { try { // This should set up JabRef to receive cookies properly if ((cm = CookieHandler.getDefault()) == null) { cm = new CookieHandlerImpl(); CookieHandler.setDefault(cm); } } catch (SecurityException e) { // Setting or getting the system default cookie handler is forbidden // In this case cookie handling is not possible. } } public String getMimeType() { return mimeType; } public URLConnection getURLConnection() { return con; } /** * This method can be used after download() has been called, to get the contents * of the download, provided this URLDownload was created with the constructor * that takes no File argument. */ public String getStringContent() { return content; } public void openConnectionOnly() throws IOException { con = source.openConnection(); con.setRequestProperty("User-Agent", "Jabref"); mimeType = con.getContentType(); } public void download() throws IOException { if (con == null) { con = source.openConnection(); con.setRequestProperty("User-Agent", "Jabref"); mimeType = con.getContentType(); } if (dest != null) downloadToFile(); else downloadToString(); } protected void downloadToString() throws IOException { InputStream input = new BufferedInputStream(con.getInputStream()); Writer output = new StringWriter(); try { copy(input, output); } catch (IOException e) { e.printStackTrace(); } finally { try { input.close(); output.close(); } catch (Exception e) { } } content = output.toString(); } protected void downloadToFile() throws IOException { InputStream input = new BufferedInputStream(con.getInputStream()); OutputStream output = new BufferedOutputStream(new FileOutputStream(dest)); try { copy(input, output); } catch (IOException e) { e.printStackTrace(); } finally { try { input.close(); output.close(); } catch (Exception e) { } } } public void copy(InputStream in, OutputStream out) throws IOException { InputStream _in = new ProgressMonitorInputStream(parent, "Downloading " + source.toString(), in); byte[] buffer = new byte[512]; while(true) { int bytesRead = _in.read(buffer); if(bytesRead == -1) break; out.write(buffer, 0, bytesRead); } } public void copy(InputStream in, Writer out) throws IOException { InputStream _in = new ProgressMonitorInputStream(parent, "Downloading " + source.toString(), in); Reader r = encoding != null ? new InputStreamReader(_in, encoding) : ImportFormatReader.getReaderDefaultEncoding(_in); BufferedReader read = new BufferedReader(r); String line; while ((line = read.readLine()) != null) { out.write(line); out.write("\n"); } } }