Changeset: df18aa5c8a61 for monetdb-java
URL: https://dev.monetdb.org/hg/monetdb-java/rev/df18aa5c8a61
Modified Files:
        src/main/java/org/monetdb/jdbc/MonetDriver.java
        src/main/java/org/monetdb/mcl/net/Parameter.java
        tests/JDBC_API_Tester.java
Branch: default
Log Message:

Add test for MonetDriver.getPropertyInfo(url, props).
The implementation is moved to Parameter.java which contains the list of 
connection parameters.
It currently only returns the mandatory connection parameters.


diffs (254 lines):

diff --git a/src/main/java/org/monetdb/jdbc/MonetDriver.java 
b/src/main/java/org/monetdb/jdbc/MonetDriver.java
--- a/src/main/java/org/monetdb/jdbc/MonetDriver.java
+++ b/src/main/java/org/monetdb/jdbc/MonetDriver.java
@@ -12,6 +12,7 @@
 
 package org.monetdb.jdbc;
 
+import org.monetdb.mcl.net.Parameter;
 import org.monetdb.mcl.net.Target;
 import org.monetdb.mcl.net.ValidationError;
 
@@ -139,7 +140,7 @@ public final class MonetDriver implement
         * discover what properties it should prompt a human for in order to get
         * enough information to connect to a database. Note that depending on 
the
         * values the human has supplied so far, additional values may become
-        * necessary, so it may be necessary to iterate though several calls to 
the
+        * necessary, so it may be necessary to iterate through several calls 
to the
         * getPropertyInfo method.
         *
         * @param url the URL of the database to which to connect
@@ -154,66 +155,8 @@ public final class MonetDriver implement
                if (!acceptsURL(url))
                        return null;
 
-               final String[] boolean_choices = new String[] { "true", "false" 
};
-               final DriverPropertyInfo[] dpi = new DriverPropertyInfo[10];    
// we currently support 10 connection properties
-
-               DriverPropertyInfo prop = new DriverPropertyInfo("user", info 
!= null ? info.getProperty("user") : null);
-               prop.required = true;
-               prop.description = "The user loginname to use when 
authenticating on the database server";
-               dpi[0] = prop;
-
-               prop = new DriverPropertyInfo("password", info != null ? 
info.getProperty("password") : null);
-               prop.required = true;
-               prop.description = "The password to use when authenticating on 
the database server";
-               dpi[1] = prop;
-
-               prop = new DriverPropertyInfo("debug", "false");
-               prop.required = false;
-               prop.description = "Whether or not to create a log file for 
debugging purposes";
-               prop.choices = boolean_choices;
-               dpi[2] = prop;
-
-               prop = new DriverPropertyInfo("logfile", null);
-               prop.required = false;
-               prop.description = "The filename to write the debug log to. 
Only takes effect if debug is set to true. If the file exists, an incrementing 
number is added, till the filename is unique.";
-               dpi[3] = prop;
-
-               prop = new DriverPropertyInfo("language", "sql");
-               prop.required = false;
-               prop.description = "What language to use for MonetDB 
conversations (experts only)";
-               prop.choices = new String[] { "sql", "mal" };
-               dpi[4] = prop;
-
-               prop = new DriverPropertyInfo("hash", null);
-               prop.required = false;
-               prop.description = "Force the use of the given hash algorithm 
(SHA512 or SHA384 or SHA256 or SHA1) during challenge response";
-               prop.choices = new String[] { "SHA512", "SHA384", "SHA256", 
"SHA1" };
-               dpi[5] = prop;
-
-               prop = new DriverPropertyInfo("treat_blob_as_binary", "true");
-               prop.required = false;
-               prop.description = "Should blob columns be mapped to 
Types.VARBINARY instead of Types.BLOB in ResultSets and PreparedStatements"; // 
recommend for increased performance due to less overhead
-               prop.choices = boolean_choices;
-               dpi[6] = prop;
-
-               prop = new DriverPropertyInfo("treat_clob_as_varchar", "true");
-               prop.required = false;
-               prop.description = "Should clob columns be mapped to 
Types.VARCHAR instead of Types.CLOB in ResultSets and PreparedStatements"; // 
recommend for increased performance due to less overhead
-               prop.choices = boolean_choices;
-               dpi[7] = prop;
-
-               prop = new DriverPropertyInfo("so_timeout", "0");
-               prop.required = false;
-               prop.description = "Defines the maximum time to wait in 
milliseconds on a blocking read socket call"; // this corresponds to the 
Connection.setNetworkTimeout() method introduced in JDBC 4.1
-               dpi[8] = prop;
-
-               prop = new DriverPropertyInfo("autocommit", "true");
-               prop.required = false;
-               prop.description = "Whether the connection should start in 
auto-commit mode";
-               prop.choices = boolean_choices;
-               dpi[9] = prop;
-
-               return dpi;
+               // delegate to mcl.net.Parameters enum class, which maintains 
all connection properties
+               return Parameter.getPropertyInfo(info, 
url.startsWith("jdbc:monetdbs:"));
        }
 
        /**
diff --git a/src/main/java/org/monetdb/mcl/net/Parameter.java 
b/src/main/java/org/monetdb/mcl/net/Parameter.java
--- a/src/main/java/org/monetdb/mcl/net/Parameter.java
+++ b/src/main/java/org/monetdb/mcl/net/Parameter.java
@@ -12,12 +12,15 @@
 
 package org.monetdb.mcl.net;
 
+import java.sql.DriverPropertyInfo;
 import java.util.Calendar;
+import java.util.Properties;
 
 /**
  * Enumerates things that can be configured on a connection to MonetDB.
  */
 public enum Parameter {
+       //  String name, ParameterType type, Object defaultValue, String 
description, boolean isCore
        TLS("tls", ParameterType.Bool, false, "secure the connection using 
TLS", true),
        HOST("host", ParameterType.Str, "", "IP number, domain name or one of 
the special values `localhost` and `localhost.`", true),
        PORT("port", ParameterType.Int, -1, "Port to connect to, 1..65535 or -1 
for 'not set'", true),
@@ -167,7 +170,7 @@ public enum Parameter {
        }
 
        /**
-        * Determine if this Parameter is onlyu relevant when TlS is enabled.
+        * Determine if this Parameter is only relevant when TlS is enabled.
         *
         * Such parameters need not be shown to the user unless the URL starts 
with <code>monetdbs://</code>.
         *
@@ -184,4 +187,59 @@ public enum Parameter {
                                return false;
                }
        }
+
+       /**
+        * Gets information about the possible properties for this driver.
+        *
+        * The getPropertyInfo method is intended to allow a generic GUI tool to
+        * discover what properties it should prompt a human for in order to get
+        * enough information to connect to a database. Note that depending on 
the
+        * values the human has supplied so far, additional values may become
+        * necessary, so it may be necessary to iterate through several calls 
to the
+        * getPropertyInfo method.
+        *
+        * Note: This method is called from  jdbc.MonetDriver.getPropertyInfo()
+        *
+        * @param info a proposed list of tag/value pairs that will be sent on
+        *        connect open
+        * @return an array of DriverPropertyInfo objects describing possible
+        *         properties. This array may be an empty array if no properties
+        *         are required.
+        */
+       public static DriverPropertyInfo[] getPropertyInfo(final Properties 
info, boolean requires_tls) {
+               final String tls = info != null ? info.getProperty("tls") : 
null;
+               final boolean tls_enabled = requires_tls || (tls != null && 
tls.equals("true"));
+               final int dpi_size = (tls_enabled ? 4 : 2);
+               final DriverPropertyInfo[] dpi = new 
DriverPropertyInfo[dpi_size];
+               DriverPropertyInfo prop = null;
+
+               // minimal required connection settings are "user" and 
"password"
+               prop = new DriverPropertyInfo("user", info != null ? 
info.getProperty("user") : null);
+               prop.required = true;
+               prop.description = "User loginname to use when authenticating 
on the database server";
+               dpi[0] = prop;
+
+               prop = new DriverPropertyInfo("password", info != null ? 
info.getProperty("password") : null);
+               prop.required = true;
+               prop.description = "Password to use when authenticating on the 
database server";
+               dpi[1] = prop;
+
+               if (tls_enabled && dpi_size > 2) {
+                       // when tls is enabled or required also "tls" and 
"cert" become required
+                       final String[] boolean_choices = new String[] { "true", 
"false" };
+
+                       prop = new DriverPropertyInfo("tls", tls);
+                       prop.required = true;
+                       prop.description = "secure the connection using TLS";
+                       prop.choices = boolean_choices;
+                       dpi[2] = prop;
+
+                       prop = new DriverPropertyInfo("cert", info != null ? 
info.getProperty("cert") : null);
+                       prop.required = true;
+                       prop.description = "path to TLS certificate to 
authenticate server with";
+                       dpi[3] = prop;
+               }
+
+               return dpi;
+       }
 }
diff --git a/tests/JDBC_API_Tester.java b/tests/JDBC_API_Tester.java
--- a/tests/JDBC_API_Tester.java
+++ b/tests/JDBC_API_Tester.java
@@ -10,13 +10,11 @@
  * Copyright 1997 - July 2008 CWI.
  */
 
-import java.sql.*;
-
 import java.io.StringReader;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.nio.charset.StandardCharsets;
-import java.sql.Date;
+import java.sql.*;
 import java.text.SimpleDateFormat;
 import java.util.*;
 
@@ -93,6 +91,7 @@ public final class JDBC_API_Tester {
                jt.Test_Creplysize();
                jt.Test_Csavepoints();
                jt.Test_Ctransaction();
+               jt.Test_Driver(con_URL);
                jt.Test_Dobjects();
                jt.Test_DBCmetadata();
                jt.Test_EmptySql();
@@ -731,6 +730,50 @@ public final class JDBC_API_Tester {
                        "13. commit...failed as expected: COMMIT: not allowed 
in auto commit mode\n");
        }
 
+       private void Test_Driver(String con_URL) {
+               sb.setLength(0);        // clear the output log buffer
+
+               try {
+                       final Driver driver = DriverManager.getDriver(con_URL);
+                       DriverPropertyInfo[] props = 
driver.getPropertyInfo(con_URL, null);
+                       DriverPropertyInfo prop;
+                       final String space = "  ";
+                       for (int i = 0; i < props.length; i++) {
+                               prop = props[i];
+                               sb.append(i).append(space);
+                               sb.append(prop.name).append(space);
+                               sb.append(prop.required).append(space);
+                               sb.append(prop.value).append(space);
+                               sb.append(prop.description).append("\n");
+                       }
+                       // also test against monetdbs, this should make tls and 
cert required.
+                       props = driver.getPropertyInfo("jdbc:monetdbs:", null);
+                       sb.append("getPropertyInfo of 
jdbc:monetdbs:").append("\n");
+                       for (int i = 0; i < props.length; i++) {
+                               prop = props[i];
+                               sb.append(i).append(space);
+                               sb.append(prop.name).append(space);
+                               sb.append(prop.required).append(space);
+                               sb.append(prop.value).append(space);
+                               sb.append(prop.description).append("\n");
+                       }
+               } catch (SQLException e) {
+                       // this means we get what we expect
+                       sb.append("failed to get Driver class: 
").append(e.getMessage());
+                       sb.append("\n");
+               }
+
+               compareExpectedOutput("Test_Driver",
+                       "0  user  true  null  User loginname to use when 
authenticating on the database server\n" +
+                       "1  password  true  null  Password to use when 
authenticating on the database server\n" +
+                       "getPropertyInfo of jdbc:monetdbs:\n" +
+                       "0  user  true  null  User loginname to use when 
authenticating on the database server\n" +
+                       "1  password  true  null  Password to use when 
authenticating on the database server\n" +
+                       "2  tls  true  null  secure the connection using TLS\n" 
+
+                       "3  cert  true  null  path to TLS certificate to 
authenticate server with\n");
+       }
+
+
        private void handleExecuteDDL(Statement stmt, String action, String 
objtype, String objname, String sql) {
                try {
                        int response = stmt.executeUpdate(sql);
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to