Merge branch 'bug/JAL-3806_mappingCoversSequence' into releases/Release_2_11_1_Branch
[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.FileOutputStream;
25 import java.io.IOException;
26 import java.net.URL;
27 import java.nio.channels.Channels;
28 import java.nio.channels.ReadableByteChannel;
29 import java.nio.file.Files;
30 import java.nio.file.Path;
31 import java.nio.file.Paths;
32 import java.nio.file.StandardCopyOption;
33
34 public class UrlDownloadClient
35 {
36   /**
37    * Download and save a file from a URL
38    * 
39    * @param urlstring
40    *          url to download from, as string
41    * @param outfile
42    *          the name of file to save the URLs to
43    * @throws IOException
44    */
45   public static void download(String urlstring, String outfile)
46           throws IOException
47   {
48     FileOutputStream fos = null;
49     ReadableByteChannel rbc = null;
50     Path temp = null;
51     try
52     {
53       temp = Files.createTempFile(".jalview_", ".tmp");
54
55       URL url = new URL(urlstring);
56       rbc = Channels.newChannel(url.openStream());
57       fos = new FileOutputStream(temp.toString());
58       fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
59
60       // copy tempfile to outfile once our download completes
61       // incase something goes wrong
62       Files.copy(temp, Paths.get(outfile),
63               StandardCopyOption.REPLACE_EXISTING);
64     } catch (IOException e)
65     {
66       throw e;
67     } finally
68     {
69       try
70       {
71         if (fos != null)
72         {
73           fos.close();
74         }
75       } catch (IOException e)
76       {
77         System.out.println(
78                 "Exception while closing download file output stream: "
79                         + e.getMessage());
80       }
81       try
82       {
83         if (rbc != null)
84         {
85           rbc.close();
86         }
87       } catch (IOException e)
88       {
89         System.out.println("Exception while closing download channel: "
90                 + e.getMessage());
91       }
92       try
93       {
94         if (temp != null)
95         {
96           Files.deleteIfExists(temp);
97         }
98       } catch (IOException e)
99       {
100         System.out.println("Exception while deleting download temp file: "
101                 + e.getMessage());
102       }
103     }
104   }
105 }