Last active
November 20, 2019 00:28
-
-
Save gronono/64c2fb09810607188cc34efa67a40c85 to your computer and use it in GitHub Desktop.
Parser for Jdbc urls
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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)); | |
} | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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