Changeset: 4de810c22328 for monetdb-java
URL: https://dev.monetdb.org/hg/monetdb-java/rev/4de810c22328
Modified Files:
        src/main/java/org/monetdb/mcl/net/MonetUrlParser.java
        src/main/java/org/monetdb/mcl/net/Parameter.java
        src/main/java/org/monetdb/mcl/net/ParameterType.java
        src/main/java/org/monetdb/mcl/net/Target.java
        tests/UrlTester.java
        tests/tests.md
Branch: monetdbs
Log Message:

Refactor


diffs (truncated from 1334 to 300 lines):

diff --git a/src/main/java/org/monetdb/mcl/net/MonetUrlParser.java 
b/src/main/java/org/monetdb/mcl/net/MonetUrlParser.java
--- a/src/main/java/org/monetdb/mcl/net/MonetUrlParser.java
+++ b/src/main/java/org/monetdb/mcl/net/MonetUrlParser.java
@@ -4,17 +4,14 @@ import java.io.UnsupportedEncodingExcept
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.net.URLDecoder;
-import java.util.Properties;
 
 public class MonetUrlParser {
-    private final Properties props;
+    private final Target target;
     private final String urlText;
     private final URI url;
-    boolean userWasSet = false;
-    boolean passwordWasSet = false;
 
-    public MonetUrlParser(Properties props, String url) throws 
URISyntaxException {
-        this.props = props;
+    public MonetUrlParser(Target target, String url) throws URISyntaxException 
{
+        this.target = target;
         this.urlText = url;
         // we want to accept monetdb:// but the Java URI parser rejects that.
         switch (url) {
@@ -29,7 +26,7 @@ public class MonetUrlParser {
         this.url = new URI(url);
     }
 
-    public static void parse(Properties props, String url) throws 
URISyntaxException {
+    public static void parse(Target target, String url) throws 
URISyntaxException, ValidationError {
         boolean modern = true;
         if (url.startsWith("mapi:")) {
             modern = false;
@@ -38,16 +35,16 @@ public class MonetUrlParser {
                 // deal with peculiarity of Java's URI parser
                 url = "monetdb:///";
             }
+        }
 
-        }
+        target.barrier();
         try {
-            MonetUrlParser parser = new MonetUrlParser(props, url);
+            MonetUrlParser parser = new MonetUrlParser(target, url);
             if (modern) {
                 parser.parseModern();
             } else {
                 parser.parseClassic();
             }
-            if (parser.userWasSet && !parser.passwordWasSet) 
parser.clear(Parameter.PASSWORD);
         } catch (URISyntaxException e) {
             int idx = e.getIndex();
             if (idx >= 0 && !modern) {
@@ -56,6 +53,7 @@ public class MonetUrlParser {
             }
             throw new URISyntaxException(e.getInput(), e.getReason(), idx);
         }
+        target.barrier();
     }
 
     private static String percentDecode(String context, String text) throws 
URISyntaxException {
@@ -68,53 +66,17 @@ public class MonetUrlParser {
         }
     }
 
-    private void set(Parameter parm, String value) {
-        parm = keyMagic(parm);
-        props.setProperty(parm.name, value != null ? value : "");
-    }
-
-    private void set(String key, String value) {
-        Parameter parm = Parameter.forName(key);
-        if (parm != null)
-            set(parm, value);
-        else
-            props.setProperty(key, value);
-    }
-
-    private void clear(Parameter parm) {
-        parm = keyMagic(parm);
-        String value = parm.type.format(Target.getDefault(parm));
-        props.setProperty(parm.name, value);
-    }
-
-    private Parameter keyMagic(Parameter key) {
-        switch (key) {
-            case USER:
-                userWasSet = true;
-                break;
-            case PASSWORD:
-                passwordWasSet = true;
-                break;
-            case FETCHSIZE:
-                key = Parameter.REPLYSIZE;
-                break;
-            default:
-                break;
-        }
-        return key;
-    }
-
-    private void parseModern() throws URISyntaxException {
+    private void parseModern() throws URISyntaxException, ValidationError {
         clearBasic();
 
         String scheme = url.getScheme();
         if (scheme == null) throw new URISyntaxException(urlText, "URL scheme 
must be monetdb:// or monetdbs://");
         switch (scheme) {
             case "monetdb":
-                set(Parameter.TLS, "false");
+                target.setTls(false);
                 break;
             case "monetdbs":
-                set(Parameter.TLS, "true");
+                target.setTls(true);
                 break;
             default:
                 throw new URISyntaxException(urlText, "URL scheme must be 
monetdb:// or monetdbs://");
@@ -153,8 +115,8 @@ public class MonetUrlParser {
                 remainder = "";
             }
         }
-        host = unwrapLocalhost(host);
-        set(Parameter.HOST, host);
+        host = Target.unpackHost(host);
+        target.setHost(host);
 
         if (remainder.isEmpty()) {
             // do nothing
@@ -168,24 +130,22 @@ public class MonetUrlParser {
                 portStr = null;
             }
             if (portStr == null)
-                throw new URISyntaxException(urlText, "invalid port number");
-            set(Parameter.PORT, portStr);
+                throw new ValidationError(urlText, "invalid port number");
+            target.setString(Parameter.PORT, portStr);
         }
 
         String path = url.getRawPath();
-        String[] parts = path.split("/", 5);
+        String[] parts = path.split("/", 4);
         // <0: empty before leading slash> / <1: database> / <2: tableschema> 
/ <3: table> / <4: should not exist>
         switch (parts.length) {
-            case 5:
-                throw new URISyntaxException(urlText, "table name should not 
contain slashes");
             case 4:
-                set(Parameter.TABLE, percentDecode(Parameter.TABLE.name, 
parts[3]));
+                target.setString(Parameter.TABLE, 
percentDecode(Parameter.TABLE.name, parts[3]));
                 // fallthrough
             case 3:
-                set(Parameter.TABLESCHEMA, 
percentDecode(Parameter.TABLESCHEMA.name, parts[2]));
+                target.setString(Parameter.TABLESCHEMA, 
percentDecode(Parameter.TABLESCHEMA.name, parts[2]));
                 // fallthrough
             case 2:
-                set(Parameter.DATABASE, percentDecode(Parameter.DATABASE.name, 
parts[1]));
+                target.setString(Parameter.DATABASE, 
percentDecode(Parameter.DATABASE.name, parts[1]));
             case 1:
             case 0:
                 // fallthrough
@@ -207,37 +167,12 @@ public class MonetUrlParser {
                     throw new URISyntaxException(key, key + "= is not allowed 
as a query parameter");
 
                 String value = args[i].substring(pos + 1);
-                set(key, percentDecode(key, value));
+                target.setString(key, percentDecode(key, value));
             }
         }
     }
 
-    public static String wrapLocalhost(String host) {
-        switch (host) {
-            case "localhost":
-                host = "localhost.";
-                break;
-            case "":
-                host = "localhost";
-                break;
-        }
-        return host;
-    }
-
-    public static String unwrapLocalhost(String host) {
-        switch (host) {
-            case "localhost":
-                host = "";
-                break;
-            case "localhost.":
-                host = "localhost";
-                break;
-        }
-        return host;
-    }
-
-
-    private void parseClassic() throws URISyntaxException {
+    private void parseClassic() throws URISyntaxException, ValidationError {
         String scheme = url.getScheme();
         if (scheme == null) throw new URISyntaxException(urlText, "URL scheme 
must be mapi:monetdb:// or mapi:merovingian://");
         switch (scheme) {
@@ -279,9 +214,9 @@ public class MonetUrlParser {
                 port = -1;
             }
             if (port <= 0) {
-                throw new URISyntaxException(urlText, "invalid port number");
+                throw new ValidationError(urlText, "invalid port number");
             }
-            set(Parameter.PORT, portStr);
+            target.setString(Parameter.PORT, portStr);
         }
 
         String path = url.getRawPath();
@@ -289,22 +224,20 @@ public class MonetUrlParser {
         if (host.isEmpty() && portStr.isEmpty()) {
             // socket
             isUnix = true;
-            clear(Parameter.HOST);
-            set(Parameter.SOCK, path != null ? path : "");
+            target.clear(Parameter.HOST);
+            target.setString(Parameter.SOCK, path != null ? path : "");
         } else {
             // tcp
             isUnix = false;
-            clear(Parameter.SOCK);
-            set(Parameter.HOST, host);
+            target.clear(Parameter.SOCK);
+            target.setString(Parameter.HOST, host);
             if (path == null || path.isEmpty()) {
                 // do nothing
             } else if (!path.startsWith("/")) {
                 throw new URISyntaxException(urlText, "expect path to start 
with /");
             } else {
                 String database = path.substring(1);
-                if (database.contains("/"))
-                    throw new URISyntaxException(urlText, "no slashes allowed 
in database name");
-                set(Parameter.DATABASE, database);
+                target.setString(Parameter.DATABASE, database);
             }
         }
 
@@ -315,10 +248,10 @@ public class MonetUrlParser {
                 String arg = args[i];
                 if (arg.startsWith("language=")) {
                     String language = arg.substring(9);
-                    set(Parameter.LANGUAGE, language);
+                    target.setString(Parameter.LANGUAGE, language);
                 } else if (arg.startsWith("database=")) {
                     String database = arg.substring(9);
-                    set(Parameter.DATABASE, database);
+                    target.setString(Parameter.DATABASE, database);
                 } else {
                     // ignore
                 }
@@ -327,9 +260,9 @@ public class MonetUrlParser {
     }
 
     private void clearBasic() {
-        clear(Parameter.HOST);
-        clear(Parameter.PORT);
-        clear(Parameter.SOCK);
-        clear(Parameter.DATABASE);
+        target.clear(Parameter.HOST);
+        target.clear(Parameter.PORT);
+        target.clear(Parameter.SOCK);
+        target.clear(Parameter.DATABASE);
     }
 }
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
@@ -1,6 +1,8 @@
 package org.monetdb.mcl.net;
 
 
+import java.util.Calendar;
+
 public enum Parameter {
     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),
@@ -17,7 +19,7 @@ public enum Parameter {
     USER("user", ParameterType.Str, "", "user name to authenticate as", false),
     PASSWORD("password", ParameterType.Str, "", "password to authenticate 
with", false),
     LANGUAGE("language", ParameterType.Str, "sql", "for example, \"sql\", 
\"mal\", \"msql\", \"profiler\"", false),
-    AUTOCOMMIT("autocommit", ParameterType.Bool, false, "initial value of 
autocommit", false),
+    AUTOCOMMIT("autocommit", ParameterType.Bool, true, "initial value of 
autocommit", false),
     SCHEMA("schema", ParameterType.Str, "", "initial schema", false),
     TIMEZONE("timezone", ParameterType.Int, null, "client time zone as minutes 
east of UTC", false),
     BINARY("binary", ParameterType.Str, "on", "whether to use binary result 
set format (number or bool)", false),
@@ -31,7 +33,7 @@ public enum Parameter {
 
     public final String name;
     public final ParameterType type;
-    public final Object defaultValue;
+    private final Object defaultValue;
     public final String description;
     public final boolean isCore;
 
@@ -78,4 +80,16 @@ public enum Parameter {
             return false;
         return name.contains("_");
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to