Skip to content

Commit

Permalink
[CONJ-1085] Utility method to display configuration from url string
Browse files Browse the repository at this point in the history
  • Loading branch information
rusher committed Jun 8, 2023
1 parent 1137bd1 commit 00e1375
Show file tree
Hide file tree
Showing 2 changed files with 179 additions and 0 deletions.
119 changes: 119 additions & 0 deletions src/main/java/org/mariadb/jdbc/Configuration.java
Expand Up @@ -1511,6 +1511,125 @@ public String toString() {
return initialUrl;
}

/**
* Permit to have string information on how string is parsed. example :
* Configuration.toConf("jdbc:mariadb://localhost/test") will return a String containing: <code>
* Configuration:
* * resulting Url : jdbc:mariadb://localhost/test
* Unknown options : None
*
* Non default options :
* * database : test
*
* default options :
* * user : null
* ...
* </code>
*
* @param url url string
* @return string describing the configuration parsed from url
* @throws SQLException if parsing fails
*/
public static String toConf(String url) throws SQLException {
Configuration conf = Configuration.parseInternal(url, new Properties());
StringBuilder sb = new StringBuilder();
StringBuilder sbUnknownOpts = new StringBuilder();

if (conf.nonMappedOptions.isEmpty()) {
sbUnknownOpts.append("None");
} else {
for (Map.Entry entry : conf.nonMappedOptions.entrySet()) {
sbUnknownOpts.append("\n * ").append(entry.getKey()).append(" : ").append(entry.getValue());
}
}
sb.append("Configuration:")
.append("\n * resulting Url : ")
.append(conf.initialUrl)
.append("\nUnknown options : ")
.append(sbUnknownOpts)
.append("\n")
.append("\nNon default options : ");

Configuration defaultConf = Configuration.parse("jdbc:mariadb://localhost/");
StringBuilder sbDefaultOpts = new StringBuilder();
StringBuilder sbDifferentOpts = new StringBuilder();
try {
List<String> propertyToSkip = Arrays.asList(new String[] {"initialUrl", "logger", "codecs", "$jacocoData"});
Field[] fields = Configuration.class.getDeclaredFields();
Arrays.sort(fields, Comparator.comparing(Field::getName));

for (Field field : fields) {
if (!propertyToSkip.contains(field.getName())) {
Object fieldValue = field.get(conf);
if (fieldValue == null) {
(Objects.equals(fieldValue, field.get(defaultConf)) ? sbDefaultOpts : sbDifferentOpts)
.append("\n * ")
.append(field.getName())
.append(" : ")
.append(fieldValue);
} else {
if (field.getName().equals("haMode")) {
(Objects.equals(fieldValue, field.get(defaultConf)) ? sbDefaultOpts : sbDifferentOpts)
.append("\n * ")
.append(field.getName())
.append(" : ")
.append(fieldValue);
continue;
}
switch (fieldValue.getClass().getSimpleName()) {
case "String":
case "Boolean":
case "HaMode":
case "TransactionIsolation":
case "Integer":
case "SslMode":
(Objects.equals(fieldValue, field.get(defaultConf))
? sbDefaultOpts
: sbDifferentOpts)
.append("\n * ")
.append(field.getName())
.append(" : ")
.append(fieldValue);
break;
case "ArrayList":
(Objects.equals(fieldValue.toString(), field.get(defaultConf).toString())
? sbDefaultOpts
: sbDifferentOpts)
.append("\n * ")
.append(field.getName())
.append(" : ")
.append(fieldValue);

case "Properties":
break;
default:
throw new IllegalArgumentException("field type not expected for fields " + field.getName());
}
}
}
}

String diff = sbDifferentOpts.toString();
if (diff.isEmpty()) {
sb.append("None\n");
} else {
sb.append(diff);
}

sb.append("\n\ndefault options :");
String same = sbDefaultOpts.toString();
if (same.isEmpty()) {
sb.append("None\n");
} else {
sb.append(same);
}

} catch (IllegalArgumentException | IllegalAccessException e) {
throw new IllegalArgumentException("Wrong parsing", e);
}
return sb.toString();
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
Expand Down
60 changes: 60 additions & 0 deletions src/test/java/org/mariadb/jdbc/unit/util/ConfigurationTest.java
Expand Up @@ -884,4 +884,64 @@ public void useMysqlMetadata() throws SQLException {
.build()
.useMysqlMetadata());
}

@Test
public void toConf() throws SQLException {
assertTrue(
Configuration.toConf("jdbc:mariadb://localhost/test")
.startsWith(
"Configuration:\n"
+ " * resulting Url : jdbc:mariadb://localhost/test\n"
+ "Unknown options : None\n"
+ "\n"
+ "Non default options : \n"
+ " * database : test\n"
+ "\n"
+ "default options :"));
assertTrue(
Configuration.toConf(
"jdbc:mariadb:loadbalance://host1:3305,address=(host=host2)(port=3307)(type=replica)/db?nonExisting&nonExistingWithValue=tt&user=me&password=***&timezone=UTC&autocommit=false&createDatabaseIfNotExist=true&")
.startsWith(
"Configuration:\n"
+ " * resulting Url : jdbc:mariadb:loadbalance://address=(host=host1)(port=3305)(type=primary),address=(host=host2)(port=3307)(type=replica)/db?user=me&password=***&nonExisting=&nonExistingWithValue=tt&timezone=UTC&autocommit=false&createDatabaseIfNotExist=true\n"
+ "Unknown options : \n"
+ " * nonExisting : \n"
+ " * nonExistingWithValue : tt\n"
+ "\n"
+ "Non default options : \n"
+ " * addresses : [address=(host=host1)(port=3305)(type=primary), address=(host=host2)(port=3307)(type=replica)]\n"
+ " * autocommit : false\n"
+ " * createDatabaseIfNotExist : true\n"
+ " * database : db\n"
+ " * haMode : LOADBALANCE\n"
+ " * password : ***\n"
+ " * timezone : UTC\n"
+ " * user : me\n"
+ "\n"
+ "default options :\n"
+ " * allowLocalInfile : true\n"
+ " * allowMultiQueries : false\n"
+ " * allowPublicKeyRetrieval : false"));

assertTrue(
Configuration.toConf(
"jdbc:mariadb://localhost/test?user=root&sslMode=verify-ca&serverSslCert=/tmp/t.pem&trustStoreType=JKS&keyStore=/tmp/keystore&keyStorePassword=kspass")
.startsWith(
"Configuration:\n"
+ " * resulting Url : jdbc:mariadb://localhost/test?user=root&sslMode=VERIFY_CA&serverSslCert=/tmp/t.pem&keyStore=/tmp/keystore&keyStorePassword=kspass&trustStoreType=JKS\n"
+ "Unknown options : None\n"
+ "\n"
+ "Non default options : \n"
+ " * database : test\n"
+ " * keyStore : /tmp/keystore\n"
+ " * keyStorePassword : kspass\n"
+ " * serverSslCert : /tmp/t.pem\n"
+ " * sslMode : VERIFY_CA\n"
+ " * trustStoreType : JKS\n"
+ " * user : root\n"
+ "\n"
+ "default options :\n"
+ " * addresses : [address=(host=localhost)(port=3306)(type=primary)]\n"
+ " * allowLocalInfile : true"));
}
}

0 comments on commit 00e1375

Please sign in to comment.