cfe080ca80546a3cd0e03445c3f8dc3af93f8bd0
[jalview.git] / src / jalview / ws / utils / UrlDownloadClient.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21
22 package jalview.ws.utils;
23
24 import java.io.ByteArrayInputStream;
25 import java.io.File;
26 import java.io.FileOutputStream;
27 import java.io.IOException;
28 import java.net.URL;
29 import java.nio.channels.Channels;
30 import java.nio.channels.ReadableByteChannel;
31 import java.nio.file.Files;
32 import java.nio.file.Path;
33 import java.nio.file.Paths;
34 import java.nio.file.StandardCopyOption;
35
36 public class UrlDownloadClient
37 {
38   public UrlDownloadClient()
39   {
40
41   }
42
43   /**
44    * Download and save a file from a URL
45    * 
46    * @param urlstring
47    *          url to download from, as string
48    * @param outfile
49    *          the name of file to save the URLs to
50    * @throws IOException
51    */
52   public static void download(String urlstring, String outfile)
53           throws IOException
54   {
55
56       FileOutputStream fos = null;
57       ReadableByteChannel rbc = null;
58       Path temp = null;
59       try
60       {
61         temp = Files.createTempFile(".jalview_", ".tmp");
62
63         URL url = new URL(urlstring);
64         rbc = Channels.newChannel(url.openStream());
65         fos = new FileOutputStream(temp.toString());
66         fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
67
68         // copy tempfile to outfile once our download completes
69         // incase something goes wrong
70         Files.copy(temp, Paths.get(outfile),
71                 StandardCopyOption.REPLACE_EXISTING);
72       } catch (IOException e)
73       {
74         throw e;
75       } finally
76       {
77         try
78         {
79           if (fos != null)
80           {
81             fos.close();
82           }
83         } catch (IOException e)
84         {
85           System.out.println(
86                   "Exception while closing download file output stream: "
87                           + e.getMessage());
88         }
89         try
90         {
91           if (rbc != null)
92           {
93             rbc.close();
94           }
95         } catch (IOException e)
96         {
97           System.out.println("Exception while closing download channel: "
98                   + e.getMessage());
99         }
100         try
101         {
102           if (temp != null)
103           {
104             Files.deleteIfExists(temp);
105           }
106         } catch (IOException e)
107         {
108           System.out.println("Exception while deleting download temp file: "
109                   + e.getMessage());
110         }
111       }
112
113   }
114
115   public static void download(String urlstring, File tempFile) throws IOException
116   {
117     if (/** @j2sNative 1?false: */true) {
118       download(urlstring, tempFile.toString());
119     }
120     // JavaScript only
121
122     /** @j2sNative 
123      * tempFile._bytes = swingjs.JSUtil.getFileAsBytes(urlstring); 
124      */
125   }
126 }