Skip to content

Instantly share code, notes, and snippets.

@gronono
Last active November 20, 2019 00:28
Show Gist options
  • Save gronono/64c2fb09810607188cc34efa67a40c85 to your computer and use it in GitHub Desktop.
Save gronono/64c2fb09810607188cc34efa67a40c85 to your computer and use it in GitHub Desktop.
Parser for Jdbc urls
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
@Getter
@Slf4j
public class JdbcUrlParser {
// view details on https://regex101.com/r/Sa4xHK/1
private static final Pattern DATABASE_PATTERN = Pattern.compile("^jdbc:(\\w+?):(thin:)?@?\\/?\\/?([a-z.-]+?):(\\d+)(:|\\/)([a-z-_.]+)(\\?currentSchema=)?([a-z_]*)");
private static final int GROUP_DATABASE = 1;
private static final int GROUP_SERVER = 3;
private static final int GROUP_PORT = 4;
private static final int GROUP_SERVICE = 6;
private static final int GROUP_SCHEMA = 8;
private final String url;
private final String database;
private final String server;
private final int port;
private final String service;
private final String schema;
public JdbcUrlParser(String url) {
this.url = url;
String [] values = parse();
this.database = values[GROUP_DATABASE];
this.server = values[GROUP_SERVER];
this.port = Integer.parseInt(values[GROUP_PORT]);
this.service = values[GROUP_SERVICE];
this.schema = values[GROUP_SCHEMA];
}
private String [] parse() {
Matcher matcher = DATABASE_PATTERN.matcher(url);
boolean matches = matcher.find();
if (!matches) {
throw new IllegalArgumentException(String.format("L'url %s ne respecte pas le format %s", url, DATABASE_PATTERN));
}
debug(matcher);
String [] parsed = new String[matcher.groupCount() + 1];
for (int i = 0; i <= matcher.groupCount(); i++) {
parsed[i] = matcher.group(i);
}
return parsed;
}
private void debug(Matcher matcher) {
if (log.isDebugEnabled()) {
for (int i = 0; i <= matcher.groupCount(); i++) {
log.debug("Group {} : {}", i, matcher.group(i));
}
}
}
}
import static org.assertj.core.api.Assertions.assertThat;
import org.junit.jupiter.api.Test;
class JdbcUrlParserTest {
@Test
void should_parse_gestdev() {
JdbcUrlParser parser = new JdbcUrlParser("jdbc:oracle:thin:@//lepto.prod:1521/gestdev.lepto");
assertThat(parser.getDatabase()).isEqualTo("oracle");
assertThat(parser.getServer()).isEqualTo("lepto.prod");
assertThat(parser.getPort()).isEqualTo(1521);
assertThat(parser.getService()).isEqualTo("gestdev.lepto");
assertThat(parser.getSchema()).isBlank();
}
@Test
void should_parse_gest() {
JdbcUrlParser parser = new JdbcUrlParser("jdbc:oracle:thin:@sgbd:1521:gest");
assertThat(parser.getDatabase()).isEqualTo("oracle");
assertThat(parser.getServer()).isEqualTo("sgbd");
assertThat(parser.getPort()).isEqualTo(1521);
assertThat(parser.getService()).isEqualTo("gest");
assertThat(parser.getSchema()).isBlank();
}
@Test
void should_parse_spring_batch() {
JdbcUrlParser parser = new JdbcUrlParser("jdbc:postgresql://kproxy:5433/spring_batch");
assertThat(parser.getDatabase()).isEqualTo("postgresql");
assertThat(parser.getServer()).isEqualTo("kproxy");
assertThat(parser.getPort()).isEqualTo(5433);
assertThat(parser.getService()).isEqualTo("spring_batch");
assertThat(parser.getSchema()).isBlank();
}
@Test
void should_parse_importsup() {
JdbcUrlParser parser = new JdbcUrlParser("jdbc:postgresql://kproxy:5433/importsup?currentSchema=s_admission");
assertThat(parser.getDatabase()).isEqualTo("postgresql");
assertThat(parser.getServer()).isEqualTo("kproxy");
assertThat(parser.getPort()).isEqualTo(5433);
assertThat(parser.getService()).isEqualTo("importsup");
assertThat(parser.getSchema()).isEqualTo("s_admission");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment