changeset 578:687034945b3f onclient

Pass expected encoding as a constructor parameter to FileTransferHandler
author Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
date Thu, 14 Oct 2021 15:25:31 +0200 (2021-10-14)
parents 6ab9168ef8e1
children 72f4437de9be
files src/main/java/org/monetdb/client/JdbcClient.java src/main/java/org/monetdb/util/FileTransferHandler.java tests/OnClientTester.java
diffstat 3 files changed, 21 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/org/monetdb/client/JdbcClient.java
+++ b/src/main/java/org/monetdb/client/JdbcClient.java
@@ -27,6 +27,7 @@ import java.io.File;
 import java.io.PrintWriter;
 import java.net.HttpURLConnection;
 import java.net.URL;
+import java.nio.charset.Charset;
 import java.sql.Connection;
 import java.sql.DatabaseMetaData;
 import java.sql.DriverManager;	// this import is required as it will trigger loading the org.monetdb.jdbc.MonetDriver class
@@ -353,7 +354,7 @@ public class JdbcClient {	/* cannot (yet
 				// check if provided csvdir is an existing dir
 				// else a download of data into file will terminate the JDBC connection!!
 				if (java.nio.file.Files.isDirectory(java.nio.file.Paths.get(csvdir))) {
-					final FileTransferHandler FThandler = new FileTransferHandler(csvdir, true);
+					final FileTransferHandler FThandler = new FileTransferHandler(csvdir, Charset.defaultCharset());
 
 					// register file data uploadHandler to allow support
 					// for: COPY INTO mytable FROM 'data.csv' ON CLIENT;
--- a/src/main/java/org/monetdb/util/FileTransferHandler.java
+++ b/src/main/java/org/monetdb/util/FileTransferHandler.java
@@ -10,6 +10,7 @@ package org.monetdb.util;
 
 import org.monetdb.jdbc.MonetConnection;
 
+import java.io.BufferedReader;
 import java.io.IOException;
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
@@ -27,17 +28,16 @@ import java.nio.file.StandardOpenOption;
  */
 public class FileTransferHandler implements MonetConnection.UploadHandler, MonetConnection.DownloadHandler {
 	private final Path root;
-	private final boolean utf8Encoded;
+	private final Charset encoding;
 
 	/**
 	 * Create a new FileTransferHandler which serves the given directory.
-	 *
 	 * @param dir directory to read and write files from
-	 * @param utf8Encoded set this to true if all files in the directory are known to be utf-8 encoded.
+	 * @param encoding set this to true if all files in the directory are known to be utf-8 encoded.
 	 */
-	public FileTransferHandler(final Path dir, final boolean utf8Encoded) {
-		root = dir.toAbsolutePath().normalize();
-		this.utf8Encoded = utf8Encoded;
+	public FileTransferHandler(final Path dir, final Charset encoding) {
+		this.root = dir.toAbsolutePath().normalize();
+		this.encoding = encoding;
 	}
 
 	/**
@@ -46,8 +46,8 @@ public class FileTransferHandler impleme
 	 * @param dir directory to read and write files from
 	 * @param utf8Encoded set this to true if all files in the directory are known to be utf-8 encoded.
 	 */
-	public FileTransferHandler(final String dir, final boolean utf8Encoded) {
-		this(FileSystems.getDefault().getPath(dir), utf8Encoded);
+	public FileTransferHandler(final String dir, final Charset encoding) {
+		this(FileSystems.getDefault().getPath(dir), encoding);
 	}
 
 	public void handleUpload(final MonetConnection.Upload handle, final String name, final boolean textMode, final long linesToSkip) throws IOException {
@@ -60,9 +60,9 @@ public class FileTransferHandler impleme
 			handle.sendError("Cannot read " + name);
 			return;
 		}
-		if (textMode && (linesToSkip > 0 || !utf8Encoded)) {
-			final Charset encoding = utf8Encoded ? StandardCharsets.UTF_8 : Charset.defaultCharset();
-			handle.uploadFrom(Files.newBufferedReader(path, encoding), linesToSkip);
+		if (textMode && (linesToSkip > 0 || !isUtf8Encoded())) {
+			final BufferedReader reader = Files.newBufferedReader(path, encoding);
+			handle.uploadFrom(reader, linesToSkip);
 		} else {
 			handle.uploadFrom(Files.newInputStream(path));
 		}
@@ -80,4 +80,8 @@ public class FileTransferHandler impleme
 		}
 		handle.downloadTo(Files.newOutputStream(path, StandardOpenOption.CREATE_NEW));
 	}
+
+	public boolean isUtf8Encoded() {
+		return encoding.equals(StandardCharsets.UTF_8);
+	}
 }
--- a/tests/OnClientTester.java
+++ b/tests/OnClientTester.java
@@ -365,7 +365,7 @@ public final class OnClientTester extend
 		ps.println("2|two");
 		ps.println("3|three");
 		ps.close();
-		conn.setUploadHandler(new FileTransferHandler(d, true));
+		conn.setUploadHandler(new FileTransferHandler(d, StandardCharsets.UTF_8));
 		update("COPY INTO foo FROM 'data.txt' ON CLIENT");
 		assertQueryInt("SELECT SUM(i) FROM foo", 6);
 	}
@@ -382,7 +382,7 @@ public final class OnClientTester extend
 		ps.close();
 
 		Path d2 = getTmpDir(currentTestName + "2");
-		conn.setUploadHandler(new FileTransferHandler(d2, false));
+		conn.setUploadHandler(new FileTransferHandler(d2, StandardCharsets.UTF_8));
 		String quoted = f.toAbsolutePath().toString().replaceAll("'", "''");
 		expectError("COPY INTO foo FROM R'"+ quoted + "' ON CLIENT", "not in upload directory");
 		// connection is still alive
@@ -393,7 +393,7 @@ public final class OnClientTester extend
 		prepare();
 		update("INSERT INTO foo VALUES (42, 'forty-two')");
 		Path d = getTmpDir(currentTestName);
-		conn.setDownloadHandler(new FileTransferHandler(d, false));
+		conn.setDownloadHandler(new FileTransferHandler(d, StandardCharsets.UTF_8));
 		update("COPY SELECT * FROM foo INTO 'data.txt' ON CLIENT");
 		List<String> lines = Files.readAllLines(d.resolve("data.txt"));
 		assertEq("lines written", lines.size(), 1);
@@ -408,7 +408,7 @@ public final class OnClientTester extend
 		update("INSERT INTO foo VALUES (42, 'forty-two')");
 		Path d = getTmpDir(currentTestName);
 		Path d2 = getTmpDir(currentTestName + "2");
-		conn.setDownloadHandler(new FileTransferHandler(d2, false));
+		conn.setDownloadHandler(new FileTransferHandler(d2, StandardCharsets.UTF_8));
 		String quoted = d.resolve("data.txt").toAbsolutePath().toString().replaceAll("'", "''");
 		expectError("COPY SELECT * FROM foo INTO R'" + quoted + "' ON CLIENT", "not in download directory");
 		if (level.compareTo(BugFixLevel.CanRefuseDownload) >= 0) {