Mercurial > hg > monetdb-java
annotate src/main/java/org/monetdb/util/FileTransferHandler.java @ 973:32f246853ec4 default tip
Optimisation, call connection.mapClobAsVarChar() and connection.mapBlobAsVarBinary() outside the for-loop, as it does not change.
author | Martin van Dinther <martin.van.dinther@monetdbsolutions.com> |
---|---|
date | Thu, 10 Apr 2025 19:26:59 +0200 (2 weeks ago) |
parents | d416e9b6b3d0 |
children |
rev | line source |
---|---|
542
d462000fc410
Various changes suggested by Martin van Dinther
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
541
diff
changeset
|
1 /* |
833
e890195256ac
Update copyright for the new year, move to MonetDB Foundation, add SPDX.
Sjoerd Mullender <sjoerd@acm.org>
parents:
716
diff
changeset
|
2 * SPDX-License-Identifier: MPL-2.0 |
e890195256ac
Update copyright for the new year, move to MonetDB Foundation, add SPDX.
Sjoerd Mullender <sjoerd@acm.org>
parents:
716
diff
changeset
|
3 * |
542
d462000fc410
Various changes suggested by Martin van Dinther
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
541
diff
changeset
|
4 * This Source Code Form is subject to the terms of the Mozilla Public |
d462000fc410
Various changes suggested by Martin van Dinther
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
541
diff
changeset
|
5 * License, v. 2.0. If a copy of the MPL was not distributed with this |
d462000fc410
Various changes suggested by Martin van Dinther
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
541
diff
changeset
|
6 * file, You can obtain one at http://mozilla.org/MPL/2.0/. |
d462000fc410
Various changes suggested by Martin van Dinther
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
541
diff
changeset
|
7 * |
937
d416e9b6b3d0
Update Copyright year.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
833
diff
changeset
|
8 * Copyright 2024, 2025 MonetDB Foundation; |
833
e890195256ac
Update copyright for the new year, move to MonetDB Foundation, add SPDX.
Sjoerd Mullender <sjoerd@acm.org>
parents:
716
diff
changeset
|
9 * Copyright August 2008 - 2023 MonetDB B.V.; |
e890195256ac
Update copyright for the new year, move to MonetDB Foundation, add SPDX.
Sjoerd Mullender <sjoerd@acm.org>
parents:
716
diff
changeset
|
10 * Copyright 1997 - July 2008 CWI. |
542
d462000fc410
Various changes suggested by Martin van Dinther
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
541
diff
changeset
|
11 */ |
d462000fc410
Various changes suggested by Martin van Dinther
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
541
diff
changeset
|
12 |
504
8aa70bd8d21f
Register upload handler and download handler separately
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
13 package org.monetdb.util; |
8aa70bd8d21f
Register upload handler and download handler separately
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
14 |
514
443780d71bae
More renaming. user registers MonetUploadHandler which is handed an Upload
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
504
diff
changeset
|
15 import org.monetdb.jdbc.MonetConnection; |
504
8aa70bd8d21f
Register upload handler and download handler separately
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
16 |
578
687034945b3f
Pass expected encoding as a constructor parameter to FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
576
diff
changeset
|
17 import java.io.BufferedReader; |
579
72f4437de9be
Reencode downloads if necessary
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
578
diff
changeset
|
18 import java.io.BufferedWriter; |
504
8aa70bd8d21f
Register upload handler and download handler separately
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
19 import java.io.IOException; |
595
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
20 import java.io.InputStream; |
603
7a6b003d65d6
Fix Gzip Reader in FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
597
diff
changeset
|
21 import java.io.InputStreamReader; |
579
72f4437de9be
Reencode downloads if necessary
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
578
diff
changeset
|
22 import java.io.OutputStream; |
603
7a6b003d65d6
Fix Gzip Reader in FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
597
diff
changeset
|
23 import java.io.OutputStreamWriter; |
504
8aa70bd8d21f
Register upload handler and download handler separately
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
24 import java.nio.charset.Charset; |
8aa70bd8d21f
Register upload handler and download handler separately
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
25 import java.nio.charset.StandardCharsets; |
8aa70bd8d21f
Register upload handler and download handler separately
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
26 import java.nio.file.FileSystems; |
8aa70bd8d21f
Register upload handler and download handler separately
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
27 import java.nio.file.Files; |
8aa70bd8d21f
Register upload handler and download handler separately
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
28 import java.nio.file.Path; |
514
443780d71bae
More renaming. user registers MonetUploadHandler which is handed an Upload
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
504
diff
changeset
|
29 import java.nio.file.StandardOpenOption; |
595
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
30 import java.util.zip.GZIPInputStream; |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
31 import java.util.zip.GZIPOutputStream; |
504
8aa70bd8d21f
Register upload handler and download handler separately
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
32 |
535
c9d88af06d35
Javadoc and some minor changes
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
515
diff
changeset
|
33 /** |
595
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
34 * Default implementation of UploadHandler and DownloadHandler interfaces |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
35 * for reading from and writing to files on the local file system. |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
36 * It enables support for: |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
37 * COPY .. INTO table FROM 'file-name' ON CLIENT ... |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
38 * and |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
39 * COPY SELECT_query INTO 'file-name' ON CLIENT ... |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
40 * handling. |
535
c9d88af06d35
Javadoc and some minor changes
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
515
diff
changeset
|
41 * |
595
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
42 * Currently only file compression format .gz is supported. This is intentionally |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
43 * as other compression formats would introduce dependencies on external |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
44 * libraries which complicates usage of JDBC driver or JdbcClient application. |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
45 * Developers can of course build their own MyFileTransferHandler class |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
46 * and use it instead of this default implementation. |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
47 * |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
48 * A FileTransferHandler object needs to be registered via |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
49 * {@link MonetConnection#setUploadHandler(MonetConnection.UploadHandler)} and/or |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
50 * {@link MonetConnection#setDownloadHandler(MonetConnection.DownloadHandler)}. |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
51 * |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
52 * @author Joeri van Ruth |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
53 * @author Martin van Dinther |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
54 * @version 1.1 |
535
c9d88af06d35
Javadoc and some minor changes
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
515
diff
changeset
|
55 */ |
541
31df6a12fd41
Make the MonetUploadHandler and MonetDownloadHandler interfaces part of MonetConnection
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
535
diff
changeset
|
56 public class FileTransferHandler implements MonetConnection.UploadHandler, MonetConnection.DownloadHandler { |
504
8aa70bd8d21f
Register upload handler and download handler separately
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
57 private final Path root; |
578
687034945b3f
Pass expected encoding as a constructor parameter to FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
576
diff
changeset
|
58 private final Charset encoding; |
504
8aa70bd8d21f
Register upload handler and download handler separately
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
59 |
535
c9d88af06d35
Javadoc and some minor changes
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
515
diff
changeset
|
60 /** |
c9d88af06d35
Javadoc and some minor changes
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
515
diff
changeset
|
61 * Create a new FileTransferHandler which serves the given directory. |
595
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
62 * |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
63 * @param dir directory Path to read and write files from |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
64 * @param encoding the specified characterSet encoding is used for all data files in the directory |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
65 * when null the Charset.defaultCharset() is used. |
535
c9d88af06d35
Javadoc and some minor changes
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
515
diff
changeset
|
66 */ |
578
687034945b3f
Pass expected encoding as a constructor parameter to FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
576
diff
changeset
|
67 public FileTransferHandler(final Path dir, final Charset encoding) { |
687034945b3f
Pass expected encoding as a constructor parameter to FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
576
diff
changeset
|
68 this.root = dir.toAbsolutePath().normalize(); |
581
5aef0ea654b1
Take null to mean the default charset
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
579
diff
changeset
|
69 this.encoding = encoding != null ? encoding: Charset.defaultCharset(); |
504
8aa70bd8d21f
Register upload handler and download handler separately
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
70 } |
8aa70bd8d21f
Register upload handler and download handler separately
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
71 |
535
c9d88af06d35
Javadoc and some minor changes
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
515
diff
changeset
|
72 /** |
c9d88af06d35
Javadoc and some minor changes
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
515
diff
changeset
|
73 * Create a new FileTransferHandler which serves the given directory. |
c9d88af06d35
Javadoc and some minor changes
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
515
diff
changeset
|
74 * |
595
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
75 * @param dir directory String to read and write files from |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
76 * @param encoding the specified characterSet encoding is used for all data files in the directory |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
77 * when null the Charset.defaultCharset() is used. |
535
c9d88af06d35
Javadoc and some minor changes
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
515
diff
changeset
|
78 */ |
578
687034945b3f
Pass expected encoding as a constructor parameter to FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
576
diff
changeset
|
79 public FileTransferHandler(final String dir, final Charset encoding) { |
687034945b3f
Pass expected encoding as a constructor parameter to FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
576
diff
changeset
|
80 this(FileSystems.getDefault().getPath(dir), encoding); |
504
8aa70bd8d21f
Register upload handler and download handler separately
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
81 } |
8aa70bd8d21f
Register upload handler and download handler separately
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
82 |
595
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
83 /** |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
84 * Read the data from the specified file (in the root directory) and upload it to the server. |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
85 */ |
576
095e896f9d7a
Updated comments. Improved code. Added final keywords
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
571
diff
changeset
|
86 public void handleUpload(final MonetConnection.Upload handle, final String name, final boolean textMode, final long linesToSkip) throws IOException { |
595
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
87 if (name == null || name.isEmpty()) { |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
88 handle.sendError("Missing file name"); |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
89 return; |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
90 } |
576
095e896f9d7a
Updated comments. Improved code. Added final keywords
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
571
diff
changeset
|
91 final Path path = root.resolve(name).normalize(); |
504
8aa70bd8d21f
Register upload handler and download handler separately
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
92 if (!path.startsWith(root)) { |
595
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
93 handle.sendError("File is not in upload directory: " + root.toString()); |
504
8aa70bd8d21f
Register upload handler and download handler separately
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
94 return; |
8aa70bd8d21f
Register upload handler and download handler separately
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
95 } |
8aa70bd8d21f
Register upload handler and download handler separately
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
96 if (!Files.isReadable(path)) { |
595
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
97 handle.sendError("Cannot read file " + path.toString()); |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
98 return; |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
99 } |
603
7a6b003d65d6
Fix Gzip Reader in FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
597
diff
changeset
|
100 |
595
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
101 // In this implementation we ONLY support gzip compression format and none of the other compression formats. |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
102 if (name.endsWith(".bz2") || name.endsWith(".lz4") || name.endsWith(".xz") || name.endsWith(".zip")) { |
597
f30b319d57b8
Removed strange character lastIndexOf???('.') in method name. It reported a compilation error on Windows but not on Linux.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
596
diff
changeset
|
103 final String extension = name.substring(name.lastIndexOf('.')); |
595
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
104 handle.sendError("Specified file compression format " + extension + " is not supported. Only .gz is supported."); |
504
8aa70bd8d21f
Register upload handler and download handler separately
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
105 return; |
8aa70bd8d21f
Register upload handler and download handler separately
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
106 } |
595
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
107 |
603
7a6b003d65d6
Fix Gzip Reader in FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
597
diff
changeset
|
108 InputStream byteStream = Files.newInputStream(path); |
7a6b003d65d6
Fix Gzip Reader in FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
597
diff
changeset
|
109 if (name.endsWith(".gz")) { |
7a6b003d65d6
Fix Gzip Reader in FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
597
diff
changeset
|
110 byteStream = new GZIPInputStream(byteStream, 128 * 1024); |
7a6b003d65d6
Fix Gzip Reader in FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
597
diff
changeset
|
111 } |
7a6b003d65d6
Fix Gzip Reader in FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
597
diff
changeset
|
112 |
595
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
113 if (!textMode || (linesToSkip == 0 && utf8Encoded())) { |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
114 // when !textMode we must upload as a byte stream |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
115 // when utf8Encoded and linesToSkip is 0 it is more efficient to upload as a byte stream |
603
7a6b003d65d6
Fix Gzip Reader in FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
597
diff
changeset
|
116 handle.uploadFrom(byteStream); |
7a6b003d65d6
Fix Gzip Reader in FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
597
diff
changeset
|
117 byteStream.close(); |
579
72f4437de9be
Reencode downloads if necessary
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
578
diff
changeset
|
118 } else { |
595
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
119 // cannot upload as a byte stream, must deal with encoding and/or linesToSkip |
603
7a6b003d65d6
Fix Gzip Reader in FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
597
diff
changeset
|
120 final BufferedReader reader = new BufferedReader(new InputStreamReader(byteStream, encoding)); |
7a6b003d65d6
Fix Gzip Reader in FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
597
diff
changeset
|
121 handle.uploadFrom(reader, linesToSkip); |
7a6b003d65d6
Fix Gzip Reader in FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
597
diff
changeset
|
122 reader.close(); |
504
8aa70bd8d21f
Register upload handler and download handler separately
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
123 } |
8aa70bd8d21f
Register upload handler and download handler separately
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
diff
changeset
|
124 } |
515
7bbcff2c775b
Also implement downloadTo(), and use it in FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
514
diff
changeset
|
125 |
595
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
126 /** |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
127 * Download the data from the server and write it to a new created file in the root directory. |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
128 * When a file with the same name already exists the download request will send an error and NOT overwrite the existing file. |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
129 */ |
576
095e896f9d7a
Updated comments. Improved code. Added final keywords
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
571
diff
changeset
|
130 public void handleDownload(final MonetConnection.Download handle, final String name, final boolean textMode) throws IOException { |
595
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
131 if (name == null || name.isEmpty()) { |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
132 handle.sendError("Missing file name"); |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
133 return; |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
134 } |
576
095e896f9d7a
Updated comments. Improved code. Added final keywords
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
571
diff
changeset
|
135 final Path path = root.resolve(name).normalize(); |
515
7bbcff2c775b
Also implement downloadTo(), and use it in FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
514
diff
changeset
|
136 if (!path.startsWith(root)) { |
595
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
137 handle.sendError("File is not in download directory: " + root.toString()); |
515
7bbcff2c775b
Also implement downloadTo(), and use it in FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
514
diff
changeset
|
138 return; |
7bbcff2c775b
Also implement downloadTo(), and use it in FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
514
diff
changeset
|
139 } |
567
e068d2039e14
Silly bug in FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
551
diff
changeset
|
140 if (Files.exists(path)) { |
595
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
141 handle.sendError("File already exists: " + path.toString()); |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
142 return; |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
143 } |
603
7a6b003d65d6
Fix Gzip Reader in FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
597
diff
changeset
|
144 |
595
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
145 // In this implementation we ONLY support gzip compression format and none of the other compression formats. |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
146 if (name.endsWith(".bz2") || name.endsWith(".lz4") || name.endsWith(".xz") || name.endsWith(".zip")) { |
597
f30b319d57b8
Removed strange character lastIndexOf???('.') in method name. It reported a compilation error on Windows but not on Linux.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
596
diff
changeset
|
147 final String extension = name.substring(name.lastIndexOf('.')); |
595
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
148 handle.sendError("Requested file compression format " + extension + " is not supported. Use .gz instead."); |
515
7bbcff2c775b
Also implement downloadTo(), and use it in FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
514
diff
changeset
|
149 return; |
7bbcff2c775b
Also implement downloadTo(), and use it in FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
514
diff
changeset
|
150 } |
595
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
151 |
603
7a6b003d65d6
Fix Gzip Reader in FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
597
diff
changeset
|
152 OutputStream byteStream = Files.newOutputStream(path, StandardOpenOption.CREATE_NEW); |
7a6b003d65d6
Fix Gzip Reader in FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
597
diff
changeset
|
153 if (name.endsWith(".gz")) { |
7a6b003d65d6
Fix Gzip Reader in FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
597
diff
changeset
|
154 byteStream = new GZIPOutputStream(byteStream, 128 * 1024); |
7a6b003d65d6
Fix Gzip Reader in FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
597
diff
changeset
|
155 } |
7a6b003d65d6
Fix Gzip Reader in FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
597
diff
changeset
|
156 |
595
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
157 if (!textMode || utf8Encoded()) { |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
158 // when !textMode we must download as a byte stream |
36df3c89845d
Extended FileTransferHandler utility class by adding support for reading from and writing to gzip compressed files when using file name extension .gz
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
581
diff
changeset
|
159 // when utf8Encoded it is more efficient to download as a byte stream |
603
7a6b003d65d6
Fix Gzip Reader in FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
597
diff
changeset
|
160 handle.downloadTo(byteStream); |
7a6b003d65d6
Fix Gzip Reader in FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
597
diff
changeset
|
161 byteStream.close(); |
579
72f4437de9be
Reencode downloads if necessary
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
578
diff
changeset
|
162 } else { |
72f4437de9be
Reencode downloads if necessary
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
578
diff
changeset
|
163 // cannot download as a byte stream, must deal with encoding |
603
7a6b003d65d6
Fix Gzip Reader in FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
597
diff
changeset
|
164 final BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(byteStream, encoding)); |
7a6b003d65d6
Fix Gzip Reader in FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
597
diff
changeset
|
165 handle.downloadTo(writer); |
7a6b003d65d6
Fix Gzip Reader in FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
597
diff
changeset
|
166 writer.close(); |
579
72f4437de9be
Reencode downloads if necessary
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
578
diff
changeset
|
167 } |
515
7bbcff2c775b
Also implement downloadTo(), and use it in FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
514
diff
changeset
|
168 } |
578
687034945b3f
Pass expected encoding as a constructor parameter to FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
576
diff
changeset
|
169 |
579
72f4437de9be
Reencode downloads if necessary
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
578
diff
changeset
|
170 public boolean utf8Encoded() { |
578
687034945b3f
Pass expected encoding as a constructor parameter to FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
576
diff
changeset
|
171 return encoding.equals(StandardCharsets.UTF_8); |
687034945b3f
Pass expected encoding as a constructor parameter to FileTransferHandler
Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
parents:
576
diff
changeset
|
172 } |
576
095e896f9d7a
Updated comments. Improved code. Added final keywords
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents:
571
diff
changeset
|
173 } |