package org.skywalking.apm.plugin.jdbc.connectionurl.parser;
import org.skywalking.apm.plugin.jdbc.ConnectionInfo;
/**
* {@link OracleURLParser} presents that how to parse oracle connection url.
* <p>
* The {@link ConnectionInfo#host} be set the string between charset "@" and the last
* charset ":" after the charset "@", and {@link ConnectionInfo#databaseName} be set the
* string that after the last index of ":".
* <p>
* Note: {@link OracleURLParser} can parse the commons connection url. the commons
* connection url is of the form: <code>jdbc:oracle:<drivertype>:@<database></code>,the other
* the form of connection url cannot be parsed success.
*
* @author zhangxin
*/
public class OracleURLParser extends AbstractURLParser {
private static final String DB_TYPE = "Oracle";
private static final int DEFAULT_PORT = 1521;
public OracleURLParser(String url) {
super(url);
}
@Override
protected int[] fetchDatabaseHostsIndexRange() {
int hostLabelStartIndex = url.indexOf("@");
int hostLabelEndIndex = url.lastIndexOf(":");
return new int[] {hostLabelStartIndex + 1, hostLabelEndIndex};
}
@Override
protected int[] fetchDatabaseNameIndexRange() {
return new int[0];
}
@Override
public ConnectionInfo parse() {
int[] hostRangeIndex = fetchDatabaseHostsIndexRange();
String host = fetchDatabaseHostsFromURL();
String[] hostSegment = splitDatabaseAddress(host);
String databaseName = url.substring(hostRangeIndex[1] + 1);
if (hostSegment.length == 1) {
return new ConnectionInfo(DB_TYPE, host, DEFAULT_PORT, databaseName);
} else {
return new ConnectionInfo(DB_TYPE, hostSegment[0], Integer.valueOf(hostSegment[1]), databaseName);
}
}
private String[] splitDatabaseAddress(String address) {
String[] hostSegment = address.split(":");
return hostSegment;
}
}