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]